diff --git a/.arcconfig b/.arcconfig deleted file mode 100644 index 0df938ee..00000000 --- a/.arcconfig +++ /dev/null @@ -1,3 +0,0 @@ -{ - "conduit_uri" : "https://phab.nylas.com/" -} diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 4247d35b..00000000 --- a/.babelrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "plugins": ["@babel/plugin-proposal-object-rest-spread"], - "presets": ["@babel/preset-env"] -} diff --git a/.eslintignore b/.eslintignore index e6c30dce..142200e3 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,4 @@ node_modules lib -example \ No newline at end of file +example +docs diff --git a/.eslintrc.js b/.eslintrc.js index a614e35c..6062f4e8 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -9,7 +9,7 @@ module.exports = { ecmaVersion: 2016, sourceType: 'module', }, - plugins: ['@typescript-eslint'], + plugins: ['@typescript-eslint', 'eslint-plugin-import'], extends: [ 'eslint:recommended', 'prettier', @@ -30,5 +30,17 @@ module.exports = { { properties: 'never', ignoreDestructuring: true }, ], 'no-undef': 'error', + 'import/extensions': ['error', 'ignorePackages'], }, + settings: { + 'import/extensions': ['.js'], + }, + overrides: [ + { + files: ['*.spec.ts'], + rules: { + 'import/extensions': 'off', + }, + }, + ], }; diff --git a/.github/workflows/pull-reqeust.yml b/.github/workflows/pull-reqeust.yml index 036edcbb..8337da4b 100644 --- a/.github/workflows/pull-reqeust.yml +++ b/.github/workflows/pull-reqeust.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [ 8.x, 14.x ] + node-version: [ 16.x, 18.x, 20.x ] name: Nodejs ${{ matrix.node-version }} steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/sdk-reference.yaml b/.github/workflows/sdk-reference.yaml new file mode 100644 index 00000000..0a70a568 --- /dev/null +++ b/.github/workflows/sdk-reference.yaml @@ -0,0 +1,43 @@ +name: sdk-reference + +on: + push: + branches: + - main + pull_request: + +jobs: + docs: + runs-on: ubuntu-latest + environment: + name: sdk-reference + url: ${{ steps.deploy.outputs.url }} + steps: + - uses: actions/checkout@v2 + - name: Setup Nodejs + uses: actions/setup-node@v1 + with: + node-version: 18.x + - name: Install dependencies and build + run: npm install + - name: Build docs + run: npm run build:docs + - name: Set env BRANCH + run: echo "BRANCH=$(echo $GITHUB_REF | cut -d'/' -f 3)" >> $GITHUB_ENV + - name: Set env CLOUDFLARE_BRANCH + run: | + if [[ $BRANCH == 'main' && $GITHUB_EVENT_NAME == 'push' ]]; then + echo "CLOUDFLARE_BRANCH=main" >> "$GITHUB_ENV" + else + echo "CLOUDFLARE_BRANCH=$BRANCH" >> "$GITHUB_ENV" + fi + - name: Publish to Cloudflare Pages + uses: cloudflare/pages-action@v1 + id: deploy + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + projectName: nylas-nodejs-sdk-reference + directory: docs + wranglerVersion: "3" + branch: ${{ env.CLOUDFLARE_BRANCH }} diff --git a/.gitignore b/.gitignore index 0ce4bf9a..202282a6 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,7 @@ _SpecRunner.html tags CTAGS .idea +coverage +docs +cjs +esm diff --git a/.prettierignore b/.prettierignore index e6c30dce..2ddf2e1e 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,4 @@ node_modules lib -example \ No newline at end of file +example +docs \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index f1d5e969..00000000 --- a/.travis.yml +++ /dev/null @@ -1,20 +0,0 @@ -language: node_js -node_js: - - 8 - - 9 - - 10 - - 11 - - 12 - - 13 - - 14 - -script: npm test - -matrix: - include: - - name: "eslint" - node_js: 12 - script: npm run lint - - name: "test coverage" - node_js: 12 - script: ./node_modules/.bin/jest --coverage diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e5c4aa0..d07ce636 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,27 +1,17 @@ # Changelog -### Unreleased -* Fix issue where Graph events were returning 400 on update - -### 6.11.0 / 2023-11-28 -* Add support for logging -* Nullify replyToMessageId is an empty string -* Nullify visibility if visibility is an empty string -* Fix numbers defaulting to 0 instead of null -* Fix parsing of Number arrays -* Fix configured timeout not being used -* Bump `node-fetch` dependency from 2.6.1 to 2.6.12 - -### 6.10.0 / 2023-04-04 -* Add support for verifying webhook signatures - -### 6.9.0 / 2023-03-14 -* Add missing generic type in `RestfulModelCollection` for better type safety -* Add 409 to error mapping -* Add `startTimezone`, `endTimezone` and `timezone` fields to `When` -* Allow configurable timeout for API calls -* Bump `minimist` sub-dependency from 1.2.0 to 1.2.6 -* Bump `mkdirp` sub-dependency from 0.5.1 to 0.5.6 +### 7.0.0 / 2024-02-05 +* **BREAKING CHANGE**: Node SDK v7 supports the Nylas API v3 exclusively, dropping support for any endpoints that are not available in v3. +* **BREAKING CHANGE**: Convert `Nylas` class from a static to a non-static class +* **BREAKING CHANGE**: Officially support minimum Node 16 +* **BREAKING CHANGE**: Dropped the use of 'Collections' in favor of 'Resources' +* **BREAKING CHANGE**: Removed all REST calls from models and moved them directly into resources +* **REMOVED**: Local Webhook development support is removed due to incompatibility +* Rewrote the majority of SDK to be more modular and efficient +* Removed the use of custom strings for serialization and deserialization, now automatically converting to camelCase and from the API's snake_case +* Added support for both ES6 and CommonJS module systems +* Created models for all API resources and endpoints, for all HTTP methods to reduce confusion on which fields are available for each endpoint +* Created error classes for the different API errors as well as SDK-specific errors ### 6.8.0 / 2023-02-03 * Local webhook testing support diff --git a/README.md b/README.md index a96e29d7..42e3fd74 100644 --- a/README.md +++ b/README.md @@ -4,28 +4,37 @@ # Nylas Node.js SDK -[![Travis build status](https://travis-ci.org/nylas/nylas-nodejs.svg?branch=master)](https://travis-ci.org/nylas/nylas-nodejs) +[![npm](https://img.shields.io/npm/v/nylas) +](https://www.npmjs.com/package/nylas) [![codecov](https://codecov.io/gh/nylas/nylas-nodejs/branch/main/graph/badge.svg?token=94IMGU4F09)](https://codecov.io/gh/nylas/nylas-nodejs) -This is the GitHub repository for the Nylas Node SDK and this repo is primarily for anyone who wants to make contributions to the SDK or install it from source. If you are looking to use Node to access the Nylas Email, Calendar, or Contacts API you should refer to our official [Node SDK Quickstart Guide](https://developer.nylas.com/docs/developer-tools/sdk/node-sdk/). +This is the GitHub repository for the Nylas Node SDK. This repo is primarily for anyone who wants to make contributions to the SDK, or install it from source. If you are looking to use Node to access the Nylas Email, Calendar, or Contacts API you should refer to our official [Node SDK Quickstart Guide](https://developer.nylas.com/docs/developer-tools/sdk/node-sdk/). The Nylas Communications Platform provides REST APIs for [Email](https://developer.nylas.com/docs/connectivity/email/), [Calendar](https://developer.nylas.com/docs/connectivity/calendar/), and [Contacts](https://developer.nylas.com/docs/connectivity/contacts/), and the Node SDK is the quickest way to build your integration using JavaScript. Here are some resources to help you get started: -- [Nylas SDK Tutorials](https://developer.nylas.com/docs/the-basics/tutorials/nodejs/) -- [Quickstart](https://developer.nylas.com/docs/the-basics/quickstart/) +- [Sign up for your free Nylas account](https://dashboard.nylas.com/register) +- [Sign up for the Nylas v3 Beta program to access the v3 Dashboard](https://info.nylas.com/apiv3betasignup.html?utm_source=github&utm_medium=devrel-surfaces&utm_campaign=&utm_content=node-sdk-upgrade) +- [Nylas API v3 Quickstart Guide](https://developer.nylas.com/docs/v3-beta/v3-quickstart/) +- [Nylas SDK Reference](https://nylas-nodejs-sdk-reference.pages.dev/) - [Nylas API Reference](https://developer.nylas.com/docs/api/) - +- [Nylas Samples repo for code samples and example applications](https://github.com/orgs/nylas-samples/repositories?q=&type=all&language=javascript) ## ⚙️ Install -To run the Nylas Node SDK, you will first need to have [Node](https://nodejs.org/en/download/) and [npm](https://www.npmjs.com/get-npm) installed on your machine. +**Note:** The Nylas Node SDK requires Node.js v16 or later. + +### Set up using npm + +To run the Nylas Node SDK, first install [Node](https://nodejs.org/en/download/) and [npm](https://www.npmjs.com/get-npm) on your machine. Then, head to the nearest command line and run the following: `npm install nylas` -Alternatively, if you prefer to use [Yarn](https://yarnpkg.com/en/), you can install the Nylas Node SDK with `yarn add nylas` +Alternatively, you can use [Yarn](https://yarnpkg.com/en/) to install the Nylas Node SDK by running the `yarn add nylas` command. + +### Build from source To install this package from source, clone this repo and run `npm install` from inside the project directory. @@ -37,27 +46,41 @@ npm install ## ⚡️ Usage -Every resource (i.e., messages, events, contacts) is accessed via an instance of `Nylas`. Before making any requests, be sure to call `config` and initialize the `Nylas` instance with your `clientId` and `clientSecret`. Then, call `with` and pass it your `accessToken`. The `accessToken` allows `Nylas` to make requests for a given account's resources. +To use this SDK, you must first [get a free Nylas account](https://dashboard.nylas.com/register). -```javascript -const Nylas = require('nylas'); +Then, follow the Quickstart guide to [set up your first app and get your API keys](https://developer.nylas.com/docs/v3-beta/v3-quickstart/). -Nylas.config({ - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET, -}); +For code examples that demonstrate how to use this SDK, take a look at our [Node repos in the Nylas Samples collection](https://github.com/orgs/nylas-samples/repositories?q=&type=all&language=javascript&sort=). + +### 🚀 Making Your First Request + +You access Nylas resources (messages, calendars, events, contacts) through an instance of `Nylas`. The `Nylas` object must be initialized with your Nylas API key, and you can provide other additional configurations such as the Nylas API url and the timeout. + +```typescript +import Nylas from "nylas"; -const nylas = Nylas.with(ACCESS_TOKEN); +const nylas = new Nylas({ + apiKey: "NYLAS_API_KEY", +}); ``` -Then, you can use Nylas to access information about a user's account: -```javascript -nylas.threads.list({}).then(threads => { - console.log(threads.length); +Once initialized you can use the object to make requests for a given account's resources, for example to list all the calendars for a given account: + +```typescript +nylas.calendars.list({ identifier: "GRANT_ID" }).then(calendars => { + console.log(calendars); }); ``` -For more information about how to use the Nylas Node SDK, [take a look at our quickstart guide](https://developer.nylas.com/docs/developer-tools/sdk/node-sdk/). +## 📚 Documentation + +Nylas maintains a [reference guide for the Node SDK](https://nylas-nodejs-sdk-reference.pages.dev/) to help you get familiar with the available methods and classes. + +## ✨ Upgrading from 6.x + +See [UPGRADE.md](UPGRADE.md) for instructions on upgrading from 6.x to 7.x. + +**Note**: The Node SDK v7.x is not compatible with the Nylas API earlier than v3-beta. ## 💙 Contributing @@ -65,6 +88,4 @@ Please refer to [Contributing](Contributing.md) for information about how to mak ## 📝 License -This project is licensed under the terms of the MIT license. Please refer to [LICENSE](LICENSE.txt) for the full terms. - - +This project is licensed under the terms of the MIT license. Please refer to [LICENSE](LICENSE.txt) for the full terms. diff --git a/UPGRADE.md b/UPGRADE.md new file mode 100644 index 00000000..648a23ac --- /dev/null +++ b/UPGRADE.md @@ -0,0 +1,200 @@ +# Upgrading to Nylas Node SDK v7.0 + +The Nylas Node SDK has been refactored and large parts of it have been rewritten for the upcoming release of the [Nylas API v3](https://developer.nylas.com/docs/v3-beta/). The goal was to have a product that is intuitive and easier to use. This guide helps you upgrade your code to use the new SDK. The new SDK also includes [documentation for the SDK's methods and models](https://nylas-nodejs-sdk-reference.pages.dev/) so you can easily find the implementation details you need. + +Head's up! Nylas API v3 [contains a lot of changes](https://developer.nylas.com/docs/v3-beta/features-and-changes/), and you should familiarize yourself with them before you start upgrading. + +⚠️ **Note:** The Nylas Node SDK v7.0 is not compatible with Nylas APIs earlier than 3.0 beta. If you are still using an earlier version of the API (such as Nylas v2.7), keep using the Nylas Node SDK v6.x until you can upgrade. + +## Initial Set up + +To upgrade to the new SDK, update your dependencies to use the new version. Do this by installing the new version of the SDK using npm or yarn. + +**Note:** The a minimum Node version is now the lowest supported LTS, Node v16. + +```bash +npm install nylas@beta +``` + +The first step to using the new SDK is to initialize a new instance of the Nylas SDK. Do this by passing in your API key to the constructor. You will notice a few changes here. + +First, the Nylas SDK is now a hybrid Node project, meaning we are using both CommonJS and ES6 modules. This means that you can import the Nylas SDK using either `require` or `import`. + +The second change is that the Nylas SDK entrypoint is no longer static. Instead of importing the Nylas SDK directly, you import the `Nylas` class from the SDK. This allows you to create multiple instances of the Nylas SDK, each with their own configuration. + +```typescript +import Nylas from "nylas"; + +const nylas = new Nylas({ + apiKey: "NYLAS_API_KEY", // Required to make API calls +}) +``` + +From here, you can use the `Nylas` instance to make API requests by accessing the different resources configured with your API Key. + +## New Models + +The new Nylas Node SDK now includes a specific model for each outgoing call to the Nylas API. Let's take a Nylas calendar object for example. In the previous SDK version there was only one `Calendar` object, and it simultaneously represented a Calendar that: + +- Is to be created +- Is to be updated +- Or is to be retrieved + +This meant that the models like the `Calendar` model had to be configured with _all_ the possible fields that could ever be used in any of the above scenarios. This made object very large and hard to anticipate as a developer. The new Node SDK has split the `Calendar` model into three models, one for each of the scenarios above. + +- `Calendar` (for retrieving a calendar) +- `CreateCalenderRequest` (for creating a calendar) +- `UpdateCalendarRequest` (for updating a calendar) + +```typescript +// Import only required if you need the typing +import { CreateCalendarRequest, UpdateCalendarRequest } from "nylas/lib/types/models/calendars"; + +const createCalendarRequest: CreateCalendarRequest = { + name: "My Calendar", // Calendar name is required + description: "This is my calendar", // Calendar description is optional + location: "My calendar location", // Calendar location is optional + timezone: "America/New_York", // Calendar timezone is optional +} + +const updateCalendarRequest: UpdateCalenderRequest = { + name: "My Updated Calendar", // All fields are optional since we are updating + hexColor: "#000000", // Other fields not present during creation are now available +} +``` + +Furthermore, these models are no longer classes but TypeScript interfaces. We also removed all functions that make API calls from the models. This means that the models are now just data structures, which makes them easier to understand and use. This includes the `save()` function. Instead now you can use the `create()`, `update()`, and `destroy()` functions on the resource class to make those requests to the API. + +## Making Requests to the Nylas API + +You use the `Nylas` instance you configured earlier to make requests to the Nylas API. The SDK is organized into different resources corresponding to each of the Email, Calendar, and Contacts APIs, and each resource includes all the available methods to make requests to that API. + +For example, to get a list of calendars, you can do so like: + +```typescript +import Nylas from "nylas"; +import { NylasListResponse } from "nylas/lib/types/models/responses"; +import { Calendar } from "nylas/lib/types/models/calendars"; + +const nylas = new Nylas({ + apiKey: "NYLAS_API_KEY", +}); + +const response: NylasListResponse = await + nylas.calendars.list({ + identifier: "GRANT_ID", // Required, the grant ID of the account to make the request for + }); +``` + +You might notice in the code above that there are some new concepts in the new SDK when making requests. These concepts are explained in more detail below. + +### Resource Parameters + +Each resource takes different parameters. All resources take an "identifier", which is the ID of the account ("grant") you want to make the request for. This is usually the Grant ID or the email address of the account. Some resources also take "query parameters" which are mainly used to filter data or pass in additional information. There are models available for all the query parameters that can be passed in. For example, listing a calendar you have `ListCalendersQueryParams`: + +```typescript +import Nylas from "nylas"; +import { NylasListResponse } from "nylas/lib/types/models/responses"; +import { Calendar, ListCalendersQueryParams } from "nylas/lib/types/models/calendars"; + +const nylas = new Nylas({ + apiKey: "NYLAS_API_KEY", +}); + +const queryParams: ListCalendersQueryParams = { + limit: 10 +} + +const response: NylasListResponse = await + nylas.calendars.list({ + identifier: "GRANT_ID", + queryParams, // Now you will get a maximum of 10 calendars back + }); +``` + +### Response Objects + +The new Nylas API v3 now has standard response objects for all requests (excluding OAuth endpoints). There are generally two main types of response objects: `NylasResponse` and `NylasListResponse`. + +The `NylasResponse` object is used for requests that return a single object, such as retrieving a single calendar. This returns a parameterized object of the type you are requesting (for example `Calendar`), and a string that represents the request ID. + +The `NylasListResponse` object is used for requests that return a list of objects, such as retrieving a _list_ of calendars. This returns a list of parameterized objects of the type you are requesting (for example, `Calendar`), a string representing the request ID, and another string representing the token of the next page for paginating a request. + +### Pagination + +The pagination mechanics have changes in Nylas API v3. Now, Nylas sends a `nextCursor` with a token value for the next page, if the "list" response returns more than one page of results. This means the v7.0 Node SDK now handles pagination differently. There are two ways to paginate a request: you can use the `next()` function to access the next page, or you can use a `for await...of` loop to auto-paginate until the end of the list. + +```typescript +// Get a list of Calendars +const calendars = nylas.calendars.list({ + identifier: 'Grant_ID', +}); + +// Option 1 - Use the next() function to get the next page +const nextPage = await calendars.next(); + +// Option 2 - Use a for await...of loop to auto-paginate until the end +for await (const item of calendars) { + // do something with each item +} +``` + +### Error Objects + +Like the response objects, Nylas v3 now has standard error objects for all requests (excluding OAuth endpoints). There are two superclass error classes, `AbstractNylasApiError`, used for errors returned by the API, and `AbstractNylasSdkError`, used for errors returned by the SDK. + +The `AbstractNylasApiError` includes two subclasses: `NylasOAuthError`, used for API errors that are returned from the OAuth endpoints, and `NylasApiError`, used for any other Nylas API errors. + +The SDK extracts the error details from the response and stores them in the error object, along with the request ID and the HTTP status code. + +`AbstractNylasSdkError` is used for errors returned by the SDK. Right now there's only one type of error we return, and that's a `NylasSdkTimeoutError` which is thrown when a request times out. + +## Authentication + +The SDK's authentication methods reflect [the methods available in the new Nylas API v3](https://developer.nylas.com/docs/developer-guide/v3-authentication/). While you can only create and manage your application's connectors (formerly called integrations) in the dashboard, you can manage almost everything else directly from the SDK. This includes managing grants, redirect URIs, OAuth tokens, and authenticating your users. + +There are two main methods to focus on when authenticating users to your application. The first is the `Auth#urlForOAuth2` method, which returns the URL that you should redirect your users to in order to authenticate them using Nylas' OAuth 2.0 implementation. + +The second is the `Auth#exchangeCodeForToken` method. Use this method to exchange the code Nylas returned from the authentication redirect for an access token from the OAuth provider. Nylas's response to this request includes both the access token, and information about the grant that was created. You don't _need_ to use the `grant_id` to make requests. Instead, you can use the authenticated email address directly as the identifier for the account. If you prefer to use the `grant_id`, you can extract it from the `CodeExchangeResponse` object and use that instead. + +The following code shows how to authenticate a user into a Nylas application: + +```typescript +import Nylas from "nylas"; + +const nylas = new Nylas({ + api_key: "NYLAS_API_KEY", +}); + +// Build the URL for authentication +const authURL = nylas.auth.urlForOAuth2({ + clientId: "CLIENT_ID", + redirectUri: "REDIRECT_URI", + loginHint: "example@email.com" +}); + +// Write code here to redirect the user to the url and parse the code +... + +// Exchange the code for an access token + +const codeExchangeResponse = nylas.auth.exchangeCodeForToken({ + redirectUri: "REDIRECT_URI", + clientId: "CLIENT_ID", + clientSecret: "CLIENT_SECRET", + code: "CODE" +}); + +// Now you can either use the email address that was authenticated or the grant ID in the response as the identifier + +const responseWithEmail: NylasListResponse = await + nylas.calendars.list({ + identifier: "example@email.com", + }); + +const responseWithGrant: NylasListResponse = await + nylas.calendars.list({ + identifier: codeExchangeResponse.grantId, + queryParams, // Now you will get a maximum of 10 calendars back + }); +``` diff --git a/__tests__/account-spec.js b/__tests__/account-spec.js deleted file mode 100644 index 11f4d061..00000000 --- a/__tests__/account-spec.js +++ /dev/null @@ -1,46 +0,0 @@ -import NylasConnection from '../src/nylas-connection'; - -describe('account', () => { - let testContext; - const linkedAtNum = 1520546095; - - beforeEach(() => { - testContext = {}; - testContext.connection = new NylasConnection('123', { clientId: 'foo' }); - testContext.connection.request = jest.fn(() => - Promise.resolve({ - account_id: 'hecea680y4sborshkiraj17c', - email_address: 'jeremy@emmerge.com', - id: 'hecea680y4sborshkiraj17c', - name: '', - object: 'account', - organization_unit: 'folder', - provider: 'eas', - sync_state: 'running', - linked_at: linkedAtNum, - }) - ); - }); - - test('should fetch an account model', done => { - testContext.connection.account.get(); - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'GET', - path: '/account', - qs: {}, - }); - done(); - }); - - test('account attributes should resolve', done => { - testContext.connection.account.get().then(function(account) { - expect(account.id).toBe('hecea680y4sborshkiraj17c'); - expect(account.emailAddress).toBe('jeremy@emmerge.com'); - expect(account.organizationUnit).toBe('folder'); - expect(account.provider).toBe('eas'); - expect(account.syncState).toBe('running'); - expect(account.linkedAt).toEqual(new Date(linkedAtNum * 1000)); - done(); - }); - }); -}); diff --git a/__tests__/calendar-restful-model-collection-spec.js b/__tests__/calendar-restful-model-collection-spec.js deleted file mode 100644 index bf87acdf..00000000 --- a/__tests__/calendar-restful-model-collection-spec.js +++ /dev/null @@ -1,385 +0,0 @@ -import fetch from 'node-fetch'; - -import Nylas from '../src/nylas'; -import NylasConnection from '../src/nylas-connection'; -import { Days, RoundRobin } from '../src/models/calendar-availability'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('CalendarRestfulModelCollection', () => { - let testContext; - const testAccessToken = 'test-access-token'; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection(testAccessToken, { - clientId: 'myClientId', - }); - jest.spyOn(testContext.connection, 'request'); - - const response = { - status: 200, - text: () => { - return Promise.resolve( - JSON.stringify({ - body: 'body', - }) - ); - }, - headers: new Map(), - }; - - fetch.mockImplementation(() => Promise.resolve(response)); - }); - - test('[DELETE] should use correct route, method and auth', done => { - const calendarId = 'id123'; - - return testContext.connection.calendars.delete(calendarId).then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - `https://api.nylas.com/calendars/${calendarId}` - ); - expect(options.method).toEqual('DELETE'); - expect(options.headers['authorization']).toEqual( - `Basic ${Buffer.from(`${testAccessToken}:`, 'utf8').toString('base64')}` - ); - done(); - }); - }); - - describe('Free Busy', () => { - test('Should fetch results with params', done => { - const response = { - status: 200, - text: () => { - return Promise.resolve( - JSON.stringify([ - { - object: 'free_busy', - email: 'jane@email.com', - time_slots: [ - { - object: 'time_slot', - status: 'busy', - start_time: 1590454800, - end_time: 1590780800, - capacity: { - event_id: 'abc-123', - current_capacity: 2, - max_capacity: 5, - }, - }, - ], - }, - ]) - ); - }, - headers: new Map(), - }; - fetch.mockImplementation(() => Promise.resolve(response)); - - const params = { - startTime: 1590454800, - endTime: 1590780800, - emails: ['jane@email.com'], - calendars: [ - { - accountId: 'test_account_id', - calendarIds: ['example_calendar_id_A', 'example_calendar_id_B'], - }, - ], - }; - - return testContext.connection.calendars - .freeBusy(params) - .then(freeBusy => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/calendars/free-busy' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - start_time: '1590454800', - end_time: '1590780800', - emails: ['jane@email.com'], - calendars: [ - { - account_id: 'test_account_id', - calendar_ids: [ - 'example_calendar_id_A', - 'example_calendar_id_B', - ], - }, - ], - }); - expect(options.headers['authorization']).toEqual( - `Basic ${Buffer.from(`${testAccessToken}:`, 'utf8').toString( - 'base64' - )}` - ); - expect(freeBusy.length).toEqual(1); - freeBusy = freeBusy[0]; - expect(freeBusy.object).toEqual('free_busy'); - expect(freeBusy.email).toEqual('jane@email.com'); - expect(freeBusy.timeSlots.length).toEqual(1); - const timeSlots = freeBusy.timeSlots[0]; - expect(timeSlots.object).toEqual('time_slot'); - expect(timeSlots.status).toEqual('busy'); - expect(timeSlots.startTime).toEqual(1590454800); - expect(timeSlots.endTime).toEqual(1590780800); - expect(timeSlots.capacity.eventId).toEqual('abc-123'); - expect(timeSlots.capacity.currentCapacity).toEqual(2); - expect(timeSlots.capacity.maxCapacity).toEqual(5); - done(); - }); - }); - - test('Should throw error if neither emails or calendars are passed in', done => { - const params = { - startTime: 1590454800, - endTime: 1590780800, - }; - - expect(() => testContext.connection.calendars.freeBusy(params)).toThrow(); - done(); - }); - }); - - describe('Availability', () => { - test('Should fetch results with params', done => { - const params = { - startTime: 1590454800, - endTime: 1590780800, - interval: 5, - duration: 30, - emails: ['jane@email.com'], - roundRobin: RoundRobin.MaxAvailability, - openHours: [ - { - emails: ['swag@nylas.com'], - days: [Days.Sunday, Days.Thursday], - timezone: 'America/Chicago', - start: '10:00', - end: '14:00', - }, - ], - calendars: [ - { - accountId: 'test_account_id', - calendarIds: ['example_calendar_id_A', 'example_calendar_id_B'], - }, - ], - }; - - return testContext.connection.calendars.availability(params).then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/calendars/availability' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - start_time: 1590454800, - end_time: 1590780800, - interval_minutes: 5, - duration_minutes: 30, - emails: ['jane@email.com'], - round_robin: 'max-availability', - free_busy: [], - open_hours: [ - { - emails: ['swag@nylas.com'], - days: [6, 3], - timezone: 'America/Chicago', - start: '10:00', - end: '14:00', - object_type: 'open_hours', - }, - ], - calendars: [ - { - account_id: 'test_account_id', - calendar_ids: ['example_calendar_id_A', 'example_calendar_id_B'], - }, - ], - }); - expect(options.headers['authorization']).toEqual( - `Basic ${Buffer.from(`${testAccessToken}:`, 'utf8').toString( - 'base64' - )}` - ); - done(); - }); - }); - - test('Should throw error if neither emails or calendars are passed in', done => { - const params = { - startTime: 1590454800, - endTime: 1590780800, - interval: 5, - duration: 30, - }; - - expect(() => - testContext.connection.calendars.availability(params) - ).toThrow(); - done(); - }); - }); - - describe('Consecutive Availability', () => { - test('Should fetch results with params', done => { - const params = { - startTime: 1590454800, - endTime: 1590780800, - interval: 5, - duration: 30, - emails: [['jane@email.com'], ['swag@nylas.com']], - freeBusy: [ - { - email: 'jane@email.com', - timeSlots: [ - { - status: 'busy', - startTime: 1590454800, - endTime: 1590780800, - }, - ], - }, - ], - openHours: [ - { - emails: ['jane@email.com', 'swag@nylas.com'], - days: [Days.Sunday], - timezone: 'America/Chicago', - start: '10:00', - end: '14:00', - }, - ], - calendars: [ - { - accountId: 'test_account_id', - calendarIds: ['example_calendar_id_A', 'example_calendar_id_B'], - }, - ], - }; - - return testContext.connection.calendars - .consecutiveAvailability(params) - .then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/calendars/availability/consecutive' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - start_time: 1590454800, - end_time: 1590780800, - interval_minutes: 5, - duration_minutes: 30, - emails: [['jane@email.com'], ['swag@nylas.com']], - free_busy: [ - { - email: 'jane@email.com', - object: 'free_busy', - time_slots: [ - { - object: 'time_slot', - status: 'busy', - start_time: 1590454800, - end_time: 1590780800, - }, - ], - }, - ], - open_hours: [ - { - emails: ['jane@email.com', 'swag@nylas.com'], - days: [6], - timezone: 'America/Chicago', - start: '10:00', - end: '14:00', - object_type: 'open_hours', - }, - ], - calendars: [ - { - account_id: 'test_account_id', - calendar_ids: [ - 'example_calendar_id_A', - 'example_calendar_id_B', - ], - }, - ], - }); - expect(options.headers['authorization']).toEqual( - `Basic ${Buffer.from(`${testAccessToken}:`, 'utf8').toString( - 'base64' - )}` - ); - done(); - }); - }); - - test('Should throw error if open hour emails dont match free busy emails', done => { - const params = { - startTime: 1590454800, - endTime: 1590780800, - interval: 5, - duration: 30, - emails: [['jane@email.com']], - freeBusy: [ - { - email: 'jane@email.com', - timeSlots: [ - { - status: 'busy', - startTime: 1590454800, - endTime: 1590780800, - }, - ], - }, - ], - openHours: [ - { - emails: ['jane@email.com', 'swag@nylas.com'], - days: [Days.Sunday], - timezone: 'America/Chicago', - start: '10:00', - end: '14:00', - }, - ], - }; - - expect(() => - testContext.connection.calendars.consecutiveAvailability(params) - ).toThrow(); - done(); - }); - - test('Should throw error if neither emails or calendars are passed in', done => { - const params = { - startTime: 1590454800, - endTime: 1590780800, - interval: 5, - duration: 30, - }; - - expect(() => - testContext.connection.calendars.consecutiveAvailability(params) - ).toThrow(); - done(); - }); - }); -}); diff --git a/__tests__/calendar-spec.js b/__tests__/calendar-spec.js deleted file mode 100644 index 24888c63..00000000 --- a/__tests__/calendar-spec.js +++ /dev/null @@ -1,161 +0,0 @@ -import NylasConnection from '../src/nylas-connection'; -import Calendar from '../src/models/calendar'; -import fetch from 'node-fetch'; -import Nylas from '../src/nylas'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('Calendar', () => { - let testContext; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection('123', { clientId: 'foo' }); - const calendarJSON = { - account_id: 'eof2wrhqkl7kdwhy9hylpv9o9', - description: 'All the holidays', - id: '8e570s302fdazx9zqwiuk9jqn', - is_primary: false, - job_status_id: '48pp6ijzrxpw9jors9ylnsxnf', - location: 'Santa Monica, CA', - name: 'Holidays', - object: 'calendar', - read_only: false, - timezone: 'America/Los_Angeles', - hex_color: '#0099EE', - }; - jest.spyOn(testContext.connection, 'request'); - - const response = receivedBody => { - return { - status: 200, - text: () => { - if (receivedBody === null) { - return Promise.resolve(JSON.stringify(calendarJSON)); - } - - const j = JSON.parse(receivedBody.toString()); - if (!j.id) { - j.id = calendarJSON.id; - } - return Promise.resolve(JSON.stringify(j)); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(req => Promise.resolve(response(req.body))); - testContext.calendar = new Calendar(testContext.connection); - testContext.calendar.fromJSON(calendarJSON); - }); - - const sharedCalendarEvaluation = calendar => { - expect(calendar.id).toEqual('8e570s302fdazx9zqwiuk9jqn'); - expect(calendar.accountId).toEqual('eof2wrhqkl7kdwhy9hylpv9o9'); - expect(calendar.isPrimary).toEqual(false); - expect(calendar.location).toEqual('Santa Monica, CA'); - expect(calendar.name).toEqual('Holidays'); - expect(calendar.object).toEqual('calendar'); - expect(calendar.timezone).toEqual('America/Los_Angeles'); - expect(calendar.readOnly).toEqual(false); - expect(calendar.jobStatusId).toEqual('48pp6ijzrxpw9jors9ylnsxnf'); - expect(calendar.hexColor).toEqual('#0099EE'); - }; - - test('[SAVE] should do a POST request if the calendar has no id', done => { - expect.assertions(14); - testContext.calendar.id = undefined; - testContext.calendar.save().then(calendar => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/calendars'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - name: 'Holidays', - description: 'All the holidays', - location: 'Santa Monica, CA', - timezone: 'America/Los_Angeles', - }); - sharedCalendarEvaluation(calendar); - expect(calendar.description).toEqual('All the holidays'); - done(); - }); - }); - - test('[SAVE] should do a PUT request if the event has an id', done => { - expect.assertions(14); - testContext.calendar.id = '8e570s302fdazx9zqwiuk9jqn'; - testContext.calendar.description = 'Updated description'; - testContext.calendar.metadata = { - key: 'value', - }; - testContext.calendar.save().then(calendar => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/calendars/8e570s302fdazx9zqwiuk9jqn' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - name: 'Holidays', - description: 'Updated description', - location: 'Santa Monica, CA', - timezone: 'America/Los_Angeles', - metadata: { - key: 'value', - }, - }); - sharedCalendarEvaluation(calendar); - expect(calendar.description).toEqual('Updated description'); - done(); - }); - }); - - test('[FIND] should use correct method and route', done => { - expect.assertions(13); - testContext.connection.calendars - .find('8e570s302fdazx9zqwiuk9jqn') - .then(calendar => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/calendars/8e570s302fdazx9zqwiuk9jqn' - ); - expect(options.method).toEqual('GET'); - expect(options.body).toBeUndefined(); - sharedCalendarEvaluation(calendar); - done(); - }); - }); - - test('[GET job status] should use correct method and route', done => { - expect.assertions(3); - testContext.calendar.getJobStatus().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/job-statuses/48pp6ijzrxpw9jors9ylnsxnf' - ); - expect(options.method).toEqual('GET'); - expect(options.body).toBeUndefined(); - done(); - }); - }); - - test('[GET job status] should error without job status id', done => { - expect.assertions(1); - const error = new Error('jobStatusId must be defined'); - testContext.calendar.jobStatusId = undefined; - testContext.calendar.getJobStatus().catch(err => { - expect(err).toEqual(error); - done(); - }); - }); -}); diff --git a/__tests__/component-spec.js b/__tests__/component-spec.js deleted file mode 100644 index 8113151a..00000000 --- a/__tests__/component-spec.js +++ /dev/null @@ -1,241 +0,0 @@ -import Nylas from '../src/nylas'; -import NylasConnection from '../src/nylas-connection'; -import fetch from 'node-fetch'; -import Component from '../src/models/component'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('Component', () => { - let testContext; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection('123', { - clientId: 'myClientId', - }); - jest.spyOn(testContext.connection, 'request'); - - const response = receivedBody => { - return { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(receivedBody)); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(req => Promise.resolve(response(req.body))); - testContext.component = new Component(testContext.connection); - }); - - describe('save', () => { - test('should do a POST request if the component has no id', done => { - testContext.component.id = undefined; - return testContext.component.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/component/myClientId' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - id: undefined, - account_id: undefined, - object: undefined, - name: undefined, - type: undefined, - action: undefined, - active: undefined, - settings: undefined, - allowed_domains: undefined, - public_account_id: undefined, - public_token_id: undefined, - public_application_id: undefined, - created_at: undefined, - updated_at: undefined, - }); - done(); - }); - }); - - test('should do a PUT request if the component has an id', done => { - testContext.component.id = 'abc-123'; - testContext.component.allowedDomains = ['www.nylas.com']; - return testContext.component.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/component/myClientId/abc-123' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - id: undefined, - account_id: undefined, - object: undefined, - name: undefined, - type: undefined, - action: undefined, - active: undefined, - settings: undefined, - allowed_domains: ['www.nylas.com'], - public_account_id: undefined, - public_token_id: undefined, - public_application_id: undefined, - created_at: undefined, - updated_at: undefined, - }); - done(); - }); - }); - - test('should not send certain values if making a PUT', done => { - testContext.component.id = 'abc-123'; - testContext.component.type = 'agenda'; - testContext.component.publicApplicationId = 'test-123'; - testContext.component.accessToken = 'access-123'; - return testContext.component.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/component/myClientId/abc-123' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - id: undefined, - account_id: undefined, - object: undefined, - name: undefined, - type: undefined, - action: undefined, - active: undefined, - settings: undefined, - allowed_domains: undefined, - public_account_id: undefined, - public_token_id: undefined, - public_application_id: undefined, - created_at: undefined, - updated_at: undefined, - }); - done(); - }); - }); - }); - - describe('fetching', () => { - beforeEach(() => { - const componentJSON = { - id: 'abc-123', - account_id: 'account-123', - name: 'test-component', - type: 'agenda', - action: 0, - active: true, - settings: {}, - allowed_domains: [], - public_account_id: ['account-123'], - public_token_id: ['token-123'], - public_application_id: ['application-123'], - created_at: '2021-08-24T15:05:48.000Z', - updated_at: '2021-08-24T15:05:48.000Z', - }; - - const response = req => { - return { - status: 200, - text: () => { - if (!req.url.includes('abc-123')) { - return Promise.resolve(JSON.stringify([componentJSON])); - } - return Promise.resolve(JSON.stringify(componentJSON)); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(req => Promise.resolve(response(req))); - }); - - test('should do a GET request to the correct URL when requesting all components', done => { - return testContext.connection.component.list().then(componentList => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/component/myClientId?offset=0&limit=100' - ); - expect(options.method).toEqual('GET'); - expect(componentList.length).toBe(1); - expect(componentList[0].id).toEqual('abc-123'); - expect(componentList[0].accountId).toEqual('account-123'); - expect(componentList[0].name).toEqual('test-component'); - expect(componentList[0].type).toEqual('agenda'); - expect(componentList[0].action).toBe(0); - expect(componentList[0].active).toBe(true); - expect(componentList[0].settings).toEqual({}); - expect(componentList[0].allowedDomains).toEqual([]); - expect(componentList[0].publicAccountId).toEqual(['account-123']); - expect(componentList[0].publicTokenId).toEqual(['token-123']); - expect(componentList[0].publicApplicationId).toEqual([ - 'application-123', - ]); - expect(componentList[0].createdAt).toEqual( - new Date('2021-08-24T15:05:48.000Z') - ); - expect(componentList[0].updatedAt).toEqual( - new Date('2021-08-24T15:05:48.000Z') - ); - done(); - }); - }); - - test('should do a GET request to the correct URL when requesting a specific component', done => { - return testContext.connection.component - .find('abc-123') - .then(component => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/component/myClientId/abc-123' - ); - expect(options.method).toEqual('GET'); - expect(component.id).toEqual('abc-123'); - expect(component.accountId).toEqual('account-123'); - expect(component.name).toEqual('test-component'); - expect(component.type).toEqual('agenda'); - expect(component.action).toBe(0); - expect(component.active).toBe(true); - expect(component.settings).toEqual({}); - expect(component.allowedDomains).toEqual([]); - expect(component.publicAccountId).toEqual(['account-123']); - expect(component.publicTokenId).toEqual(['token-123']); - expect(component.publicApplicationId).toEqual(['application-123']); - expect(component.createdAt).toEqual( - new Date('2021-08-24T15:05:48.000Z') - ); - expect(component.updatedAt).toEqual( - new Date('2021-08-24T15:05:48.000Z') - ); - done(); - }); - }); - }); - - describe('delete', () => { - test('should do a DELETE request to the correct URL when deleting a', done => { - return testContext.connection.component.delete('abc-123').then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/component/myClientId/abc-123' - ); - expect(options.method).toEqual('DELETE'); - done(); - }); - }); - }); -}); diff --git a/__tests__/connect-spec.js b/__tests__/connect-spec.js deleted file mode 100644 index f082547b..00000000 --- a/__tests__/connect-spec.js +++ /dev/null @@ -1,125 +0,0 @@ -import Nylas from '../src/nylas'; -import { NativeAuthenticationProvider, Scope } from '../src/models/connect'; - -describe('Connect', () => { - const name = 'Connect Test'; - const password = 'connecting123'; - const scopeString = 'email.modify,email.send,calendar,contacts'; - const scopes = [ - Scope.EmailModify, - Scope.EmailSend, - Scope.Calendar, - Scope.Contacts, - ]; - const exchangeEmail = 'connect_test@outlook.com'; - const CLIENT_ID = 'abc'; - const CLIENT_SECRET = 'xyz'; - const authorizeOptions = (email, provider, settings) => { - return { - name: name, - emailAddress: email, - provider: provider, - settings: settings, - scopes: scopes, - }; - }; - const authorizeJSON = { - code: 'bOjq4Wt9ZAlCy0CSbVeDGDQ5PquytC', - }; - const tokenJSON = { - access_token: 'the-token', - account_id: 'the-account-id', - billing_state: 'paid', - email_address: 'erlich@aviato.com', - id: 'the-id', - linked_at: 1563496685, - name: 'Erlich Bachman', - object: 'account', - organization_unit: 'folder', - provider: 'eas', - sync_state: 'running', - }; - - describe('authorize without clientId', () => { - beforeEach(() => { - Nylas.config({}); - }); - - test('Should throw an error when the clientId is not passed in to Nylas.config()', done => { - expect.assertions(2); - const settings = { username: exchangeEmail, password: password }; - expect(() => - Nylas.connect.authorize( - authorizeOptions( - exchangeEmail, - NativeAuthenticationProvider.Exchange, - settings - ) - ) - ).toThrow(); - expect(() => Nylas.connect.token(authorizeJSON.code)).toThrow(); - done(); - }); - }); - - describe('authorize with clientId', () => { - beforeEach(() => { - Nylas.config({ - clientId: CLIENT_ID, - clientSecret: CLIENT_SECRET, - }); - }); - - test('Should do a POST request to /connect/authorize', done => { - expect.assertions(2); - const settings = { username: exchangeEmail, password: password }; - Nylas.connect.connection.request = jest.fn(() => - Promise.resolve(authorizeJSON) - ); - Nylas.connect - .authorize( - authorizeOptions( - exchangeEmail, - NativeAuthenticationProvider.Exchange, - settings - ) - ) - .then(resp => { - expect(resp).toEqual(authorizeJSON); - expect(Nylas.connect.connection.request).toHaveBeenCalledWith({ - method: 'POST', - path: '/connect/authorize', - body: { - client_id: CLIENT_ID, - name: name, - email_address: exchangeEmail, - provider: 'exchange', - settings: { username: exchangeEmail, password: password }, - scopes: scopeString, - }, - }); - done(); - }); - }); - - test('Should do a POST request to /connect/token', done => { - expect.assertions(2); - Nylas.connect.connection.request = jest.fn(() => - Promise.resolve(tokenJSON) - ); - Nylas.connect.token(authorizeJSON.code).then(resp => { - expect(resp.toJSON()).toEqual(tokenJSON); - expect(Nylas.connect.connection.request).toHaveBeenCalledWith({ - method: 'POST', - path: '/connect/token', - body: { - client_id: CLIENT_ID, - client_secret: CLIENT_SECRET, - code: authorizeJSON.code, - }, - }); - done(); - }); - }); - }); -}); diff --git a/__tests__/contact-restful-model-collection-spec.js b/__tests__/contact-restful-model-collection-spec.js deleted file mode 100644 index 75aa4a03..00000000 --- a/__tests__/contact-restful-model-collection-spec.js +++ /dev/null @@ -1,99 +0,0 @@ -import fetch from 'node-fetch'; - -import Nylas from '../src/nylas'; -import NylasConnection from '../src/nylas-connection'; -import { Group } from '../src/models/contact'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('RestfulModelCollection', () => { - let testContext; - const testAccessToken = 'test-access-token'; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection(testAccessToken, { - clientId: 'foo', - }); - jest.spyOn(testContext.connection, 'request'); - - const contactJSON = [ - { - account_id: 'account123', - id: 'group123', - object: 'contact_group', - name: 'name123', - path: 'path123', - }, - ]; - - const response = { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(contactJSON)); - }, - headers: new Map(), - }; - - fetch.mockImplementation(() => Promise.resolve(response)); - }); - - describe('groups', () => { - test('should call API with correct authentication', done => { - expect.assertions(3); - - return testContext.connection.contacts.groups().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/contacts/groups' - ); - expect(options.method).toEqual('GET'); - expect(options.headers['authorization']).toEqual( - `Basic ${Buffer.from(`${testAccessToken}:`, 'utf8').toString( - 'base64' - )}` - ); - done(); - }); - }); - - const evaluateContactGroup = data => { - expect(data[0].accountId).toBe('account123'); - expect(data[0].id).toBe('group123'); - expect(data[0].object).toBe('contact_group'); - expect(data[0].name).toBe('name123'); - expect(data[0].path).toBe('path123'); - expect(data[0] instanceof Group).toBe(true); - }; - - test('should call callback', done => { - expect.assertions(7); - const testCallback = (err, data) => { - expect(err).toBe(null); - evaluateContactGroup(data); - done(); - }; - - return testContext.connection.contacts.groups(testCallback); - }); - - test('should resolve to group object', done => { - expect.assertions(6); - return testContext.connection.contacts.groups().then(data => { - evaluateContactGroup(data); - done(); - }); - }); - }); -}); diff --git a/__tests__/contact-spec.js b/__tests__/contact-spec.js deleted file mode 100644 index 1fd560d5..00000000 --- a/__tests__/contact-spec.js +++ /dev/null @@ -1,260 +0,0 @@ -import NylasConnection from '../src/nylas-connection'; -import Contact from '../src/models/contact'; -import Nylas from '../src/nylas'; -import fetch from 'node-fetch'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('Contact', () => { - let testContext; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection('123', { clientId: 'foo' }); - jest.spyOn(testContext.connection, 'request'); - - const response = receivedBody => { - return { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(receivedBody)); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(req => Promise.resolve(response(req.body))); - testContext.contact = new Contact(testContext.connection); - }); - - describe('save', () => { - test('should do a POST request if the contact has no id', done => { - testContext.contact.id = undefined; - return testContext.contact.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/contacts' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - given_name: undefined, - middle_name: undefined, - surname: undefined, - suffix: undefined, - nickname: undefined, - birthday: undefined, - job_title: undefined, - manager_name: undefined, - company_name: undefined, - office_location: undefined, - notes: undefined, - picture_url: undefined, - emails: [], - im_addresses: [], - physical_addresses: [], - phone_numbers: [], - web_pages: [], - groups: [], - source: undefined, - }); - done(); - }); - }); - test('should do a PUT request if the contact has id', done => { - testContext.contact.id = '1257'; - return testContext.contact.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/contacts/1257' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - given_name: undefined, - middle_name: undefined, - surname: undefined, - suffix: undefined, - nickname: undefined, - birthday: undefined, - job_title: undefined, - manager_name: undefined, - company_name: undefined, - office_location: undefined, - notes: undefined, - picture_url: undefined, - emails: [], - im_addresses: [], - physical_addresses: [], - phone_numbers: [], - web_pages: [], - groups: [], - source: undefined, - }); - done(); - }); - }); - }); - - describe('picture url', () => { - test('should make GET request for the picture', done => { - testContext.contact.id = 'a_pic_url'; - return testContext.contact.getPicture().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/contacts/a_pic_url/picture' - ); - expect(options.method).toEqual('GET'); - expect(options.body).toBeUndefined(); - done(); - }); - }); - }); - - describe('when the request succeeds', () => { - beforeEach(() => { - const contactProps = { - id: '1257', - object: 'contact', - accountId: '1234', - givenName: 'John', - middleName: 'Jacob', - surname: 'Jingleheimer Schmidt', - suffix: 'II', - nickname: 'John', - birthday: '2019-07-01', - companyName: 'Life', - jobTitle: 'artist', - managerName: 'April', - officeLocation: 'SF, CA, USA', - notes: 'lalala', - pictureUrl: 'example.com', - emailAddresses: [{ type: 'work', email: 'john@test.com' }], - imAddresses: [{ type: 'yahoo', imAddress: 'jjj' }], - physicalAddresses: [ - { - format: 'structured', - type: 'home', - streetAddress: '102 Test Dr', - city: 'Boston', - postalCode: '90210', - state: 'MA', - country: 'USA', - }, - ], - phoneNumbers: [{ type: 'mobile', number: '555-444-3333' }], - webPages: [{ type: 'blog', url: 'johnblogs.com' }], - groups: [ - { - id: '123', - object: 'contact_group', - accountId: '1234', - name: 'Fam', - path: 'Fam', - }, - ], - source: 'inbox', - }; - testContext.contact = new Contact(testContext.connection, contactProps); - }); - - test('should resolve with the contact object', done => { - testContext.contact.save().then(contact => { - expect(contact.id).toBe('1257'); - expect(contact.object).toBe('contact'); - expect(contact.accountId).toBe('1234'); - expect(contact.givenName).toBe('John'); - expect(contact.middleName).toBe('Jacob'); - expect(contact.surname).toBe('Jingleheimer Schmidt'); - expect(contact.suffix).toBe('II'); - expect(contact.nickname).toBe('John'); - expect(contact.birthday).toBe('2019-07-01'); - expect(contact.companyName).toBe('Life'); - expect(contact.jobTitle).toBe('artist'); - expect(contact.managerName).toBe('April'); - expect(contact.officeLocation).toBe('SF, CA, USA'); - expect(contact.notes).toBe('lalala'); - expect(contact.pictureUrl).toBe('example.com'); - expect(contact.emailAddresses[0].toJSON()).toEqual({ - type: 'work', - email: 'john@test.com', - }); - expect(contact.imAddresses[0].toJSON()).toEqual({ - type: 'yahoo', - im_address: 'jjj', - }); - expect(contact.physicalAddresses[0].toJSON()).toEqual({ - type: 'home', - city: 'Boston', - country: 'USA', - format: 'structured', - postal_code: '90210', - state: 'MA', - street_address: '102 Test Dr', - }); - expect(contact.phoneNumbers[0].toJSON()).toEqual({ - type: 'mobile', - number: '555-444-3333', - }); - expect(contact.webPages[0].toJSON()).toEqual({ - type: 'blog', - url: 'johnblogs.com', - }); - expect(contact.groups[0].toJSON()).toEqual({ - id: '123', - object: 'contact_group', - account_id: '1234', - name: 'Fam', - path: 'Fam', - }); - expect(contact.source).toBe('inbox'); - done(); - }); - }); - - test('should call the callback with the contact object', done => { - return testContext.contact.save().then(contact => { - expect(contact.id).toBe('1257'); - expect(contact.givenName).toBe('John'); - expect(contact.middleName).toBe('Jacob'); - expect(contact.surname).toBe('Jingleheimer Schmidt'); - done(); - }); - }); - }); - - describe('when the request fails', () => { - beforeEach(() => { - testContext.error = new Error('Network error'); - testContext.connection.request = jest.fn(() => - Promise.reject(testContext.error) - ); - }); - - test('should reject with the error', done => { - testContext.contact.save().catch(err => { - expect(err).toBe(testContext.error); - done(); - }); - }); - - test('should call the callback with the error', done => { - testContext.contact - .save((err, contact) => { - expect(err).toBe(testContext.error); - expect(contact).toBe(undefined); - done(); - }) - .catch(() => {}); - }); - }); -}); diff --git a/__tests__/delta-spec.js b/__tests__/delta-spec.js deleted file mode 100644 index 66660cc8..00000000 --- a/__tests__/delta-spec.js +++ /dev/null @@ -1,457 +0,0 @@ -import { PassThrough } from 'stream'; -import fetch, { Response } from 'node-fetch'; -import * as config from '../src/config.ts'; -import NylasConnection from '../src/nylas-connection'; -import Delta from '../src/models/delta'; -import DeltaCollection from '../src/models/delta-collection'; -import { Deltas } from '../src/models/deltas'; - -jest.mock('node-fetch', () => { - const { Request, Response, Headers } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - fetch.Headers = Headers; - return fetch; -}); - -describe('Delta', () => { - let testContext; - - beforeEach(() => { - testContext = {}; - testContext.connection = new NylasConnection('123', { clientId: 'foo' }); - testContext.delta = new DeltaCollection(testContext.connection); - jest.useFakeTimers(); - }); - - describe('startStream (delta streaming)', () => { - config.setApiServer('https://api.nylas.com'); - - // Listens to the 'delta' event on the stream and pushes them to the returned array. - const observeDeltas = stream => { - const deltas = []; - stream.on('delta', delta => deltas.push(delta)); - return deltas; - }; - - test('start and close stream', async () => { - fetch.mockImplementation(() => - Promise.resolve(new Response(new PassThrough(), { status: 200 })) - ); - const stream = await testContext.delta.startStream('deltacursor0'); - const { request, controller } = stream.requestInfo; - - expect(request.method).toBe('GET'); - expect(request.url).toBe( - `${config.apiServer}/delta/streaming?cursor=deltacursor0` - ); - - expect(controller.signal.aborted).toEqual(false); - stream.close(); - expect(controller.signal.aborted).toEqual(true); - expect(stream.requestInfo).toEqual(undefined); - - // Make sure the stream doesn't auto-restart if explicitly closed. - jest.runTimersToTime(Delta.streamingTimeoutMs + 500); - expect(stream.requestInfo).toEqual(undefined); - }); - - test('passes the correct params to the request', async () => { - fetch.mockImplementation(() => - Promise.resolve(new Response(new PassThrough(), { status: 200 })) - ); - const stream = await testContext.delta.startStream('deltacursor0', { - expanded: true, - includeTypes: ['thread', 'message'], - excludeTypes: ['event'], - }); - const { request } = stream.requestInfo; - - expect(request.method).toBe('GET'); - const search = [ - 'view=expanded', - 'cursor=deltacursor0', - 'exclude_types=event', - `include_types=thread%2Cmessage`, - ].join('&'); - expect(request.url).toBe(`${config.apiServer}/delta/streaming?${search}`); - }); - - test('stream response parsing', async () => { - const response = new Response(new PassThrough(), { status: 200 }); - fetch.mockImplementation(() => Promise.resolve(response)); - const stream = await testContext.delta.startStream('deltacursor0'); - const deltas = observeDeltas(stream); - - expect(deltas).toEqual([]); - expect(stream.cursor).toEqual('deltacursor0'); - - const delta1 = { - cursor: 'deltacursor1', - attributes: {}, - object: 'thread', - event: 'create', - id: 'deltaid1', - }; - - response.body.write(JSON.stringify(delta1)); - expect(deltas).toEqual([delta1]); - expect(stream.cursor).toEqual('deltacursor1'); - - stream.close(); - }); - - test('stream response parsing, delta split across data packets', async () => { - const response = new Response(new PassThrough(), { status: 200 }); - fetch.mockImplementation(() => Promise.resolve(response)); - const stream = await testContext.delta.startStream('deltacursor0'); - const deltas = observeDeltas(stream); - - expect(deltas).toEqual([]); - expect(stream.cursor).toEqual('deltacursor0'); - - const delta1 = { - cursor: 'deltacursor1', - attributes: {}, - object: 'thread', - event: 'create', - id: 'deltaid1', - }; - const deltaStr = JSON.stringify(delta1); - - // Partial data packet will not result in a delta yet... - response.body.write(deltaStr.substring(0, 20)); - expect(deltas).toEqual([]); - expect(stream.cursor).toEqual('deltacursor0'); - - // ...now the rest of the delta comes in, and there should be a delta object. - response.body.write(deltaStr.substring(20)); - expect(deltas).toEqual([delta1]); - expect(stream.cursor).toEqual('deltacursor1'); - - stream.close(); - }); - - test('stream timeout and auto-restart', async () => { - const response = new Response(new PassThrough(), { status: 200 }); - fetch.mockImplementation(() => Promise.resolve(response)); - const stream = await testContext.delta.startStream('deltacursor0'); - const requestInfo = stream.requestInfo; - const { controller } = requestInfo; - - expect(stream.cursor).toEqual('deltacursor0'); - - // Server sends a heartbeat every 5 seconds. - response.body.write('\n'); - jest.runTimersToTime(5000); - expect(controller.signal.aborted).toEqual(false); - response.body.write('\n'); - expect(controller.signal.aborted).toEqual(false); - - // Actual response packets also reset the timeout. - jest.runTimersToTime(5000); - const delta1 = { cursor: 'deltacursor1' }; - response.body.write(JSON.stringify(delta1)); - expect(stream.cursor).toEqual('deltacursor1'); - jest.runTimersToTime(5500); - expect(controller.signal.aborted).toEqual(false); - - // If the timeout has elapsed since the last data received, the stream is restarted. - jest.runTimersToTime(Delta.streamingTimeoutMs); - // The old request should have been aborted, and a new request created. - expect(controller.signal.aborted).toEqual(true); - expect(stream.requestInfo).not.toBe(requestInfo); - // The new request should be using the last delta cursor received prior to timeout. - expect(stream.requestInfo.request.url).toBe( - `${config.apiServer}/delta/streaming?cursor=deltacursor1` - ); - - stream.close(); - }); - }); - - describe('latestCursor', () => { - test('returns a cursor', done => { - testContext.connection.request = jest.fn(() => - Promise.resolve({ cursor: 'abcdefg' }) - ); - - return testContext.delta - .latestCursor(() => { - // do nothing. - }) - .then(cursor => { - expect(cursor).toEqual('abcdefg'); - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'POST', - path: '/delta/latest_cursor', - }); - done(); - }); - }); - - test('returns a null cursor in case of an error', done => { - testContext.connection.request = jest.fn(() => Promise.reject('Error.')); - return testContext.delta - .latestCursor(() => { - // do nothing. - }) - .catch(e => { - expect(e).toEqual('Error.'); - done(); - }); - }); - }); - - describe('deserialize', () => { - test('returns a cursor', done => { - const json = { - cursor_start: 'start_cursor', - cursor_end: 'end_cursor', - deltas: [ - { - attributes: { - account_id: 'aid-5678', - given_name: 'First', - surname: 'Last', - id: 'id-1234', - object: 'contact', - }, - cursor: 'contact_cursor', - event: 'create', - id: 'delta-1', - object: 'contact', - }, - { - attributes: { - account_id: 'aid-5678', - content_type: 'text/plain', - filename: 'sample.txt', - id: 'id-1234', - object: 'file', - size: 123, - }, - cursor: 'file_cursor', - event: 'create', - id: 'delta-2', - object: 'file', - }, - { - attributes: { - account_id: 'aid-5678', - to: [{ email: 'foo', name: 'bar' }], - subject: 'foo', - id: 'id-1234', - object: 'message', - }, - cursor: 'message_cursor', - event: 'create', - id: 'delta-3', - object: 'message', - }, - { - attributes: { - account_id: 'aid-5678', - to: [{ email: 'foo', name: 'bar' }], - subject: 'foo', - id: 'id-1234', - object: 'draft', - }, - cursor: 'draft_cursor', - event: 'create', - id: 'delta-4', - object: 'draft', - }, - { - attributes: { - account_id: 'aid-5678', - subject: 'Subject', - id: 'id-1234', - object: 'thread', - }, - cursor: 'thread_cursor', - event: 'create', - id: 'delta-5', - object: 'thread', - }, - { - attributes: { - id: 'id-1234', - title: 'test event', - when: { time: 1409594400, object: 'time' }, - participants: [ - { - name: 'foo', - email: 'bar', - status: 'noreply', - comment: 'This is a comment', - phone_number: '416-000-0000', - }, - ], - ical_uid: 'id-5678', - master_event_id: 'master-1234', - original_start_time: 1409592400, - }, - cursor: 'event_cursor', - event: 'create', - id: 'delta-6', - object: 'event', - }, - { - attributes: { - account_id: 'aid-5678', - id: 'id-1234', - object: 'folder', - name: 'inbox', - display_name: 'name', - }, - cursor: 'folder_cursor', - event: 'create', - id: 'delta-7', - object: 'folder', - }, - { - attributes: { - account_id: 'aid-5678', - id: 'id-1234', - object: 'label', - name: 'inbox', - }, - cursor: 'label_cursor', - event: 'create', - id: 'delta-8', - object: 'label', - }, - ], - }; - - testContext.connection.request = jest.fn(() => Promise.resolve(json)); - const deltas = new Deltas(testContext.connection).fromJSON(json); - - expect(deltas.cursorStart).toEqual('start_cursor'); - expect(deltas.cursorEnd).toEqual('end_cursor'); - expect(deltas.deltas.length).toBe(8); - - expect(deltas.deltas[0].cursor).toEqual('contact_cursor'); - expect(deltas.deltas[0].event).toEqual('create'); - expect(deltas.deltas[0].id).toEqual('delta-1'); - expect(deltas.deltas[0].object).toEqual('contact'); - expect(deltas.deltas[0].objectAttributes.givenName).toEqual('First'); - expect(deltas.deltas[0].objectAttributes.surname).toEqual('Last'); - - expect(deltas.deltas[1].cursor).toEqual('file_cursor'); - expect(deltas.deltas[1].event).toEqual('create'); - expect(deltas.deltas[1].id).toEqual('delta-2'); - expect(deltas.deltas[1].object).toEqual('file'); - expect(deltas.deltas[1].objectAttributes.filename).toEqual('sample.txt'); - expect(deltas.deltas[1].objectAttributes.size).toEqual(123); - expect(deltas.deltas[1].objectAttributes.contentType).toEqual( - 'text/plain' - ); - - expect(deltas.deltas[2].cursor).toEqual('message_cursor'); - expect(deltas.deltas[2].event).toEqual('create'); - expect(deltas.deltas[2].id).toEqual('delta-3'); - expect(deltas.deltas[2].object).toEqual('message'); - expect(deltas.deltas[2].objectAttributes.to[0].email).toEqual('foo'); - expect(deltas.deltas[2].objectAttributes.to[0].name).toEqual('bar'); - expect(deltas.deltas[2].objectAttributes.subject).toEqual('foo'); - - expect(deltas.deltas[3].cursor).toEqual('draft_cursor'); - expect(deltas.deltas[3].event).toEqual('create'); - expect(deltas.deltas[3].id).toEqual('delta-4'); - expect(deltas.deltas[3].object).toEqual('draft'); - expect(deltas.deltas[3].objectAttributes.to[0].email).toEqual('foo'); - expect(deltas.deltas[3].objectAttributes.to[0].name).toEqual('bar'); - expect(deltas.deltas[3].objectAttributes.subject).toEqual('foo'); - - expect(deltas.deltas[4].cursor).toEqual('thread_cursor'); - expect(deltas.deltas[4].event).toEqual('create'); - expect(deltas.deltas[4].id).toEqual('delta-5'); - expect(deltas.deltas[4].object).toEqual('thread'); - expect(deltas.deltas[4].objectAttributes.subject).toEqual('Subject'); - - expect(deltas.deltas[5].cursor).toEqual('event_cursor'); - expect(deltas.deltas[5].event).toEqual('create'); - expect(deltas.deltas[5].id).toEqual('delta-6'); - expect(deltas.deltas[5].object).toEqual('event'); - expect(deltas.deltas[5].objectAttributes.participants[0].name).toEqual( - 'foo' - ); - expect(deltas.deltas[5].objectAttributes.participants[0].email).toEqual( - 'bar' - ); - expect(deltas.deltas[5].objectAttributes.participants[0].status).toEqual( - 'noreply' - ); - expect(deltas.deltas[5].objectAttributes.participants[0].comment).toEqual( - 'This is a comment' - ); - expect( - deltas.deltas[5].objectAttributes.participants[0].phoneNumber - ).toEqual('416-000-0000'); - expect(deltas.deltas[5].objectAttributes.title).toEqual('test event'); - expect(deltas.deltas[5].objectAttributes.when.time).toEqual(1409594400); - expect(deltas.deltas[5].objectAttributes.iCalUID).toEqual('id-5678'); - expect(deltas.deltas[5].objectAttributes.masterEventId).toEqual( - 'master-1234' - ); - expect(deltas.deltas[5].objectAttributes.originalStartTime).toEqual( - new Date(1409592400 * 1000) - ); - - expect(deltas.deltas[6].cursor).toEqual('folder_cursor'); - expect(deltas.deltas[6].event).toEqual('create'); - expect(deltas.deltas[6].id).toEqual('delta-7'); - expect(deltas.deltas[6].object).toEqual('folder'); - expect(deltas.deltas[6].objectAttributes.name).toEqual('inbox'); - expect(deltas.deltas[6].objectAttributes.displayName).toEqual('name'); - - expect(deltas.deltas[7].cursor).toEqual('label_cursor'); - expect(deltas.deltas[7].event).toEqual('create'); - expect(deltas.deltas[7].id).toEqual('delta-8'); - expect(deltas.deltas[7].object).toEqual('label'); - expect(deltas.deltas[7].objectAttributes.name).toEqual('inbox'); - done(); - }); - }); - - describe('since', () => { - test('returns a cursor', done => { - const json = { - cursor_start: 'start_cursor', - cursor_end: 'end_cursor', - deltas: [ - { - attributes: { - account_id: 'aid-5678', - content_type: 'text/plain', - filename: 'sample.txt', - id: 'id-1234', - object: 'file', - size: 123, - }, - cursor: 'file_cursor', - event: 'create', - id: 'id-1234', - object: 'file', - }, - ], - }; - - testContext.connection.request = jest.fn(() => Promise.resolve(json)); - - return testContext.delta.since('end_cursor').then(() => { - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'GET', - path: '/delta', - qs: { - cursor: 'end_cursor', - }, - }); - done(); - }); - }); - }); -}); diff --git a/__tests__/draft-spec.js b/__tests__/draft-spec.js deleted file mode 100644 index 0d582fad..00000000 --- a/__tests__/draft-spec.js +++ /dev/null @@ -1,635 +0,0 @@ -import NylasConnection from '../src/nylas-connection'; -import Draft from '../src/models/draft'; -import Message from '../src/models/message'; -import Nylas from '../src/nylas'; -import fetch from 'node-fetch'; -import File from '../src/models/file'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('Draft', () => { - let testContext; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection('123', { clientId: 'foo' }); - jest.spyOn(testContext.connection, 'request'); - - const response = receivedBody => { - return { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(receivedBody)); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(req => Promise.resolve(response(req.body))); - - testContext.draft = new Draft(testContext.connection); - }); - - describe('save', () => { - test('should do a POST request if the draft has no id', done => { - testContext.draft.id = undefined; - return testContext.draft.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/drafts'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - to: [], - cc: [], - bcc: [], - from: [], - date: null, - body: undefined, - events: [], - unread: undefined, - snippet: undefined, - thread_id: undefined, - subject: undefined, - version: undefined, - folder: undefined, - starred: undefined, - labels: [], - file_ids: [], - headers: undefined, - reply_to: [], - reply_to_message_id: undefined, - }); - done(); - }); - }); - - test('should do a PUT request if the draft has an id', done => { - testContext.draft.id = 'id-1234'; - return testContext.draft.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/drafts/id-1234' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - to: [], - cc: [], - bcc: [], - from: [], - date: null, - body: undefined, - events: [], - unread: undefined, - snippet: undefined, - thread_id: undefined, - subject: undefined, - version: undefined, - folder: undefined, - starred: undefined, - labels: [], - file_ids: [], - headers: undefined, - reply_to: [], - reply_to_message_id: undefined, - }); - done(); - }); - }); - - describe('when the request succeeds', () => { - beforeEach(() => { - testContext.connection.request = jest.fn(() => { - const draftJSON = { - id: 'id-1234', - version: 1, - }; - return Promise.resolve(draftJSON); - }); - }); - - test('should resolve with the draft object', done => { - testContext.draft.save().then(draft => { - expect(draft.id).toBe('id-1234'); - expect(draft.version).toBe(1); - done(); - }); - }); - - test('should call the callback with the draft object', done => { - testContext.draft.save((err, draft) => { - expect(err).toBe(null); - expect(draft.id).toBe('id-1234'); - expect(draft.version).toBe(1); - done(); - }); - }); - }); - - describe('when the request fails', () => { - beforeEach(() => { - testContext.error = new Error('Network error'); - testContext.connection.request = jest.fn(() => - Promise.reject(testContext.error) - ); - }); - - test('should reject with the error', done => { - testContext.draft.save().catch(err => { - expect(err).toBe(testContext.error); - done(); - }); - }); - - test('should call the callback with the error', done => { - testContext.draft - .save((err, draft) => { - expect(err).toBe(testContext.error); - expect(draft).toBe(undefined); - done(); - }) - .catch(() => {}); - }); - }); - - describe('files', () => { - test('setting fileIdsToAttach should set file_ids on a save', done => { - testContext.draft.id = undefined; - testContext.draft.fileIdsToAttach = [ - 'file_id1', - 'file_id2', - 'file_id3', - ]; - return testContext.draft.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/drafts' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - to: [], - cc: [], - bcc: [], - from: [], - date: null, - body: undefined, - events: [], - unread: undefined, - snippet: undefined, - thread_id: undefined, - subject: undefined, - version: undefined, - folder: undefined, - starred: undefined, - labels: [], - file_ids: ['file_id1', 'file_id2', 'file_id3'], - headers: undefined, - reply_to: [], - reply_to_message_id: undefined, - }); - done(); - }); - }); - - test('setting only files set should parse and send file_ids on a save', done => { - testContext.draft.id = undefined; - testContext.draft.files = [ - new File(testContext.connection).fromJSON({ id: 'file_id4' }), - new File(testContext.connection).fromJSON({ id: 'file_id5' }), - new File(testContext.connection).fromJSON({ id: 'file_id6' }), - ]; - return testContext.draft.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/drafts' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - to: [], - cc: [], - bcc: [], - from: [], - date: null, - body: undefined, - events: [], - unread: undefined, - snippet: undefined, - thread_id: undefined, - subject: undefined, - version: undefined, - folder: undefined, - starred: undefined, - labels: [], - file_ids: ['file_id4', 'file_id5', 'file_id6'], - headers: undefined, - reply_to: [], - reply_to_message_id: undefined, - }); - done(); - }); - }); - - test('setting fileIdsToAttach with files already set should merge onto file_ids on a save', done => { - testContext.draft.id = undefined; - testContext.draft.fileIdsToAttach = [ - 'file_id1', - 'file_id2', - 'file_id3', - ]; - testContext.draft.files = [ - new File(testContext.connection).fromJSON({ id: 'file_id4' }), - new File(testContext.connection).fromJSON({ id: 'file_id5' }), - new File(testContext.connection).fromJSON({ id: 'file_id6' }), - ]; - return testContext.draft.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/drafts' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - to: [], - cc: [], - bcc: [], - from: [], - date: null, - body: undefined, - events: [], - unread: undefined, - snippet: undefined, - thread_id: undefined, - subject: undefined, - version: undefined, - folder: undefined, - starred: undefined, - labels: [], - file_ids: [ - 'file_id4', - 'file_id5', - 'file_id6', - 'file_id1', - 'file_id2', - 'file_id3', - ], - headers: undefined, - reply_to: [], - reply_to_message_id: undefined, - }); - done(); - }); - }); - - test('setting fileIdsToAttach with duplicate ids in files set should only save unique file_ids on a save', done => { - testContext.draft.id = undefined; - testContext.draft.fileIdsToAttach = [ - 'file_id1', - 'file_id2', - 'file_id3', - ]; - testContext.draft.files = [ - new File(testContext.connection).fromJSON({ id: 'file_id3' }), - new File(testContext.connection).fromJSON({ id: 'file_id4' }), - new File(testContext.connection).fromJSON({ id: 'file_id5' }), - ]; - return testContext.draft.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/drafts' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - to: [], - cc: [], - bcc: [], - from: [], - date: null, - body: undefined, - events: [], - unread: undefined, - snippet: undefined, - thread_id: undefined, - subject: undefined, - version: undefined, - folder: undefined, - starred: undefined, - labels: [], - file_ids: [ - 'file_id3', - 'file_id4', - 'file_id5', - 'file_id1', - 'file_id2', - ], - headers: undefined, - reply_to: [], - reply_to_message_id: undefined, - }); - done(); - }); - }); - - test('setting fileIdsToAttach via constructor should send the values as file_ids to the API', done => { - const draft = new Draft(testContext.connection, { - to: [{ name: 'test', email: 'test@email.com' }], - fileIdsToAttach: ['file_id1', 'file_id2', 'file_id3'], - }); - - draft.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/drafts' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - to: [{ name: 'test', email: 'test@email.com' }], - cc: [], - bcc: [], - from: [], - events: [], - labels: [], - date: null, - file_ids: ['file_id1', 'file_id2', 'file_id3'], - reply_to: [], - }); - done(); - }); - }); - }); - - test('should set reply_to_message_id to undefined if set to an empty string', done => { - testContext.draft.replyToMessageId = ''; - return testContext.draft.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/drafts'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - to: [], - cc: [], - bcc: [], - from: [], - date: null, - body: undefined, - events: [], - unread: undefined, - snippet: undefined, - thread_id: undefined, - subject: undefined, - version: undefined, - folder: undefined, - starred: undefined, - labels: [], - file_ids: [], - headers: undefined, - reply_to: [], - reply_to_message_id: undefined, - }); - done(); - }); - }); - }); - - describe('send', () => { - test('should send the draft_id and version if the draft has an id', done => { - testContext.draft.id = 'id-1234'; - testContext.draft.version = 2; - return testContext.draft.send().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/send'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - draft_id: 'id-1234', - version: 2, - }); - expect(options.json).toBe(true); - done(); - }); - }); - - test('should send the draft JSON with the tracking object if the draft has an id and has a tracking object passed in', done => { - testContext.draft.id = 'id-1234'; - testContext.draft.version = 2; - return testContext.draft.send({ opens: true }).then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/send'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - draft_id: 'id-1234', - version: 2, - tracking: { opens: true }, - }); - expect(options.json).toBe(true); - done(); - }); - }); - - test('should send the draft JSON if the draft has no id', done => { - testContext.draft.id = undefined; - testContext.draft.subject = 'Test Subject'; - return testContext.draft.send().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/send'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - to: [], - cc: [], - bcc: [], - from: [], - date: null, - body: undefined, - events: [], - unread: undefined, - snippet: undefined, - thread_id: undefined, - subject: 'Test Subject', - version: undefined, - folder: undefined, - starred: undefined, - labels: [], - file_ids: [], - headers: undefined, - reply_to: [], - reply_to_message_id: undefined, - }); - expect(options.json).toBe(true); - done(); - }); - }); - - const evaluateTracking = () => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/send'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - to: [], - cc: [], - bcc: [], - from: [], - date: null, - body: undefined, - events: [], - unread: undefined, - snippet: undefined, - thread_id: undefined, - subject: 'Test Subject', - version: undefined, - folder: undefined, - starred: undefined, - labels: [], - file_ids: [], - headers: undefined, - reply_to: [], - reply_to_message_id: undefined, - tracking: { opens: true }, - }); - expect(options.json).toBe(true); - }; - - test('should send the draft JSON with the tracking object if the draft has no id and has a tracking object passed in as the second parameter', done => { - testContext.draft.id = undefined; - testContext.draft.subject = 'Test Subject'; - return testContext.draft.send(null, { opens: true }).then(() => { - evaluateTracking(); - done(); - }); - }); - - test('should send the draft JSON with the tracking object if the draft has a tracking object as the only parameter', done => { - testContext.draft.id = undefined; - testContext.draft.subject = 'Test Subject'; - return testContext.draft.send({ opens: true }).then(() => { - evaluateTracking(); - done(); - }); - }); - - test('should send the draft JSON with the tracking object if the draft has no id and has a tracking object passed in as the first parameter', done => { - testContext.draft.id = undefined; - testContext.draft.subject = 'Test Subject'; - return testContext.draft - .send({ opens: true }, () => {}) - .then(() => { - evaluateTracking(); - done(); - }); - }); - - test('should send the draft as raw MIME if rawMime exists', done => { - const msg = `MIME-Version: 1.0 \ -Content-Type: text/plain; charset=UTF-8 \ -In-Reply-To: <84umizq7c4jtrew491brpa6iu-0@mailer.nylas.com> \ -References: <84umizq7c4jtrew491brpa6iu-0@mailer.nylas.com> \ -Subject: Meeting on Thursday \ -From: Bill \ -To: Ben Bitdiddle \ -\ -Hey Ben, \ -\ -Would you like to grab coffee @ 2pm this Thursday?`; - - const draft = new Draft(testContext.connection, { - to: [{ email: 'foo', name: 'bar' }], - rawMime: msg, - }); - draft.send().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/send'); - expect(options.method).toEqual('POST'); - expect(options.body).toEqual(msg); - expect(options.headers['Content-Type']).toEqual('message/rfc822'); - expect(options.json).toBe(false); - done(); - }); - }); - - describe('when the request succeeds', () => { - beforeEach(() => { - testContext.connection.request = jest.fn(() => { - const draftJSON = { - id: 'id-1234', - thread_id: 'new-thread-id', - }; - return Promise.resolve(draftJSON); - }); - }); - - test('should resolve with the message object', done => { - testContext.draft.send().then(message => { - expect(message.id).toBe('id-1234'); - expect(message.threadId).toBe('new-thread-id'); - expect(message).toBeInstanceOf(Message); - done(); - }); - }); - - test('should call the callback with the message object', done => { - testContext.draft.send((err, message) => { - expect(err).toBe(null); - expect(message.id).toBe('id-1234'); - expect(message.threadId).toBe('new-thread-id'); - expect(message).toBeInstanceOf(Message); - done(); - }); - }); - - test('should call the callback when tracking object is passed as first argument', done => { - testContext.draft.send({ opens: true }, (err, message) => { - expect(err).toBe(null); - expect(message.id).toBe('id-1234'); - expect(message.threadId).toBe('new-thread-id'); - expect(message).toBeInstanceOf(Message); - done(); - }); - }); - - test('should call the callback when tracking object is passed as second argument', done => { - testContext.draft.send( - (err, message) => { - expect(err).toBe(null); - expect(message.id).toBe('id-1234'); - expect(message.threadId).toBe('new-thread-id'); - expect(message).toBeInstanceOf(Message); - done(); - }, - { opens: true } - ); - }); - }); - - describe('when the request fails', () => { - beforeEach(() => { - testContext.error = new Error('Network error'); - testContext.connection.request = jest.fn(() => - Promise.reject(testContext.error) - ); - }); - - test('should reject with the error', done => { - testContext.draft.send().catch(err => { - expect(err).toBe(testContext.error); - done(); - }); - }); - - test('should call the callback with the error', done => { - testContext.draft - .send((err, message) => { - expect(err).toBe(testContext.error); - expect(message).toBe(undefined); - done(); - }) - .catch(() => { - // do nothing - }); - }); - }); - }); -}); diff --git a/__tests__/event-spec.js b/__tests__/event-spec.js deleted file mode 100644 index 243ddf79..00000000 --- a/__tests__/event-spec.js +++ /dev/null @@ -1,1051 +0,0 @@ -import NylasConnection from '../src/nylas-connection'; -import Event from '../src/models/event'; -import EventConferencing from '../src/models/event-conferencing'; -import Nylas from '../src/nylas'; -import fetch from 'node-fetch'; -import When from '../src/models/when'; -import EventParticipant from '../src/models/event-participant'; -import { ICSMethod } from '../src/models/event'; -import { EventReminder } from '../src/models/event-reminder-method'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('Event', () => { - let testContext; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection('123', { clientId: 'foo' }); - jest.spyOn(testContext.connection, 'request'); - - const response = receivedBody => { - return { - status: 200, - text: () => { - return Promise.resolve(receivedBody); - }, - buffer: () => { - return Promise.resolve('body'); - }, - json: () => { - return Promise.resolve(receivedBody); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(req => Promise.resolve(response(req.body))); - - testContext.event = new Event(testContext.connection); - }); - - describe('save', () => { - test('should do a POST request if the event has no id', done => { - testContext.event.id = undefined; - return testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/events'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - busy: undefined, - title: undefined, - description: undefined, - location: undefined, - when: {}, - participants: [], - notifications: undefined, - }); - done(); - }); - }); - - test('should do a PUT request if the event has an id', done => { - testContext.event.id = 'id-1234'; - return testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/events/id-1234' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - busy: undefined, - title: undefined, - description: undefined, - location: undefined, - when: {}, - participants: [], - notifications: undefined, - }); - done(); - }); - }); - - test('should include params in the request if they were passed in', done => { - return testContext.event.save({ notify_participants: true }).then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.qs['notify_participants']).toEqual(true); - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/events?notify_participants=true' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - busy: undefined, - title: undefined, - description: undefined, - location: undefined, - when: {}, - participants: [], - notifications: undefined, - }); - done(); - }); - }); - - test('should create recurring event if recurrence is defined', done => { - const recurrence = { - rrule: ['RRULE:FREQ=WEEKLY;BYDAY=MO'], - timezone: 'America/New_York', - }; - testContext.event.recurrence = recurrence; - return testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/events'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - busy: undefined, - title: undefined, - description: undefined, - location: undefined, - when: {}, - participants: [], - notifications: undefined, - recurrence: recurrence, - }); - done(); - }); - }); - - test('should create event with time when start and end are the same UNIX timestamp', done => { - testContext.event.when = new When(); - testContext.event.start = 1408875644; - testContext.event.end = 1408875644; - testContext.event.when.object = 'timespan'; - return testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/events'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - message_id: undefined, - busy: undefined, - title: undefined, - description: undefined, - owner: undefined, - location: undefined, - when: { - time: 1408875644, - }, - participants: [], - notifications: undefined, - read_only: undefined, - status: undefined, - }); - done(); - }); - }); - - test('should create event with start_time and end_time when start and end are different UNIX timestamps', done => { - testContext.event.start = 1409594400; - testContext.event.end = 1409598000; - return testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/events'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - message_id: undefined, - busy: undefined, - title: undefined, - description: undefined, - owner: undefined, - location: undefined, - when: { - start_time: 1409594400, - end_time: 1409598000, - }, - participants: [], - notifications: undefined, - read_only: undefined, - status: undefined, - }); - done(); - }); - }); - - test('should create event with date when start and end are same ISO date', done => { - testContext.event.start = '1912-06-23'; - testContext.event.end = '1912-06-23'; - return testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/events'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - message_id: undefined, - busy: undefined, - title: undefined, - description: undefined, - owner: undefined, - location: undefined, - when: { - date: '1912-06-23', - }, - participants: [], - notifications: undefined, - read_only: undefined, - status: undefined, - }); - done(); - }); - }); - - test('should create event with start_date and end_date when start and end are different ISO date', done => { - testContext.event.start = '1815-12-10'; - testContext.event.end = '1852-11-27'; - return testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/events'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - message_id: undefined, - busy: undefined, - title: undefined, - description: undefined, - owner: undefined, - location: undefined, - when: { - start_date: '1815-12-10', - end_date: '1852-11-27', - }, - participants: [], - notifications: undefined, - read_only: undefined, - }); - done(); - }); - }); - - test('should create event with time when event param `when` is updated with time', done => { - testContext.event.when = { time: 1408875644 }; - return testContext.event.save().then(event => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/events'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - message_id: undefined, - busy: undefined, - title: undefined, - description: undefined, - owner: undefined, - location: undefined, - when: { - time: 1408875644, - }, - participants: [], - notifications: undefined, - read_only: undefined, - status: undefined, - }); - expect(event.start).toBe(1408875644); - expect(event.end).toBe(1408875644); - done(); - }); - }); - - test('should create event with start_time and end_time when event param `when` is updated with start_time and end_time', done => { - testContext.event.when = new When({ - startTime: 1409594400, - endTime: 1409598000, - }); - return testContext.event.save().then(event => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/events'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - message_id: undefined, - busy: undefined, - title: undefined, - description: undefined, - owner: undefined, - location: undefined, - when: { - start_time: 1409594400, - end_time: 1409598000, - }, - participants: [], - notifications: undefined, - read_only: undefined, - status: undefined, - }); - expect(event.start).toBe(1409594400); - expect(event.end).toBe(1409598000); - done(); - }); - }); - - test('should create event with date when the event param `when` is updated with date', done => { - testContext.event.when = new When(); - testContext.event.when.date = '1912-06-23'; - return testContext.event.save().then(event => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/events'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - message_id: undefined, - busy: undefined, - title: undefined, - description: undefined, - owner: undefined, - location: undefined, - when: { - date: '1912-06-23', - }, - participants: [], - notifications: undefined, - read_only: undefined, - status: undefined, - }); - expect(event.start).toBe('1912-06-23'); - expect(event.end).toBe('1912-06-23'); - done(); - }); - }); - - test('should create event with start_date and end_date when the event param `when` is updated with start_date and end_date', done => { - testContext.event.when = new When({ - startDate: '1815-12-10', - endDate: '1852-11-27', - }); - return testContext.event.save().then(event => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/events'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - message_id: undefined, - busy: undefined, - title: undefined, - description: undefined, - owner: undefined, - location: undefined, - when: { - start_date: '1815-12-10', - end_date: '1852-11-27', - }, - participants: [], - notifications: undefined, - read_only: undefined, - status: undefined, - }); - expect(event.start).toBe('1815-12-10'); - expect(event.end).toBe('1852-11-27'); - done(); - }); - }); - - test('setting event.start should create event.when if it does does not exist', done => { - delete testContext.event.when; - testContext.event.start = '1815-12-10'; - testContext.event.end = '1852-11-27'; - expect(testContext.event.when.toJSON()).toEqual({ - start_date: '1815-12-10', - end_date: '1852-11-27', - }); - return testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/events'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - message_id: undefined, - busy: undefined, - title: undefined, - description: undefined, - owner: undefined, - location: undefined, - when: { - start_date: '1815-12-10', - end_date: '1852-11-27', - }, - participants: [], - notifications: undefined, - read_only: undefined, - status: undefined, - }); - done(); - }); - }); - - test('should create an event with a metadata object', done => { - testContext.event.metadata = { hello: 'world' }; - testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/events'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - busy: undefined, - title: undefined, - description: undefined, - location: undefined, - when: {}, - participants: [], - notifications: undefined, - metadata: { hello: 'world' }, - }); - done(); - }); - }); - - test('should add reminder method and minutes if defined', done => { - testContext.event.reminderMinutes = '[20]'; - testContext.event.reminderMethod = 'popup'; - testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/events'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - busy: undefined, - title: undefined, - description: undefined, - location: undefined, - when: {}, - participants: [], - notifications: undefined, - reminder_method: 'popup', - reminder_minutes: '[20]', - }); - done(); - }); - }); - - test('should not serialize reminder object is defined', done => { - testContext.event.reminders = new EventReminder({ - reminderMinutes: '[20]', - reminderMethod: 'popup', - }); - testContext.event.id = 'reminder123'; - - testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/events/reminder123' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - busy: undefined, - title: undefined, - description: undefined, - location: undefined, - when: {}, - participants: [], - notifications: undefined, - reminder_method: undefined, - reminder_minutes: undefined, - }); - done(); - }); - }); - - describe('conferencing', () => { - test('should create an event with conferencing details', done => { - testContext.event.conferencing = new EventConferencing({ - provider: 'Zoom Meeting', - details: { - url: 'https://us02web.zoom.us/j/****************', - meetingCode: '213', - password: 'xyz', - phone: ['+11234567890'], - }, - }); - testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/events' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - busy: undefined, - title: undefined, - description: undefined, - location: undefined, - when: {}, - _start: undefined, - _end: undefined, - participants: [], - notifications: undefined, - conferencing: { - provider: 'Zoom Meeting', - details: { - url: 'https://us02web.zoom.us/j/****************', - meeting_code: '213', - password: 'xyz', - phone: ['+11234567890'], - }, - }, - }); - done(); - }); - }); - - test('should create an event with conferencing autocreate set', done => { - testContext.event.conferencing = new EventConferencing({ - provider: 'Zoom Meeting', - autocreate: { - settings: { - password: '1234', - }, - }, - }); - testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/events' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - busy: undefined, - title: undefined, - description: undefined, - location: undefined, - when: {}, - participants: [], - notifications: undefined, - conferencing: { - provider: 'Zoom Meeting', - autocreate: { - settings: { - password: '1234', - }, - }, - }, - }); - done(); - }); - }); - - test('should set visibility to undefined if set to an empty string', done => { - testContext.event.visibility = ''; - return testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(JSON.parse(options.body)).toEqual({ - visibility: undefined, - calendar_id: '', - when: {}, - participants: [], - }); - done(); - }); - }); - }); - - describe('notification', () => { - test('should create an event with notifications', done => { - const notificationEvent = testContext.event.fromJSON({ - notifications: [ - { - body: 'Reminding you about our meeting.', - minutes_before_event: 600, - subject: 'Test Event Notification', - type: 'email', - }, - { - type: 'webhook', - minutes_before_event: 600, - url: - 'https://hooks.service.com/services/T01A03EEXDE/B01TBNH532R/HubIZu1zog4oYdFqQ8VUcuiW', - payload: JSON.stringify({ - text: 'Your reminder goes here!', - }), - }, - { - type: 'sms', - minutes_before_event: 60, - message: 'Test Event Notification', - }, - ], - }); - - expect(notificationEvent.notifications.length).toBe(3); - expect(notificationEvent.notifications[0].body).toEqual( - 'Reminding you about our meeting.' - ); - expect(notificationEvent.notifications[0].minutesBeforeEvent).toBe(600); - expect(notificationEvent.notifications[0].subject).toEqual( - 'Test Event Notification' - ); - expect(notificationEvent.notifications[0].type).toEqual('email'); - expect(notificationEvent.notifications[1].type).toEqual('webhook'); - expect(notificationEvent.notifications[1].minutesBeforeEvent).toBe(600); - expect(notificationEvent.notifications[1].url).toEqual( - 'https://hooks.service.com/services/T01A03EEXDE/B01TBNH532R/HubIZu1zog4oYdFqQ8VUcuiW' - ); - expect(notificationEvent.notifications[1].payload).toEqual( - '{"text":"Your reminder goes here!"}' - ); - expect(notificationEvent.notifications[2].type).toEqual('sms'); - expect(notificationEvent.notifications[2].minutesBeforeEvent).toBe(60); - expect(notificationEvent.notifications[2].message).toEqual( - 'Test Event Notification' - ); - - notificationEvent.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/events' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - busy: undefined, - title: undefined, - description: undefined, - location: undefined, - when: {}, - _start: undefined, - _end: undefined, - participants: [], - conferencing: undefined, - notifications: [ - { - body: 'Reminding you about our meeting.', - minutes_before_event: 600, - subject: 'Test Event Notification', - type: 'email', - }, - { - minutes_before_event: 600, - payload: '{"text":"Your reminder goes here!"}', - type: 'webhook', - url: - 'https://hooks.service.com/services/T01A03EEXDE/B01TBNH532R/HubIZu1zog4oYdFqQ8VUcuiW', - }, - { - message: 'Test Event Notification', - minutes_before_event: 60, - type: 'sms', - }, - ], - }); - done(); - }); - }); - - test('setting empty notifications array should send empty array', done => { - testContext.event.notifications = []; - - testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/events' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: '', - busy: undefined, - title: undefined, - description: undefined, - location: undefined, - when: {}, - _start: undefined, - _end: undefined, - participants: [], - conferencing: undefined, - notifications: [], - }); - done(); - }); - }); - - test('not setting notifications should not send notifications in json', done => { - testContext.event.notifications = undefined; - - testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/events' - ); - expect(options.method).toEqual('POST'); - expect('notifications' in JSON.parse(options.body)).toBe(false); - done(); - }); - }); - }); - - describe('when the request succeeds', () => { - beforeEach(() => { - testContext.connection.request = jest.fn(() => { - const eventJSON = { - id: 'id-1234', - title: 'test event', - when: { time: 1409594400, object: 'time' }, - participants: [ - { - name: 'foo', - email: 'bar', - status: 'noreply', - comment: 'This is a comment', - phone_number: '416-000-0000', - }, - ], - ical_uid: 'id-5678', - master_event_id: 'master-1234', - original_start_time: 1409592400, - event_collection_id: 100, - capacity: 4, - round_robin_order: ['test@email.com'], - }; - return Promise.resolve(eventJSON); - }); - }); - - test('should resolve with the event object', done => { - return testContext.event.save().then(event => { - expect(event.id).toBe('id-1234'); - expect(event.title).toBe('test event'); - expect(event.when.time).toEqual(1409594400); - expect(event.when.object).toEqual('time'); - expect(event.iCalUID).toBe('id-5678'); - expect(event.masterEventId).toBe('master-1234'); - expect(event.eventCollectionId).toBe(100); - expect(event.capacity).toBe(4); - expect(event.roundRobinOrder[0]).toBe('test@email.com'); - expect(event.originalStartTime.toString()).toBe( - new Date(1409592400 * 1000).toString() - ); - const participant = event.participants[0]; - expect(participant.name).toEqual('foo'); - expect(participant.email).toEqual('bar'); - expect(participant.status).toEqual('noreply'); - expect(participant.comment).toEqual('This is a comment'); - expect(participant.phoneNumber).toEqual('416-000-0000'); - done(); - }); - }); - - test('should call the callback with the event object', done => { - return testContext.event.save((err, event) => { - expect(err).toBe(null); - expect(event.id).toBe('id-1234'); - expect(event.title).toBe('test event'); - done(); - }); - }); - - test('should only send the status object within the participant object on create', done => { - testContext.event.participants = [ - new EventParticipant({ - name: 'foo', - email: 'bar', - status: 'noreply', - comment: 'This is a comment', - phoneNumber: '416-000-0000', - }), - ]; - testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.body).toEqual({ - calendar_id: '', - when: {}, - participants: [ - { - name: 'foo', - email: 'bar', - comment: 'This is a comment', - phone_number: '416-000-0000', - status: 'noreply', - }, - ], - }); - }); - testContext.event.id = 'abc-123'; - testContext.event.save().then(() => { - const options = testContext.connection.request.mock.calls[1][0]; - expect(options.body).toEqual({ - calendar_id: '', - when: {}, - participants: [ - { - name: 'foo', - email: 'bar', - comment: 'This is a comment', - phone_number: '416-000-0000', - status: undefined, - }, - ], - }); - done(); - }); - }); - }); - - describe('when the request fails', () => { - beforeEach(() => { - testContext.error = new Error('Network error'); - testContext.connection.request = jest.fn(() => - Promise.reject(testContext.error) - ); - }); - - test('should reject with the error', done => { - testContext.event.save().catch(err => { - expect(err).toBe(testContext.error); - done(); - }); - }); - - test('should call the callback with the error', done => { - testContext.event - .save((err, event) => { - expect(err).toBe(testContext.error); - expect(event).toBe(undefined); - done(); - }) - .catch(() => { - // do nothing - }); - }); - }); - }); - - describe('rsvp', () => { - test('should do a POST request to the RSVP endpoint', done => { - testContext.event.id = 'public_id'; - return testContext.event.rsvp('yes', 'I will come.').then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/send-rsvp' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - event_id: 'public_id', - status: 'yes', - comment: 'I will come.', - }); - done(); - }); - }); - }); - - describe('generateICS', () => { - beforeEach(() => { - const response = () => { - return { - status: 200, - text: () => { - return Promise.resolve( - JSON.stringify({ - ics: 'ics_string', - }) - ); - }, - buffer: () => { - return Promise.resolve('body'); - }, - json: () => { - return Promise.resolve({ - ics: 'ics_string', - }); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(() => Promise.resolve(response())); - }); - - test('should do a POST request to the /to-ics endpoint', done => { - testContext.event.calendarId = 'calendar_id'; - testContext.event.when.date = '1912-06-23'; - return testContext.event.generateICS().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/events/to-ics' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: 'calendar_id', - busy: undefined, - title: undefined, - description: undefined, - location: undefined, - when: { - date: '1912-06-23', - }, - participants: [], - notifications: undefined, - ics_options: {}, - }); - done(); - }); - }); - - test('should do a POST request to the /to-ics endpoint with options set', done => { - testContext.event.calendarId = 'calendar_id'; - testContext.event.when.date = '1912-06-23'; - const icsOptions = { - iCalUID: 'aaa', - method: ICSMethod.Request, - prodId: 'prodId', - }; - - return testContext.event.generateICS(icsOptions).then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/events/to-ics' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - calendar_id: 'calendar_id', - busy: undefined, - title: undefined, - description: undefined, - location: undefined, - when: { - date: '1912-06-23', - }, - participants: [], - notifications: undefined, - ics_options: { - ical_uid: 'aaa', - method: 'request', - prodid: 'prodId', - }, - }); - done(); - }); - }); - - test('should do throw an error if calendar id is not set', done => { - testContext.event.when.date = '1912-06-23'; - - expect(() => testContext.event.generateICS()).toThrow(); - done(); - }); - - test('should do throw an error if when is not properly set', done => { - testContext.event.calendarId = 'calendar_id'; - - expect(() => testContext.event.generateICS()).toThrow(); - done(); - }); - }); - - describe('validation', () => { - test('should throw exception if both conferencing details and autocreate are set', done => { - testContext.event.conferencing = new EventConferencing({ - provider: 'Zoom Meeting', - details: { - url: 'https://us02web.zoom.us/j/****************', - meeting_code: '213', - password: 'xyz', - phone: ['+11234567890'], - }, - autocreate: { - settings: { - password: '1234', - }, - }, - }); - expect(() => testContext.event.save()).toThrow( - new Error( - "Cannot set both 'details' and 'autocreate' in conferencing object." - ) - ); - done(); - }); - - test('should throw an error if capacity is less than the amount of participants', done => { - testContext.event.capacity = 1; - testContext.event.participants = [ - new EventParticipant({ - email: 'person1@email.com', - }), - new EventParticipant({ - email: 'person2@email.com', - }), - ]; - expect(() => testContext.event.save()).toThrow( - new Error( - 'The number of participants in the event exceeds the set capacity.' - ) - ); - done(); - }); - - test('should not throw if capacity is -1', done => { - testContext.event.capacity = -1; - testContext.event.participants = [ - new EventParticipant({ - email: 'person1@email.com', - }), - new EventParticipant({ - email: 'person2@email.com', - }), - ]; - expect(() => testContext.event.save()).not.toThrow( - new Error( - 'The number of participants in the event exceeds the set capacity.' - ) - ); - done(); - }); - - test('should not throw if capacity is set but participants are less than or equal to capacity', done => { - testContext.event.capacity = 2; - testContext.event.participants = [ - new EventParticipant({ - email: 'person1@email.com', - }), - new EventParticipant({ - email: 'person2@email.com', - }), - ]; - expect(() => testContext.event.save()).not.toThrow( - new Error( - 'The number of participants in the event exceeds the set capacity.' - ) - ); - testContext.event.capacity = 3; - expect(() => testContext.event.save()).not.toThrow( - new Error( - 'The number of participants in the event exceeds the set capacity.' - ) - ); - done(); - }); - }); -}); diff --git a/__tests__/file-spec.js b/__tests__/file-spec.js deleted file mode 100644 index c7bfb113..00000000 --- a/__tests__/file-spec.js +++ /dev/null @@ -1,279 +0,0 @@ -import NylasConnection from '../src/nylas-connection'; -import File from '../src/models/file'; -import fetch from 'node-fetch'; -import Nylas from '../src/nylas'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('File', () => { - let testContext; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection('123', { clientId: 'foo' }); - jest.spyOn(testContext.connection, 'request'); - - const headers = new Map(); - headers.set('header1', '1'); - headers.set('header2', '2'); - const response = receivedBody => { - return { - status: 200, - buffer: () => { - return Promise.resolve('body'); - }, - text: () => { - // Just a placeholder so that we can mimic returning data after uploading - // This data is not used - if ( - receivedBody === null || - receivedBody.constructor.name === 'FormData' - ) { - return Promise.resolve(JSON.stringify([testContext.file.toJSON()])); - } - return Promise.resolve(JSON.stringify(receivedBody)); - }, - headers: headers, - }; - }; - - fetch.mockImplementation(req => Promise.resolve(response(req.body))); - - testContext.file = new File(testContext.connection); - testContext.file.data = 'Sample data'; - testContext.file.contentType = 'text/plain'; - testContext.file.filename = 'sample.txt'; - testContext.file.id = 'fileId'; - }); - - describe('upload', () => { - test('should raise error if missing filename', done => { - testContext.file.filename = undefined; - expect(() => { - testContext.file.upload(); - }).toThrow(); - done(); - }); - - test('should raise error if missing data', done => { - testContext.file.data = undefined; - expect(() => { - testContext.file.upload(); - }).toThrow(); - done(); - }); - - test('should raise error if missing contentType', done => { - testContext.file.contentType = undefined; - expect(() => { - testContext.file.upload(); - }).toThrow(); - done(); - }); - - test('should do a POST request', done => { - return testContext.file.upload().then(() => { - const callParams = testContext.connection.request.mock.calls[0][0]; - const expectedFormData = { - file: { - value: 'Sample data', - options: { - filename: 'sample.txt', - contentType: 'text/plain', - }, - }, - }; - - expect(callParams['method']).toEqual('POST'); - expect(callParams['json']).toBe(true); - expect(callParams['path']).toEqual('/files'); - expect(callParams['formData']).toEqual(expectedFormData); - expect(typeof callParams['body']).toBe('object'); - done(); - }); - }); - - test('should add knownLength to the request formData', done => { - testContext.file.size = 12345; - return testContext.file.upload().then(() => { - const callParams = testContext.connection.request.mock.calls[0][0]; - const expectedFormData = { - file: { - value: 'Sample data', - options: { - filename: 'sample.txt', - contentType: 'text/plain', - knownLength: 12345, - }, - }, - }; - - expect(callParams['method']).toEqual('POST'); - expect(callParams['json']).toBe(true); - expect(callParams['path']).toEqual('/files'); - expect(callParams['formData']).toEqual(expectedFormData); - expect(typeof callParams['body']).toBe('object'); - done(); - }); - }); - - describe('when the request succeeds', () => { - beforeEach(() => { - testContext.connection.request = jest.fn(() => { - const fileJSON = [ - { - account_id: 'aid-5678', - content_type: 'text/plain', - filename: 'sample.txt', - id: 'id-1234', - object: 'file', - size: 123, - }, - ]; - return Promise.resolve(fileJSON); - }); - }); - - test('should resolve with the file object', done => { - return testContext.file.upload().then(file => { - expect(file.accountId).toBe('aid-5678'); - expect(file.contentType).toBe('text/plain'); - expect(file.filename).toBe('sample.txt'); - expect(file.id).toBe('id-1234'); - expect(file.object).toBe('file'); - expect(file.size).toBe(123); - done(); - }); - }); - - test('should call the callback with the file object', done => { - return testContext.file.upload((err, file) => { - expect(err).toBe(null); - expect(file.accountId).toBe('aid-5678'); - expect(file.contentType).toBe('text/plain'); - expect(file.filename).toBe('sample.txt'); - expect(file.id).toBe('id-1234'); - expect(file.object).toBe('file'); - expect(file.size).toBe(123); - done(); - }); - }); - }); - - describe('when the request fails', () => { - beforeEach(() => { - testContext.error = new Error('Network error'); - testContext.connection.request = jest.fn(() => { - return Promise.reject(testContext.error); - }); - }); - - test('should reject with the error', done => { - return testContext.file - .upload() - .catch(err => { - expect(err).toBe(testContext.error); - done(); - }) - .catch(() => { - // do nothing - }); - }); - - test('should call the callback with the error', done => { - return testContext.file - .upload((err, file) => { - expect(err).toBe(testContext.error); - expect(file).toBe(undefined); - done(); - }) - .catch(() => { - // do nothing - }); - }); - }); - }); - - describe('download', () => { - test('should do a GET request', done => { - return testContext.file.download().then(() => { - const callParams = testContext.connection.request.mock.calls[0][0]; - - expect(callParams['downloadRequest']).toBe(true); - expect(callParams['path']).toBe('/files/fileId/download'); - done(); - }); - }); - - describe('when the request succeeds', () => { - test('should resolve with the file information', done => { - return testContext.file.download().then(file => { - const fileInfo = { - body: 'body', - header1: '1', - header2: '2', - }; - expect(file).toEqual(fileInfo); - done(); - }); - }); - - test('should call the callback with the file object', done => { - return testContext.file.download((err, file) => { - const fileInfo = { - body: 'body', - header1: '1', - header2: '2', - }; - expect(err).toBe(null); - expect(file).toEqual(fileInfo); - done(); - }); - }); - }); - - describe('when the request fails', () => { - beforeEach(() => { - testContext.error = new Error('Network error'); - testContext.connection.request = jest.fn(() => { - return Promise.reject(testContext.error); - }); - }); - - test('should reject with the error', done => { - return testContext.file - .download() - .catch(err => { - expect(err).toBe(testContext.error); - done(); - }) - .catch(() => { - // do nothing - }); - }); - - test('should call the callback with the error', done => { - return testContext.file - .download((err, file) => { - expect(err).toBe(testContext.error); - expect(file).toBe(undefined); - done(); - }) - .catch(() => { - // do nothing - }); - }); - }); - }); -}); diff --git a/__tests__/folder-spec.js b/__tests__/folder-spec.js deleted file mode 100644 index 309714eb..00000000 --- a/__tests__/folder-spec.js +++ /dev/null @@ -1,87 +0,0 @@ -import Nylas from '../src/nylas'; -import NylasConnection from '../src/nylas-connection'; -import fetch from 'node-fetch'; -import Folder from '../src/models/folder'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('Label', () => { - let testContext; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection('123', { clientId: 'foo' }); - jest.spyOn(testContext.connection, 'request'); - - const response = receivedBody => { - return { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(receivedBody)); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(req => Promise.resolve(response(req.body))); - testContext.folder = new Folder(testContext.connection); - testContext.folder.displayName = 'Folder display name'; - testContext.folder.name = 'Folder name'; - }); - - describe('save', () => { - test('should do a POST request if id is undefined', done => { - return testContext.folder.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/folders'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - display_name: 'Folder display name', - name: 'Folder name', - }); - done(); - }); - }); - - test('should do a PUT if id is defined', done => { - testContext.folder.id = 'folder_id'; - testContext.folder.displayName = 'Updated display name'; - return testContext.folder.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/folders/folder_id' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - display_name: 'Updated display name', - name: 'Folder name', - }); - done(); - }); - }); - }); - - describe('delete', () => { - test('should do a DELETE if delete is requested', done => { - return testContext.connection.folders.delete('folder_id').then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/folders/folder_id' - ); - expect(options.method).toEqual('DELETE'); - done(); - }); - }); - }); -}); diff --git a/__tests__/job-status-spec.js b/__tests__/job-status-spec.js deleted file mode 100644 index e2127c34..00000000 --- a/__tests__/job-status-spec.js +++ /dev/null @@ -1,249 +0,0 @@ -import fetch from 'node-fetch'; -const { Response } = jest.requireActual('node-fetch'); - -import Nylas from '../src/nylas'; -import NylasConnection from '../src/nylas-connection'; -import JobStatus from '../src/models/job-status'; -import OutboxJobStatus from '../src/models/outbox-job-status'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('Job Status', () => { - let testContext; - const testAccessToken = 'test-access-token'; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection(testAccessToken, { - clientId: 'myClientId', - }); - testContext.listApiResponse = [ - { - id: 'dcjq3eyd5svm7cnz055tb6cry', - object: 'calendar', - account_id: 'abcdfr1iw2tzmp4rr02x789r', - action: 'create_calendar', - created_at: 1592374298, - job_status_id: 'eslvh7ieykvf5yf2xx9k9yrn8', - status: 'successful', - metadata: { - sdk: true, - }, - }, - { - id: '2ab73sqyim3poa8qjm4rv0o2', - object: 'calendar', - account_id: 'abcw0dfr1iw2tzmp4rr02x789r', - action: 'delete_calendar', - created_at: 1592374298, - job_status_id: '9l1cl6tv6idfp8s4tuvk8saubw', - status: 'successful', - }, - ]; - testContext.getApiResponse = { - id: 'dcjq3eyd5svm7cnz055tb6cry', - object: 'calendar', - account_id: 'abcdfr1iw2tzmp4rr02x789r', - action: 'create_calendar', - created_at: 1592374298, - job_status_id: 'eslvh7ieykvf5yf2xx9k9yrn8', - status: 'successful', - metadata: { - sdk: true, - }, - }; - jest.spyOn(testContext.connection, 'request'); - }); - - describe('list job statuses', () => { - beforeEach(() => { - fetch.mockReturnValue( - Promise.resolve(new Response(testContext.listApiResponse)) - ); - - const response = { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(testContext.listApiResponse)); - }, - headers: new Map(), - }; - - fetch.mockImplementation(() => Promise.resolve(response)); - }); - - test('should call API with correct authentication', done => { - expect.assertions(3); - const defaultParams = '?offset=0&limit=100'; - - return testContext.connection.jobStatuses.list().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/job-statuses' + defaultParams - ); - expect(options.method).toEqual('GET'); - expect(options.headers['authorization']).toEqual( - `Basic ${Buffer.from(`${testAccessToken}:`, 'utf8').toString( - 'base64' - )}` - ); - done(); - }); - }); - - test('should resolve to job status object(s)', done => { - expect.assertions(9); - testContext.connection.request = jest.fn(() => - Promise.resolve(testContext.listApiResponse) - ); - - testContext.connection.jobStatuses.list().then(data => { - expect(data[0].object).toBe('calendar'); - expect(data[0].id).toBe('dcjq3eyd5svm7cnz055tb6cry'); - expect(data[0].accountId).toBe('abcdfr1iw2tzmp4rr02x789r'); - expect(data[0].action).toBe('create_calendar'); - expect(data[0].jobStatusId).toBe('eslvh7ieykvf5yf2xx9k9yrn8'); - expect(data[0].status).toBe('successful'); - expect(data[0].metadata).toEqual({ - sdk: true, - }); - expect(data[0] instanceof JobStatus).toBe(true); - expect(data[0].createdAt instanceof Date).toBe(true); - done(); - }); - }); - }); - - describe('find job status', () => { - beforeEach(() => { - const response = { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(testContext.getApiResponse)); - }, - headers: new Map(), - }; - - fetch.mockImplementation(() => Promise.resolve(response)); - }); - test('should call API with correct authentication', done => { - expect.assertions(3); - - testContext.connection.jobStatuses.find('a1b2c3').then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/job-statuses/a1b2c3' - ); - expect(options.method).toEqual('GET'); - expect(options.headers['authorization']).toEqual( - `Basic ${Buffer.from(`${testAccessToken}:`, 'utf8').toString( - 'base64' - )}` - ); - done(); - }); - }); - - test('should resolve to job status object', done => { - expect.assertions(9); - testContext.connection.request = jest.fn(() => - Promise.resolve(testContext.getApiResponse) - ); - - testContext.connection.jobStatuses.find('a1b2c3').then(data => { - expect(data.object).toBe('calendar'); - expect(data.id).toBe('dcjq3eyd5svm7cnz055tb6cry'); - expect(data.accountId).toBe('abcdfr1iw2tzmp4rr02x789r'); - expect(data.action).toBe('create_calendar'); - expect(data.jobStatusId).toBe('eslvh7ieykvf5yf2xx9k9yrn8'); - expect(data.status).toBe('successful'); - expect(data.metadata).toEqual({ - sdk: true, - }); - expect(data instanceof JobStatus).toBe(true); - expect(data.createdAt instanceof Date).toBe(true); - done(); - }); - }); - }); - - describe('isSuccessful', () => { - beforeEach(() => { - const response = { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(testContext.getApiResponse)); - }, - headers: new Map(), - }; - - fetch.mockImplementation(() => Promise.resolve(response)); - }); - - test('job status with status = successful should return true, otherwise false', done => { - testContext.connection.jobStatuses.find('a1b2c3').then(jobStatus => { - expect(jobStatus.isSuccessful()).toBe(true); - jobStatus.status = 'failure'; - expect(jobStatus.isSuccessful()).toBe(false); - done(); - }); - }); - }); - - describe('JobStatusRestfulModelCollection', () => { - beforeEach(() => { - const jobStatuses = [ - testContext.getApiResponse, - { - action: 'new_outbox', - created_at: 1646245940, - send_at: 1646245940, - original_send_at: 1646245940, - job_status_id: 'job-status-id', - status: 'pending', - account_id: 'account-id', - message_id: 'message-id', - thread_id: 'thread-id', - object: 'message', - original_data: { - to: [{ name: 'me', email: 'test@email.com' }], - subject: 'This is an email', - send_at: 1646245940, - original_send_at: 1646245940, - retry_limit_datetime: 1646332340, - }, - }, - ]; - - const response = { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(jobStatuses)); - }, - headers: new Map(), - }; - - fetch.mockImplementation(() => Promise.resolve(response)); - }); - - test('should call API with correct authentication', done => { - testContext.connection.jobStatuses.list().then(jobStatuses => { - expect(jobStatuses.length).toBe(2); - expect(jobStatuses[0]).toBeInstanceOf(JobStatus); - expect(jobStatuses[1]).toBeInstanceOf(OutboxJobStatus); - done(); - }); - }); - }); -}); diff --git a/__tests__/label-spec.js b/__tests__/label-spec.js deleted file mode 100644 index ea1fb37b..00000000 --- a/__tests__/label-spec.js +++ /dev/null @@ -1,71 +0,0 @@ -import NylasConnection from '../src/nylas-connection'; -import { Label } from '../src/models/folder'; -import fetch from 'node-fetch'; -import Nylas from '../src/nylas'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('Label', () => { - let testContext; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection('123', { clientId: 'foo' }); - jest.spyOn(testContext.connection, 'request'); - - const response = receivedBody => { - return { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(receivedBody)); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(req => Promise.resolve(response(req.body))); - testContext.label = new Label(testContext.connection); - testContext.label.displayName = 'Label name'; - testContext.label.name = 'Longer label name'; - }); - - describe('save', () => { - test('should do a POST request if id is undefined', done => { - return testContext.label.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual('https://api.nylas.com/labels'); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - display_name: 'Label name', - }); - done(); - }); - }); - - test('should do a PUT if id is defined', done => { - testContext.label.id = 'label_id'; - return testContext.label.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/labels/label_id' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - display_name: 'Label name', - }); - done(); - }); - }); - }); -}); diff --git a/__tests__/management-account-spec.js b/__tests__/management-account-spec.js deleted file mode 100644 index f6fe19a6..00000000 --- a/__tests__/management-account-spec.js +++ /dev/null @@ -1,378 +0,0 @@ -import Nylas from '../src/nylas'; -import NylasConnection from '../src/nylas-connection'; -import ManagementAccount from '../src/models/management-account'; - -describe('ManagementAccount', () => { - const CLIENT_ID = 'abc'; - const ACCOUNT_ID = '8rilmlwuo4zmpjedz8bcplclk'; - beforeEach(() => { - Nylas.config({ - clientId: CLIENT_ID, - clientSecret: 'xyz', - }); - }); - - describe('list', () => { - test('should do a GET request to get the account list', done => { - Nylas.accounts.connection.request = jest.fn(() => - Promise.resolve([ - { - account_id: '8rilmlwuo4zmpjedz8bcplclk', - billing_state: 'paid', - email: 'margaret@hamilton.com', - id: ACCOUNT_ID, - provider: 'gmail', - sync_state: 'running', - authentication_type: 'password', - trial: false, - metadata: { - test: 'true', - }, - }, - ]) - ); - Nylas.accounts.list({}, (err, accounts) => { - expect(accounts.length).toEqual(1); - expect(accounts[0].id).toEqual('8rilmlwuo4zmpjedz8bcplclk'); - expect(accounts[0].billingState).toEqual('paid'); - expect(accounts[0].emailAddress).toEqual('margaret@hamilton.com'); - expect(accounts[0].provider).toEqual('gmail'); - expect(accounts[0].syncState).toEqual('running'); - expect(accounts[0].authenticationType).toEqual('password'); - expect(accounts[0].trial).toBe(false); - expect(accounts[0].metadata).toEqual({ - test: 'true', - }); - expect(Nylas.accounts.connection.request).toHaveBeenCalledWith({ - method: 'GET', - qs: { limit: 100, offset: 0 }, - path: `/a/${CLIENT_ID}/accounts`, - }); - done(); - }); - }); - }); - - describe('upgrade', () => { - test('should POST to upgrade an account', done => { - expect.assertions(4); - const requestMock = jest.fn(); - requestMock - .mockReturnValueOnce( - Promise.resolve([ - { - account_id: '8rilmlwuo4zmpjedz8bcplclk', - billing_state: 'free', - id: ACCOUNT_ID, - sync_state: 'running', - trial: false, - }, - ]) - ) - .mockReturnValueOnce(Promise.resolve({ success: 'true' })); - Nylas.accounts.connection.request = requestMock; - Nylas.accounts - .first() - .then(account => account.upgrade()) - .then(resp => { - expect(Nylas.accounts.connection.request).toHaveBeenCalledTimes(2); - expect(Nylas.accounts.connection.request).toHaveBeenCalledWith({ - method: 'GET', - qs: { limit: 1, offset: 0 }, - path: `/a/${CLIENT_ID}/accounts`, - }); - expect(Nylas.accounts.connection.request).toHaveBeenCalledWith({ - method: 'POST', - path: `/a/${CLIENT_ID}/accounts/${ACCOUNT_ID}/upgrade`, - }); - expect(resp.success).toBe('true'); - done(); - }); - }); - }); - - describe('downgrade', () => { - test('should POST to downgrade an account', done => { - expect.assertions(4); - const requestMock = jest.fn(); - requestMock - .mockReturnValueOnce( - Promise.resolve([ - { - account_id: '8rilmlwuo4zmpjedz8bcplclk', - billing_state: 'free', - id: ACCOUNT_ID, - sync_state: 'running', - trial: false, - }, - ]) - ) - .mockReturnValueOnce(Promise.resolve({ success: 'true' })); - Nylas.accounts.connection.request = requestMock; - Nylas.accounts - .first() - .then(account => account.downgrade()) - .then(resp => { - expect(Nylas.accounts.connection.request).toHaveBeenCalledTimes(2); - expect(Nylas.accounts.connection.request).toHaveBeenCalledWith({ - method: 'GET', - qs: { limit: 1, offset: 0 }, - path: `/a/${CLIENT_ID}/accounts`, - }); - expect(Nylas.accounts.connection.request).toHaveBeenCalledWith({ - method: 'POST', - path: `/a/${CLIENT_ID}/accounts/${ACCOUNT_ID}/downgrade`, - }); - expect(resp.success).toBe('true'); - done(); - }); - }); - }); - - describe('revokeAll', () => { - test('should POST to revoke all tokens of an account', done => { - expect.assertions(4); - const requestMock = jest.fn(); - requestMock - .mockReturnValueOnce( - Promise.resolve([ - { - account_id: '8rilmlwuo4zmpjedz8bcplclk', - billing_state: 'free', - id: ACCOUNT_ID, - sync_state: 'running', - trial: false, - }, - ]) - ) - .mockReturnValueOnce(Promise.resolve({ success: 'true' })); - Nylas.accounts.connection.request = requestMock; - Nylas.accounts - .first() - .then(account => account.revokeAll()) - .then(resp => { - expect(Nylas.accounts.connection.request).toHaveBeenCalledTimes(2); - expect(Nylas.accounts.connection.request).toHaveBeenCalledWith({ - method: 'GET', - qs: { limit: 1, offset: 0 }, - path: `/a/${CLIENT_ID}/accounts`, - }); - expect(Nylas.accounts.connection.request).toHaveBeenCalledWith({ - method: 'POST', - path: `/a/${CLIENT_ID}/accounts/${ACCOUNT_ID}/revoke-all`, - body: { keep_access_token: undefined }, - }); - expect(resp.success).toBe('true'); - done(); - }); - }); - test('should POST to revoke all tokens of an account except one token', done => { - expect.assertions(4); - const requestMock = jest.fn(); - requestMock - .mockReturnValueOnce( - Promise.resolve([ - { - account_id: '8rilmlwuo4zmpjedz8bcplclk', - billing_state: 'free', - id: ACCOUNT_ID, - sync_state: 'running', - trial: false, - }, - ]) - ) - .mockReturnValueOnce(Promise.resolve({ success: 'true' })); - Nylas.accounts.connection.request = requestMock; - Nylas.accounts - .first() - .then(account => account.revokeAll('abc123')) - .then(resp => { - expect(Nylas.accounts.connection.request).toHaveBeenCalledTimes(2); - expect(Nylas.accounts.connection.request).toHaveBeenCalledWith({ - method: 'GET', - qs: { limit: 1, offset: 0 }, - path: `/a/${CLIENT_ID}/accounts`, - }); - expect(Nylas.accounts.connection.request).toHaveBeenCalledWith({ - method: 'POST', - path: `/a/${CLIENT_ID}/accounts/${ACCOUNT_ID}/revoke-all`, - body: { keep_access_token: 'abc123' }, - }); - expect(resp.success).toBe('true'); - done(); - }); - }); - }); - - describe('ip_addresses', () => { - test('should do a GET request to get the ip_addresses', done => { - expect.assertions(2); - const requestMock = jest.fn(); - requestMock - .mockReturnValueOnce( - Promise.resolve([ - { - account_id: '8rilmlwuo4zmpjedz8bcplclk', - billing_state: 'free', - id: ACCOUNT_ID, - sync_state: 'running', - trial: false, - }, - ]) - ) - .mockReturnValueOnce( - Promise.resolve({ - ip_addresses: [ - '52.25.153.17', - '52.26.120.161', - '52.39.252.208', - '54.71.62.98', - '34.208.138.149', - '52.88.199.110', - '54.69.11.122', - '54.149.110.158', - ], - updated_at: 1544658529, - }) - ); - Nylas.accounts.connection.request = requestMock; - Nylas.accounts - .first() - .then(account => account.ipAddresses()) - .then(resp => { - expect(Nylas.accounts.connection.request).toHaveBeenCalledWith({ - method: 'GET', - path: `/a/${CLIENT_ID}/ip_addresses`, - }); - expect(resp.updatedAt).toBe(1544658529); - done(); - }); - }); - }); - - describe('tokenInfo', () => { - test("should POST to get info on account's access token", done => { - expect.assertions(7); - const requestMock = jest.fn(); - requestMock - .mockReturnValueOnce( - Promise.resolve([ - { - account_id: '8rilmlwuo4zmpjedz8bcplclk', - billing_state: 'free', - id: ACCOUNT_ID, - sync_state: 'running', - trial: false, - }, - ]) - ) - .mockReturnValueOnce( - Promise.resolve({ - created_at: 1563496685, - scopes: 'calendar,email,contacts', - state: 'valid', - updated_at: 1563496685, - }) - ); - Nylas.accounts.connection.request = requestMock; - Nylas.accounts - .first() - .then(account => account.tokenInfo('abc123')) - .then(resp => { - expect(Nylas.accounts.connection.request).toHaveBeenCalledTimes(2); - expect(Nylas.accounts.connection.request).toHaveBeenCalledWith({ - method: 'GET', - qs: { limit: 1, offset: 0 }, - path: `/a/${CLIENT_ID}/accounts`, - }); - expect(Nylas.accounts.connection.request).toHaveBeenCalledWith({ - method: 'POST', - path: `/a/${CLIENT_ID}/accounts/${ACCOUNT_ID}/token-info`, - body: { access_token: 'abc123' }, - }); - expect(resp.createdAt).toBe(1563496685); - expect(resp.scopes).toBe('calendar,email,contacts'); - expect(resp.state).toBe('valid'); - expect(resp.updatedAt).toBe(1563496685); - done(); - }); - }); - - test('should error when no access token passed in', done => { - expect.assertions(3); - const requestMock = jest.fn(); - requestMock - .mockReturnValueOnce( - Promise.resolve([ - { - account_id: '8rilmlwuo4zmpjedz8bcplclk', - billing_state: 'free', - id: ACCOUNT_ID, - sync_state: 'running', - trial: false, - }, - ]) - ) - .mockReturnValueOnce(Promise.reject('Error: No access_token passed.')); - Nylas.accounts.connection.request = requestMock; - Nylas.accounts - .first() - .then(account => account.tokenInfo()) - .catch(() => { - expect(Nylas.accounts.connection.request).toHaveBeenCalledTimes(2); - expect(Nylas.accounts.connection.request).toHaveBeenCalledWith({ - method: 'GET', - qs: { limit: 1, offset: 0 }, - path: `/a/${CLIENT_ID}/accounts`, - }); - expect(Nylas.accounts.connection.request).toHaveBeenCalledWith({ - method: 'POST', - path: `/a/${CLIENT_ID}/accounts/${ACCOUNT_ID}/token-info`, - body: { access_token: undefined }, - }); - done(); - }); - }); - }); - - describe('save', () => { - test('Should update only metadata when saving', async done => { - Nylas.accounts.connection = new NylasConnection('123', { - clientId: CLIENT_ID, - }); - Nylas.accounts.connection.request = jest.fn(() => Promise.resolve({})); - const accJson = { - account_id: '8rilmlwuo4zmpjedz8bcplclk', - billing_state: 'paid', - email: 'margaret@hamilton.com', - id: ACCOUNT_ID, - provider: 'gmail', - sync_state: 'running', - authentication_type: 'password', - trial: false, - }; - const account = new ManagementAccount( - Nylas.accounts.connection, - CLIENT_ID, - accJson - ); - account.metadata = { - test: 'true', - }; - - account.save().then(() => { - expect(Nylas.accounts.connection.request).toHaveBeenCalledWith({ - method: 'PUT', - path: `/a/${CLIENT_ID}/accounts/${ACCOUNT_ID}`, - qs: {}, - body: { - metadata: { - test: 'true', - }, - }, - }); - done(); - }); - }); - }); -}); diff --git a/__tests__/message-spec.js b/__tests__/message-spec.js deleted file mode 100644 index 8f86383d..00000000 --- a/__tests__/message-spec.js +++ /dev/null @@ -1,277 +0,0 @@ -import Nylas from '../src/nylas'; -import NylasConnection from '../src/nylas-connection'; -import File from '../src/models/file'; -import Message from '../src/models/message'; -import { Label } from '../src/models/folder'; -import MessageRestfulModelCollection from '../src/models/message-restful-model-collection'; -import fetch from 'node-fetch'; -import EmailParticipant from '../src/models/email-participant'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('Message', () => { - let testContext; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection('123', { clientId: 'foo' }); - jest.spyOn(testContext.connection, 'request'); - - const response = receivedBody => { - return { - status: 200, - text: () => { - // For the raw/MIME flow - if (receivedBody === null) { - return Promise.resolve('MIME'); - } - return Promise.resolve(JSON.stringify(receivedBody)); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(req => Promise.resolve(response(req.body))); - - testContext.message = new Message(testContext.connection); - testContext.message.id = '4333'; - testContext.message.subject = 'foo'; - testContext.message.body = 'bar'; - testContext.message.starred = true; - testContext.message.unread = false; - testContext.message.to = [ - new EmailParticipant({ email: 'foo', name: 'bar' }), - ]; - }); - - describe('save', () => { - test('should do a PUT request with labels if labels is defined. Additional arguments should be ignored.', done => { - const label = new Label(testContext.connection); - label.id = 'label_id'; - testContext.message.labels = [label]; - testContext.message.randomArgument = true; - return testContext.message.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/messages/4333' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - label_ids: ['label_id'], - starred: true, - unread: false, - }); - done(); - }); - }); - - test('should do a PUT with folder if folder is defined', done => { - const label = new Label(testContext.connection); - label.id = 'label_id'; - testContext.message.folder = label; - return testContext.message.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/messages/4333' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - folder_id: 'label_id', - starred: true, - unread: false, - }); - done(); - }); - }); - - test('should do a PUT with metadata if metadata is defined', done => { - testContext.message.metadata = { - test: 'yes', - }; - return testContext.message.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/messages/4333' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - metadata: { - test: 'yes', - }, - starred: true, - unread: false, - }); - done(); - }); - }); - - test('should throw an error if the message has no ID (messages cannot be created)', done => { - testContext.message.id = undefined; - testContext.message.metadata = { - test: 'yes', - }; - expect(() => testContext.message.save()).toThrow(); - done(); - }); - - test('should resolve with the message object', done => { - return testContext.message.save().then(message => { - expect(message.id).toBe('4333'); - expect(message.body).toBe('bar'); - expect(message.subject).toBe('foo'); - const toParticipant = message.to[0]; - expect(toParticipant).toEqual({ email: 'foo', name: 'bar' }); - done(); - }); - }); - }); - - describe('getRaw', () => { - test('should support getting raw messages', done => { - return testContext.message.getRaw().then(rawMessage => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/messages/4333' - ); - expect(options.method).toEqual('GET'); - expect(options.headers['message/rfc822']).toEqual(); - expect(rawMessage).toBe('MIME'); - done(); - }); - }); - }); - - describe('MessageRestfulModelCollection', () => { - beforeEach(() => { - const secondMessage = new Message(testContext.connection); - secondMessage.id = '5333'; - secondMessage.subject = 'subject2'; - secondMessage.body = 'body'; - secondMessage.unread = false; - secondMessage.to = [new EmailParticipant({ email: 'foo', name: 'bar' })]; - - const response = request => { - return { - status: 200, - text: () => { - // For the raw/MIME flow - if (request.headers.get('Accept') === 'message/rfc822') { - return Promise.resolve('MIME'); - } - if (!request.url.includes(',')) { - return Promise.resolve( - JSON.stringify(testContext.message.toJSON(false)) - ); - } else { - return Promise.resolve( - JSON.stringify([ - testContext.message.toJSON(false), - secondMessage.toJSON(false), - ]) - ); - } - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(req => Promise.resolve(response(req))); - - testContext.collection = new MessageRestfulModelCollection( - testContext.connection - ); - testContext.collection.getModelCollection = jest.fn(() => { - return Promise.resolve([testContext.message]); - }); - }); - - test('first should resolve with the first item', done => { - const fileObj = { - account_id: 'foo', - content_disposition: 'inline', - content_id: 'bar', - content_type: 'image/png', - filename: 'foobar.png', - id: 'file_id', - object: 'file', - message_ids: [], - size: 123, - }; - const file = new File(testContext.connection); - file.fromJSON(fileObj); - testContext.message.files = [file]; - return testContext.collection.first().then(message => { - expect(message instanceof Message).toBe(true); - expect(message).toBe(testContext.message); - const file = message.files[0]; - expect(file.toJSON()).toEqual(fileObj); - expect(file.contentDisposition).toEqual(fileObj.content_disposition); - done(); - }); - }); - - test('should support getting raw messages', done => { - return testContext.collection.findRaw('abc-123').then(rawMessage => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.path.toString()).toEqual('/messages/abc-123'); - expect(options.method).toEqual('GET'); - expect(options.headers['Accept']).toEqual('message/rfc822'); - expect(rawMessage).toBe('MIME'); - done(); - }); - }); - - describe('findMultiple', () => { - test('should return multiple messages', done => { - return testContext.connection.messages - .findMultiple(['4333', '5333']) - .then(messages => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.path.toString()).toEqual(`/messages/4333,5333`); - expect(options.method).toEqual('GET'); - expect(options.qs).toEqual({ - offset: 0, - limit: 100, - }); - expect(messages.length).toBe(2); - expect(messages[0] instanceof Message).toBe(true); - expect(messages[1] instanceof Message).toBe(true); - expect(messages[0].id).toBe('4333'); - expect(messages[0].subject).toBe('foo'); - expect(messages[0].body).toBe('bar'); - expect(messages[1].id).toBe('5333'); - expect(messages[1].subject).toBe('subject2'); - expect(messages[1].body).toBe('body'); - done(); - }); - }); - - test('array of one should return an array of one message', done => { - return testContext.connection.messages - .findMultiple(['4333']) - .then(messages => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.path.toString()).toEqual(`/messages/4333`); - expect(options.method).toEqual('GET'); - expect(messages.length).toBe(1); - expect(messages[0] instanceof Message).toBe(true); - expect(messages[0].id).toBe('4333'); - expect(messages[0].subject).toBe('foo'); - expect(messages[0].body).toBe('bar'); - done(); - }); - }); - }); - }); -}); diff --git a/__tests__/neural-spec.js b/__tests__/neural-spec.js deleted file mode 100644 index 61e131b4..00000000 --- a/__tests__/neural-spec.js +++ /dev/null @@ -1,376 +0,0 @@ -import Nylas from '../src/nylas'; -import File from '../src/models/file'; -import NylasConnection from '../src/nylas-connection'; -import fetch from 'node-fetch'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('Neural', () => { - let testContext; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = Nylas.with('123'); - jest.spyOn(testContext.connection, 'request'); - }); - - describe('Clean Conversation', () => { - beforeEach(() => { - const serverResponse = [ - { - account_id: 'account123', - body: " This is the body", - conversation: - " This is the conversation", - date: 1624029503, - from: [ - { - email: 'swag@nylas.com', - name: 'Nylas Swag', - }, - ], - id: 'abc123', - model_version: '0.0.1', - object: 'message', - provider_name: 'gmail', - subject: 'Subject', - to: [ - { - email: 'me@nylas.com', - name: 'me', - }, - ], - }, - ]; - - testContext.connection.neural.request = jest.fn(() => - Promise.resolve(serverResponse) - ); - }); - - test('should properly decode object', done => { - return testContext.connection.neural - .cleanConversation(['abc123']) - .then(convoList => { - expect(convoList.length).toEqual(1); - const convo = convoList[0]; - // Test message-specific values were parsed - expect(convo.id).toEqual('abc123'); - expect(convo.body).toEqual( - " This is the body" - ); - - // Test conversation-specific values were parsed - expect(convo.conversation).toEqual( - " This is the conversation" - ); - expect(convo.modelVersion).toEqual('0.0.1'); - done(); - }); - }); - - test('should properly extract all images and return a file', async done => { - testContext.connection.files.find = jest.fn(a => { - const fileJson = { id: a }; - return Promise.resolve(new File(testContext.connection, fileJson)); - }); - const convoList = await testContext.connection.neural.cleanConversation([ - 'abc123', - ]); - return convoList[0].extractImages().then(f => { - expect(f.length).toEqual(1); - expect(f[0].id).toEqual('1781777f666586677621'); - done(); - }); - }); - }); - - describe('Sentiment Analysis', () => { - beforeEach(() => { - const sentiment = { - account_id: 'abc123', - processed_length: 17, - sentiment: 'NEUTRAL', - sentiment_score: 0.20000000298023224, - text: 'This is some text', - }; - - testContext.connection.neural.request = jest.fn((path, body) => { - if (body['message_id']) { - return Promise.resolve([sentiment]); - } - return Promise.resolve(sentiment); - }); - }); - - const evaluateSentiment = convo => { - expect(convo.accountId).toEqual('abc123'); - expect(convo.processedLength).toEqual(17); - expect(convo.sentiment).toEqual('NEUTRAL'); - expect(convo.sentimentScore).toEqual(0.20000000298023224); - expect(convo.text).toEqual('This is some text'); - }; - - test('should properly decode object from message', done => { - return testContext.connection.neural - .sentimentAnalysisMessage(['abc123']) - .then(convoList => { - const sentBody = - testContext.connection.neural.request.mock.calls[0][1]; - expect(sentBody).toEqual({ message_id: ['abc123'] }); - expect(convoList.length).toEqual(1); - evaluateSentiment(convoList[0]); - done(); - }); - }); - - test('should properly decode object from text', done => { - return testContext.connection.neural - .sentimentAnalysisText('This is some text') - .then(convo => { - const sentBody = - testContext.connection.neural.request.mock.calls[0][1]; - expect(sentBody).toEqual({ text: 'This is some text' }); - evaluateSentiment(convo); - done(); - }); - }); - }); - - describe('Extract Signature', () => { - beforeEach(() => { - const serverResponse = [ - { - account_id: 'account123', - body: - "This is the body
Nylas Swag
Software Engineer
123-456-8901
swag@nylas.com
https://example.com/link.html", - signature: - 'Nylas Swag\n\nSoftware Engineer\n\n123-456-8901\n\nswag@nylas.com', - contacts: { - job_titles: ['Software Engineer'], - links: [ - { - description: 'string', - url: 'https://example.com/link.html', - }, - ], - phone_numbers: ['123-456-8901'], - emails: ['swag@nylas.com'], - names: [ - { - first_name: 'Nylas', - last_name: 'Swag', - }, - ], - }, - date: 1624029503, - from: [ - { - email: 'swag@nylas.com', - name: 'Nylas Swag', - }, - ], - id: 'abc123', - model_version: '0.0.1', - object: 'message', - provider_name: 'gmail', - subject: 'Subject', - to: [ - { - email: 'me@nylas.com', - name: 'me', - }, - ], - }, - ]; - - testContext.connection.neural.request = jest.fn(() => - Promise.resolve(serverResponse) - ); - }); - - test('should properly decode both the signature and contact', done => { - return testContext.connection.neural - .extractSignature(['abc123']) - .then(sigList => { - expect(sigList.length).toEqual(1); - const sig = sigList[0]; - expect(sig.signature).toEqual( - 'Nylas Swag\n\nSoftware Engineer\n\n123-456-8901\n\nswag@nylas.com' - ); - expect(sig.modelVersion).toEqual('0.0.1'); - - // Check that the contact object parsed properly - expect(sig.contacts.jobTitles).toEqual(['Software Engineer']); - expect(sig.contacts.phoneNumbers).toEqual(['123-456-8901']); - expect(sig.contacts.emails).toEqual(['swag@nylas.com']); - - // Check if the links parsed properly - expect(sig.contacts.links.length).toEqual(1); - expect(sig.contacts.links[0].description).toEqual('string'); - expect(sig.contacts.links[0].url).toEqual( - 'https://example.com/link.html' - ); - - // Check if the contact parsed properly - expect(sig.contacts.names.length).toEqual(1); - expect(sig.contacts.names[0].firstName).toEqual('Nylas'); - expect(sig.contacts.names[0].lastName).toEqual('Swag'); - done(); - }); - }); - - test('should properly convert contact in signature to contact object', done => { - return testContext.connection.neural - .extractSignature(['abc123']) - .then(sigList => { - const contact = sigList[0].contacts.toContactObject( - testContext.connection - ); - - expect(contact.givenName).toEqual('Nylas'); - expect(contact.surname).toEqual('Swag'); - expect(contact.jobTitle).toEqual('Software Engineer'); - expect(contact.emailAddresses.length).toEqual(1); - expect(contact.emailAddresses[0].email).toEqual('swag@nylas.com'); - expect(contact.phoneNumbers.length).toEqual(1); - expect(contact.phoneNumbers[0].number).toEqual('123-456-8901'); - expect(contact.webPages.length).toEqual(1); - expect(contact.webPages[0].url).toEqual( - 'https://example.com/link.html' - ); - done(); - }); - }); - }); - - describe('Categorize', () => { - beforeEach(() => { - const serverResponse = [ - { - account_id: 'account123', - body: 'This is a body', - categorizer: { - categorized_at: 1624570089, - category: 'feed', - model_version: '6194f733', - subcategories: ['ooo'], - }, - date: 1624029503, - from: [ - { - email: 'swag@nylas.com', - name: 'Nylas Swag', - }, - ], - id: 'abc123', - object: 'message', - provider_name: 'gmail', - subject: 'Subject', - to: [ - { - email: 'me@nylas.com', - name: 'me', - }, - ], - }, - ]; - - testContext = {}; - testContext.connection = new NylasConnection('123', { clientId: 'foo' }); - jest.spyOn(testContext.connection, 'request'); - - const response = () => { - return { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(serverResponse)); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(() => Promise.resolve(response())); - }); - - const evaluateCategorize = categorizer => { - expect(categorizer).toBeDefined(); - expect(categorizer.category).toEqual('feed'); - expect(categorizer.categorizedAt).toEqual( - new Date('2021-06-24T21:28:09Z') - ); - expect(categorizer.modelVersion).toEqual('6194f733'); - expect(categorizer.subcategories.length).toEqual(1); - expect(categorizer.subcategories[0]).toEqual('ooo'); - }; - - test('should properly decode the category object', done => { - return testContext.connection.neural - .categorize(['abc123']) - .then(categorizeList => { - expect(categorizeList.length).toEqual(1); - evaluateCategorize(categorizeList[0].categorizer); - done(); - }); - }); - - test('should properly call recategorize and return a new NeuralCategorize object', async done => { - const categorizeList = await testContext.connection.neural.categorize([ - 'abc123', - ]); - const newCategorize = await categorizeList[0].reCategorize('feed'); - const options = testContext.connection.request.mock.calls[1][0]; - - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/neural/categorize/feedback' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - message_id: 'abc123', - category: 'feed', - }); - evaluateCategorize(newCategorize.categorizer); - done(); - }); - }); - - describe('OCR', () => { - beforeEach(() => { - const serverResponse = { - account_id: 'account123', - content_type: 'application/pdf', - filename: 'sample.pdf', - id: 'abc123', - object: 'file', - ocr: ['This is page 1', 'This is page 2'], - processed_pages: 2, - size: 20, - }; - - testContext.connection.neural.request = jest.fn(() => - Promise.resolve(serverResponse) - ); - }); - - test('should properly decode the ocr object', done => { - return testContext.connection.neural.ocrRequest('abc123').then(file => { - expect(file.ocr.length).toEqual(2); - expect(file.ocr[0]).toEqual('This is page 1'); - expect(file.ocr[1]).toEqual('This is page 2'); - expect(file.processedPages).toEqual(2); - done(); - }); - }); - }); -}); diff --git a/__tests__/nylas-api-spec.js b/__tests__/nylas-api-spec.js deleted file mode 100644 index fe7e24ae..00000000 --- a/__tests__/nylas-api-spec.js +++ /dev/null @@ -1,375 +0,0 @@ -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -// TODO since node 10 URL is global -import { URL } from 'url'; -import fetch, { Response } from 'node-fetch'; -import Nylas from '../src/nylas'; -import NylasConnection from '../src/nylas-connection'; -import AccessToken from '../src/models/access-token'; - -describe('Nylas', () => { - beforeEach(() => { - Nylas.clientId = undefined; - Nylas.clientSecret = undefined; - Nylas.apiServer = 'https://api.nylas.com'; - - fetch.mockImplementation(() => - Promise.resolve( - new Response( - JSON.stringify({ - access_token: '12345', - account_id: 'test_account_id', - email_address: 'test@email.com', - provider: 'gmail', - token_type: 'bearer', - }) - ) - ) - ); - }); - - describe('config', () => { - test('should allow you to populate the clientId, clientSecret, etc.', () => { - const newConfig = { - clientId: 'newId', - clientSecret: 'newSecret', - apiServer: 'https://api-staging.nylas.com/', - timeout: 5000, - logger: { - warn: jest.fn(), - error: jest.fn(), - }, - }; - - Nylas.config(newConfig); - expect(Nylas.clientId).toBe(newConfig.clientId); - expect(Nylas.clientSecret).toBe(newConfig.clientSecret); - expect(Nylas.apiServer).toBe(newConfig.apiServer); - expect(Nylas.timeout).toBe(newConfig.timeout); - expect(Nylas.logger).toBe(newConfig.logger); - }); - - test('should not override existing values unless new values are provided', () => { - const newConfig = { - clientId: 'newId', - clientSecret: 'newSecret', - }; - - Nylas.config(newConfig); - expect(Nylas.clientId).toBe(newConfig.clientId); - expect(Nylas.clientSecret).toBe(newConfig.clientSecret); - expect(Nylas.apiServer).toBe('https://api.nylas.com'); - expect(Nylas.timeout).toBe(0); - }); - - test('should throw an exception if the server options do not contain ://', () => { - const newConfig = { - clientId: 'newId', - clientSecret: 'newSecret', - apiServer: 'dontknowwhatImdoing.nylas.com', - }; - - expect(() => Nylas.config(newConfig)).toThrow(); - }); - - test('using setters should update the values', () => { - const newConfig = { - clientId: 'id', - clientSecret: 'secret', - }; - const logger = { - warn: jest.fn(), - error: jest.fn(), - }; - Nylas.config(newConfig); - Nylas.clientId = 'newId'; - Nylas.clientSecret = 'newSecret'; - Nylas.apiServer = 'https://new.api.nylas.com'; - Nylas.timeout = 5000; - Nylas.logger = logger; - - expect(Nylas.clientId).toBe('newId'); - expect(Nylas.clientSecret).toBe('newSecret'); - expect(Nylas.apiServer).toBe('https://new.api.nylas.com'); - expect(Nylas.timeout).toBe(5000); - expect(Nylas.logger).toBe(logger); - }); - }); - - describe('with', () => { - test('should throw an exception if an access token is not provided', () => - expect(() => Nylas.with()).toThrow()); - - test('should return an NylasConnection for making requests with the access token', () => { - Nylas.config({ - clientId: 'newId', - clientSecret: 'newSecret', - }); - - const conn = Nylas.with('test-access-token'); - expect(conn instanceof NylasConnection).toEqual(true); - }); - }); - - describe('exchangeCodeForToken', () => { - beforeEach(() => - Nylas.config({ - clientId: 'newId', - clientSecret: 'newSecret', - }) - ); - - test('should throw an exception if no code is provided', () => - expect(() => Nylas.exchangeCodeForToken()).toThrow()); - - test('should throw an exception if the client id and secret have not been configured', () => { - Nylas.clientId = undefined; - Nylas.clientSecret = undefined; - expect(() => Nylas.exchangeCodeForToken('code-from-server')).toThrow( - 'cannot be called until you provide a clientId and secret' - ); - }); - - test('should return a promise', () => { - const p = Nylas.exchangeCodeForToken('code-from-server'); - expect(p).toBeInstanceOf(Promise); - }); - - test('should make a request to /oauth/token with the correct grant_type and client params', async () => { - await Nylas.exchangeCodeForToken('code-from-server'); - const search = - 'client_id=newId&client_secret=newSecret&grant_type=authorization_code&code=code-from-server'; - const url = new URL(`https://api.nylas.com/oauth/token?${search}`); - expect(fetch).lastCalledWith(url); - }); - - test('should resolve with the returned AccessToken type', async () => { - const accessToken = await Nylas.exchangeCodeForToken('code-from-server'); - expect(accessToken).toBeInstanceOf(AccessToken); - expect(accessToken.accessToken).toEqual('12345'); - expect(accessToken.accountId).toEqual('test_account_id'); - expect(accessToken.emailAddress).toEqual('test@email.com'); - expect(accessToken.provider).toEqual('gmail'); - expect(accessToken.tokenType).toEqual('bearer'); - }); - - test('should reject with the request error', async () => { - const error = new Error('network error'); - fetch.mockImplementation(() => Promise.reject(error)); - await expect( - Nylas.exchangeCodeForToken('code-from-server') - ).rejects.toThrow(error.message); - }); - - test('should reject with the api error', async () => { - const apiError = { - message: 'Unable to associate credentials', - type: 'api_error', - }; - fetch.mockImplementation(() => - Promise.resolve(new Response(JSON.stringify(apiError))) - ); - await expect( - Nylas.exchangeCodeForToken('code-from-server') - ).rejects.toThrow(apiError.message); - }); - - test('should reject with default error', async () => { - fetch.mockImplementation(() => - Promise.resolve(new Response(JSON.stringify(null))) - ); - await expect( - Nylas.exchangeCodeForToken('code-from-server') - ).rejects.toThrow('No access token in response'); - }); - - describe('when provided an optional callback', () => { - test('should call it with the returned access_token', done => { - fetch.mockImplementation(() => - Promise.resolve(new Response('{"access_token": "12345"}')) - ); - Nylas.exchangeCodeForToken( - 'code-from-server', - (returnedError, accessToken) => { - expect(accessToken).toStrictEqual({ access_token: '12345' }); - done(); - } - ); - }); - - test('should call it with the request error', done => { - const error = new Error('network error'); - fetch.mockImplementation(() => Promise.reject(error)); - Nylas.exchangeCodeForToken('code-from-server', returnedError => { - expect(returnedError).toEqual(error); - done(); - }).catch(() => { - // do nothing - }); - }); - }); - }); - - describe('urlForAuthentication', () => { - const redirectURI = 'https://localhost/callback'; - - beforeEach(() => - Nylas.config({ - clientId: 'newId', - clientSecret: 'newSecret', - }) - ); - - test('should require a redirectURI', () => - expect(() => Nylas.urlForAuthentication()).toThrow()); - - test('should throw an exception if the client id has not been configured', () => { - Nylas.clientId = undefined; - const options = { redirectURI: redirectURI }; - expect(() => Nylas.urlForAuthentication(options)).toThrow(); - }); - - test('should not throw an exception if the client secret has not been configured', () => { - Nylas.clientSecret = undefined; - const options = { redirectURI: redirectURI }; - expect(Nylas.urlForAuthentication(options)).toEqual( - `https://api.nylas.com/oauth/authorize?client_id=newId&response_type=code&login_hint=&redirect_uri=${redirectURI}` - ); - }); - - test('should generate the correct authentication URL', () => { - const options = { redirectURI: 'https://localhost/callback' }; - expect(Nylas.urlForAuthentication(options)).toEqual( - `https://api.nylas.com/oauth/authorize?client_id=newId&response_type=code&login_hint=&redirect_uri=${redirectURI}` - ); - }); - - test('should use a login hint when provided in the options', () => { - const loginHint = 'ben@nylas.com'; - - const options = { - loginHint, - redirectURI, - }; - - expect(Nylas.urlForAuthentication(options)).toEqual( - `https://api.nylas.com/oauth/authorize?client_id=newId&response_type=code&login_hint=${loginHint}&redirect_uri=${redirectURI}` - ); - }); - - test('should use a provider when provided in the options', () => { - const loginHint = 'ben@nylas.com', - provider = 'icloud'; - - const options = { - loginHint, - redirectURI, - provider, - }; - - expect(Nylas.urlForAuthentication(options)).toEqual( - `https://api.nylas.com/oauth/authorize?client_id=newId&response_type=code&login_hint=${loginHint}&redirect_uri=${redirectURI}&provider=${provider}` - ); - }); - - test('should add scopes when provided in the options', () => { - const loginHint = 'ben@nylas.com', - scopes = ['calendar', 'contacts']; - - const options = { - loginHint, - redirectURI, - scopes, - }; - - expect(Nylas.urlForAuthentication(options)).toEqual( - `https://api.nylas.com/oauth/authorize?client_id=newId&response_type=code&login_hint=${loginHint}&redirect_uri=${redirectURI}&scopes=${scopes[0]},${scopes[1]}` - ); - }); - - test('should add response type when provided in the options', () => { - const loginHint = 'ben@nylas.com', - scopes = ['calendar', 'contacts'], - responseType = 'token'; - - const options = { - loginHint, - redirectURI, - scopes, - responseType, - }; - - expect(Nylas.urlForAuthentication(options)).toEqual( - `https://api.nylas.com/oauth/authorize?client_id=newId&response_type=token&login_hint=${loginHint}&redirect_uri=${redirectURI}&scopes=${scopes[0]},${scopes[1]}` - ); - }); - - test('should default to response_type = code when not provided in the options', () => { - const loginHint = 'ben@nylas.com', - scopes = ['calendar', 'contacts']; - - const options = { - loginHint, - redirectURI, - scopes, - }; - - expect(Nylas.urlForAuthentication(options)).toEqual( - `https://api.nylas.com/oauth/authorize?client_id=newId&response_type=code&login_hint=${loginHint}&redirect_uri=${redirectURI}&scopes=${scopes[0]},${scopes[1]}` - ); - }); - }); - - describe('application', () => { - const testSecret = 'mySecret'; - beforeEach(() => - Nylas.config({ - clientId: 'myId', - clientSecret: testSecret, - }) - ); - - test('should throw an exception if the client id has not been configured', () => { - Nylas.clientId = undefined; - expect(() => Nylas.application()).toThrow(); - }); - - test('should throw an exception if the client secret has not been configured', () => { - Nylas.clientSecret = undefined; - expect(() => Nylas.application()).toThrow(); - }); - - // test('should make a GET request to /a/ when options are not provided', () => { - // const defaultParams = "?offset=0&limit=100" - // - // fetch.Request = jest.fn((url, options) => { - // expect(url.toString()).toEqual(`https://api.nylas.com/a/myId${defaultParams}`); - // expect(options.headers['authorization']).toEqual(`Basic ${Buffer.from(`${testSecret}:`, 'utf8').toString('base64')}`); - // expect(options.method).toEqual('GET'); - // }); - // Nylas.application(); - // }); - - // test('should make a PUT request to /a/ when options are provided', () => { - // fetch.Request = jest.fn((url, options) => { - // expect(url.toString()).toEqual('https://api.nylas.com/a/myId'); - // expect(options.headers['authorization']).toEqual(`Basic ${Buffer.from(`${testSecret}:`, 'utf8').toString('base64')}`); - // expect(options.method).toEqual('PUT'); - // expect(options.body).toEqual({ - // application_name: 'newName', - // redirect_uris: ['newURIs'], - // }); - // }); - // Nylas.application({ - // applicationName: 'newName', - // redirectUris: ['newURIs'], - // }); - // }); - }); -}); diff --git a/__tests__/nylas-connection-spec.js b/__tests__/nylas-connection-spec.js deleted file mode 100644 index 622b2ec2..00000000 --- a/__tests__/nylas-connection-spec.js +++ /dev/null @@ -1,335 +0,0 @@ -jest.mock('node-fetch'); -import fetch from 'node-fetch'; -import NylasConnection from '../src/nylas-connection'; -import * as config from '../src/config.ts'; -import PACKAGE_JSON from '../package.json'; - -const { Response } = jest.requireActual('node-fetch'); - -const SDK_VERSION = PACKAGE_JSON.version; - -describe('NylasConnection', () => { - let testContext; - - beforeEach(() => { - testContext = {}; - testContext.connection = new NylasConnection('test-access-token', { - clientId: 'foo', - }); - config.setApiServer('http://nylas.com'); - }); - - describe('requestOptions', () => { - test("should pass view='expanded' when expanded param is provided", () => { - const options = { - method: 'GET', - path: '/threads/123', - qs: { expanded: true }, - }; - const result = testContext.connection.requestOptions(options); - const params = result.url.searchParams; - expect(params.has('expanded')).toEqual(false); - expect(params.get('view')).toEqual('expanded'); - expect(result.headers['User-Agent']).toEqual( - `Nylas Node SDK v${SDK_VERSION}` - ); - expect(result.headers['X-Nylas-Client-Id']).toEqual('foo'); - }); - }); - describe('mismatched api version warnings', () => { - test('should not warn if Nylas API version matches SDK supported API version', () => { - const noWarning = testContext.connection.getWarningForVersion( - '2.0', - '2.0' - ); - expect(noWarning).toEqual(''); - - const warnSdk = testContext.connection.getWarningForVersion('1.0', '2.0'); - expect(warnSdk).toEqual( - `WARNING: SDK version may not support your Nylas API version. SDK supports version 1.0 of the API and your application is currently running on version 2.0 of the API. Please update the sdk to ensure it works properly.` - ); - - const warnApi = testContext.connection.getWarningForVersion('2.0', '1.0'); - expect(warnApi).toEqual( - `WARNING: SDK version may not support your Nylas API version. SDK supports version 2.0 of the API and your application is currently running on version 1.0 of the API. Please update the version of the API that your application is using through the developer dashboard.` - ); - }); - }); - describe('request', () => { - describe('error status', () => { - test('Should fill and return a NylasApiError from a JSON error', done => { - const errorJson = { - message: 'Invalid datetime value z for start_time', - type: 'invalid_request_error', - missing_fields: ['start_time'], - server_error: 'This is also a server error', - }; - - fetch.mockReturnValue( - Promise.resolve( - new Response(JSON.stringify(errorJson), { - status: 400, - }) - ) - ); - - return testContext.connection - .request({ - path: '/test', - method: 'GET', - }) - .catch(err => { - expect(err.message).toEqual( - 'Invalid datetime value z for start_time' - ); - expect(err.statusCode).toEqual(400); - expect(err.name).toEqual('Bad Request'); - expect(err.type).toEqual('invalid_request_error'); - expect(err.missingFields).toEqual(['start_time']); - expect(err.serverError).toEqual('This is also a server error'); - done(); - }); - }); - - test('Should return a NylasApiError if error was a non-JSON', done => { - fetch.mockReturnValue( - Promise.resolve( - new Response('This is an error text.', { - status: 404, - statusText: 'Not Found', - }) - ) - ); - - return testContext.connection - .request({ - path: '/test', - method: 'GET', - }) - .catch(err => { - expect(err.message).toEqual('This is an error text.'); - expect(err.statusCode).toEqual(404); - expect(err.name).toEqual('Not Found'); - expect(err.type).toEqual('Not Found'); - done(); - }); - }); - - describe('timeout', () => { - test('signal is set if timeout is set, unset otherwise', async done => { - fetch.mockReturnValue( - Promise.resolve( - new Response('This is just text', { - headers: { - 'content-length': 17, - 'Content-Type': 'message/rfc822', - }, - }) - ) - ); - await testContext.connection.request({ - path: '/test', - method: 'GET', - }); - expect( - fetch.mock.calls[fetch.mock.calls.length - 1][1].signal - ).toBeUndefined(); - - fetch.mockReturnValue( - Promise.resolve( - new Response('This is just text', { - headers: { - 'content-length': 17, - 'Content-Type': 'message/rfc822', - }, - }) - ) - ); - config.timeout = 5000; - await testContext.connection.request({ - path: '/test', - method: 'GET', - }); - expect( - fetch.mock.calls[fetch.mock.calls.length - 1][1].signal - ).not.toBeUndefined(); - - done(); - }); - - test('Should handle timeout errors properly', done => { - config.logger = { - warn: jest.fn(), - error: jest.fn(), - }; - - const err = new Error(); - err.name = 'AbortError'; - fetch.mockReturnValue(Promise.reject(err)); - - return testContext.connection - .request({ - path: '/test', - method: 'GET', - }) - .catch(err => { - expect(config.logger.warn).toHaveBeenCalledWith( - 'Request timed out' - ); - expect(err.name).toEqual('AbortError'); - done(); - }); - }); - }); - - describe('rate limit errors', () => { - test('Should fill and return a RateLimitError from a 429 error', done => { - const errorJson = { - message: 'Too many requests', - type: 'invalid_request_error', - }; - - fetch.mockReturnValue( - Promise.resolve( - new Response(JSON.stringify(errorJson), { - status: 429, - headers: { - 'X-RateLimit-Limit': '500', - 'X-RateLimit-Reset': '10', - }, - }) - ) - ); - - return testContext.connection - .request({ - path: '/test', - method: 'GET', - }) - .catch(err => { - expect(err.message).toEqual('Too many requests'); - expect(err.statusCode).toEqual(429); - expect(err.name).toEqual('Too Many Requests'); - expect(err.type).toEqual('invalid_request_error'); - expect(err.rateLimit).toEqual(500); - expect(err.rateLimitReset).toEqual(10); - done(); - }); - }); - - test('Should fill and return a RateLimitError from a 429 error even with invalid/missing headers', done => { - const errorJson = { - message: 'Too many requests', - type: 'invalid_request_error', - }; - - fetch.mockReturnValue( - Promise.resolve( - new Response(JSON.stringify(errorJson), { - status: 429, - headers: { - 'X-RateLimit-Limit': 'abcd', - }, - }) - ) - ); - - return testContext.connection - .request({ - path: '/test', - method: 'GET', - }) - .catch(err => { - expect(err.message).toEqual('Too many requests'); - expect(err.statusCode).toEqual(429); - expect(err.name).toEqual('Too Many Requests'); - expect(err.type).toEqual('invalid_request_error'); - expect(err.rateLimit).toBeUndefined(); - expect(err.rateLimitReset).toBeUndefined(); - done(); - }); - }); - }); - }); - describe('successful status', () => { - test('Should return undefined if the content-length header is 0', async () => { - fetch.mockReturnValue( - Promise.resolve( - new Response('This is just text', { - headers: { - 'content-length': 0, - }, - }) - ) - ); - - const response = await testContext.connection.request({ - path: '/test', - method: 'GET', - }); - expect(response).toBeUndefined(); - }); - - test('Should return text if the content-type header is "message/rfc822"', async () => { - fetch.mockReturnValue( - Promise.resolve( - new Response('This is just text', { - headers: { - 'content-length': 17, - 'Content-Type': 'message/rfc822', - }, - }) - ) - ); - - const response = await testContext.connection.request({ - path: '/test', - method: 'GET', - }); - expect(response).toEqual('This is just text'); - }); - - test('Should deserialize JSON properly', async () => { - const mockJson = { - text: 'This is just text', - }; - - fetch.mockReturnValue( - Promise.resolve( - new Response(JSON.stringify(mockJson), { - headers: { - 'content-length': 17, - 'Content-Type': 'application/json', - }, - }) - ) - ); - - const response = await testContext.connection.request({ - path: '/test', - method: 'GET', - }); - expect(response).toEqual(mockJson); - }); - - test('Should return text if JSON body parsing fails', async () => { - fetch.mockReturnValue( - Promise.resolve( - new Response('This is just text', { - headers: { - 'content-length': 17, - 'Content-Type': 'application/json', - }, - }) - ) - ); - - const a = await testContext.connection.request({ - path: '/test', - method: 'GET', - }); - expect(a).toEqual('This is just text'); - }); - }); - }); -}); diff --git a/__tests__/outbox-spec.js b/__tests__/outbox-spec.js deleted file mode 100644 index 8526f59d..00000000 --- a/__tests__/outbox-spec.js +++ /dev/null @@ -1,335 +0,0 @@ -import Nylas from '../src/nylas'; -import NylasConnection from '../src/nylas-connection'; -import fetch from 'node-fetch'; -import Draft from '../src/models/draft'; -import OutboxMessage from '../src/models/outbox-message'; -import OutboxJobStatus from '../src/models/outbox-job-status'; -import { SendGridVerifiedStatus } from '../src/models/outbox'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('Outbox', () => { - let testContext; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection('123', { clientId: 'foo' }); - jest.spyOn(testContext.connection, 'request'); - - const response = receivedBody => { - return { - status: 200, - clone: () => response(receivedBody), - text: () => { - return Promise.resolve(receivedBody); - }, - json: () => { - return Promise.resolve(receivedBody); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(req => Promise.resolve(response(req.body))); - - testContext.draft = new Draft(testContext.connection, { - to: [{ name: 'me', email: 'test@email.com' }], - subject: 'This is an email', - }); - }); - - test('should do a POST request for send', done => { - const today = new Date(); - const tomorrow = new Date(today); - tomorrow.setDate(tomorrow.getDate() + 1); - const dayAfter = new Date(tomorrow); - dayAfter.setDate(dayAfter.getDate() + 1); - - return testContext.connection.outbox - .send(testContext.draft, { - sendAt: tomorrow, - retryLimitDatetime: dayAfter, - }) - .then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/v2/outbox' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - to: [{ name: 'me', email: 'test@email.com' }], - subject: 'This is an email', - send_at: Math.floor(tomorrow.getTime() / 1000.0), - retry_limit_datetime: Math.floor(dayAfter.getTime() / 1000.0), - cc: [], - bcc: [], - from: [], - date: null, - body: undefined, - events: [], - unread: undefined, - snippet: undefined, - thread_id: undefined, - version: undefined, - folder: undefined, - starred: undefined, - labels: [], - file_ids: [], - headers: undefined, - reply_to: [], - reply_to_message_id: undefined, - }); - done(); - }); - }); - - test('should do a PATCH request for update', done => { - const today = new Date(); - const tomorrow = new Date(today); - tomorrow.setDate(tomorrow.getDate() + 1); - const dayAfter = new Date(tomorrow); - dayAfter.setDate(dayAfter.getDate() + 1); - testContext.draft.subject = 'updated subject'; - - return testContext.connection.outbox - .update('job-status-id', { - updatedMessage: testContext.draft, - sendAt: tomorrow, - retryLimitDatetime: dayAfter, - }) - .then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/v2/outbox/job-status-id' - ); - expect(options.method).toEqual('PATCH'); - expect(JSON.parse(options.body)).toEqual({ - to: [{ name: 'me', email: 'test@email.com' }], - subject: 'updated subject', - send_at: Math.floor(tomorrow.getTime() / 1000.0), - retry_limit_datetime: Math.floor(dayAfter.getTime() / 1000.0), - cc: [], - bcc: [], - from: [], - date: null, - body: undefined, - events: [], - unread: undefined, - snippet: undefined, - thread_id: undefined, - version: undefined, - folder: undefined, - starred: undefined, - labels: [], - file_ids: [], - headers: undefined, - reply_to: [], - reply_to_message_id: undefined, - }); - done(); - }); - }); - - test('should do a DELETE request for delete', done => { - return testContext.connection.outbox.delete('job-status-id').then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/v2/outbox/job-status-id' - ); - expect(options.method).toEqual('DELETE'); - done(); - }); - }); - - describe('deserialization', () => { - test('should deserialize OutboxMessage properly', () => { - const json = { - to: [{ name: 'me', email: 'test@email.com' }], - subject: 'This is an email', - send_at: 1646245940, - original_send_at: 1646245940, - retry_limit_datetime: 1646332340, - }; - - const outboxMessage = new OutboxMessage(testContext.connection).fromJSON( - json - ); - - expect(outboxMessage.to.length).toBe(1); - expect(outboxMessage.to[0].name).toEqual('me'); - expect(outboxMessage.to[0].email).toEqual('test@email.com'); - expect(outboxMessage.subject).toEqual('This is an email'); - expect(outboxMessage.sendAt).toEqual(new Date(1646245940 * 1000)); - expect(outboxMessage.originalSendAt).toEqual(new Date(1646245940 * 1000)); - expect(outboxMessage.retryLimitDatetime).toEqual( - new Date(1646332340 * 1000) - ); - }); - - test('should deserialize OutboxJobStatus properly', () => { - const json = { - action: 'new_outbox', - created_at: 1646245940, - send_at: 1646245940, - original_send_at: 1646245940, - job_status_id: 'job-status-id', - status: 'pending', - account_id: 'account-id', - message_id: 'message-id', - thread_id: 'thread-id', - original_data: { - to: [{ name: 'me', email: 'test@email.com' }], - subject: 'This is an email', - send_at: 1646245940, - original_send_at: 1646245940, - retry_limit_datetime: 1646332340, - }, - }; - - const outboxJobStatus = new OutboxJobStatus( - testContext.connection - ).fromJSON(json); - - expect(outboxJobStatus.jobStatusId).toEqual('job-status-id'); - expect(outboxJobStatus.messageId).toEqual('message-id'); - expect(outboxJobStatus.threadId).toEqual('thread-id'); - expect(outboxJobStatus.sendAt).toEqual(new Date(1646245940 * 1000)); - expect(outboxJobStatus.originalSendAt).toEqual( - new Date(1646245940 * 1000) - ); - expect(outboxJobStatus.createdAt).toEqual(new Date(1646245940 * 1000)); - expect(outboxJobStatus.action).toEqual('new_outbox'); - expect(outboxJobStatus.status).toEqual('pending'); - expect(outboxJobStatus.accountId).toEqual('account-id'); - expect(outboxJobStatus.originalData.to.length).toBe(1); - expect(outboxJobStatus.originalData.to[0].name).toEqual('me'); - expect(outboxJobStatus.originalData.to[0].email).toEqual( - 'test@email.com' - ); - expect(outboxJobStatus.originalData.subject).toEqual('This is an email'); - expect(outboxJobStatus.originalData.sendAt).toEqual( - new Date(1646245940 * 1000) - ); - expect(outboxJobStatus.originalData.originalSendAt).toEqual( - new Date(1646245940 * 1000) - ); - expect(outboxJobStatus.originalData.retryLimitDatetime).toEqual( - new Date(1646332340 * 1000) - ); - }); - - test('should deserialize SendGridVerifiedStatus properly', () => { - const json = { - domain_verified: true, - sender_verified: true, - }; - - const verificationStatus = new SendGridVerifiedStatus().fromJSON(json); - expect(verificationStatus.domainVerified).toBe(true); - expect(verificationStatus.senderVerified).toBe(true); - }); - }); - - describe('sendGrid', () => { - beforeEach(() => { - jest.spyOn(testContext.connection, 'request'); - - const response = () => { - return { - status: 200, - clone: () => response(), - text: () => { - return Promise.resolve({}); - }, - json: () => { - return Promise.resolve({ - results: { - domain_verified: true, - sender_verified: true, - }, - }); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(() => Promise.resolve(response())); - }); - - test('should do a GET request for getting sendGrid verification', done => { - return testContext.connection.outbox - .sendGridVerificationStatus() - .then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/v2/outbox/onboard/verified_status' - ); - expect(options.method).toEqual('GET'); - done(); - }); - }); - - test('should do a DELETE request for delete sendGrid user', done => { - return testContext.connection.outbox - .deleteSendGridSubUser('user@email.com') - .then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/v2/outbox/onboard/subuser' - ); - expect(options.method).toEqual('DELETE'); - expect(JSON.parse(options.body)).toEqual({ - email: 'user@email.com', - }); - done(); - }); - }); - }); - - describe('Date Validation', () => { - test('Setting sendAt to older than today throws an error', done => { - expect(() => - testContext.connection.outbox.update('string', { - sendAt: 636309514, // 1990 - }) - ).toThrow(); - done(); - }); - - test('Setting retryLimitDatetime to older than sendAt', done => { - const today = new Date(); - const tomorrow = new Date(today); - tomorrow.setDate(tomorrow.getDate() + 1); - const dayAfter = new Date(tomorrow); - dayAfter.setDate(dayAfter.getDate() + 1); - - expect(() => - testContext.connection.outbox.update('string', { - sendAt: dayAfter, - retryLimitDatetime: tomorrow, - }) - ).toThrow(); - done(); - }); - - test('Setting retryLimitDatetime to older than today without sendAt date', done => { - expect(() => - testContext.connection.outbox.update('string', { - retryLimitDatetime: 636309514, // 1990 - }) - ).toThrow(); - done(); - }); - }); -}); diff --git a/__tests__/resource-spec.js b/__tests__/resource-spec.js deleted file mode 100644 index 185a8373..00000000 --- a/__tests__/resource-spec.js +++ /dev/null @@ -1,92 +0,0 @@ -import fetch from 'node-fetch'; - -import Nylas from '../src/nylas'; -import NylasConnection from '../src/nylas-connection'; -import Resource from '../src/models/resource'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('Resource', () => { - let testContext; - const testAccessToken = 'test-access-token'; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection(testAccessToken, { - clientId: 'myClientId', - }); - testContext.apiResponse = [ - { - object: 'room_resource', - name: 'training room', - email: 'training_room@google.com', - }, - { - object: 'room_resource', - name: 'cafeteria', - email: 'cafeteria@google.com', - }, - ]; - - jest.spyOn(testContext.connection, 'request'); - - const response = () => { - return { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(testContext.apiResponse)); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(() => Promise.resolve(response())); - }); - - describe('list resources', () => { - test('should call API with correct authentication', done => { - expect.assertions(3); - const defaultParams = '?offset=0&limit=100'; - - return testContext.connection.resources.list().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/resources' + defaultParams - ); - expect(options.method).toEqual('GET'); - expect(options.headers['authorization']).toEqual( - `Basic ${Buffer.from(`${testAccessToken}:`, 'utf8').toString( - 'base64' - )}` - ); - done(); - }); - }); - - test('should resolve to resource object(s)', done => { - expect.assertions(7); - - return testContext.connection.resources.list().then(data => { - expect(data[0].object).toBe('room_resource'); - expect(data[0].email).toBe('training_room@google.com'); - expect(data[0].name).toBe('training room'); - expect(data[0] instanceof Resource).toBe(true); - expect(data[1].object).toBe('room_resource'); - expect(data[1].email).toBe('cafeteria@google.com'); - expect(data[1].name).toBe('cafeteria'); - done(); - }); - }); - }); -}); diff --git a/__tests__/restful-model-collection-spec.js b/__tests__/restful-model-collection-spec.js deleted file mode 100644 index cd6449b2..00000000 --- a/__tests__/restful-model-collection-spec.js +++ /dev/null @@ -1,808 +0,0 @@ -import Nylas from '../src/nylas'; -import NylasConnection from '../src/nylas-connection'; -import RestfulModelCollection from '../src/models/restful-model-collection'; -import Draft from '../src/models/draft'; -import Event from '../src/models/event'; -import Thread from '../src/models/thread'; - -describe('RestfulModelCollection', () => { - let testContext; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - }); - testContext = {}; - testContext.connection = new NylasConnection('test-access-token', { - clientId: 'foo', - }); - testContext.connection.request = jest.fn(() => Promise.resolve()); - testContext.collection = new RestfulModelCollection( - Thread, - testContext.connection - ); - }); - - describe('constructor', () => { - test('should require an inbox connection object', () => - expect(() => new RestfulModelCollection(Thread)).toThrow()); - - test('should require a model class', () => - expect(() => { - return new RestfulModelCollection(null, this.connection); - }).toThrow()); - }); - - describe('forEach', () => { - beforeEach(() => { - const threadsResponses = []; - for (let x = 0; x <= 3; x++) { - const response = []; - const count = x < 3 ? 99 : 12; - for ( - let i = 0, end = count, asc = 0 <= end; - asc ? i <= end : i >= end; - asc ? i++ : i-- - ) { - response.push({ - id: '123', - account_id: undefined, - subject: 'A', - }); - } - threadsResponses.push(response); - } - - testContext.collection.getModelCollection = jest.fn((params, offset) => - Promise.resolve(threadsResponses[offset / 100]) - ); - }); - - test('should fetch models with the given params', () => { - const params = { from: 'ben@nylas.com' }; - testContext.collection.forEach( - params, - () => {}, - () => {} - ); - expect(testContext.collection.getModelCollection).toHaveBeenCalledWith( - params, - 0, - 100, - '/threads' - ); - }); - - test('should fetch repeatedly until fewer than requested models are returned', done => { - const params = { from: 'ben@nylas.com' }; - testContext.collection.forEach( - params, - () => {}, - () => { - expect( - testContext.collection.getModelCollection.mock.calls[0] - ).toEqual([{ from: 'ben@nylas.com' }, 0, 100, '/threads']); - expect( - testContext.collection.getModelCollection.mock.calls[1] - ).toEqual([{ from: 'ben@nylas.com' }, 100, 100, '/threads']); - expect( - testContext.collection.getModelCollection.mock.calls[2] - ).toEqual([{ from: 'ben@nylas.com' }, 200, 100, '/threads']); - expect( - testContext.collection.getModelCollection.mock.calls[3] - ).toEqual([{ from: 'ben@nylas.com' }, 300, 100, '/threads']); - done(); - } - ); - }); - - test('should call eachCallback with each model fetched', done => { - const params = { from: 'ben@nylas.com' }; - let eachCallCount = 0; - testContext.collection.forEach( - params, - () => (eachCallCount += 1), - () => { - expect(eachCallCount).toBe(313); - done(); - } - ); - }); - - test('should call completeCallback when finished', done => { - const params = { from: 'ben@nylas.com' }; - let doneCallCount = 0; - testContext.collection.forEach( - params, - () => {}, - () => { - doneCallCount += 1; - expect(doneCallCount).toBe(1); - done(); - } - ); - }); - }); - - describe('count', () => { - test('should make a request with the provided params and view=count', done => { - testContext.collection.count({ from: 'ben@nylas.com' }).catch(() => { - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'GET', - path: '/threads', - qs: { view: 'count', from: 'ben@nylas.com' }, - }); - done(); - }); - }); - - describe('when the request is successful', () => { - beforeEach(() => { - testContext.connection.request = jest.fn(() => - Promise.resolve({ count: 1023 }) - ); - }); - - test('should resolve with the count', done => { - testContext.collection.count({ from: 'ben@nylas.com' }).then(count => { - expect(count).toBe(1023); - done(); - }); - }); - - test('should call the optional callback with the count', done => { - testContext.collection.count( - { from: 'ben@nylas.com' }, - (callbackError, count) => { - expect(count).toBe(1023); - done(); - } - ); - }); - }); - - describe('when the request fails', () => { - beforeEach(() => { - testContext.error = new Error('Network error'); - testContext.connection.request = jest.fn(() => { - return Promise.reject(testContext.error); - }); - }); - - test('should reject with any error', done => { - testContext.collection - .count({ from: 'ben@nylas.com' }) - .catch(rejectError => { - expect(rejectError).toBe(testContext.error); - done(); - }); - }); - - test('should call the optional callback with any error', done => { - testContext.collection - .count({ from: 'ben@nylas.com' }, callbackError => { - expect(callbackError).toBe(testContext.error); - done(); - }) - .catch(() => {}); - }); - }); - }); - - describe('first', () => { - describe('when the request is successful', () => { - beforeEach(() => { - testContext.item = { - id: '123', - headers: { - 'In-Reply-To': null, - 'Message-Id': '<123@mailer.nylas.com>', - References: [], - }, - }; - testContext.items = [testContext.item]; - testContext.collection.getModelCollection = jest.fn(() => { - return Promise.resolve(testContext.items); - }); - }); - - test('should fetch one item with the provided params', done => { - testContext.collection - .first({ - from: 'ben@nylas.com', - view: 'expanded', - }) - .then(msg => { - expect( - testContext.collection.getModelCollection - ).toHaveBeenCalledWith( - { from: 'ben@nylas.com', view: 'expanded' }, - 0, - 1, - '/threads' - ); - expect(msg).toBe(testContext.item); - done(); - }); - }); - - test('should resolve with the first item', done => { - testContext.collection.first({ from: 'ben@nylas.com' }).then(item => { - expect(item).toBe(testContext.item); - done(); - }); - }); - - test('should call the optional callback with the first item', done => { - testContext.collection.first({ from: 'ben@nylas.com' }, (err, item) => { - expect(item).toBe(testContext.item); - done(); - }); - }); - - test('should not throw an exception when no items are returned', done => { - testContext.items = []; - testContext.collection.first({ from: 'ben@nylas.com' }).then(item => { - expect(item).toBe(undefined); - done(); - }); - }); - }); - - describe('when the request fails', () => { - beforeEach(() => { - testContext.error = new Error('Network error'); - testContext.collection.getModelCollection = jest.fn(() => { - return Promise.reject(testContext.error); - }); - }); - - test('should reject with any underlying error', done => { - testContext.collection.first({ from: 'ben@nylas.com' }).catch(err => { - expect(err).toBe(testContext.error); - done(); - }); - }); - - test('should call the optional callback with the underlying error', done => { - testContext.collection - .first({ from: 'ben@nylas.com' }, err => { - expect(err).toBe(testContext.error); - done(); - }) - .catch(() => {}); - }); - }); - }); - - describe('list', () => { - test('should call range() with an infinite range', () => { - testContext.collection.range = jest.fn(); - - const params = { from: 'ben@nylas.com' }; - const callback = () => {}; - testContext.collection.list(params, callback); - expect(testContext.collection.range).toHaveBeenCalledWith({ - params, - limit: Infinity, - callback, - }); - }); - }); - - describe('find', () => { - test('should reject with an error if an id is not provided', () => { - testContext.collection.find().catch(() => {}); - }); - - test('should make an API request for the individual model', done => { - testContext.collection.find('123'); - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'GET', - path: '/threads/123', - qs: {}, - }); - done(); - }); - - test('should pass additional params as third argument to the request when callback is null', done => { - testContext.collection.find('123', null, { param: 1 }); - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'GET', - path: '/threads/123', - qs: { param: 1 }, - }); - done(); - }); - - test('should pass additional params as second argument to the request', done => { - testContext.collection.find('123', { param: 1 }); - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'GET', - path: '/threads/123', - qs: { param: 1 }, - }); - done(); - }); - - test('should pass additional params as second argument to the request when callback is null', done => { - testContext.collection.find('123', { param: 1 }, null); - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'GET', - path: '/threads/123', - qs: { param: 1 }, - }); - done(); - }); - - test('should pass additional params as second argument to the request when callback is provided', done => { - testContext.collection.find('123', { param: 1 }, () => {}); - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'GET', - path: '/threads/123', - qs: { param: 1 }, - }); - done(); - }); - - describe('when the request succeeds', () => { - beforeEach(() => { - testContext.item = { id: '123' }; - testContext.connection.request = jest.fn(() => { - return Promise.resolve(testContext.item); - }); - }); - - test('should resolve with the item', done => { - testContext.collection.find('123').then(item => { - expect(item instanceof Thread).toBe(true); - expect(item.id).toBe('123'); - done(); - }); - }); - - test('should call the optional callback with the first item', done => { - testContext.collection.find('123', (err, item) => { - expect(item instanceof Thread).toBe(true); - expect(item.id).toBe('123'); - done(); - }); - }); - - test('should call the optional callback with the first item when params provided as second arg', done => { - testContext.collection.find('123', { param: 1 }, (err, item) => { - expect(item instanceof Thread).toBe(true); - expect(item.id).toBe('123'); - done(); - }); - }); - - test('should call the optional callback with the first item when params provided as third arg', done => { - testContext.collection.find( - '123', - (err, item) => { - expect(item instanceof Thread).toBe(true); - expect(item.id).toBe('123'); - done(); - }, - { param: 1 } - ); - }); - }); - - describe('when the request fails', () => { - beforeEach(() => { - testContext.error = new Error('Network error'); - testContext.connection.request = jest.fn(() => { - return Promise.reject(testContext.error); - }); - }); - - test('should reject with any underlying error', done => { - testContext.collection.find('123').catch(err => { - expect(err).toBe(testContext.error); - done(); - }); - }); - - test('should call the optional callback with the underlying error', done => { - testContext.collection - .find('123', err => { - expect(err).toBe(testContext.error); - done(); - }) - .catch(() => {}); - }); - }); - }); - - describe('search', () => { - test('should reject with an error if a query is not provided', () => { - testContext.collection.search().catch(err => { - expect(err).toBeInstanceOf(Error); - }); - }); - - test('should reject with an error if called on any model but Message or Thread', () => { - testContext.collection = new RestfulModelCollection( - Event, - testContext.connection - ); - testContext.collection.search().catch(err => { - expect(err).toBeInstanceOf(Error); - }); - }); - - test('should make an API request to search with query string', done => { - testContext.collection.search('blah').catch(() => { - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'GET', - path: '/threads/search', - qs: { limit: 40, offset: 0, q: 'blah' }, - }); - done(); - }); - }); - - test('should pass user-defined limit and offset to the request', done => { - testContext.collection - .search('blah', { limit: 1, offset: 1 }) - .catch(() => { - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'GET', - path: '/threads/search', - qs: { limit: 1, offset: 1, q: 'blah' }, - }); - done(); - }); - }); - - describe('when the request succeeds', () => { - beforeEach(() => { - testContext.item = { subject: 'Hey, Jackie!' }; - testContext.connection.request = jest.fn(() => { - return Promise.resolve([testContext.item]); - }); - }); - - test('should resolve with the item', done => { - testContext.collection.search('Jackie').then(threads => { - expect(threads[0] instanceof Thread).toBe(true); - expect(threads[0].subject).toContain('Jackie'); - done(); - }); - }); - - test('should call the optional callback with the first item', done => { - testContext.collection - .search('Jackie', {}, (err, threads) => { - expect(threads[0] instanceof Thread).toBe(true); - expect(threads[0].subject).toContain('Jackie'); - }) - .then(() => { - done(); - }); - }); - }); - - describe('when the request fails', () => { - beforeEach(() => { - testContext.error = new Error('Network error'); - testContext.connection.request = jest.fn(() => { - return Promise.reject(testContext.error); - }); - }); - - test('should reject with any underlying error', done => { - testContext.collection.search('Jackie').catch(err => { - expect(err).toBe(testContext.error); - done(); - }); - }); - - test('should call the optional callback with the underlying error', done => { - testContext.collection - .search('Jackie', {}, err => { - expect(err).toBe(testContext.error); - }) - .catch(() => { - done(); - }); - }); - }); - }); - - describe('delete', () => { - beforeEach(() => { - testContext.collection = new RestfulModelCollection( - Event, - testContext.connection - ); - testContext.item = new Event(testContext.connection, { - id: '123', - }); - }); - - test('should populate qs if params passed in', done => { - testContext.collection.delete(testContext.item, { - notify_participants: false, - }); - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'DELETE', - qs: { notify_participants: false }, - body: {}, - path: '/events/123', - }); - done(); - }); - - test('should accept an object id as the first parameter', done => { - testContext.collection.delete(testContext.item.id, { - notify_participants: true, - }); - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'DELETE', - qs: { notify_participants: true }, - body: {}, - path: '/events/123', - }); - done(); - }); - - test('should work without query params', done => { - testContext.collection.delete(testContext.item); - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'DELETE', - qs: {}, - body: {}, - path: '/events/123', - }); - done(); - }); - - test('should work with extraneous params', done => { - testContext.collection.delete(testContext.item, { foo: 'bar' }); - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'DELETE', - qs: {}, - body: {}, - path: '/events/123', - }); - done(); - }); - - describe('when the api request is successful', () => { - test('should resolve', done => { - testContext.collection.delete(testContext.item.id).then(() => done()); - }); - - test('should call its callback with no error', done => { - testContext.collection.delete(testContext.item.id, err => { - expect(err).toBe(null); - done(); - }); - }); - }); - - describe('when the api request fails', () => { - beforeEach(() => { - testContext.error = new Error('Network error'); - testContext.connection.request = jest.fn(() => { - return Promise.reject(testContext.error); - }); - }); - - test('should reject', done => { - testContext.collection.delete(testContext.item.id).catch(err => { - expect(err).toBe(testContext.error); - done(); - }); - }); - - test('should call its callback with the error', done => { - testContext.collection - .delete(testContext.item.id, err => { - expect(err).toBe(testContext.error); - done(); - }) - .catch(() => {}); - }); - }); - }); - - describe('deleteItem', () => { - beforeEach(() => { - testContext.collection = new RestfulModelCollection( - Draft, - testContext.connection - ); - testContext.item = new Draft(testContext.connection, { - id: '123', - to: [{ email: 'foo', name: 'bar' }], - version: 0, - }); - }); - - test("should populate body with draft object's version if version param not provided", () => { - testContext.collection.deleteItem({ item: testContext.item }); - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'DELETE', - qs: {}, - body: { version: 0 }, - path: '/drafts/123', - }); - }); - - test('should override draft version if it was passed in', () => { - testContext.collection.deleteItem({ - item: testContext.item, - body: { version: 2 }, - }); - expect(testContext.connection.request).toHaveBeenCalledWith({ - method: 'DELETE', - qs: {}, - body: { version: 2 }, - path: '/drafts/123', - }); - }); - - describe('when the api request is successful', () => { - test('should resolve', done => { - testContext.collection - .deleteItem({ item: testContext.item }) - .then(() => done()); - }); - - test('should call its callback with no error', done => { - function callback(err) { - expect(err).toBe(null); - done(); - } - testContext.collection.deleteItem({ - item: testContext.item, - callback: callback, - }); - }); - }); - - describe('when the api request fails', () => { - beforeEach(() => { - testContext.error = new Error('Network error'); - testContext.connection.request = jest.fn(() => { - return Promise.reject(testContext.error); - }); - }); - - test('should reject', done => { - testContext.collection - .deleteItem({ item: testContext.item }) - .catch(err => { - expect(err).toBe(testContext.error); - done(); - }); - }); - - test('should call its callback with the error', done => { - function callback(err) { - expect(err).toBe(testContext.error); - done(); - } - testContext.collection - .deleteItem({ item: testContext.item, callback: callback }) - .catch(() => {}); - }); - }); - }); - - describe('path', () => { - test("should return the modelClass' collectionName with no prefix", () => { - expect(testContext.collection.path()).toEqual('/threads'); - }); - }); - - describe('range', () => { - beforeEach(() => { - const threadsResponses = []; - for (let x = 0; x <= 3; x++) { - const response = []; - const count = x < 3 ? 99 : 12; - for ( - let i = 0, end = count, asc = 0 <= end; - asc ? i <= end : i >= end; - asc ? i++ : i-- - ) { - response.push({ - id: '123', - account_id: undefined, - subject: 'A', - }); - } - threadsResponses.push(response); - } - - testContext.collection.getModelCollection = jest.fn((params, offset) => - Promise.resolve(threadsResponses[offset / 100]) - ); - }); - - test('should fetch once if fewer than one page of models are requested', () => { - const params = { from: 'ben@nylas.com' }; - testContext.collection.range({ params, offset: 0, limit: 50 }); - expect(testContext.collection.getModelCollection).toHaveBeenCalledWith( - params, - 0, - 50, - '/threads' - ); - }); - - test('should fetch repeatedly until the requested number of models have been returned', () => { - const params = { from: 'ben@nylas.com' }; - const callback = () => { - expect( - testContext.collection.getModelCollection.mock.calls[0] - ).toEqual([{ from: 'ben@nylas.com' }, 0, 100, '/threads']); - expect( - testContext.collection.getModelCollection.mock.calls[1] - ).toEqual([{ from: 'ben@nylas.com' }, 100, 100, '/threads']); - expect( - testContext.collection.getModelCollection.mock.calls[2] - ).toEqual([{ from: 'ben@nylas.com' }, 200, 100, '/threads']); - }; - testContext.collection.range({ - params, - callback, - offset: 0, - limit: 300, - }); - }); - - test('should stop fetching if fewer than requested models are returned', () => { - const params = { from: 'ben@nylas.com' }; - const callback = () => { - expect( - testContext.collection.getModelCollection.mock.calls[0] - ).toEqual([{ from: 'ben@nylas.com' }, 0, 100, '/threads']); - expect( - testContext.collection.getModelCollection.mock.calls[1] - ).toEqual([{ from: 'ben@nylas.com' }, 100, 100, '/threads']); - expect( - testContext.collection.getModelCollection.mock.calls[2] - ).toEqual([{ from: 'ben@nylas.com' }, 200, 100, '/threads']); - expect( - testContext.collection.getModelCollection.mock.calls[3] - ).toEqual([{ from: 'ben@nylas.com' }, 300, 100, '/threads']); - }; - testContext.collection.range({ - params, - callback, - offset: 0, - limit: 10000, - }); - }); - - test('should call the callback with all of the loaded models', done => { - const params = { from: 'ben@nylas.com' }; - testContext.collection.range({ - params, - offset: 0, - limit: 10000, - callback: (err, models) => { - expect(models.length).toBe(313); - done(); - }, - }); - }); - - test('should resolve with the loaded models', done => { - const params = { from: 'ben@nylas.com' }; - testContext.collection - .range({ params, offset: 0, limit: 10000 }) - .then(function(models) { - expect(models.length).toBe(313); - done(); - }); - }); - }); -}); diff --git a/__tests__/restful-model-spec.js b/__tests__/restful-model-spec.js deleted file mode 100644 index 1a947fb4..00000000 --- a/__tests__/restful-model-spec.js +++ /dev/null @@ -1,214 +0,0 @@ -import NylasConnection from '../src/nylas-connection'; -import RestfulModel from '../src/models/restful-model'; -import Attributes from '../src/models/attributes'; - -class RestfulSubclassA extends RestfulModel {} - -class RestfulSubclassB extends RestfulModel {} - -class RestfulSubclassAttributes extends RestfulModel {} -RestfulSubclassAttributes.attributes = { - ...RestfulModel.attributes, - testNumber: Attributes.Number({ - modelKey: 'testNumber', - jsonKey: 'test_number', - }), - testBoolean: Attributes.Boolean({ - modelKey: 'testBoolean', - jsonKey: 'test_boolean', - }), -}; - -describe('RestfulModel', () => { - let testContext; - - beforeEach(() => { - testContext = {}; - testContext.connection = new NylasConnection('token', { clientId: 'foo' }); - }); - - test('should throw an exception unless constructed with a connection', () => { - expect(() => new RestfulModel()).toThrow(); - expect(() => new RestfulModel(testContext.connection)).not.toThrow(); - }); - - test('should accept JSON properties', () => { - const model = new RestfulModel(testContext.connection, { - object: 'thread', - id: '123', - }); - expect(model.object).toBe('thread'); - expect(model.id).toBe('123'); - }); - - describe('attributes', () => { - test('should return the attributes attached to the class', () => { - const model = new RestfulModel(testContext.connection, { - object: 'thread', - id: '123', - }); - expect(model.attributes()).toBe(model.constructor.attributes); - }); - }); - - describe('isEqual', () => { - beforeEach(() => { - testContext.model1 = new RestfulModel(testContext.connection, { - object: 'thread', - id: 'A', - }); - testContext.model2 = new RestfulModel(testContext.connection, { - object: 'thread', - id: 'A', - }); - testContext.model3 = new RestfulModel(testContext.connection, { - object: 'thread', - id: 'B', - }); - testContext.model4 = new RestfulSubclassA(testContext.connection, { - object: 'thread', - id: 'B', - }); - testContext.model5 = new RestfulSubclassB(testContext.connection, { - object: 'thread', - id: 'C', - }); - testContext.model6 = new RestfulSubclassB(testContext.connection, { - object: 'thread', - id: 'C', - }); - }); - - test('should return true if the objects are of the same class and have the same id', () => { - expect(testContext.model1.isEqual(testContext.model2)).toBe(true); - expect(testContext.model5.isEqual(testContext.model6)).toBe(true); - }); - - test('should return false otherwise', () => { - expect(testContext.model1.isEqual(testContext.model3)).toBe(false); - expect(testContext.model3.isEqual(testContext.model4)).toBe(false); - }); - }); - - describe('fromJSON', () => { - beforeEach(() => { - testContext.json = { - id: '1234', - account_id: '1234', - test_number: 4, - test_boolean: true, - daysOld: 4, - }; - testContext.m = new RestfulSubclassAttributes(testContext.connection); - }); - - test('should assign attribute values by calling through to attribute fromJSON functions', () => { - const testNumberFromJSON = - RestfulSubclassAttributes.attributes.testNumber.fromJSON; - RestfulSubclassAttributes.attributes.testNumber.fromJSON = jest.fn( - () => 'inflated value!' - ); - testContext.m.fromJSON(testContext.json); - expect( - RestfulSubclassAttributes.attributes.testNumber.fromJSON.mock.calls - .length - ).toBe(1); - expect(testContext.m.testNumber).toBe('inflated value!'); - RestfulSubclassAttributes.attributes.testNumber.fromJSON = testNumberFromJSON; - }); - - test('should not touch attributes that are missing in the json', () => { - testContext.m.fromJSON(testContext.json); - expect(testContext.m.object).toBe(undefined); - - testContext.m.object = 'abc'; - testContext.m.fromJSON(testContext.json); - expect(testContext.m.object).toBe('abc'); - }); - - test('should not do anything with extra JSON keys', () => { - testContext.m.fromJSON(testContext.json); - expect(testContext.m.daysOld).toBe(undefined); - }); - - describe('Attributes.Number', () => { - test('should read number attributes and coerce them to numeric values', () => { - testContext.m.fromJSON({ test_number: 4 }); - expect(testContext.m.testNumber).toBe(4); - - testContext.m.fromJSON({ test_number: '4' }); - expect(testContext.m.testNumber).toBe(4); - - testContext.m.fromJSON({ test_number: 'lolz' }); - expect(testContext.m.testNumber).toBe(null); - - testContext.m.fromJSON({ test_number: 0 }); - expect(testContext.m.testNumber).toBe(0); - }); - }); - - describe('Attributes.Boolean', () => { - test('should read `true` or true and coerce everything else to false', () => { - testContext.m.fromJSON({ test_boolean: true }); - expect(testContext.m.testBoolean).toBe(true); - - testContext.m.fromJSON({ test_boolean: 'true' }); - expect(testContext.m.testBoolean).toBe(true); - - testContext.m.fromJSON({ test_boolean: 4 }); - expect(testContext.m.testBoolean).toBe(false); - - testContext.m.fromJSON({ test_boolean: '4' }); - expect(testContext.m.testBoolean).toBe(false); - - testContext.m.fromJSON({ test_boolean: false }); - expect(testContext.m.testBoolean).toBe(false); - - testContext.m.fromJSON({ test_boolean: 0 }); - expect(testContext.m.testBoolean).toBe(false); - - testContext.m.fromJSON({ test_boolean: null }); - expect(testContext.m.testBoolean).toBe(false); - }); - }); - }); - - describe('toJSON', () => { - beforeEach(() => { - testContext.model = new RestfulModel(testContext.connection, { - id: '1234', - account_id: 'ACD', - }); - }); - - test('should return a JSON object and call attribute toJSON functions to map values', () => { - RestfulModel.attributes.accountId.toJSON = jest.fn( - () => 'inflated value!' - ); - - const json = testContext.model.toJSON(); - expect(json instanceof Object).toBe(true); - expect(json.id).toBe('1234'); - expect(json.account_id).toBe('inflated value!'); - }); - - test('should surface any exception one of the attribute toJSON functions raises', () => { - RestfulModel.attributes.accountId.toJSON = jest.fn(() => { - throw new Error("Can't convert value into JSON format"); - }); - expect(() => testContext.model.toJSON()).toThrow(); - }); - - test('if enforceReadOnly is set to true, ignore read only values', () => { - const model = new RestfulModel(testContext.connection, { - object: 'thread', - id: '123', - accountId: '123abc', - }); - const json = model.toJSON(true); - expect(json.id).toBeUndefined(); - expect(json.object).toBeUndefined(); - expect(json.account_id).toBeUndefined(); - }); - }); -}); diff --git a/__tests__/scheduler-restful-model-collection-spec.js b/__tests__/scheduler-restful-model-collection-spec.js deleted file mode 100644 index 8b86103c..00000000 --- a/__tests__/scheduler-restful-model-collection-spec.js +++ /dev/null @@ -1,405 +0,0 @@ -import Nylas from '../src/nylas'; -import NylasConnection from '../src/nylas-connection'; -import fetch from 'node-fetch'; -import SchedulerTimeSlot from '../src/models/scheduler-time-slot'; -import SchedulerBookingRequest from '../src/models/scheduler-booking-request'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('SchedulerRestfulModelCollection', () => { - let testContext; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection('abc-123', { - clientId: 'myClientId', - }); - jest.spyOn(testContext.connection, 'request'); - }); - - describe('Configuration', () => { - test('Base URL was set properly', done => { - const response = { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify({})); - }, - headers: new Map(), - }; - - fetch.mockImplementation(() => Promise.resolve(response)); - - testContext.connection.scheduler.find('abc-123').then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.schedule.nylas.com/manage/pages/abc-123' - ); - done(); - }); - }); - }); - - describe('ProviderAvailability', () => { - beforeEach(() => { - const availability = { - busy: [ - { - end: 1636731958, - start: 1636728347, - }, - ], - email: 'test@example.com', - name: 'John Doe', - }; - - const response = { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(availability)); - }, - headers: new Map(), - }; - - fetch.mockImplementation(() => Promise.resolve(response)); - }); - - test('getGoogleAvailability should call the correct endpoint', done => { - testContext.connection.scheduler.getGoogleAvailability().then(json => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.schedule.nylas.com/schedule/availability/google' - ); - expect(options.method).toEqual('GET'); - expect(json.busy[0].end).toBe(1636731958); - expect(json.busy[0].start).toBe(1636728347); - expect(json.email).toEqual('test@example.com'); - expect(json.name).toEqual('John Doe'); - done(); - }); - }); - - test('getOffice365Availability should call the correct endpoint', done => { - testContext.connection.scheduler.getOffice365Availability().then(json => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.schedule.nylas.com/schedule/availability/o365' - ); - expect(options.method).toEqual('GET'); - expect(json.busy[0].end).toBe(1636731958); - expect(json.busy[0].start).toBe(1636728347); - expect(json.email).toEqual('test@example.com'); - expect(json.name).toEqual('John Doe'); - done(); - }); - }); - }); - - describe('Public Booking API', () => { - beforeEach(() => { - const availability = { - busy: [ - { - end: 1636731958, - start: 1636728347, - }, - ], - email: 'test@example.com', - name: 'John Doe', - }; - - const response = { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(availability)); - }, - headers: new Map(), - }; - - fetch.mockImplementation(() => Promise.resolve(response)); - }); - - test('getPageBySlug should return a Scheduler type', done => { - const schedulerJSON = { - app_client_id: 'test-client-id', - app_organization_id: 0, - config: { - timezone: 'America/Los_Angeles', - }, - edit_token: 'token', - name: 'Test', - slug: 'test-slug', - created_at: new Date('2021-06-24T21:28:09Z'), - modified_at: new Date('2021-06-24T21:28:09Z'), - }; - - const response = { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(schedulerJSON)); - }, - headers: new Map(), - }; - - fetch.mockImplementation(() => Promise.resolve(response)); - - testContext.connection.scheduler - .getPageBySlug('test-slug') - .then(scheduler => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.schedule.nylas.com/schedule/test-slug/info' - ); - expect(options.method).toEqual('GET'); - expect(scheduler.appClientId).toEqual('test-client-id'); - expect(scheduler.appOrganizationId).toBe(0); - expect(scheduler.config.timezone).toEqual('America/Los_Angeles'); - expect(scheduler.editToken).toEqual('token'); - expect(scheduler.name).toEqual('Test'); - expect(scheduler.slug).toEqual('test-slug'); - expect(scheduler.createdAt).toEqual(new Date('2021-06-24T21:28:09Z')); - expect(scheduler.modifiedAt).toEqual( - new Date('2021-06-24T21:28:09Z') - ); - done(); - }); - }); - - test('getAvailableTimeSlots should return an array of SchedulerTimeSlot', done => { - const schedulerTimeSlots = [ - { - account_id: 'test-account-id', - calendar_id: 'test-calendar-id', - emails: ['test@example.com'], - end: 1636731958, - host_name: 'www.hostname.com', - start: 1636728347, - }, - ]; - - const response = { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(schedulerTimeSlots)); - }, - headers: new Map(), - }; - - fetch.mockImplementation(() => Promise.resolve(response)); - - testContext.connection.scheduler - .getAvailableTimeSlots('test-slug') - .then(timeslots => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.schedule.nylas.com/schedule/test-slug/timeslots' - ); - expect(options.method).toEqual('GET'); - expect(timeslots.length).toBe(1); - const timeslot = timeslots[0]; - expect(timeslot.accountId).toEqual('test-account-id'); - expect(timeslot.calendarId).toEqual('test-calendar-id'); - expect(timeslot.emails[0]).toEqual('test@example.com'); - expect(timeslot.hostName).toEqual('www.hostname.com'); - expect(timeslot.end).toEqual(new Date(1636731958 * 1000)); - expect(timeslot.start).toEqual(new Date(1636728347 * 1000)); - done(); - }); - }); - - test('cancel booking', done => { - const success = { - success: true, - }; - - const response = { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(success)); - }, - headers: new Map(), - }; - - fetch.mockImplementation(() => Promise.resolve(response)); - - testContext.connection.scheduler - .cancelBooking('test-slug', 'test-edit-hash', 'test') - .then(json => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.schedule.nylas.com/schedule/test-slug/test-edit-hash/cancel' - ); - expect(options.method).toEqual('POST'); - expect(json).toEqual({ - success: true, - }); - done(); - }); - }); - - describe('SchedulerBookingConfirmation', () => { - beforeEach(() => { - const bookingConfirmation = { - account_id: 'test-account-id', - additional_field_values: { - test: 'yes', - }, - calendar_event_id: 'test-event-id', - calendar_id: 'test-calendar-id', - edit_hash: 'test-edit-hash', - end_time: 1636731958, - id: 123, - is_confirmed: false, - location: 'Earth', - recipient_email: 'recipient@example.com', - recipient_locale: 'en_US', - recipient_name: 'Recipient Doe', - recipient_tz: 'America/New_York', - start_time: 1636728347, - title: 'Test Booking', - }; - - const response = { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(bookingConfirmation)); - }, - headers: new Map(), - }; - - fetch.mockImplementation(() => Promise.resolve(response)); - }); - - test('bookTimeSlot should return a SchedulerBookingConfirmation type', done => { - const slot = new SchedulerTimeSlot(testContext.connection); - slot.accountId = 'test-account-id'; - slot.calendarId = 'test-calendar-id'; - slot.emails = ['recipient@example.com']; - slot.start = new Date(1636728347 * 1000); - slot.end = new Date(1636731958 * 1000); - const timeslotToBook = new SchedulerBookingRequest( - testContext.connection - ); - timeslotToBook.additionalValues = { - test: 'yes', - }; - timeslotToBook.email = 'recipient@example.com'; - timeslotToBook.locale = 'en_US'; - timeslotToBook.name = 'Recipient Doe'; - timeslotToBook.timezone = 'America/New_York'; - timeslotToBook.slot = slot; - - testContext.connection.scheduler - .bookTimeSlot('test-slug', timeslotToBook) - .then(bookingConfirmation => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.schedule.nylas.com/schedule/test-slug/timeslots' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - additional_emails: [], - additional_values: { - test: 'yes', - }, - email: 'recipient@example.com', - locale: 'en_US', - name: 'Recipient Doe', - timezone: 'America/New_York', - slot: { - account_id: 'test-account-id', - calendar_id: 'test-calendar-id', - emails: ['recipient@example.com'], - start: 1636728347, - end: 1636731958, - }, - }); - - expect(bookingConfirmation.accountId).toEqual('test-account-id'); - expect(bookingConfirmation.calendarId).toEqual('test-calendar-id'); - expect(bookingConfirmation.additionalFieldValues).toEqual({ - test: 'yes', - }); - expect(bookingConfirmation.calendarEventId).toEqual( - 'test-event-id' - ); - expect(bookingConfirmation.calendarId).toEqual('test-calendar-id'); - expect(bookingConfirmation.calendarEventId).toEqual( - 'test-event-id' - ); - expect(bookingConfirmation.editHash).toEqual('test-edit-hash'); - expect(bookingConfirmation.id).toEqual(123); - expect(bookingConfirmation.isConfirmed).toBe(false); - expect(bookingConfirmation.location).toEqual('Earth'); - expect(bookingConfirmation.title).toEqual('Test Booking'); - expect(bookingConfirmation.recipientEmail).toEqual( - 'recipient@example.com' - ); - expect(bookingConfirmation.recipientLocale).toEqual('en_US'); - expect(bookingConfirmation.recipientName).toEqual('Recipient Doe'); - expect(bookingConfirmation.recipientTz).toEqual('America/New_York'); - expect(bookingConfirmation.endTime).toEqual( - new Date(1636731958 * 1000) - ); - expect(bookingConfirmation.startTime).toEqual( - new Date(1636728347 * 1000) - ); - done(); - }); - }); - - test('confirmBooking should return a SchedulerBookingConfirmation type', done => { - testContext.connection.scheduler - .confirmBooking('test-slug', 'test-edit-hash') - .then(bookingConfirmation => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.schedule.nylas.com/schedule/test-slug/test-edit-hash/confirm' - ); - expect(options.method).toEqual('POST'); - - expect(bookingConfirmation.accountId).toEqual('test-account-id'); - expect(bookingConfirmation.calendarId).toEqual('test-calendar-id'); - expect(bookingConfirmation.additionalFieldValues).toEqual({ - test: 'yes', - }); - expect(bookingConfirmation.calendarEventId).toEqual( - 'test-event-id' - ); - expect(bookingConfirmation.calendarId).toEqual('test-calendar-id'); - expect(bookingConfirmation.calendarEventId).toEqual( - 'test-event-id' - ); - expect(bookingConfirmation.editHash).toEqual('test-edit-hash'); - expect(bookingConfirmation.id).toEqual(123); - expect(bookingConfirmation.isConfirmed).toBe(false); - expect(bookingConfirmation.location).toEqual('Earth'); - expect(bookingConfirmation.title).toEqual('Test Booking'); - expect(bookingConfirmation.recipientEmail).toEqual( - 'recipient@example.com' - ); - expect(bookingConfirmation.recipientLocale).toEqual('en_US'); - expect(bookingConfirmation.recipientName).toEqual('Recipient Doe'); - expect(bookingConfirmation.recipientTz).toEqual('America/New_York'); - expect(bookingConfirmation.endTime).toEqual( - new Date(1636731958 * 1000) - ); - expect(bookingConfirmation.startTime).toEqual( - new Date(1636728347 * 1000) - ); - done(); - }); - }); - }); - }); -}); diff --git a/__tests__/scheduler-spec.js b/__tests__/scheduler-spec.js deleted file mode 100644 index a28b3bc0..00000000 --- a/__tests__/scheduler-spec.js +++ /dev/null @@ -1,272 +0,0 @@ -import Nylas from '../src/nylas'; -import NylasConnection from '../src/nylas-connection'; -import fetch from 'node-fetch'; -import Scheduler, { - SchedulerAvailableCalendars, -} from '../src/models/scheduler'; -import Calendar from '../src/models/calendar'; -import { SchedulerConfig } from '../src/models/scheduler'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('Scheduler', () => { - let testContext; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection('123', { clientId: 'foo' }); - jest.spyOn(testContext.connection, 'request'); - - const response = receivedBody => { - return { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(receivedBody)); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(req => Promise.resolve(response(req.body))); - - testContext.scheduler = new Scheduler(testContext.connection); - }); - - describe('json', () => { - test('Should deserialize the object properly', done => { - const schedulerJSON = { - appClientId: 'test-client-id', - appOrganizationId: 0, - config: { - timezone: 'America/Los_Angeles', - }, - editToken: 'token', - name: 'Test', - slug: 'test-slug', - createdAt: new Date('2021-06-24'), - modifiedAt: new Date('2021-06-24'), - }; - const scheduler = new Scheduler(testContext.connection, schedulerJSON); - - expect(scheduler.appClientId).toEqual('test-client-id'); - expect(scheduler.appOrganizationId).toBe(0); - expect(scheduler.config.timezone).toEqual('America/Los_Angeles'); - expect(scheduler.editToken).toEqual('token'); - expect(scheduler.name).toEqual('Test'); - expect(scheduler.slug).toEqual('test-slug'); - expect(scheduler.createdAt).toEqual(new Date('2021-06-24')); - expect(scheduler.modifiedAt).toEqual(new Date('2021-06-24')); - done(); - }); - - test('Should serialize the object properly', done => { - testContext.scheduler.id = 'abc-123'; - testContext.scheduler.appClientId = 'test-client-id'; - testContext.scheduler.appOrganizationId = 0; - testContext.scheduler.config = { - timezone: 'America/Los_Angeles', - }; - testContext.scheduler.editToken = 'token'; - testContext.scheduler.name = 'Test'; - testContext.scheduler.slug = 'test-slug'; - testContext.scheduler.createdAt = new Date('2021-06-24'); - testContext.scheduler.modifiedAt = new Date('2021-06-24'); - testContext.scheduler.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.schedule.nylas.com/manage/pages/abc-123' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - config: { - timezone: 'America/Los_Angeles', - }, - name: 'Test', - slug: 'test-slug', - }); - done(); - }); - }); - }); - - describe('save', () => { - test('Should do a POST request if the scheduler has no id', done => { - testContext.scheduler.id = undefined; - testContext.scheduler.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.schedule.nylas.com/manage/pages' - ); - expect(options.method).toEqual('POST'); - expect(JSON.parse(options.body)).toEqual({ - app_client_id: undefined, - app_organization_id: undefined, - config: undefined, - edit_token: undefined, - name: undefined, - slug: undefined, - created_at: undefined, - modified_at: undefined, - }); - done(); - }); - }); - - test('Should do a PUT request if the scheduler an id', done => { - testContext.scheduler.id = 'abc-123'; - testContext.scheduler.name = 'test'; - testContext.scheduler.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.schedule.nylas.com/manage/pages/abc-123' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - app_client_id: undefined, - app_organization_id: undefined, - config: undefined, - edit_token: undefined, - name: 'test', - slug: undefined, - created_at: undefined, - modified_at: undefined, - }); - done(); - }); - }); - - test('Should not convert null to 0 if SchedulerBooking.intervalMinutes is null', done => { - // Cannot be set to 0 - testContext.scheduler.config = new SchedulerConfig({ - booking: { - intervalMinutes: null, - }, - }); - - const value = testContext.scheduler.config.toJSON(); - expect(value.booking.interval_minutes).toEqual(null); - - done(); - }); - - test('Should throw an error if SchedulerBooking.intervalMinutes is invalid', done => { - // Cannot be set to 0 - testContext.scheduler.config = new SchedulerConfig({ - booking: { - intervalMinutes: 0, - }, - }); - expect(() => testContext.scheduler.save()).toThrow(); - - // Cannot be negative - testContext.scheduler.config.booking.intervalMinutes = -1; - expect(() => testContext.scheduler.save()).toThrow(); - - // Has to be divisible by 5 - testContext.scheduler.config.booking.intervalMinutes = 3; - expect(() => testContext.scheduler.save()).toThrow(); - - // If valid, don't throw - testContext.scheduler.config.booking.intervalMinutes = 15; - expect(() => testContext.scheduler.save()).not.toThrow(); - - done(); - }); - }); - - describe('getAvailableCalendars', () => { - beforeEach(() => { - const calendarsJSON = [ - { - calendars: [ - { - id: 'test-calendar-id', - name: 'Test Calendar', - read_only: true, - }, - ], - email: 'test@example.com', - id: 'test-response-id', - name: 'John Doe', - }, - ]; - const response = () => { - return { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(calendarsJSON)); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(() => Promise.resolve(response())); - }); - - test('Should do a GET request if the scheduler has an id', done => { - testContext.scheduler.id = 'abc-123'; - testContext.scheduler.getAvailableCalendars().then(calendars => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.schedule.nylas.com/manage/pages/abc-123/calendars' - ); - expect(options.method).toEqual('GET'); - expect(calendars.length).toBe(1); - expect(calendars[0] instanceof SchedulerAvailableCalendars).toEqual( - true - ); - expect(calendars[0].calendars[0] instanceof Calendar).toEqual(true); - expect(calendars[0].calendars[0].id).toEqual('test-calendar-id'); - expect(calendars[0].calendars[0].name).toEqual('Test Calendar'); - expect(calendars[0].calendars[0].readOnly).toEqual(true); - expect(calendars[0].id).toEqual('test-response-id'); - expect(calendars[0].name).toEqual('John Doe'); - expect(calendars[0].email).toEqual('test@example.com'); - done(); - }); - }); - - test('Should throw an error if scheduler has no id', done => { - testContext.scheduler.id = undefined; - expect(() => testContext.scheduler.getAvailableCalendars()).toThrow(); - done(); - }); - }); - - describe('uploadImage', () => { - test('Should do a PUT request if the scheduler has an id', done => { - testContext.scheduler.id = 'abc-123'; - testContext.scheduler.uploadImage('image', 'logo.png').then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.schedule.nylas.com/manage/pages/abc-123/upload-image' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - contentType: 'image', - objectName: 'logo.png', - }); - done(); - }); - }); - - test('Should throw an error if scheduler has no id', done => { - testContext.scheduler.id = undefined; - expect(() => - testContext.scheduler.uploadImage('image', 'logo.png') - ).toThrow(); - done(); - }); - }); -}); diff --git a/__tests__/thread-spec.js b/__tests__/thread-spec.js deleted file mode 100644 index bf7ab5e2..00000000 --- a/__tests__/thread-spec.js +++ /dev/null @@ -1,144 +0,0 @@ -import Nylas from '../src/nylas'; -import NylasConnection from '../src/nylas-connection'; -import Thread from '../src/models/thread'; -import Message from '../src/models/message'; -import Folder, { Label } from '../src/models/folder'; -import EmailParticipant from '../src/models/email-participant'; -import fetch from 'node-fetch'; - -jest.mock('node-fetch', () => { - const { Request, Response } = jest.requireActual('node-fetch'); - const fetch = jest.fn(); - fetch.Request = Request; - fetch.Response = Response; - return fetch; -}); - -describe('Thread', () => { - let testContext; - - beforeEach(() => { - Nylas.config({ - clientId: 'myClientId', - clientSecret: 'myClientSecret', - apiServer: 'https://api.nylas.com', - }); - testContext = {}; - testContext.connection = new NylasConnection('123', { clientId: 'foo' }); - jest.spyOn(testContext.connection, 'request'); - - const response = receivedBody => { - return { - status: 200, - text: () => { - return Promise.resolve(JSON.stringify(receivedBody)); - }, - headers: new Map(), - }; - }; - - fetch.mockImplementation(req => Promise.resolve(response(req.body))); - - testContext.thread = new Thread(testContext.connection); - testContext.thread.id = '4333'; - testContext.thread.starred = true; - testContext.thread.unread = false; - }); - - describe('save', () => { - test('should do a PUT request with labels if labels is defined', done => { - const label = new Label(testContext.connection); - label.id = 'label_id'; - testContext.thread.labels = [label]; - testContext.thread.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/threads/4333' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - label_ids: ['label_id'], - starred: true, - unread: false, - }); - done(); - }); - }); - - test('should do a PUT with folder if folder is defined', done => { - const label = new Label(testContext.connection); - label.id = 'label_id'; - testContext.thread.folders = [label]; - testContext.thread.save().then(() => { - const options = testContext.connection.request.mock.calls[0][0]; - expect(options.url.toString()).toEqual( - 'https://api.nylas.com/threads/4333' - ); - expect(options.method).toEqual('PUT'); - expect(JSON.parse(options.body)).toEqual({ - folder_id: 'label_id', - starred: true, - unread: false, - }); - done(); - }); - }); - }); - - describe('fromJSON', () => { - test('should populate messages, draft & folder fields when receiving expanded thread', () => { - const m1 = { - id: 'm1', - object: 'message', - to: [{ name: 'Ben Bitdiddle', email: 'ben.bitdiddle@gmail.com' }], - }; - const m2 = { - id: 'm2', - object: 'message', - to: [{ name: 'Alice', email: 'alice@gmail.com' }], - }; - const draft = { - id: 'm3', - object: 'draft', - to: [{ name: 'Bob', email: 'bob@gmail.com' }], - }; - const folder = { - display_name: 'Inbox', - id: 'f1', - name: 'inbox', - }; - - const t = testContext.thread.fromJSON({ - messages: [m1, m2], - drafts: [draft], - folders: [folder], - }); - - expect(t.messages).toBeDefined(); - expect(t.messages[0] instanceof Message).toBe(true); - expect(t.messages[0].id).toBe('m1'); - expect(t.messages[1] instanceof Message).toBe(true); - expect(t.messages[1].id).toBe('m2'); - expect(t.drafts[0] instanceof Message).toBe(true); - expect(t.drafts[0].id).toBe('m3'); - expect(t.folders[0] instanceof Folder).toBe(true); - expect(t.folders[0].id).toBe('f1'); - }); - test('should populate participants', () => { - const participants = [ - { - email: 'anna@yahoo.com', - name: 'Anna', - }, - ]; - const t = testContext.thread.fromJSON({ - participants: participants, - }); - - expect(t.participants).toBeDefined(); - expect(t.participants[0] instanceof EmailParticipant).toBe(true); - expect(t.participants[0].email).toBe('anna@yahoo.com'); - expect(t.participants[0].name).toBe('Anna'); - }); - }); -}); diff --git a/__tests__/webhook-notification-spec.js b/__tests__/webhook-notification-spec.js deleted file mode 100644 index f2e0ce8f..00000000 --- a/__tests__/webhook-notification-spec.js +++ /dev/null @@ -1,226 +0,0 @@ -import WebhookNotification, { - LinkClick, - LinkClickCount, - MessageTrackingData, - WebhookDelta, - WebhookObjectAttributes, - WebhookObjectData, -} from '../src/models/webhook-notification'; -import { WebhookTriggers } from '../src/models/webhook'; - -describe('Webhook Notification', () => { - test('Should deserialize from JSON properly', done => { - const webhookNotificationJSON = { - deltas: [ - { - date: 1602623196, - object: 'message', - type: 'message.created', - object_data: { - namespace_id: 'aaz875kwuvxik6ku7pwkqp3ah', - account_id: 'aaz875kwuvxik6ku7pwkqp3ah', - object: 'message', - attributes: { - action: 'save_draft', - job_status_id: 'abc1234', - thread_id: '2u152dt4tnq9j61j8seg26ni6', - message_id: '1hhg2m8bagpkeddtrsg6t4xav', - received_date: 1602623166, - extras: { - reason: 'testing', - send_at: 1602623166, - original_send_at: 1602623166, - }, - }, - - id: '93mgpjynqqu5fohl2dvv6ray7', - metadata: { - sender_app_id: 64280, - link_data: [ - { - url: 'https://nylas.com/', - count: 1, - }, - ], - timestamp: 1602623966, - recents: [ - { - ip: '24.243.155.85', - link_index: 0, - id: 0, - user_agent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36', - timestamp: 1602623980, - }, - ], - message_id: '4utnziee7bu2ohak56wfxe39p', - payload: 'Tracking enabled', - }, - }, - }, - ], - }; - const webhookNotification = new WebhookNotification().fromJSON( - webhookNotificationJSON - ); - expect(webhookNotification.deltas.length).toBe(1); - - const webhookDelta = webhookNotification.deltas[0]; - expect(webhookDelta instanceof WebhookDelta).toBe(true); - expect(webhookDelta.date).toEqual(new Date(1602623196 * 1000)); - expect(webhookDelta.object).toEqual('message'); - expect(webhookDelta.type).toEqual(WebhookTriggers.MessageCreated); - - const webhookDeltaObjectData = webhookDelta.objectData; - expect(webhookDeltaObjectData instanceof WebhookObjectData).toBe(true); - expect(webhookDeltaObjectData.id).toEqual('93mgpjynqqu5fohl2dvv6ray7'); - expect(webhookDeltaObjectData.accountId).toEqual( - 'aaz875kwuvxik6ku7pwkqp3ah' - ); - expect(webhookDeltaObjectData.namespaceId).toEqual( - 'aaz875kwuvxik6ku7pwkqp3ah' - ); - expect(webhookDeltaObjectData.object).toEqual('message'); - - const webhookDeltaObjectAttributes = - webhookDeltaObjectData.objectAttributes; - expect( - webhookDeltaObjectAttributes instanceof WebhookObjectAttributes - ).toBe(true); - expect(webhookDeltaObjectAttributes.action).toEqual('save_draft'); - expect(webhookDeltaObjectAttributes.jobStatusId).toEqual('abc1234'); - expect(webhookDeltaObjectAttributes.threadId).toEqual( - '2u152dt4tnq9j61j8seg26ni6' - ); - expect(webhookDeltaObjectAttributes.messageId).toEqual( - '1hhg2m8bagpkeddtrsg6t4xav' - ); - expect(webhookDeltaObjectAttributes.receivedDate).toEqual( - new Date(1602623166 * 1000) - ); - - const webhookObjectExtras = webhookDeltaObjectAttributes.extras; - expect(webhookObjectExtras.reason).toEqual('testing'); - expect(webhookObjectExtras.sendAt).toEqual(new Date(1602623166 * 1000)); - expect(webhookObjectExtras.originalSendAt).toEqual( - new Date(1602623166 * 1000) - ); - - const webhookMessageTrackingData = webhookDeltaObjectData.metadata; - expect(webhookMessageTrackingData instanceof MessageTrackingData).toBe( - true - ); - expect(webhookMessageTrackingData.messageId).toEqual( - '4utnziee7bu2ohak56wfxe39p' - ); - expect(webhookMessageTrackingData.payload).toEqual('Tracking enabled'); - expect(webhookMessageTrackingData.timestamp).toEqual( - new Date(1602623966 * 1000) - ); - expect(webhookMessageTrackingData.senderAppId).toBe(64280); - expect(webhookMessageTrackingData.linkData.length).toBe(1); - expect(webhookMessageTrackingData.recents.length).toBe(1); - - const linkData = webhookMessageTrackingData.linkData[0]; - expect(linkData instanceof LinkClickCount).toBe(true); - expect(linkData.url).toEqual('https://nylas.com/'); - expect(linkData.count).toBe(1); - - const recents = webhookMessageTrackingData.recents[0]; - expect(recents instanceof LinkClick).toBe(true); - expect(recents.id).toBe(0); - expect(recents.ip).toEqual('24.243.155.85'); - expect(recents.userAgent).toEqual( - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36' - ); - expect(recents.timestamp).toEqual(new Date(1602623980 * 1000)); - expect(recents.linkIndex).toBe(0); - done(); - }); - - test('Should deserialize an event notification from JSON properly', done => { - const webhookNotificationJSON = { - deltas: [ - { - date: 1602623196, - object: 'event', - type: 'event.created', - object_data: { - namespace_id: 'aaz875kwuvxik6ku7pwkqp3ah', - account_id: 'aaz875kwuvxik6ku7pwkqp3ah', - object: 'event', - attributes: { - calendar_id: 'calendar-123', - created_before_account_connection: true, - }, - id: '93mgpjynqqu5fohl2dvv6ray7', - metadata: { - test: 1234, - }, - }, - }, - ], - }; - const webhookNotification = new WebhookNotification().fromJSON( - webhookNotificationJSON - ); - expect(webhookNotification.deltas.length).toBe(1); - - const webhookDelta = webhookNotification.deltas[0]; - expect(webhookDelta instanceof WebhookDelta).toBe(true); - expect(webhookDelta.date).toEqual(new Date(1602623196 * 1000)); - expect(webhookDelta.object).toEqual('event'); - expect(webhookDelta.type).toEqual(WebhookTriggers.EventCreated); - - const webhookDeltaObjectData = webhookDelta.objectData; - expect(webhookDeltaObjectData instanceof WebhookObjectData).toBe(true); - expect(webhookDeltaObjectData.id).toEqual('93mgpjynqqu5fohl2dvv6ray7'); - expect(webhookDeltaObjectData.accountId).toEqual( - 'aaz875kwuvxik6ku7pwkqp3ah' - ); - expect(webhookDeltaObjectData.namespaceId).toEqual( - 'aaz875kwuvxik6ku7pwkqp3ah' - ); - expect(webhookDeltaObjectData.object).toEqual('event'); - - const webhookDeltaObjectAttributes = - webhookDeltaObjectData.objectAttributes; - expect( - webhookDeltaObjectAttributes instanceof WebhookObjectAttributes - ).toBe(true); - expect(webhookDeltaObjectAttributes.calendarId).toEqual('calendar-123'); - expect(webhookDeltaObjectAttributes.createdBeforeAccountConnection).toBe( - true - ); - - const metadata = webhookDeltaObjectData.metadata; - expect(metadata instanceof MessageTrackingData).toBe(false); - expect(metadata).toEqual({ - test: 1234, - }); - - done(); - }); - - describe('verifySignature', () => { - test('Webhook verification should pass if the body matches the Nylas signature', () => { - const isVerified = WebhookNotification.verifyWebhookSignature( - 'ddc02f921a4835e310f249dc09770c3fea2cb6fe949adc1887d7adc04a581e1c', - Buffer.from('test123', 'utf8'), - 'myClientSecret' - ); - - expect(isVerified).toBe(true); - }); - - test('Webhook verification should fail if the body does not match the Nylas signature', () => { - const isVerified = WebhookNotification.verifyWebhookSignature( - 'ddc02f921a4835e310f249dc09770c3fea2cb6fe949adc1887d7adc04a581e1c', - Buffer.from('test12345', 'utf8'), - 'myClientSecret' - ); - - expect(isVerified).toBe(false); - }); - }); -}); diff --git a/__tests__/webhook-spec.js b/__tests__/webhook-spec.js deleted file mode 100644 index fef0fc96..00000000 --- a/__tests__/webhook-spec.js +++ /dev/null @@ -1,152 +0,0 @@ -import Nylas from '../src/nylas'; - -describe('Webhook', () => { - const CLIENT_ID = 'abc'; - const WEBHOOK_ID = '5rilmlwuo4zmpjedz8bcplclk'; - const webhookJSON = { - id: WEBHOOK_ID, - application_id: CLIENT_ID, - callback_url: 'https://wwww.myapp.com/webhook', - state: 'active', - triggers: ['message.opened', 'message.link_clicked'], - version: '2.0', - }; - beforeEach(() => { - Nylas.config({ - clientId: CLIENT_ID, - clientSecret: 'xyz', - }); - }); - - describe('list', () => { - test('Should do a GET request to get the webhook list', done => { - expect.assertions(3); - Nylas.webhooks.connection.request = jest.fn(() => - Promise.resolve([webhookJSON]) - ); - return Nylas.webhooks.list({}, (err, webhooks) => { - expect(webhooks.length).toEqual(1); - expect(webhooks[0].id).toEqual(WEBHOOK_ID); - expect(Nylas.webhooks.connection.request).toHaveBeenCalledWith({ - method: 'GET', - qs: { limit: 100, offset: 0 }, - path: `/a/${CLIENT_ID}/webhooks`, - }); - done(); - }); - }); - }); - - describe('Get an existing webhook', () => { - test('Should do a GET request to /a//webhooks/', done => { - expect.assertions(2); - Nylas.webhooks.connection.request = jest.fn(() => - Promise.resolve(webhookJSON) - ); - return Nylas.webhooks.find(WEBHOOK_ID).then(webhookResp => { - expect(webhookResp.toJSON()).toEqual(webhookJSON); - expect(Nylas.webhooks.connection.request).toHaveBeenCalledWith({ - method: 'GET', - path: `/a/${CLIENT_ID}/webhooks/${WEBHOOK_ID}`, - qs: {}, - }); - done(); - }); - }); - }); - - describe('Create a new webhook', () => { - test('Should do a POST request to /a//webhooks', done => { - expect.assertions(2); - Nylas.webhooks.connection.request = jest.fn(() => - Promise.resolve(webhookJSON) - ); - const webhook = Nylas.webhooks.build({ - applicationId: CLIENT_ID, - callbackUrl: 'https://wwww.myapp.com/webhook', - state: 'active', - triggers: ['message.opened', 'message.link_clicked'], - version: '2.0', - }); - return webhook.save().then(webhookResp => { - expect(webhookResp.toJSON()).toEqual(webhookJSON); - expect(Nylas.webhooks.connection.request).toHaveBeenCalledWith({ - method: 'POST', - path: `/a/${CLIENT_ID}/webhooks`, - qs: {}, - body: { - callback_url: 'https://wwww.myapp.com/webhook', - state: 'active', - triggers: ['message.opened', 'message.link_clicked'], - }, - }); - done(); - }); - }); - }); - - describe('Update an existing webhook', () => { - test('Should do a PUT request to /a//webhooks/', done => { - expect.assertions(2); - Nylas.webhooks.connection.request = jest.fn(() => - Promise.resolve(webhookJSON) - ); - const webhook = Nylas.webhooks.build({ - id: WEBHOOK_ID, - applicationId: CLIENT_ID, - callbackUrl: 'https://wwww.myapp.com/webhook', - state: 'active', - triggers: ['message.opened', 'message.link_clicked'], - version: '2.0', - }); - return webhook.save().then(webhookResp => { - expect(webhookResp.toJSON()).toEqual(webhookJSON); - expect(Nylas.webhooks.connection.request).toHaveBeenCalledWith({ - method: 'PUT', - path: `/a/${CLIENT_ID}/webhooks/${WEBHOOK_ID}`, - qs: {}, - body: { state: 'active' }, - }); - done(); - }); - }); - }); - - describe('Delete an existing webhook', () => { - test('Should do a DELETE request to /a//webhooks/', done => { - expect.assertions(1); - Nylas.webhooks.connection.request = jest.fn(() => Promise.resolve(null)); - const webhook = Nylas.webhooks.build({ - id: WEBHOOK_ID, - applicationId: CLIENT_ID, - callbackUrl: 'https://wwww.myapp.com/webhook', - state: 'active', - triggers: ['message.opened', 'message.link_clicked'], - version: '2.0', - }); - return Nylas.webhooks.delete(webhook).then(() => { - expect(Nylas.webhooks.connection.request).toHaveBeenCalledWith({ - method: 'DELETE', - path: `/a/${CLIENT_ID}/webhooks/${WEBHOOK_ID}`, - qs: {}, - body: {}, - }); - done(); - }); - }); - - test('Should DELETE webhook by ID', done => { - expect.assertions(1); - Nylas.webhooks.connection.request = jest.fn(() => Promise.resolve(null)); - return Nylas.webhooks.delete(WEBHOOK_ID).then(() => { - expect(Nylas.webhooks.connection.request).toHaveBeenCalledWith({ - method: 'DELETE', - path: `/a/${CLIENT_ID}/webhooks/${WEBHOOK_ID}`, - qs: {}, - body: {}, - }); - done(); - }); - }); - }); -}); diff --git a/example/authentication/.gitignore b/example/authentication/.gitignore deleted file mode 100644 index 1bf4259a..00000000 --- a/example/authentication/.gitignore +++ /dev/null @@ -1 +0,0 @@ -config.js diff --git a/example/authentication/app.js b/example/authentication/app.js deleted file mode 100644 index d1073971..00000000 --- a/example/authentication/app.js +++ /dev/null @@ -1,55 +0,0 @@ -const express = require('express'); -const path = require('path'); -const favicon = require('serve-favicon'); -const logger = require('morgan'); -const cookieParser = require('cookie-parser'); -const bodyParser = require('body-parser'); -const session = require('express-session'); -// Import secret and other configuration -const config = require('./config'); - -const routes = require('./routes/index'); - -const app = express(); - -app.use(logger('dev')); -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({ extended: true })); -app.use(cookieParser()); -app.use(session({ secret: config.nylasClientId })); -app.use(express.static(path.join(__dirname, 'public'))); - -app.use('/', routes); - -// catch 404 and forward to error handler -app.use(function(req, res, next) { - const err = new Error('Not Found'); - err.status = 404; - next(err); -}); - -// error handlers - -// development error handler -// will print stacktrace -if (app.get('env') === 'development') { - app.use(function(err, req, res, next) { - res.status(err.status || 500); - res.json({ - message: err.message, - error: err, - }); - }); -} - -// production error handler -// no stacktraces leaked to user -app.use(function(err, req, res, next) { - res.status(err.status || 500); - res.json({ - message: err.message, - error: err, - }); -}); - -module.exports = app; diff --git a/example/authentication/auth.js b/example/authentication/auth.js deleted file mode 100644 index c0afb5fd..00000000 --- a/example/authentication/auth.js +++ /dev/null @@ -1,72 +0,0 @@ -const config = require('./config'); -const request = require('request-promise'); -const url = require('url'); - -if (config.nylasClientSecret === '' || config.nylasClientId === '') { - throw 'You need to add your Nylas client secret to config.js first!'; -} - -// setup the Nylas API -global.Nylas = require('nylas').config({ - clientId: config.nylasClientId, - clientSecret: config.nylasClientSecret, -}); - -// First POST to /connect/authorize to get an authorization code from Nylas -// Then post to /connect/token to get an access_token that can be used to access -// account data -function connectToNylas(data) { - return nylasCode(data) - .then(code => { - const params = { - client_id: config.nylasClientId, - client_secret: config.nylasClientSecret, - code: code, - }; - return nylasToken(params) - .then(token => { - return Promise.resolve(token); - }) - .catch(err => { - return Promise.reject( - new Error(`Could not connect to Nylas. Error: ${err.message}`) - ); - }); - }) - .catch(err => { - return Promise.reject( - new Error(`Could not connect to Nylas. Error: ${err.message}`) - ); - }); -} -module.exports.connectToNylas = connectToNylas; - -function nylasCode(data) { - const connect_uri = config.nylasApi + '/connect/authorize'; - return request - .post({ url: connect_uri, json: data }) - .then(body => { - return Promise.resolve(body.code); - }) - .catch(err => { - return Promise.reject( - new Error(`Could not fetch Nylas code: ${err.message}`) - ); - }); -} - -function nylasToken(data) { - const token_uri = config.nylasApi + '/connect/token'; - return request - .post({ url: token_uri, json: data }) - .then(body => { - return Promise.resolve(body.access_token); - }) - .catch(err => { - return Promise.reject( - new Error(`Could not fetch Nylas access token: ${err.message}`) - ); - }); -} - -config.redirect_uri = 'http://localhost:3000/google/oauth2callback'; diff --git a/example/authentication/bin/www b/example/authentication/bin/www deleted file mode 100755 index a410d55d..00000000 --- a/example/authentication/bin/www +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var app = require('../app'); -const auth = require('../auth'); -var debug = require('debug')('authentication:server'); -var http = require('http'); - -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(process.env.PORT || '3000'); -app.set('port', port); - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} diff --git a/example/authentication/config.js.template b/example/authentication/config.js.template deleted file mode 100644 index f25f79af..00000000 --- a/example/authentication/config.js.template +++ /dev/null @@ -1,10 +0,0 @@ -const config = {}; - -config.nylasClientId = ''; -config.nylasClientSecret = ''; -config.googleClientId= ''; -config.googleClientSecret = ''; - -config.nylasApi = 'https://api.nylas.com'; - -module.exports = config; diff --git a/example/authentication/package.json b/example/authentication/package.json deleted file mode 100644 index c5b43f49..00000000 --- a/example/authentication/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "authentication", - "version": "0.0.0", - "private": true, - "scripts": { - "start": "node ./bin/www" - }, - "dependencies": { - "body-parser": "^1.19.0", - "cookie-parser": "~1.4.3", - "debug": "~4.1.1", - "express": "^4.17.1", - "pug": "^2.0.4", - "morgan": "^1.9.1", - "request-promise": "^4.1.1", - "serve-favicon": "^2.5.0" - }, - "devDependencies": { - "express-session": "^1.14.1", - "nylas": "^2.2.0" - } -} diff --git a/example/authentication/public/stylesheets/style.css b/example/authentication/public/stylesheets/style.css deleted file mode 100644 index bcafeaf5..00000000 --- a/example/authentication/public/stylesheets/style.css +++ /dev/null @@ -1,141 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=Roboto:300); - -.login-page { - width: 360px; - padding: 8% 0 0; - margin: auto; -} -.form { - position: relative; - z-index: 1; - background: #FFFFFF; - max-width: 360px; - margin: 0 auto 100px; - padding: 45px; - text-align: center; - box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24); -} -.form input { - font-family: "Roboto", sans-serif; - outline: 0; - background: #f2f2f2; - width: 100%; - border: 0; - margin: 0 0 15px; - padding: 15px; - box-sizing: border-box; - font-size: 14px; -} -.form .message { - margin: 15px 0 0; - color: #b3b3b3; - font-size: 12px; -} -.form .message a { - color: #4CAF50; - text-decoration: none; -} -.form .register-form { - display: none; -} -.container { - position: relative; - z-index: 1; - max-width: 300px; - margin: 0 auto; -} -.container:before, .container:after { - content: ""; - display: block; - clear: both; -} -.container .info { - margin: 50px auto; - text-align: center; -} -.container .info h1 { - margin: 0 0 15px; - padding: 0; - font-size: 36px; - font-weight: 300; - color: #1a1a1a; -} -.container .info span { - color: #4d4d4d; - font-size: 12px; -} -.container .info span a { - color: #000000; - text-decoration: none; -} -.container .info span .fa { - color: #EF3B3A; -} - -.exchange { - background: #76b852; /* fallback for old browsers */ - background: -webkit-linear-gradient(right, #76b852, #8DC26F); - background: -moz-linear-gradient(right, #76b852, #8DC26F); - background: -o-linear-gradient(right, #76b852, #8DC26F); - background: linear-gradient(to left, #76b852, #8DC26F); - font-family: "Roboto", sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.login { - background: #0B2545; /* fallback for old browsers */ - background: -webkit-linear-gradient(right, #0B2545, #09203D); - background: -moz-linear-gradient(right, #0B2545, #09203D); - background: -o-linear-gradient(right, #0B2545, #09203D); - background: linear-gradient(to left, #0B2545, #09203D); - font-family: "Roboto", sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} -p { - padding-bottom: 15px; -} -a { - color: #eee; - text-decoration: none; -} - -.login-btn { - font-family: "Roboto", sans-serif; - text-transform: uppercase; - outline: 0; - background: #13315C; - width: 100%; - border: 0; - padding: 15px; - color: #FFFFFF; - font-size: 14px; - -webkit-transition: all 0.3 ease; - transition: all 0.3 ease; - cursor: pointer; - margin-bottom: 5px; -} - -.login-btn:hover, .login-btn:active, .login-btn:focus { - background: #134074; -} - -.exchange-btn { - font-family: "Roboto", sans-serif; - text-transform: uppercase; - outline: 0; - background: #4CAF50; - width: 100%; - border: 0; - padding: 15px; - color: #FFFFFF; - font-size: 14px; - -webkit-transition: all 0.3 ease; - transition: all 0.3 ease; - cursor: pointer; -} - -.exchange-btn:hover, .exchange-btn:active, .exchange-btn:focus { - background: #43A047; -} diff --git a/example/authentication/readme.md b/example/authentication/readme.md deleted file mode 100644 index 1d9953f4..00000000 --- a/example/authentication/readme.md +++ /dev/null @@ -1,93 +0,0 @@ -# Nylas Connect - -This tiny [Express](https://expressjs.com/) app is a simple example of how to -use Nylas' [Native authentication -APIs](https://www.nylas.com/docs/platform#native_authentication). You can -connect both Exchange accounts and Gmail account's in this example. - -It shows how to receive a `refresh_token` from Google before authenticating with -Nylas. Then it uses the Nylas Node SDK to connect an email account and load the -user's latest email. - -While this steps through the Google OAuth flow manually, you can alternatively -use Google API SDKs for node and many other languages. Learn more about that -[here](https://developers.google.com/api-client-library/python/). You can also -learn more about Google OAuth -[here](https://developers.google.com/identity/protocols/OAuth2WebServer). - -Here is an overview of the complete flow when connecting a Google account. - -``` -Your App Google -+------+ +-----+ -| | Redirect user to Oauth Login | | -| +----------------------------------> | | -| | | | -| | Authorization code | | -| | <--(localhost)-<-------------------+ | -| | | | -| | Request refresh token | | -| +----------------------------------> | | -| | | | -| | Refresh & access token | | -| | <----------------------------------+ | -| | +-----+ -| | -| | -| | Nylas -| | Request Authorization code +-----+ -| +----------------------------------> | | -| | | | -| | Authorization code | | -| | <----------------------------------+ | -| | | | -| | Request Access Token | | -| +----------------------------------> | | -| | | | -| | Access Token | | -| | <----------------------------------+ | -+------+ +-----+ -``` - -# Getting Started - -## Dependencies - -### Google Application - -You'll need to have a Nylas [developer account](https://developer.nylas.com), a -Google Application (if you'd like to connect Google accounts), and the -respective `client_id` and `client_secret`s. Learn about how to setup the -Google App to correctly work with Nylas -[here](https://docs.nylas.com/docs/native-auth-google-oauth-setup-guide). - -After you follow that setup doc, you'll have to configure your google client app -to properly redirect to this example app. On the Google developer console, under -the credentials tab, click the edit button for the client ID that you created. -Add `http://localhost:3000/google/oauth2callback` as an authorized redirect URI -and save this change. Now a user will be redirected back to to this example -app after authenticating. - -## Initial Setup - -Add your google and nylas client id's and secrets to a new file `config.js`. -See `config.js.template` for an example. - -Then install dependencies with: -```bash -npm install -``` - -# Running the app - -Run the express app. - -```bash -npm start -``` - -Visit http://localhost:3000 in your browser. - -Auth a gmail account. After, you will be redirected back to the example -application. To show a basic use case for what you can do after authing -with Nylas, we added a button to get the authed accounts most recent email! diff --git a/example/authentication/routes/index.js b/example/authentication/routes/index.js deleted file mode 100644 index e92e48cc..00000000 --- a/example/authentication/routes/index.js +++ /dev/null @@ -1,196 +0,0 @@ -const express = require('express'); -const router = express.Router(); -const path = require('path'); -const querystring = require('querystring'); -const request = require('request-promise'); -const config = require('../config'); -const auth = require('../auth'); - -// These are the permissions your app will ask the user to approve for access -// https://developers.google.com/identity/protocols/OAuth2WebServer#scope -const GOOGLE_SCOPES = [ - 'https://mail.google.com/', - 'https://www.googleapis.com/auth/calendar', - 'https://www.googleapis.com/auth/userinfo.email', - 'https://www.googleapis.com/auth/userinfo.profile', - 'https://www.googleapis.com/auth/calendar', - 'https://www.google.com/m8/feeds/', -].join(' '); - -// This is the path in your Google application that users are redirected to after -// they have authenticated with Google, and it must be authorized through -// Google's developer console -const GOOGLE_OAUTH_TOKEN_VALIDATION_URL = - 'https://www.googleapis.com/oauth2/v2/tokeninfo'; -const GOOGLE_OAUTH_AUTH_URL = 'https://accounts.google.com/o/oauth2/v2/auth'; -const GOOGLE_OAUTH_ACCESS_TOKEN_URL = - 'https://www.googleapis.com/oauth2/v4/token'; - -function get_email_from_access_token(google_access_token) { - const data = { - access_token: google_access_token, - fields: ['email'], - }; - return request - .post({ url: GOOGLE_OAUTH_TOKEN_VALIDATION_URL, form: data }) - .then(body => { - return Promise.resolve(JSON.parse(body).email); - }) - .catch(err => { - return Promise.reject(`Error validating Google token: ${err.message}`); - }); -} - -// This is the url Google will call once a user has approved access to their -// account -router.get('/google/oauth2callback', function(req, res, next) { - if (!req.query.code) { - const data = { - response_type: 'code', - access_type: 'offline', - client_id: config.googleClientId, - redirect_uri: config.redirect_uri, - scope: GOOGLE_SCOPES, - // Note: this is only for testing to ensure a refresh token is - // passed everytime, but requires the user to approve offline - // access every time. You should remove this if you don't want - // your user to have to approve access each time they connect - prompt: 'consent', - }; - const auth_uri = GOOGLE_OAUTH_AUTH_URL + '?' + querystring.stringify(data); - res.redirect(auth_uri); - } else { - // The user just successfully authenticated with Google and was redirected - // back here with a Google code - const auth_code = req.query.code; - const data = { - code: auth_code, - client_id: config.googleClientId, - client_secret: config.googleClientSecret, - redirect_uri: config.redirect_uri, - grant_type: 'authorization_code', - }; - - // Using Google's authorization code we can get an access and refresh token - const options = { - uri: GOOGLE_OAUTH_ACCESS_TOKEN_URL, - method: 'POST', - form: data, - }; - - request(options) - .then(body => { - json = JSON.parse(body); - req.session.google_refresh_token = json.refresh_token; - req.session.google_access_token = json.access_token; - res.redirect('/google'); - }) - .catch(err => { - console.log(`Error getting refresh token: ${err.message}`); - }); - } -}); - -router.get('/google', function(req, res, next) { - // User hasn't authorized with google yet, so we should redirect - if (!req.session.google_access_token) { - res.redirect('/google/oauth2callback'); - } - - // The user has authorized with google at this point but we will need to - // connect the account to Nylas - if (!req.session.nylas_access_token) { - const google_access_token = req.session.google_access_token; - get_email_from_access_token(google_access_token) - .then(email => { - const google_refresh_token = req.session.google_refresh_token; - const google_settings = { - google_client_id: config.googleClientId, - google_client_secret: config.googleClientSecret, - google_refresh_token: google_refresh_token, - }; - const data = { - client_id: config.nylasClientId, - name: 'Your Name', - email_address: email, - provider: 'gmail', - settings: google_settings, - }; - auth - .connectToNylas(data) - .then(token => { - // User has succesfully authorized with google and connected to Nylas. Redirect - // to homepage so we can show some emails! - req.session.nylas_access_token = token; - res.redirect('/'); - }) - .catch(err => { - console.log(err); - res.redirect('/google/oauth2callback'); - }); - }) - .catch(err => { - console.log(err); - res.redirect('/google'); - }); - } -}); - -router.post('/exchange', function(req, res, next) { - // User gave us their username and password and submitted the form. Use the - // data now to login with Nylas - if (!req.session.nylas_access_token) { - const json = req.body; - const exchange_settings = { - username: json.email, - password: json.password, - }; - const data = { - client_id: config.nylasClientId, - name: json.name, - email_address: json.email, - provider: 'exchange', - settings: exchange_settings, - }; - auth.connectToNylas(data).then(token => { - req.session.nylas_access_token = token; - res.redirect('/'); - }); - } -}); - -router.get('/exchange', function(req, res, next) { - // Show a login form for a user to enter their information - res.sendFile(path.join(__dirname + '/../views/exchange_login.html')); -}); - -router.get('/choose-login', function(req, res, next) { - res.sendFile(path.join(__dirname + '/../views/choose_login.html')); -}); - -router.get('/logout', function(req, res, next) { - req.session.destroy(); - res.redirect('/'); -}); - -router.get('/get-message', function(req, res, next) { - // Account has been setup, let's use Nylas' Node SDK to retrieve an email - const nylas = Nylas.with(req.session.nylas_access_token); - - // Find the first message matching the filter criteria - nylas.messages.first().then(function(message) { - res.send(message.body); - }); -}); - -router.get('/', function(req, res, next) { - if (!req.session.nylas_access_token) { - // If the user hasn't connected their email account from any provider, send - // them to a login page that will allow them to connect any kind of account - return res.redirect('/choose-login'); - } - - res.sendFile(path.join(__dirname + '/../views/authed_account.html')); -}); - -module.exports = router; diff --git a/example/authentication/views/authed_account.html b/example/authentication/views/authed_account.html deleted file mode 100644 index 5c0b5b8e..00000000 --- a/example/authentication/views/authed_account.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - Nylas Login - - - - - - - - - - diff --git a/example/authentication/views/choose_login.html b/example/authentication/views/choose_login.html deleted file mode 100644 index 20dae5b3..00000000 --- a/example/authentication/views/choose_login.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Nylas Login - - - - - - - - - - diff --git a/example/authentication/views/exchange_login.html b/example/authentication/views/exchange_login.html deleted file mode 100644 index 9f9cfbad..00000000 --- a/example/authentication/views/exchange_login.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - Nylas Exchange Login - - - - - - - - - diff --git a/example/sample-app/app.js b/example/sample-app/app.js deleted file mode 100644 index 265719aa..00000000 --- a/example/sample-app/app.js +++ /dev/null @@ -1,107 +0,0 @@ -var express = require('express'); -var path = require('path'); -var favicon = require('serve-favicon'); -var logger = require('morgan'); -var cookieParser = require('cookie-parser'); -var bodyParser = require('body-parser'); -var session = require('express-session'); -var assert = require('assert'); - -var routes = require('./routes/index'); -var threads = require('./routes/threads'); -var dashboard = require('./routes/dashboard'); - -var app = express(); - -// view engine setup -app.set('views', path.join(__dirname, 'views')); -app.set('view engine', 'pug'); - -var nylasAppConfigs = { - clientId: '', - clientSecret: '', -}; - -assert.notEqual( - nylasAppConfigs.clientId, - '', - 'Please replace with your Nylas Client ID' -); -assert.notEqual( - nylasAppConfigs.clientSecret, - '', - 'Please replace with your Nylas Client Secret' -); - -// setup the Nylas API -global.Nylas = require('nylas').config(nylasAppConfigs); - -app.use(favicon(__dirname + '/public/favicon.ico')); -app.use(logger('dev')); -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({ extended: false })); -app.use(cookieParser()); - -var sessionSecret = { - secret: '', -}; - -assert.notEqual( - sessionSecret.secret, - '', - 'Please replace with your session secret' -); - -app.use( - session( - Object.assign( - { - resave: false, - saveUninitialized: true, - }, - sessionSecret - ) - ) -); -app.use(express.static(path.join(__dirname, 'public'))); - -function checkAuth(req, res, next) { - if (!req.session.token) res.redirect('/'); - next(); -} -app.use('/', routes); -app.use('/threads', checkAuth, threads); -app.use('/dashboard', checkAuth, dashboard); - -// catch 404 and forward to error handler -app.use(function(req, res, next) { - var err = new Error('Not Found'); - err.status = 404; - next(err); -}); - -// error handlers - -// development error handler -// will print stacktrace -if (app.get('env') === 'development') { - app.use(function(err, req, res, next) { - res.status(err.status || 500); - res.render('error', { - message: err.message, - error: err, - }); - }); -} - -// production error handler -// no stacktraces leaked to user -app.use(function(err, req, res, next) { - res.status(err.status || 500); - res.render('error', { - message: err.message, - error: {}, - }); -}); - -module.exports = app; diff --git a/example/sample-app/bin/www b/example/sample-app/bin/www deleted file mode 100755 index a6550402..00000000 --- a/example/sample-app/bin/www +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var app = require('../app'); -var debug = require('debug')('example:server'); -var http = require('http'); -var opn = require('opn'); -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(process.env.PORT || '3000'); -app.set('port', port); - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ -var localHost = `http://localhost:${port}`; -server.listen(port, () => console.log(`> Listening on ${localHost}`)); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} - -if (process.env.NODE_ENV !== 'production') { - try { - opn(localHost) - } catch (err) { - console.error(err) - } -} - -// handle unhandledRejections -process.on("unhandledRejection", (err, promise) => { - console.error("Unhandled promise rejection:\n" + err.stack); -}); \ No newline at end of file diff --git a/example/sample-app/package.json b/example/sample-app/package.json deleted file mode 100644 index 812abfe7..00000000 --- a/example/sample-app/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "example", - "version": "0.0.0", - "private": true, - "scripts": { - "start": "node ./bin/www", - "mac": "DEBUG=myapp:* npm start", - "win": "set DEBUG=myapp:* & npm start" - }, - "dependencies": { - "assert": "^1.4.1", - "bluebird": "^2.9.13", - "body-parser": "^1.19.0", - "cookie-parser": "~1.3.4", - "debug": "~4.1.1", - "express": "^4.17.1", - "express-session": "^1.15.6", - "morgan": "^1.9.1", - "nylas": "^4.7.0", - "opn": "^5.2.0", - "pug": "^3.0.2", - "serve-favicon": "^2.5.0" - } -} diff --git a/example/sample-app/public/favicon.ico b/example/sample-app/public/favicon.ico deleted file mode 100644 index 56507c03..00000000 Binary files a/example/sample-app/public/favicon.ico and /dev/null differ diff --git a/example/sample-app/public/stylesheets/style.css b/example/sample-app/public/stylesheets/style.css deleted file mode 100644 index a153f4cb..00000000 --- a/example/sample-app/public/stylesheets/style.css +++ /dev/null @@ -1,14 +0,0 @@ -body { - padding: 50px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; -} - -a { - color: #00B7FF; -} - -.frame { - border: 1px solid gray; - padding: 10px; - margin-bottom: 20px; -} \ No newline at end of file diff --git a/example/sample-app/readme.md b/example/sample-app/readme.md deleted file mode 100644 index 59aace64..00000000 --- a/example/sample-app/readme.md +++ /dev/null @@ -1,42 +0,0 @@ -# Nylas Connect - -This tiny [Express](https://expressjs.com/) app is a simple example of how to -use Nylas NodeJS SDK. You can -connect both Exchange accounts and Gmail accounts in this example. - -# Getting Started - -## Initial Setup -You will need to have a Nylas [developer account](https://dashboard.nylas.com). -On the dashboard, select the application that you want to connect to this sample -app. Copy the application id and secret to the config code on lines 22 and 23 of -`app.js` and then on line 48 of `app.js` enter your own `sessionSecret`. - -Next, you have to add the redirect URI for this sample app to your applications -callbacks. To navigate to the application callback page, go to the all applications -page and then select`edit` for your selected application. The application settings -page has two tabs, one for `Application Settings` and one for `Application Callbacks`. -Click the `Application Callbacks` tab and add the sample apps redirect URI: - -``` -http://localhost:3000/oauth/callback -``` -
-
- -
- -Install dependencies with: -```bash -npm install -``` - -# Running the app - -Run the express app. - -```bash -npm start -``` - -Visit http://localhost:3000 in your browser. diff --git a/example/sample-app/routes/dashboard.js b/example/sample-app/routes/dashboard.js deleted file mode 100644 index 3cd7171b..00000000 --- a/example/sample-app/routes/dashboard.js +++ /dev/null @@ -1,12 +0,0 @@ -var express = require('express'); -var router = express.Router(); - -router.get('/', function(req, res, next) { - res.render('dashboard', { - title: 'Your account has been linked!', - message: - 'Click the links below to test out some Nylas features for threads!', - }); -}); - -module.exports = router; diff --git a/example/sample-app/routes/index.js b/example/sample-app/routes/index.js deleted file mode 100644 index da5e8adc..00000000 --- a/example/sample-app/routes/index.js +++ /dev/null @@ -1,34 +0,0 @@ -var express = require('express'); -var router = express.Router(); - -router.get('/', function(req, res, next) { - options = { - redirectURI: 'http://localhost:3000/oauth/callback', - trial: false, - }; - res.render('index', { - title: 'Welcome', - message: 'Link your email to get started.', - url: Nylas.urlForAuthentication(options), - }); -}); - -router.get('/oauth/callback', function(req, res, next) { - if (req.query.code) { - Nylas.exchangeCodeForToken(req.query.code).then(function(token) { - req.session.token = token; - res.redirect('/dashboard'); - }); - } else if (req.query.error) { - res.render('error', { - message: req.query.reason, - error: { - status: - 'Please try authenticating again or use a different email account.', - stack: '', - }, - }); - } -}); - -module.exports = router; diff --git a/example/sample-app/routes/threads.js b/example/sample-app/routes/threads.js deleted file mode 100644 index ba16adbc..00000000 --- a/example/sample-app/routes/threads.js +++ /dev/null @@ -1,25 +0,0 @@ -var express = require('express'); -var router = express.Router(); - -router.get('/first', function(req, res, next) { - var nylas = Nylas.with(req.session.token); - var accountP = nylas.account.get(); - var threadP = nylas.threads.first(); - Promise.all([accountP, threadP]).then(function([account, thread]) { - res.render('thread', { - account: account.emailAddress, - thread: thread, - }); - }); -}); - -router.get('/list', function(req, res, next) { - var nylas = Nylas.with(req.session.token); - nylas.threads.list({ limit: 10 }).then(function(threadList) { - res.render('threadList', { - threads: threadList, - }); - }); -}); - -module.exports = router; diff --git a/example/sample-app/views/dashboard.pug b/example/sample-app/views/dashboard.pug deleted file mode 100644 index a022f541..00000000 --- a/example/sample-app/views/dashboard.pug +++ /dev/null @@ -1,12 +0,0 @@ -extends layout - -block content - h1= title - p= message - div - a(class='button', href='/threads/first') First thread - div - a(class='button', href='/threads/list') List of threads - br - div - a(href='/') Try another account diff --git a/example/sample-app/views/error.pug b/example/sample-app/views/error.pug deleted file mode 100644 index 51ec12c6..00000000 --- a/example/sample-app/views/error.pug +++ /dev/null @@ -1,6 +0,0 @@ -extends layout - -block content - h1= message - h2= error.status - pre #{error.stack} diff --git a/example/sample-app/views/index.pug b/example/sample-app/views/index.pug deleted file mode 100644 index 3af4eb59..00000000 --- a/example/sample-app/views/index.pug +++ /dev/null @@ -1,6 +0,0 @@ -extends layout - -block content - h1= title - p= message - a(href=url) Sign In diff --git a/example/sample-app/views/layout.pug b/example/sample-app/views/layout.pug deleted file mode 100644 index 6b75ca17..00000000 --- a/example/sample-app/views/layout.pug +++ /dev/null @@ -1,9 +0,0 @@ -doctype html -html - head - title= title - link(rel='stylesheet', href='/stylesheets/style.css') - link(rel="icon" href="/favicon.ico" type="image/x-icon") - link(rel="shortcut icon" href='https://www.nylas.com/hubfs/favicon64.png?t=1518776714856') - body - block content \ No newline at end of file diff --git a/example/sample-app/views/thread.pug b/example/sample-app/views/thread.pug deleted file mode 100644 index dbf89e5e..00000000 --- a/example/sample-app/views/thread.pug +++ /dev/null @@ -1,8 +0,0 @@ -extends layout - -block content - h1= 'First thread from ' + account - div(class='frame') - h3= thread.subject - p= thread.snippet - a(href='/dashboard') Try Another Function diff --git a/example/sample-app/views/threadList.pug b/example/sample-app/views/threadList.pug deleted file mode 100644 index 6723fa53..00000000 --- a/example/sample-app/views/threadList.pug +++ /dev/null @@ -1,9 +0,0 @@ -extends layout - -block content - h1= '10 Threads' - div(class='frame') - each thread in threads - li= thread.subject - - a(href='/dashboard') Try Another Function diff --git a/example/webhooks/.gitignore b/example/webhooks/.gitignore deleted file mode 100644 index 1bf4259a..00000000 --- a/example/webhooks/.gitignore +++ /dev/null @@ -1 +0,0 @@ -config.js diff --git a/example/webhooks/config.js.template b/example/webhooks/config.js.template deleted file mode 100644 index bee07b8a..00000000 --- a/example/webhooks/config.js.template +++ /dev/null @@ -1,8 +0,0 @@ -// Rename this file to config.js and then add your client secret -const config = {}; - -config.nylasClientSecret = ''; -config.host = '127.0.0.1'; -config.port = 1234; - -module.exports = config; diff --git a/example/webhooks/index.js b/example/webhooks/index.js deleted file mode 100644 index 06069eae..00000000 --- a/example/webhooks/index.js +++ /dev/null @@ -1,99 +0,0 @@ -'use strict'; -const express = require('express'); -const crypto = require('crypto'); -const request = require('request'); -// Import secret and other configuration -const config = require('./config'); - -const app = express(); - -const bodyParser = require('body-parser'); - -// Custom Middleware to compute rawBody. Unfortunately using -// JSON.stringify(req.body) will remove spaces and newlines, so verification -// will fail. We must add this middleware to ensure we're computing the correct -// signature -app.use(function(req, res, next) { - req.rawBody = ''; - req.on('data', (chunk) => (req.rawBody += chunk)); - req.on('error', (err) => res.status(500).send('Error parsing body')); - - req.on('end', () => { - // because the stream has been consumed, other parsers like bodyParser.json - // cannot stream the request data and will time out so we must explicitly parse the body - try { - req.body = req.rawBody.length ? JSON.parse(req.rawBody) : {}; - next(); - } catch (err) { - res.status(500).send('Error parsing body'); - } - }); -}); -app.use(bodyParser.urlencoded({ limit: '5mb', extended: true })); // support encoded bodies - -app.get('/webhook', function(req, res) { - // Nylas will check to make sure your webhook is valid by making a GET - // request to your endpoint with a challenge parameter when you add the - // endpoint to the developer dashboard. All you have to do is return the - // value of the challenge parameter in the body of the response. - return res.status(200).send(req.query.challenge); -}); - -app.post('/webhook', function(req, res) { - // Verify the request to make sure it's actually from Nylas. - if (!verify_nylas_request(req)) { - console.log('Failed to verify nylas'); - return res.status(401).send('X-Nylas-Signature failed verification 🚷 '); - } - - // A quick 200 response tells Nylas your endpoint is online and healthy. - res.sendStatus(200); - - // Nylas sent us a webhook notification for some kind of event, so we should - // process it! - const data = req.body.deltas; - console.log(JSON.stringify(data, null, 2)); - for (var i = 0; i < data.length; i++) { - // Print some of the information Nylas sent us. This is where you - // would normally process the webhook notification and do things like - // fetch relevant message ids, update your database, etc. - console.log( - '%s at %s with id %s', - data[i].type, - data[i].date, - data[i].object_data.id - ); - } -}); - -// Each request made by Nylas includes an X-Nylas-Signature header. The header -// contains the HMAC-SHA256 signature of the request body, using your client -// secret as the signing key. This allows your app to verify that the -// notification really came from Nylas. -function verify_nylas_request(req) { - const digest = crypto - .createHmac('sha256', config.nylasClientSecret) - .update(req.rawBody) - .digest('hex'); - return digest === req.get('x-nylas-signature'); -} - -var webhook_uri; -// Setup ngrok settings to ensure everything works locally -request('http://localhost:4040/api/tunnels', function(error, response, body) { - if (!error && response.statusCode == 200) { - webhook_uri = JSON.parse(body).tunnels[0].public_url + '/webhook'; - } else { - throw "It looks like ngrok isn't running! Make sure you've started that first with 'ngrok http 1234'"; - } - if (config.nylasClientSecret === '') { - throw 'You need to add your Nylas client secret to config.js first!'; - } - // Start the program - console.log( - '\n%s\n\nAdd the above url to the webhooks page at https://developer.nylas.com', - webhook_uri - ); - console.log(`Server running at http://${config.host}:${config.port}/`); - app.listen(config.port); -}); diff --git a/example/webhooks/package.json b/example/webhooks/package.json deleted file mode 100644 index 44017a1f..00000000 --- a/example/webhooks/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "nylas-webhooks-example", - "version": "1.0.0", - "description": "Example of how to set up a webhook endpoint using node.js that will work with Nylas webhooks", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "Mike Pfister", - "license": "ISC", - "dependencies": { - "body-parser": "^1.15.2", - "express": "^4.14.0", - "request": "^2.74.0" - } -} diff --git a/example/webhooks/readme.md b/example/webhooks/readme.md deleted file mode 100644 index 3f8be465..00000000 --- a/example/webhooks/readme.md +++ /dev/null @@ -1,41 +0,0 @@ -# Nylas Webhooks - -This tiny express app is a simple example of how to use Nylas' webhooks feature. -This app correctly responds to Nylas' challenge request when you add a webhook -url to the [developer dashboard](https://developer.nylas.com). It also verifies -any webhook notification POST requests by Nylas and prints out some information -about the notification. - -# Dependencies - -## ngrok - -[ngrok](https://ngrok.com/) makes it really easy to test callback urls that are -running locally on your computer. - -## node / npm - -Make sure `node` and `npm` are installed. - -# Initial Setup - -```bash -npm install -``` - -# Running the app - -First, make sure ngrok is running with the same port that the local express app -is running. - -```bash -ngrok http 1234 -``` - -Next, run the express app. - -```bash -node index.js -``` - -Follow the instructions that are printed to the console. diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000..e86c62ea --- /dev/null +++ b/jest.config.js @@ -0,0 +1,26 @@ +const config = { + preset: 'ts-jest/presets/js-with-ts', + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + tsconfig: 'tsconfig.test.json', + }, + ], + }, + moduleNameMapper: { + '^[../]+src/([^/]+)$': '/lib/esm/$1.js', + '^[../]+src/resources/([^/]+)$': '/lib/esm/resources/$1.js', + '^[../]+src/models/([^/]+)$': '/lib/esm/models/$1.js', + }, + coverageThreshold: { + global: { + functions: 80, + lines: 80, + statements: 80, + }, + }, + clearMocks: true, +}; + +module.exports = config; diff --git a/package-lock.json b/package-lock.json index 2701438f..d3965102 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,129 +1,116 @@ { "name": "nylas", - "version": "6.11.0", + "version": "7.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nylas", - "version": "6.11.0", + "version": "7.0.0", "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "backoff": "^2.5.0", + "change-case": "^4.1.2", + "eslint-plugin-import": "^2.28.1", "form-data": "^4.0.0", - "JSONStream": "^1.3.5", + "mime-types": "^2.1.35", "node-fetch": "^2.6.12", - "uuid": "^8.3.2", - "websocket": "^1.0.34" + "uuid": "^8.3.2" }, "devDependencies": { - "@babel/cli": "^7.13.16", "@babel/core": "^7.3.3", - "@babel/plugin-proposal-object-rest-spread": "^7.3.2", - "@babel/preset-env": "^7.3.1", - "@types/backoff": "^2.5.1", - "@types/jest": "^25.1.4", - "@types/node-fetch": "^2.5.8", + "@types/jest": "^29.5.2", + "@types/mime-types": "^2.1.2", + "@types/node-fetch": "^2.6.4", "@types/uuid": "^8.3.4", - "@types/websocket": "^1.0.5", "@typescript-eslint/eslint-plugin": "^2.25.0", "@typescript-eslint/parser": "^2.25.0", - "babel-eslint": "^10.0.1", "eslint": "^5.14.0", "eslint-config-prettier": "^4.0.0", "eslint-plugin-custom-rules": "^0.0.0", + "eslint-plugin-import": "^2.28.1", "eslint-plugin-prettier": "^3.0.1", - "jest": "^24.9.0", + "jest": "^29.6.1", "prettier": "^1.19.1", - "pretty-format": "^25.2.6", - "ts-jest": "^25.2.1", - "typescript": "^3.8.3" + "ts-jest": "^29.1.1", + "typedoc": "^0.24.8", + "typedoc-plugin-rename-defaults": "^0.6.5", + "typescript": "^4.9.5" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@babel/cli": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.13.16.tgz", - "integrity": "sha512-cL9tllhqvsQ6r1+d9Invf7nNXg/3BlfL1vvvL/AdH9fZ2l5j0CeBcoq6UjsqHpvyN1v5nXSZgqJZoGeK+ZOAbw==", + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" - }, - "bin": { - "babel": "bin/babel.js", - "babel-external-helpers": "bin/babel-external-helpers.js" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" }, - "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", - "chokidar": "^3.4.0" + "engines": { + "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/compat-data": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/core": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", - "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helpers": "^7.5.5", - "@babel/parser": "^7.5.5", - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5", - "convert-source-map": "^1.1.0", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.8.tgz", + "integrity": "sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2" }, "engines": { "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@babel/core/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", + "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", "dev": true, "dependencies": { - "@babel/types": "^7.23.5", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -132,88 +119,47 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", - "dev": true, - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@babel/helper-call-delegate": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", - "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "node_modules/@babel/helper-define-map": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", - "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.5.5", - "lodash": "^4.17.13" + "@babel/compat-data": "^7.22.6", + "@babel/helper-validator-option": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", @@ -226,95 +172,56 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", - "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.5.5" - } - }, "node_modules/@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "dependencies": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", - "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/template": "^7.4.4", - "@babel/types": "^7.5.5", - "lodash": "^4.17.13" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, "dependencies": { - "@babel/types": "^7.0.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", - "dev": true - }, - "node_modules/@babel/helper-regex": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", - "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.13" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-wrap-function": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", - "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { @@ -330,54 +237,54 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", - "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.2.0" + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", - "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, "dependencies": { - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, "engines": { @@ -385,9 +292,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", - "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -396,974 +303,948 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", - "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0", - "@babel/plugin-syntax-async-generators": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", - "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", - "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.2.0" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", - "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", - "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", - "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", - "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", - "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", - "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", - "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz", - "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==", + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.13" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", - "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "node_modules/@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", - "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz", - "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" - } + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", - "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", - "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", - "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "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" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", - "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", - "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", - "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "node_modules/@jest/console": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", + "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", - "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", - "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0", - "babel-plugin-dynamic-import-node": "^2.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz", - "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==", + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "babel-plugin-dynamic-import-node": "^2.3.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", - "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", - "babel-plugin-dynamic-import-node": "^2.3.0" + "engines": { + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-modules-umd": { + "node_modules/@jest/console/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", - "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz", - "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==", + "node_modules/@jest/core": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", + "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", "dev": true, "dependencies": { - "regexp-tree": "^0.1.6" + "@jest/console": "^29.6.1", + "@jest/reporters": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@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": "^29.5.0", + "jest-config": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-resolve-dependencies": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "jest-watcher": "^29.6.1", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", - "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "node_modules/@jest/core/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", - "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "node_modules/@jest/core/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5" + "engines": { + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", - "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@babel/helper-call-delegate": "^7.4.4", - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", - "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", - "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "regenerator-transform": "^0.14.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", - "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" - } + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", - "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", - "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "node_modules/@jest/core/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { + "node_modules/@jest/core/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", - "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", - "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", - "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "node_modules/@jest/environment": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", + "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0" + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", - "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", + "node_modules/@jest/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "expect": "^29.6.1", + "jest-snapshot": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/preset-env": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz", - "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==", + "node_modules/@jest/expect-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-dynamic-import": "^7.5.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.5.5", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.5.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.5.5", - "@babel/plugin-transform-classes": "^7.5.5", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.5.0", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/plugin-transform-duplicate-keys": "^7.5.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.4.4", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.5.0", - "@babel/plugin-transform-modules-commonjs": "^7.5.0", - "@babel/plugin-transform-modules-systemjs": "^7.5.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", - "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.5.5", - "@babel/plugin-transform-parameters": "^7.4.4", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.5", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.2.0", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.4.4", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.4.4", - "@babel/types": "^7.5.5", - "browserslist": "^4.6.0", - "core-js-compat": "^3.1.1", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", - "semver": "^5.5.0" + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "node_modules/@jest/fake-timers": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", + "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@jest/types": "^29.6.1", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { - "node": ">=6.9.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/traverse": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", - "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", + "node_modules/@jest/globals": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", + "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.5", - "@babel/types": "^7.23.5", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.1" }, "engines": { - "node": ">=6.9.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "node_modules/@jest/reporters": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", + "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "@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-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", + "node_modules/@jest/reporters/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "bin": { - "watch": "cli.js" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.1.95" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", - "dev": true, - "dependencies": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" + "node": ">=10" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/core/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 6" + "node": ">=7.0.0" } }, - "node_modules/@jest/core/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/@jest/core/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/@jest/core/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/@jest/reporters/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/environment/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/@jest/source-map": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "node_modules/@jest/test-result": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", + "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", "dev": true, "dependencies": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" + "@jest/console": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/@jest/test-sequencer": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", + "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "@jest/test-result": "^29.6.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "slash": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/fake-timers/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/@jest/transform": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", + "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/reporters/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/reporters/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@jest/reporters/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/source-map/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "dev": true, - "dependencies": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/test-result/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/test-result/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", - "dev": true, - "dependencies": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/transform/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@jest/transform/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/transform/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/@jest/types": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.2.6.tgz", - "integrity": "sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, "dependencies": { + "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { - "node": ">= 8.3" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/types/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/types/node_modules/color-convert": { @@ -1394,9 +1275,9 @@ } }, "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" @@ -1420,9 +1301,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1444,61 +1325,112 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, - "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz", - "integrity": "sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w==", + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, - "optional": true, "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/@types/babel__core": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.6.tgz", - "integrity": "sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "node_modules/@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -1506,39 +1438,33 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.9.tgz", - "integrity": "sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, - "node_modules/@types/backoff": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@types/backoff/-/backoff-2.5.1.tgz", - "integrity": "sha512-eUNAT0dGCma0K35XcScxCP5usgCyxFypkVUN1TiHLhqGzbLnb/fVhz5yoXzj/SYLuXxE9SK6k4m+FQZQqQ4QaQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, "node_modules/@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", "dev": true }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "node_modules/@types/istanbul-lib-report": { @@ -1551,41 +1477,52 @@ } }, "node_modules/@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { - "version": "25.1.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.1.4.tgz", - "integrity": "sha512-QDDY2uNAhCV7TMCITrxz+MRk1EizcsevzfeS6LykIlq2V1E5oO4wXG8V2ZEd9w7Snxeeagk46YbMgZ8ESHx3sw==", + "version": "29.5.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz", + "integrity": "sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==", "dev": true, "dependencies": { - "jest-diff": "^25.1.0", - "pretty-format": "^25.1.0" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, "node_modules/@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/mime-types": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.2.tgz", + "integrity": "sha512-q9QGHMGCiBJCHEvd4ZLdasdqXv570agPsUW0CeIm/B8DzhxsYMerD0l3IlI+EQ1A2RWHY2mmM9x1YIuuWxisCg==", "dev": true }, "node_modules/@types/node": { - "version": "13.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.1.tgz", - "integrity": "sha512-E6M6N0blf/jiZx8Q3nb0vNaswQeEyn0XlupO+xN6DtJ6r6IT4nXrTry7zhIfYvFCl3/8Cu6WIysmUBKiqV0bqQ==", + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.0.tgz", + "integrity": "sha512-jfT7iTf/4kOQ9S7CHV9BIyRaQqHu67mOjsIQBC3BKZvzvUB6zLxEwJ6sBE3ozcvP8kF6Uk5PXN0Q+c0dfhGX0g==", "dev": true }, "node_modules/@types/node-fetch": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.8.tgz", - "integrity": "sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", "dev": true, "dependencies": { "@types/node": "*", @@ -1593,9 +1530,9 @@ } }, "node_modules/@types/node-fetch/node_modules/form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", - "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "dependencies": { "asynckit": "^0.4.0", @@ -1606,10 +1543,16 @@ "node": ">= 6" } }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true + }, "node_modules/@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, "node_modules/@types/uuid": { @@ -1618,113 +1561,102 @@ "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "dev": true }, - "node_modules/@types/websocket": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz", - "integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.25.0.tgz", - "integrity": "sha512-W2YyMtjmlrOjtXc+FtTelVs9OhuR6OlYc4XKIslJ8PUJOqgYYAPRJhAqkYRQo3G4sjvG8jSodsNycEn4W2gHUw==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", + "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "2.25.0", + "@typescript-eslint/experimental-utils": "2.34.0", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", "tsutils": "^3.17.1" }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", - "dev": true, - "engines": { - "node": ">=8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^2.0.0", + "eslint": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.25.0.tgz", - "integrity": "sha512-0IZ4ZR5QkFYbaJk+8eJ2kYeA+1tzOE1sBjbwwtSV85oNWYUBep+EyhlZ7DLUCyhMUGuJpcCCFL0fDtYAP1zMZw==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.25.0", + "@typescript-eslint/typescript-estree": "2.34.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "eslint": "*" } }, "node_modules/@typescript-eslint/parser": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.25.0.tgz", - "integrity": "sha512-mccBLaBSpNVgp191CP5W+8U1crTyXsRziWliCqzj02kpxdjKMvFHGJbK33NroquH3zB/gZ8H511HEsJBa2fNEg==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", + "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", "dev": true, "dependencies": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.25.0", - "@typescript-eslint/typescript-estree": "2.25.0", + "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/typescript-estree": "2.34.0", "eslint-visitor-keys": "^1.1.0" }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.25.0.tgz", - "integrity": "sha512-VUksmx5lDxSi6GfmwSK7SSoIKSw9anukWWNitQPqt58LuYrKalzsgeuignbqnB+rK/xxGlSsCy8lYnwFfB6YJg==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -1732,69 +1664,20 @@ "glob": "^7.1.6", "is-glob": "^4.0.1", "lodash": "^4.17.15", - "semver": "^6.3.0", + "semver": "^7.3.2", "tsutils": "^3.17.1" }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "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" }, - "engines": { - "node": "*" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "engines": { - "node": ">=6.5" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/acorn": { @@ -1809,27 +1692,22 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "dependencies": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-jsx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", - "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", - "dev": true - }, "node_modules/acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.4.0" } @@ -1868,6 +1746,12 @@ "node": ">=4" } }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true + }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -1881,27 +1765,26 @@ } }, "node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { - "remove-trailing-separator": "^1.0.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1911,73 +1794,111 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", + "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, "engines": { - "node": ">=0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/astral-regex": { @@ -1989,271 +1910,189 @@ "node": ">=4" } }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true, - "optional": true - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "node_modules/babel-eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", - "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", + "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", "dev": true, "dependencies": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" + "@jest/transform": "^29.6.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/babel-jest/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/babel-jest/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", - "dev": true, - "dependencies": { - "object.assign": "^4.1.0" + "peerDependencies": { + "@babel/core": "^7.8.0" } }, - "node_modules/babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", - "dev": true, - "dependencies": { - "@types/babel__traverse": "^7.0.6" + "node": ">=8" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "precond": "0.2" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 0.6" + "node": ">=7.0.0" } }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "is-descriptor": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "dependencies": { - "kind-of": "^6.0.0" + "@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" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "node_modules/babel-plugin-jest-hoist": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", "dev": true, "dependencies": { - "kind-of": "^6.0.0" + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "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" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "node_modules/babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", "dev": true, "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true, + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -2266,71 +2105,47 @@ } }, "node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "fill-range": "^7.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, - "dependencies": { - "resolve": "1.1.7" + "node": ">=8" } }, - "node_modules/browser-resolve/node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, "node_modules/browserslist": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", - "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", - "dev": true, + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30000984", - "electron-to-chromium": "^1.3.191", - "node-releases": "^1.1.25" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, "node_modules/bs-logger": { @@ -2355,41 +2170,22 @@ } }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/bufferutil": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", - "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/callsites": { @@ -2401,6 +2197,15 @@ "node": ">=6" } }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -2411,29 +2216,35 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30000989", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", - "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==", - "dev": true + "version": "1.0.30001512", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz", + "integrity": "sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "node_modules/capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", "dependencies": { - "rsvp": "^4.8.4" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2448,195 +2259,65 @@ "node": ">=4" } }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "optional": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "engines": { - "node": ">= 8.10.0" - } - }, - "node_modules/chokidar/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "optional": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/chokidar/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "optional": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chokidar/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/chokidar/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/chokidar/node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "optional": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/chokidar/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "dependencies": { "restore-cursor": "^2.0.0" @@ -2646,79 +2327,84 @@ } }, "node_modules/cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true }, "node_modules/color-convert": { "version": "1.9.3", @@ -2732,7 +2418,7 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/combined-stream": { @@ -2746,75 +2432,35 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", "dependencies": { - "safe-buffer": "~5.1.1" + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" } }, - "node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/core-js-compat": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz", - "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==", - "dev": true, - "dependencies": { - "browserslist": "^4.6.6", - "semver": "^6.3.0" - } - }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "optional": true, + "peer": true }, "node_modules/cross-spawn": { "version": "6.0.5", @@ -2832,183 +2478,104 @@ "node": ">=4.8" } }, - "node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "dependencies": { - "cssom": "0.3.x" - } - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "bin": { + "semver": "bin/semver" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { - "assert-plus": "^1.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { + "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" } }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "engines": { - "node": ">=0.4.0" + "node": ">=8" } }, - "node_modules/detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.3.1" } }, "node_modules/diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", "dev": true, "engines": { - "node": ">= 8.3" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/doctrine": { @@ -3023,46 +2590,39 @@ "node": ">=6.0.0" } }, - "node_modules/domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dev": true, - "dependencies": { - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, "node_modules/electron-to-chromium": { - "version": "1.3.244", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.244.tgz", - "integrity": "sha512-nEfPd2EKnFeLuZ/+JsRG3KixRQwWf2SPpp09ftNt5ouGhg408N759+oXvdXy57+TcM34ykfJYj2JMkc1O3R0lQ==", + "version": "1.4.451", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.451.tgz", + "integrity": "sha512-YYbXHIBxAHe3KWvGOJOuWa6f3tgow44rBW+QAuwVp2DvGqNZeE//K2MowNdWS7XE8li5cgQDrX1LdBr41LufkA==", "dev": true }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, - "dependencies": { - "once": "^1.4.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -3073,36 +2633,81 @@ } }, "node_modules/es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-abstract/node_modules/has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" } }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -3115,82 +2720,29 @@ }, "engines": { "node": ">= 0.4" - } - }, - "node_modules/es5-ext": { - "version": "0.10.61", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz", - "integrity": "sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" } }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" } }, - "node_modules/escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eslint": { "version": "5.16.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", @@ -3251,12 +2803,61 @@ }, "bin": { "eslint-config-prettier-check": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=3.14.1" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" } }, "node_modules/eslint-plugin-custom-rules": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-custom-rules/-/eslint-plugin-custom-rules-0.0.0.tgz", - "integrity": "sha1-Z595OxJRpsPqm2sEwz9lPMLbFYE=", + "integrity": "sha512-AWzQCMQK36n/Jv0ClVdVIBo8PZ2CtxQ8zejuVC6eh0vwVeZ3F9SY5ZoNULpu/E06nYN+bZ1EfEudGQPSR3AxZA==", "dev": true, "dependencies": { "jsx-ast-utils": "^1.3.5", @@ -3268,66 +2869,167 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.8.0", + "has": "^1.0.3", + "is-core-module": "^2.13.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", + "object.values": "^1.1.6", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-plugin-prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz", - "integrity": "sha512-XWX2yVuwVNLOUhQijAkXz+rMPPoCr7WFiAl8ig6I7Xn+pPVhDhzg4DxHpmbeb0iqjO9UronEA3Tb09ChnFVHHA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", "dev": true, "dependencies": { "prettier-linter-helpers": "^1.0.0" }, "engines": { "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=5.0.0", + "prettier": ">=1.13.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } } }, "node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "engines": { - "node": ">=4.0.0" + "node": ">=8.0.0" } }, "node_modules/eslint-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", - "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.0.0" + "eslint-visitor-keys": "^1.1.0" }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, "node_modules/eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "engines": { "node": ">=4" } }, - "node_modules/eslint/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" } }, - "node_modules/eslint/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "node_modules/eslint/node_modules/eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint/node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true, + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/eslint/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } }, "node_modules/espree": { "version": "5.0.1", @@ -3357,29 +3059,47 @@ } }, "node_modules/esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=0.6" + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" } }, "node_modules/esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "dependencies": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" }, "engines": { "node": ">=4.0" } }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", @@ -3398,180 +3118,112 @@ "node": ">=0.10.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", - "dev": true - }, "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "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" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "node_modules/execa/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, "engines": { - "node": ">= 0.8.0" + "node": ">= 8" } }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "node_modules/execa/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "node_modules/execa/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "is-descriptor": "^0.1.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/execa/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "node_modules/execa/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" + "isexe": "^2.0.0" }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/expect/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/expect/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/expect/node_modules/jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ext": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", - "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", - "dependencies": { - "type": "^2.5.0" + "node": ">= 8" } }, - "node_modules/ext/node_modules/type": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", - "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "node_modules/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", "dev": true, "dependencies": { - "is-plain-object": "^2.0.4" + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/external-editor": { @@ -3588,96 +3240,6 @@ "node": ">=4" } }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3685,27 +3247,27 @@ "dev": true }, "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, "node_modules/fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "dependencies": { "bser": "2.1.1" @@ -3714,7 +3276,7 @@ "node_modules/figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, "dependencies": { "escape-string-regexp": "^1.0.5" @@ -3735,50 +3297,29 @@ "node": ">=4" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/flat-cache": { @@ -3796,27 +3337,18 @@ } }, "node_modules/flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "engines": { - "node": "*" + "dependencies": { + "is-callable": "^1.1.3" } }, "node_modules/form-data": { @@ -3832,47 +3364,24 @@ "node": ">= 6" } }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, "optional": true, "os": [ "darwin" ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, "engines": { - "node": ">= 4.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { @@ -3881,12 +3390,48 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3896,6 +3441,30 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/get-stdin": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", @@ -3906,74 +3475,51 @@ } }, "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { - "assert-plus": "^1.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" - } - }, - "node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "dependencies": { - "is-extglob": "^2.1.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globals": { @@ -3985,40 +3531,39 @@ "node": ">=4" } }, - "node_modules/graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true - }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "dependencies": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "get-intrinsic": "^1.1.3" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4031,97 +3576,97 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" } }, - "node_modules/has-symbols": { + "node_modules/has-property-descriptors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "node_modules/html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", "dependencies": { - "whatwg-encoding": "^1.0.1" + "capital-case": "^1.0.4", + "tslib": "^2.0.3" } }, "node_modules/html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": ">=10.17.0" } }, "node_modules/iconv-lite": { @@ -4146,9 +3691,9 @@ } }, "node_modules/import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { "parent-module": "^1.0.0", @@ -4156,28 +3701,34 @@ }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "dependencies": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { "node": ">=0.8.19" @@ -4186,7 +3737,7 @@ "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { "once": "^1.3.0", @@ -4244,154 +3795,111 @@ "node": ">=6" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, - "node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "optional": true, "dependencies": { - "binary-extensions": "^1.0.0" + "has-bigints": "^1.0.1" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" }, - "bin": { - "is-ci": "bin.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "has": "^1.0.3" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -4400,7 +3908,7 @@ "node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, "engines": { "node": ">=4" @@ -4416,9 +3924,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" @@ -4427,165 +3935,174 @@ "node": ">=0.10.0" } }, - "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "dependencies": { - "isobject": "^3.0.1" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, "node_modules/is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "dependencies": { - "has": "^1.0.3" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "dependencies": { - "has-symbols": "^1.0.1" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-symbol/node_modules/has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "dependencies": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" + "@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" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { @@ -4598,262 +4115,273 @@ } }, "node_modules/istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "dependencies": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/istanbul-lib-source-maps/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, "node_modules/istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "dependencies": { - "html-escaper": "^2.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", + "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", "dev": true, "dependencies": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", + "import-local": "^3.0.2", + "jest-cli": "^29.6.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, "node_modules/jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", "dev": true, "dependencies": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" + "execa": "^5.0.0", + "p-limit": "^3.1.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-changed-files/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-circus": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", + "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.6.1", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.6.1", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-changed-files/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", - "realpath-native": "^1.1.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-config/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-config/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-config/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, + "color-name": "~1.1.4" + }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/jest-config/node_modules/jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-config/node_modules/pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", + "node_modules/jest-cli": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", + "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", "dev": true, "dependencies": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" + "@jest/core": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">= 8.3" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-diff/node_modules/color-convert": { + "node_modules/jest-cli/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -4865,13 +4393,13 @@ "node": ">=7.0.0" } }, - "node_modules/jest-diff/node_modules/color-name": { + "node_modules/jest-cli/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-diff/node_modules/has-flag": { + "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -4880,10 +4408,10 @@ "node": ">=8" } }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" @@ -4892,1217 +4420,1370 @@ "node": ">=8" } }, - "node_modules/jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", - "dev": true, - "dependencies": { - "detect-newline": "^2.1.0" + "node_modules/jest-config": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", + "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.6.1", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.6.1", + "jest-environment-node": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-each/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-each/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/jest-each/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/jest-each/node_modules/jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "node_modules/jest-config/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-each/node_modules/pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "node_modules/jest-diff": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "dependencies": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-environment-jsdom/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-environment-node/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 6" + "node": ">=7.0.0" } }, - "node_modules/jest-environment-node/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==", + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">= 8.3" + "node": ">=8" } }, - "node_modules/jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 6" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" + "node": ">=8" } }, - "node_modules/jest-haste-map/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "detect-newline": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-haste-map/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-each": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", + "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.6.1", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.9.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-jasmine2/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-jasmine2/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-jasmine2/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, + "color-name": "~1.1.4" + }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/jest-jasmine2/node_modules/pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-leak-detector/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-environment-node": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", + "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-leak-detector/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-leak-detector/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", "dev": true, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-leak-detector/node_modules/jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "node_modules/jest-haste-map": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", "dev": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@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": "^29.4.3", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "node_modules/jest-leak-detector": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", + "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", "dev": true, "dependencies": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, "dependencies": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "chalk": "^4.0.0", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-matcher-utils/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-matcher-utils/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-matcher-utils/node_modules/jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-matcher-utils/node_modules/jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "node_modules/jest-message-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-message-util/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 6" + "node": ">=7.0.0" } }, - "node_modules/jest-message-util/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "@jest/types": "^24.9.0" - }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-mock/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-mock/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-mock": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", + "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "engines": { "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, "node_modules/jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", "dev": true, "dependencies": { - "@jest/types": "^24.9.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", + "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", "dev": true, "dependencies": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.6.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-resolve-dependencies/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-resolve/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 6" + "node": ">=7.0.0" } }, - "node_modules/jest-resolve/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "@types/yargs-parser": "*" + "engines": { + "node": ">=8" } }, - "node_modules/jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-runner/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-runner": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", + "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "@jest/console": "^29.6.1", + "@jest/environment": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-leak-detector": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-resolve": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-util": "^29.6.1", + "jest-watcher": "^29.6.1", + "jest-worker": "^29.6.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-runner/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "dev": true, - "dependencies": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" - }, - "bin": { - "jest-runtime": "bin/jest-runtime.js" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-runtime/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 6" + "node": ">=7.0.0" } }, - "node_modules/jest-runtime/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "@types/yargs-parser": "*" + "engines": { + "node": ">=8" } }, - "node_modules/jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" + "node_modules/jest-runtime": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", + "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/globals": "^29.6.1", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-snapshot/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-snapshot/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/jest-snapshot/node_modules/diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-snapshot/node_modules/jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-snapshot/node_modules/jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", - "dev": true, + "node_modules/jest-snapshot": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", + "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.6.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.6.1", + "semver": "^7.5.3" + }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-util/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 6" + "node": ">=7.0.0" } }, - "node_modules/jest-util/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "@types/yargs-parser": "*" + "engines": { + "node": ">=8" } }, - "node_modules/jest-util/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "node_modules/jest-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", "dev": true, "dependencies": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "leven": "^3.1.0", - "pretty-format": "^24.9.0" + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-validate/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-validate/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/jest-validate/node_modules/jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "node_modules/jest-validate": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", "dev": true, "dependencies": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" + "@jest/types": "^29.6.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.6.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-watcher/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-watcher/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "dependencies": { - "@types/yargs-parser": "*" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/jest/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/jest/node_modules/@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/jest/node_modules/jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "node_modules/jest-watcher": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", + "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", "dev": true, "dependencies": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" - }, - "bin": { - "jest": "bin/jest.js" + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.6.1", + "string-length": "^4.0.1" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "node_modules/jest-watcher/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "color-convert": "^2.0.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "node_modules/jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "dev": true, - "dependencies": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" - } - }, - "node_modules/jsdom/node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "color-name": "~1.1.4" }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.6.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -6113,13 +5794,7 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "node_modules/json5": { @@ -6134,62 +5809,21 @@ "node": ">=6" } }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true }, "node_modules/jsx-ast-utils": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", - "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", + "integrity": "sha512-0LwSmMlQjjUdXsdlyYhEfBJCn2Chm0zgUBmfmf1++KUULh+JOdlzrZfiwe2zmlVJx44UF+KX/B/odBoeK9hxmw==", "dev": true, "engines": { "node": ">=4.0" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -6199,12 +5833,6 @@ "node": ">=6" } }, - "node_modules/left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "dev": true - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -6217,7 +5845,7 @@ "node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, "dependencies": { "prelude-ls": "~1.1.2", @@ -6227,32 +5855,22 @@ "node": ">= 0.8.0" } }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/lodash": { @@ -6264,47 +5882,54 @@ "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" + "yallist": "^3.0.2" } }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "engines": { - "node": ">=6" + "bin": { + "semver": "bin/semver.js" } }, "node_modules/make-error": { @@ -6314,33 +5939,24 @@ "dev": true }, "node_modules/makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "dependencies": { - "tmpl": "1.0.x" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "engines": { - "node": ">=0.10.0" + "tmpl": "1.0.5" } }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true, - "dependencies": { - "object-visit": "^1.0.0" + "bin": { + "marked": "bin/marked.js" }, "engines": { - "node": ">=0.10.0" + "node": ">= 12" } }, "node_modules/merge-stream": { @@ -6350,55 +5966,44 @@ "dev": true }, "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.6" } }, "node_modules/mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.40.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/minimatch": { @@ -6422,31 +6027,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -6460,66 +6040,42 @@ } }, "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", "dev": true }, - "node_modules/nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -6535,174 +6091,66 @@ } } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", - "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "dev": true, - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - } - }, "node_modules/node-releases": { - "version": "1.1.28", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.28.tgz", - "integrity": "sha512-AQw4emh6iSXnCpDiFe0phYcThiccmkNWMZnFZ+lDJjAP8J0m2fVd59duvUUyuTirQOhIAajTFkzG6FHCLBO59g==", - "dev": true, - "dependencies": { - "semver": "^5.3.0" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "dev": true }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "node_modules/npm-run-path/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { - "node": "*" + "node": ">=8" } }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -6712,91 +6160,106 @@ "node": ">= 0.4" } }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { - "isobject": "^3.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "node_modules/object.groupby": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", + "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", "dev": true, "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "engines": { - "node": ">= 0.8" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "get-intrinsic": "^1.2.1" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "dependencies": { - "isobject": "^3.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "dependencies": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "word-wrap": "~1.2.3" }, "engines": { "node": ">= 0.8.0" @@ -6805,64 +6268,52 @@ "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "p-reduce": "^1.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { - "p-limit": "^2.0.0" + "p-try": "^2.0.0" }, "engines": { "node": ">=6" - } - }, - "node_modules/p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true, - "engines": { - "node": ">=4" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -6874,6 +6325,15 @@ "node": ">=6" } }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -6887,53 +6347,54 @@ } }, "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true, - "optional": true + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } }, "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6942,112 +6403,67 @@ "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "dev": true }, "node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "node_modules/picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "optional": true, "engines": { "node": ">=8.6" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "engines": { - "node": ">=4" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "dependencies": { - "find-up": "^3.0.0" + "find-up": "^4.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", - "engines": { - "node": ">= 0.6" + "node": ">=8" } }, "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -7078,76 +6494,31 @@ } }, "node_modules/pretty-format": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", - "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/types": "^25.2.6", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">= 8.3" - } - }, - "node_modules/pretty-format/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "dependencies": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-format/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" + "node": ">=10" }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/pretty-format/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true, - "engines": { - "node": ">= 0.6" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "optional": true - }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -7158,433 +6529,186 @@ } }, "node_modules/prompts": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.1.tgz", - "integrity": "sha512-qIP2lQyCwYbdzcqHIUi2HAxiWixhoM9OdLCWf8txXsapC/X9YdsCoeyRIXE/GP+Q0J37Q7+XN/MFqbUa7IzXNA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "dependencies": { "kleur": "^3.0.3", - "sisteransi": "^1.0.4" + "sisteransi": "^1.0.5" }, "engines": { "node": ">= 6" } }, - "node_modules/psl": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", - "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { "node": ">=6" } }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "node_modules/pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", "dev": true, - "engines": { - "node": ">=0.6" - } + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] }, "node_modules/react-is": { - "version": "16.13.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz", - "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, - "dependencies": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "node_modules/requireindex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz", + "integrity": "sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==", "dev": true, - "optional": true + "engines": { + "node": ">=0.10.5" + } }, - "node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, - "optional": true, "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=0.10" + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "dependencies": { - "util.promisify": "^1.0.0" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", - "dev": true, - "dependencies": { - "private": "^0.1.6" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexp-tree": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.12.tgz", - "integrity": "sha512-TsXZ8+cv2uxMEkLfgwO0E068gsNMLfuYwMMhiUxf0Kw2Vcgzq93vgl6wIlIYuPmfMqMjfQ9zAporiozqCnwLuQ==", - "dev": true, - "bin": { - "regexp-tree": "bin/regexp-tree" - } - }, - "node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { - "node": ">=6.5.0" + "node": ">=8" } }, - "node_modules/regexpu-core": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.5.tgz", - "integrity": "sha512-FpI67+ky9J+cDizQUJlIlNZFKual/lUkFr1AG6zOCpwZ9cLrg8UUVakyUQJD7fCDIe9Z2nwTQJNPyonatNmDFQ==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "dependencies": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" - }, "engines": { "node": ">=4" } }, - "node_modules/regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", - "dev": true, - "dependencies": { - "request-promise-core": "1.1.3", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/requireindex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz", - "integrity": "sha1-5UBLgVV+91225JxacgBIk/4D4WI=", + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, "engines": { - "node": ">=0.10.5" - } - }, - "node_modules/resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" + "node": ">=10" } }, - "node_modules/resolve-cwd": { + "node_modules/restore-cursor": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "dependencies": { - "resolve-from": "^3.0.0" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" }, "engines": { "node": ">=4" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true, "engines": { "node": ">=4" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "node_modules/restore-cursor/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "mimic-fn": "^1.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, "node_modules/rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -7597,31 +6721,19 @@ "rimraf": "bin.js" } }, - "node_modules/rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true, - "engines": { - "node": "6.* || >= 7.*" - } - }, "node_modules/run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, - "dependencies": { - "is-promise": "^2.1.0" - }, "engines": { "node": ">=0.12.0" } }, "node_modules/rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "dependencies": { "tslib": "^1.9.0" @@ -7630,19 +6742,42 @@ "npm": ">=2.0.0" } }, - "node_modules/safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "dependencies": { - "ret": "~0.1.10" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safer-buffer": { @@ -7651,81 +6786,53 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "node_modules/sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dev": true, "dependencies": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" + "lru-cache": "^6.0.0" }, "bin": { - "sane": "src/cli.js" + "semver": "bin/semver.js" }, "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node": ">=10" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" } }, "node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "dependencies": { "shebang-regex": "^1.0.0" @@ -7737,37 +6844,57 @@ "node_modules/shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true + "node_modules/shiki": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", + "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", + "dev": true, + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/sisteransi": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", - "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/slice-ansi": { @@ -7784,325 +6911,93 @@ "node": ">=6" } }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "dependencies": { - "is-descriptor": "^1.0.0" + "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "dependencies": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "dependencies": { - "is-descriptor": "^0.1.0" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" + "node": ">=8" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "node_modules/string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/string-width": { @@ -8118,36 +7013,55 @@ "node": ">=4" } }, - "node_modules/string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, "dependencies": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, "dependencies": { "ansi-regex": "^3.0.0" @@ -8157,27 +7071,27 @@ } }, "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8195,11 +7109,17 @@ "node": ">=4" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/table": { "version": "5.4.6", @@ -8225,6 +7145,12 @@ "node": ">=6" } }, + "node_modules/table/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "node_modules/table/node_modules/string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -8252,36 +7178,30 @@ } }, "node_modules/test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "dependencies": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true }, "node_modules/tmp": { "version": "0.0.33", @@ -8296,179 +7216,202 @@ } }, "node_modules/tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, "engines": { "node": ">=4" } }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "is-number": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0" } }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } } }, - "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "optional": true, + "peer": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.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.1", + "yn": "3.1.1" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "node_modules/ts-node/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, - "dependencies": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "optional": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=0.8" + "node": ">=0.4.0" } }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "dependencies": { - "punycode": "^2.1.0" + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "node_modules/ts-jest": { - "version": "25.2.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.2.1.tgz", - "integrity": "sha512-TnntkEEjuXq/Gxpw7xToarmHbAafgCaAzOpnajnFC6jI7oo1trMzAHA04eWpc3MhV6+yvhE8uUBAmN+teRJh0A==", + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "mkdirp": "0.x", - "resolve": "1.x", - "semver": "^5.5", - "yargs-parser": "^16.1.0" + "minimist": "^1.2.0" }, "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": ">= 6" + "json5": "lib/cli.js" } }, - "node_modules/ts-jest/node_modules/yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "engines": { + "node": ">=4" } }, "node_modules/tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "node_modules/tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "dependencies": { "tslib": "^1.8.1" }, "engines": { "node": ">= 6" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" }, - "engines": { - "node": "*" + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, "dependencies": { "prelude-ls": "~1.1.2" @@ -8477,203 +7420,227 @@ "node": ">= 0.8.0" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, "engines": { - "node": ">=4.2.0" + "node": ">=4" } }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", "dev": true, "dependencies": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" }, "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", - "dev": true, - "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", "dev": true, "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unset-value": { + "node_modules/typed-array-byte-offset": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", "dev": true, "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "node_modules/typedoc": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz", + "integrity": "sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==", "dev": true, "dependencies": { - "isarray": "1.0.0" + "lunr": "^2.3.9", + "marked": "^4.3.0", + "minimatch": "^9.0.0", + "shiki": "^0.14.1" + }, + "bin": { + "typedoc": "bin/typedoc" }, "engines": { - "node": ">=0.10.0" + "node": ">= 14.14" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x" } }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "node_modules/typedoc-plugin-rename-defaults": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/typedoc-plugin-rename-defaults/-/typedoc-plugin-rename-defaults-0.6.5.tgz", + "integrity": "sha512-DwkgwRMxgu3UrDR3VUAdnF9jYzM6p7rw6UcVIh4MD7yjEmFDR8WWyOlk6oYgELmRYHxTDx0f0GK6iSgoxSh/Qw==", "dev": true, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "typedoc": "0.22.x || 0.23.x || 0.24.x" } }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "optional": true, - "engines": { - "node": ">=4", - "yarn": "*" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "punycode": "^2.1.0" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4.2.0" } }, - "node_modules/utf-8-validate": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", - "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", - "hasInstallScript": true, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, "dependencies": { - "node-gyp-build": "^4.3.0" + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" }, - "engines": { - "node": ">=6.14.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, - "optional": true + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } }, - "node_modules/util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" + "tslib": "^2.0.3" } }, - "node_modules/util.promisify/node_modules/has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "punycode": "^2.1.0" } }, "node_modules/uuid": { @@ -8684,94 +7651,61 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } + "optional": true, + "peer": true }, - "node_modules/walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, "dependencies": { - "makeerror": "1.0.x" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" } }, - "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", "dev": true }, - "node_modules/websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", - "dependencies": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "engines": { - "node": ">=4.0.0" - } + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "dependencies": { - "iconv-lite": "0.4.24" + "makeerror": "1.0.12" } }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/which": { @@ -8786,71 +7720,148 @@ "which": "bin/which" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "node_modules/write": { @@ -8866,262 +7877,216 @@ } }, "node_modules/write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/ws": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", - "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" + "engines": { + "node": ">=10" } }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "node_modules/yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", - "engines": { - "node": ">=0.10.32" - } - }, "node_modules/yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "engines": { + "node": ">=12" } }, "node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=6" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { - "@babel/cli": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.13.16.tgz", - "integrity": "sha512-cL9tllhqvsQ6r1+d9Invf7nNXg/3BlfL1vvvL/AdH9fZ2l5j0CeBcoq6UjsqHpvyN1v5nXSZgqJZoGeK+ZOAbw==", + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "requires": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", - "chokidar": "^3.4.0", - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.22.5" } }, + "@babel/compat-data": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", + "dev": true + }, "@babel/core": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", - "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helpers": "^7.5.5", - "@babel/parser": "^7.5.5", - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5", - "convert-source-map": "^1.1.0", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.8.tgz", + "integrity": "sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2" } }, "@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", + "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", "dev": true, "requires": { - "@babel/types": "^7.23.5", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" } }, - "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-call-delegate": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", - "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/helper-define-map": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", - "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "@babel/helper-compilation-targets": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.5.5", - "lodash": "^4.17.13" + "@babel/compat-data": "^7.22.6", + "@babel/helper-validator-option": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" } }, "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true }, - "@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/helper-hoist-variables": { @@ -9133,95 +8098,44 @@ "@babel/types": "^7.22.5" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", - "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", - "dev": true, - "requires": { - "@babel/types": "^7.5.5" - } - }, "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-transforms": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", - "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/template": "^7.4.4", - "@babel/types": "^7.5.5", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true }, - "@babel/helper-regex": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", - "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", - "dev": true, - "requires": { - "lodash": "^4.17.13" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-wrap-function": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", - "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" - } - }, "@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "requires": { - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/types": "^7.22.5" } }, "@babel/helper-split-export-declaration": { @@ -9234,947 +8148,757 @@ } }, "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true }, - "@babel/helper-wrap-function": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", - "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.2.0" - } - }, - "@babel/helpers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", - "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", - "dev": true, - "requires": { - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" - } - }, - "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", - "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", + "@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", - "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0", - "@babel/plugin-syntax-async-generators": "^7.2.0" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", - "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", - "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.2.0" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", - "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", - "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", - "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", - "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", - "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", - "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", - "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz", - "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.13" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", - "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", - "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz", - "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", - "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", - "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", - "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", - "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", - "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", - "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", - "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", - "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" } }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz", - "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==", + "@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", - "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-modules-umd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", - "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz", - "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==", + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { - "regexp-tree": "^0.1.6" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-transform-new-target": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", - "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-object-super": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", - "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-parameters": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", - "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.4.4", - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-transform-property-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", - "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-regenerator": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", - "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "requires": { - "regenerator-transform": "^0.14.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-reserved-words": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", - "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", - "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-spread": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", - "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", - "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-transform-template-literals": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", - "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", - "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", - "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", + "@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" } }, - "@babel/preset-env": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz", - "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==", + "@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-dynamic-import": "^7.5.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.5.5", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.5.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.5.5", - "@babel/plugin-transform-classes": "^7.5.5", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.5.0", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/plugin-transform-duplicate-keys": "^7.5.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.4.4", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.5.0", - "@babel/plugin-transform-modules-commonjs": "^7.5.0", - "@babel/plugin-transform-modules-systemjs": "^7.5.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", - "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.5.5", - "@babel/plugin-transform-parameters": "^7.4.4", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.5", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.2.0", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.4.4", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.4.4", - "@babel/types": "^7.5.5", - "browserslist": "^4.6.0", - "core-js-compat": "^3.1.1", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", - "semver": "^5.5.0" + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" } }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" } }, - "@babel/traverse": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", - "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "optional": true, + "peer": true, "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.5", - "@babel/types": "^7.23.5", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@jridgewell/trace-mapping": "0.3.9" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, + "optional": true, + "peer": true, "requires": { - "ms": "^2.1.1" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, - "@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "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" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true }, "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", + "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", "dev": true, "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" - } - }, - "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "slash": "^3.0.0" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "color-name": "~1.1.4" } }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "has-flag": "^4.0.0" } } } }, - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "@jest/core": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", + "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", "dev": true, "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "@jest/console": "^29.6.1", + "@jest/reporters": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@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": "^29.5.0", + "jest-config": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-resolve-dependencies": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "jest-watcher": "^29.6.1", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } - } - } - }, - "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "ansi-regex": "^5.0.1" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "has-flag": "^4.0.0" } } } }, + "@jest/environment": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", + "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", + "dev": true, + "requires": { + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.1" + } + }, + "@jest/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", + "dev": true, + "requires": { + "expect": "^29.6.1", + "jest-snapshot": "^29.6.1" + } + }, + "@jest/expect-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", + "dev": true, + "requires": { + "jest-get-type": "^29.4.3" + } + }, + "@jest/fake-timers": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", + "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", + "dev": true, + "requires": { + "@jest/types": "^29.6.1", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" + } + }, + "@jest/globals": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", + "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", + "dev": true, + "requires": { + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.1" + } + }, "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", + "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", "dev": true, "requires": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" + "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-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "color-name": "~1.1.4" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, + "@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "graceful-fs": "^4.2.9" } }, "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", + "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", "dev": true, "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - } + "@jest/console": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", + "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", "dev": true, "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" + "@jest/test-result": "^29.6.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "slash": "^3.0.0" } }, "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", + "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "color-name": "~1.1.4" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, "@jest/types": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.2.6.tgz", - "integrity": "sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, "requires": { + "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -10203,9 +8927,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -10225,9 +8949,9 @@ } }, "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true }, "@jridgewell/set-array": { @@ -10243,61 +8967,111 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } + }, + "@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "dev": true + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "type-detect": "4.0.8" } }, - "@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz", - "integrity": "sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w==", + "@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, - "optional": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "@sinonjs/commons": "^3.0.0" } }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true, + "optional": true, + "peer": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "optional": true, + "peer": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "optional": true, + "peer": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "optional": true, + "peer": true + }, "@types/babel__core": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.6.tgz", - "integrity": "sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -10305,39 +9079,33 @@ } }, "@types/babel__traverse": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.9.tgz", - "integrity": "sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/backoff": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@types/backoff/-/backoff-2.5.1.tgz", - "integrity": "sha512-eUNAT0dGCma0K35XcScxCP5usgCyxFypkVUN1TiHLhqGzbLnb/fVhz5yoXzj/SYLuXxE9SK6k4m+FQZQqQ4QaQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "requires": { - "@types/node": "*" + "@babel/types": "^7.20.7" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", "dev": true }, + "@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "@types/istanbul-lib-report": { @@ -10350,41 +9118,52 @@ } }, "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, "@types/jest": { - "version": "25.1.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.1.4.tgz", - "integrity": "sha512-QDDY2uNAhCV7TMCITrxz+MRk1EizcsevzfeS6LykIlq2V1E5oO4wXG8V2ZEd9w7Snxeeagk46YbMgZ8ESHx3sw==", + "version": "29.5.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz", + "integrity": "sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==", "dev": true, "requires": { - "jest-diff": "^25.1.0", - "pretty-format": "^25.1.0" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "@types/mime-types": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.2.tgz", + "integrity": "sha512-q9QGHMGCiBJCHEvd4ZLdasdqXv570agPsUW0CeIm/B8DzhxsYMerD0l3IlI+EQ1A2RWHY2mmM9x1YIuuWxisCg==", "dev": true }, "@types/node": { - "version": "13.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.1.tgz", - "integrity": "sha512-E6M6N0blf/jiZx8Q3nb0vNaswQeEyn0XlupO+xN6DtJ6r6IT4nXrTry7zhIfYvFCl3/8Cu6WIysmUBKiqV0bqQ==", + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.0.tgz", + "integrity": "sha512-jfT7iTf/4kOQ9S7CHV9BIyRaQqHu67mOjsIQBC3BKZvzvUB6zLxEwJ6sBE3ozcvP8kF6Uk5PXN0Q+c0dfhGX0g==", "dev": true }, "@types/node-fetch": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.8.tgz", - "integrity": "sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", "dev": true, "requires": { "@types/node": "*", @@ -10392,9 +9171,9 @@ }, "dependencies": { "form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", - "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "requires": { "asynckit": "^0.4.0", @@ -10404,10 +9183,16 @@ } } }, + "@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true + }, "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, "@types/uuid": { @@ -10416,99 +9201,61 @@ "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "dev": true }, - "@types/websocket": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz", - "integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.25.0.tgz", - "integrity": "sha512-W2YyMtjmlrOjtXc+FtTelVs9OhuR6OlYc4XKIslJ8PUJOqgYYAPRJhAqkYRQo3G4sjvG8jSodsNycEn4W2gHUw==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", + "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.25.0", + "@typescript-eslint/experimental-utils": "2.34.0", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", "tsutils": "^3.17.1" - }, - "dependencies": { - "regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", - "dev": true - } } }, "@typescript-eslint/experimental-utils": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.25.0.tgz", - "integrity": "sha512-0IZ4ZR5QkFYbaJk+8eJ2kYeA+1tzOE1sBjbwwtSV85oNWYUBep+EyhlZ7DLUCyhMUGuJpcCCFL0fDtYAP1zMZw==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.25.0", + "@typescript-eslint/typescript-estree": "2.34.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - } } }, "@typescript-eslint/parser": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.25.0.tgz", - "integrity": "sha512-mccBLaBSpNVgp191CP5W+8U1crTyXsRziWliCqzj02kpxdjKMvFHGJbK33NroquH3zB/gZ8H511HEsJBa2fNEg==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", + "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.25.0", - "@typescript-eslint/typescript-estree": "2.25.0", + "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/typescript-estree": "2.34.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.25.0.tgz", - "integrity": "sha512-VUksmx5lDxSi6GfmwSK7SSoIKSw9anukWWNitQPqt58LuYrKalzsgeuignbqnB+rK/xxGlSsCy8lYnwFfB6YJg==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", "dev": true, "requires": { "debug": "^4.1.1", @@ -10516,59 +9263,8 @@ "glob": "^7.1.6", "is-glob": "^4.0.1", "lodash": "^4.17.15", - "semver": "^6.3.0", + "semver": "^7.3.2", "tsutils": "^3.17.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "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" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", - "dev": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "requires": { - "event-target-shim": "^5.0.0" } }, "acorn": { @@ -10577,27 +9273,20 @@ "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "dev": true, - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - } - }, "acorn-jsx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", - "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", - "dev": true + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} }, "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "dev": true + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "optional": true, + "peer": true }, "ajv": { "version": "6.12.6", @@ -10623,6 +9312,12 @@ "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true }, + "ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -10633,26 +9328,23 @@ } }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "optional": true, + "peer": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -10662,285 +9354,224 @@ "sprintf-js": "~1.0.2" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { + "array-buffer-byte-length": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true, - "optional": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "babel-eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", - "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - } - }, - "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - } + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" } }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "requires": { - "object.assign": "^4.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" } }, - "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "array.prototype.findlastindex": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", + "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" } }, - "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "requires": { - "@types/babel__traverse": "^7.0.6" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" } }, - "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "requires": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" } }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", + "arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, "requires": { - "precond": "0.2" + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" } }, - "balanced-match": { + "astral-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "babel-jest": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", + "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "@jest/transform": "^29.6.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "color-convert": "^2.0.1" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "color-name": "~1.1.4" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "has-flag": "^4.0.0" } } } }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@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": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", "dev": true, "requires": { - "tweetnacl": "^0.14.3" + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" } }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, - "optional": true + "requires": { + "@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" + } }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", "dev": true, - "optional": true, "requires": { - "file-uri-to-path": "1.0.0" + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" } }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -10952,66 +9583,24 @@ } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } + "fill-range": "^7.0.1" } }, "browserslist": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", - "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000984", - "electron-to-chromium": "^1.3.191", - "node-releases": "^1.1.25" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" } }, "bs-logger": { @@ -11033,34 +9622,19 @@ } }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "bufferutil": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", - "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" } }, "callsites": { @@ -11069,6 +9643,15 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -11076,26 +9659,21 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30000989", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", - "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==", + "version": "1.0.30001512", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz", + "integrity": "sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw==", "dev": true }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, + "capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", "requires": { - "rsvp": "^4.8.4" + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -11107,202 +9685,105 @@ "supports-color": "^5.3.0" } }, + "change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "requires": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } + "cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "requires": { "restore-cursor": "^2.0.0" } }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } } } @@ -11310,18 +9791,14 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } + "collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true }, "color-convert": { "version": "1.9.3", @@ -11335,7 +9812,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "combined-stream": { @@ -11346,70 +9823,35 @@ "delayed-stream": "~1.0.0" } }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, + "constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, - "core-js-compat": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz", - "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==", + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true, - "requires": { - "browserslist": "^4.6.6", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "optional": true, + "peer": true }, "cross-spawn": { "version": "6.0.5", @@ -11422,156 +9864,76 @@ "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" - } - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "dev": true, - "requires": { - "cssom": "0.3.x" - } - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" }, "dependencies": { - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "optional": true, + "peer": true + }, "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", "dev": true }, "doctrine": { @@ -11583,45 +9945,32 @@ "esutils": "^2.0.2" } }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dev": true, - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, "electron-to-chromium": { - "version": "1.3.244", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.244.tgz", - "integrity": "sha512-nEfPd2EKnFeLuZ/+JsRG3KixRQwWf2SPpp09ftNt5ouGhg408N759+oXvdXy57+TcM34ykfJYj2JMkc1O3R0lQ==", + "version": "1.4.451", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.451.tgz", + "integrity": "sha512-YYbXHIBxAHe3KWvGOJOuWa6f3tgow44rBW+QAuwVp2DvGqNZeE//K2MowNdWS7XE8li5cgQDrX1LdBr41LufkA==", "dev": true }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "error-ex": { "version": "1.3.2", @@ -11633,30 +9982,70 @@ } }, "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - } + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" } }, "es-to-primitive": { @@ -11670,63 +10059,18 @@ "is-symbol": "^1.0.2" } }, - "es5-ext": { - "version": "0.10.61", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz", - "integrity": "sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==", - "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, - "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, "eslint": { "version": "5.16.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", @@ -11771,19 +10115,35 @@ "text-table": "^0.2.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "dev": true, "requires": { - "ms": "^2.1.1" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } @@ -11797,10 +10157,52 @@ "get-stdin": "^6.0.0" } }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "eslint-plugin-custom-rules": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-custom-rules/-/eslint-plugin-custom-rules-0.0.0.tgz", - "integrity": "sha1-Z595OxJRpsPqm2sEwz9lPMLbFYE=", + "integrity": "sha512-AWzQCMQK36n/Jv0ClVdVIBo8PZ2CtxQ8zejuVC6eh0vwVeZ3F9SY5ZoNULpu/E06nYN+bZ1EfEudGQPSR3AxZA==", "dev": true, "requires": { "jsx-ast-utils": "^1.3.5", @@ -11809,38 +10211,89 @@ "requireindex": "~1.1.0" } }, + "eslint-plugin-import": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "dev": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.8.0", + "has": "^1.0.3", + "is-core-module": "^2.13.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", + "object.values": "^1.1.6", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, "eslint-plugin-prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz", - "integrity": "sha512-XWX2yVuwVNLOUhQijAkXz+rMPPoCr7WFiAl8ig6I7Xn+pPVhDhzg4DxHpmbeb0iqjO9UronEA3Tb09ChnFVHHA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" } }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "eslint-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", - "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.0.0" + "eslint-visitor-keys": "^1.1.0" } }, "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, "espree": { @@ -11861,21 +10314,37 @@ "dev": true }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "estraverse": { @@ -11890,239 +10359,97 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", - "dev": true - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", - "dev": true - } - } - }, - "ext": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", - "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", - "requires": { - "type": "^2.5.0" - }, - "dependencies": { - "type": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", - "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "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" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "shebang-regex": "^3.0.0" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "isexe": "^2.0.0" } } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true }, + "expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", + "dev": true, + "requires": { + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -12130,27 +10457,27 @@ "dev": true }, "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "requires": { "bser": "2.1.1" @@ -12159,7 +10486,7 @@ "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" @@ -12174,43 +10501,23 @@ "flat-cache": "^2.0.1" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "to-regex-range": "^5.0.1" } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "flat-cache": { @@ -12225,22 +10532,19 @@ } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } }, "form-data": { "version": "4.0.0", @@ -12252,37 +10556,18 @@ "mime-types": "^2.1.12" } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } + "optional": true }, "function-bind": { "version": "1.1.1", @@ -12290,10 +10575,34 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-caller-file": { @@ -12302,6 +10611,24 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, "get-stdin": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", @@ -12309,100 +10636,65 @@ "dev": true }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "get-intrinsic": "^1.1.3" } }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -12412,81 +10704,68 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, - "has-value": { + "has-property-descriptors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "get-intrinsic": "^1.1.1" } }, - "has-values": { + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "has-symbols": "^1.0.2" } }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, + "header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", "requires": { - "whatwg-encoding": "^1.0.1" + "capital-case": "^1.0.4", + "tslib": "^2.0.3" } }, "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true }, "iconv-lite": { "version": "0.4.24", @@ -12504,9 +10783,9 @@ "dev": true }, "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -12514,25 +10793,25 @@ } }, "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" } }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -12583,133 +10862,87 @@ } } }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "requires": { - "loose-envify": "^1.0.0" + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" } }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "optional": true, "requires": { - "binary-extensions": "^1.0.0" + "has-bigints": "^1.0.1" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "requires": { - "ci-info": "^2.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "has": "^1.0.3" } }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "has-tostringtag": "^1.0.0" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true }, "is-generator-fn": { @@ -12719,141 +10952,125 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "has-tostringtag": "^1.0.0" } }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { - "isobject": "^3.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "requires": { - "has": "^1.0.3" + "call-bind": "^1.0.2" } }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "requires": { - "has-symbols": "^1.0.1" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - } + "has-symbols": "^1.0.2" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.11" + } }, - "is-windows": { + "is-weakref": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" + "@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" }, "dependencies": { "semver": { @@ -12865,255 +11082,188 @@ } }, "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", + "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "requires": { - "html-escaper": "^2.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", + "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", "dev": true, "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", - "dev": true, - "requires": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" - } - } + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", + "import-local": "^3.0.2", + "jest-cli": "^29.6.1" } }, "jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + } + }, + "jest-circus": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", + "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.6.1", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.6.1", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - } - } - }, - "jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", - "realpath-native": "^1.1.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "color-name": "~1.1.4" } }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "has-flag": "^4.0.0" } } } }, - "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", + "jest-cli": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", + "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", "dev": true, "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" + "@jest/core": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -13142,9 +11292,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -13152,909 +11302,994 @@ } } }, - "jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", - "dev": true, - "requires": { - "detect-newline": "^2.1.0" - } - }, - "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" + "jest-config": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", + "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.6.1", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.6.1", + "jest-environment-node": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "has-flag": "^4.0.0" } } } }, - "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "jest-diff": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } - } - } - }, - "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-name": "~1.1.4" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "has-flag": "^4.0.0" } } } }, - "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==", - "dev": true - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - } + "detect-newline": "^3.0.0" } }, - "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "jest-each": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", + "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", "dev": true, "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.9.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" + "@jest/types": "^29.6.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.6.1", + "pretty-format": "^29.6.1" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "color-convert": "^2.0.1" } }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - } - } - } - }, - "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", - "dev": true, - "requires": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "color-name": "~1.1.4" } }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "has-flag": "^4.0.0" } } } }, + "jest-environment-node": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", + "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" + } + }, + "jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true + }, + "jest-haste-map": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", + "dev": true, + "requires": { + "@jest/types": "^29.6.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + } + }, + "jest-leak-detector": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", + "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", + "dev": true, + "requires": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + } + }, "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "chalk": "^4.0.0", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", - "dev": true - }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "color-name": "~1.1.4" } }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "has-flag": "^4.0.0" } } } }, "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } - } - } - }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-name": "~1.1.4" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "has-flag": "^4.0.0" } } } }, + "jest-mock": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", + "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", + "dev": true, + "requires": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-util": "^29.6.1" + } + }, "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", - "dev": true + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "requires": {} }, "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true }, "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } - } - } - }, - "jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-name": "~1.1.4" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "has-flag": "^4.0.0" } } } }, + "jest-resolve-dependencies": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", + "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", + "dev": true, + "requires": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.6.1" + } + }, "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", + "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" + "@jest/console": "^29.6.1", + "@jest/environment": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-leak-detector": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-resolve": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-util": "^29.6.1", + "jest-watcher": "^29.6.1", + "jest-worker": "^29.6.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-name": "~1.1.4" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "has-flag": "^4.0.0" } } } }, "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", + "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/globals": "^29.6.1", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-name": "~1.1.4" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "has-flag": "^4.0.0" } } } }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", + "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.6.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" + "pretty-format": "^29.6.1", + "semver": "^7.5.3" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", - "dev": true - }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "color-name": "~1.1.4" } }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "has-flag": "^4.0.0" } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true } } }, "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", "dev": true, "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "color-name": "~1.1.4" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", + "@jest/types": "^29.6.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^24.9.0" + "pretty-format": "^29.6.1" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-convert": "^2.0.1" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "has-flag": "^4.0.0" } } } }, "jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", + "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", "dev": true, "requires": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.6.1", + "string-length": "^4.0.1" }, "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "color-name": "~1.1.4" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "has-flag": "^4.0.0" } } } }, "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", "dev": true, "requires": { + "@types/node": "*", + "jest-util": "^29.6.1", "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" + "supports-color": "^8.0.0" }, "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -14062,79 +12297,25 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - } - } - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "json-schema-traverse": { @@ -14146,13 +12327,7 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "json5": { @@ -14161,42 +12336,16 @@ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true }, "jsx-ast-utils": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", - "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "integrity": "sha512-0LwSmMlQjjUdXsdlyYhEfBJCn2Chm0zgUBmfmf1++KUULh+JOdlzrZfiwe2zmlVJx44UF+KX/B/odBoeK9hxmw==", "dev": true }, "kleur": { @@ -14205,12 +12354,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "dev": true - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -14220,33 +12363,26 @@ "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" } }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { @@ -14258,38 +12394,45 @@ "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "yallist": "^3.0.2" } }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" }, "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -14301,29 +12444,20 @@ "dev": true }, "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "requires": { - "tmpl": "1.0.x" + "tmpl": "1.0.5" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -14331,43 +12465,32 @@ "dev": true }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.40.0" + "mime-db": "1.52.0" } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimatch": { @@ -14385,27 +12508,6 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -14416,208 +12518,91 @@ } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", "dev": true }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "requires": { "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } } }, - "node-gyp-build": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", - "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==" - }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, - "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - } - }, "node-releases": { - "version": "1.1.28", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.28.tgz", - "integrity": "sha512-AQw4emh6iSXnCpDiFe0phYcThiccmkNWMZnFZ+lDJjAP8J0m2fVd59duvUUyuTirQOhIAajTFkzG6FHCLBO59g==", - "dev": true, - "requires": { - "semver": "^5.3.0" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "dev": true }, "normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "optional": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "path-key": "^3.0.0" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true } } }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object-keys": { @@ -14626,129 +12611,134 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { - "isobject": "^3.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "object.groupby": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", + "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "get-intrinsic": "^1.2.1" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "requires": { - "isobject": "^3.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "requires": { "wrappy": "1" } }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" } }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "word-wrap": "~1.2.3" } }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + } } }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -14759,131 +12749,96 @@ } }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true, - "optional": true + "path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "dev": true }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true, - "optional": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true }, "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "find-up": "^3.0.0" + "find-up": "^4.0.0" } }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" - }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true }, "prettier": { @@ -14902,388 +12857,111 @@ } }, "pretty-format": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", - "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", - "dev": true, - "requires": { - "@jest/types": "^25.2.6", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "optional": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "prompts": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.1.tgz", - "integrity": "sha512-qIP2lQyCwYbdzcqHIUi2HAxiWixhoM9OdLCWf8txXsapC/X9YdsCoeyRIXE/GP+Q0J37Q7+XN/MFqbUa7IzXNA==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.4" - } - }, - "psl": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", - "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true - }, - "react-is": { - "version": "16.13.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz", - "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - } - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "dev": true, - "requires": { - "util.promisify": "^1.0.0" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", - "dev": true, - "requires": { - "private": "^0.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp-tree": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.12.tgz", - "integrity": "sha512-TsXZ8+cv2uxMEkLfgwO0E068gsNMLfuYwMMhiUxf0Kw2Vcgzq93vgl6wIlIYuPmfMqMjfQ9zAporiozqCnwLuQ==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "regexpu-core": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.5.tgz", - "integrity": "sha512-FpI67+ky9J+cDizQUJlIlNZFKual/lUkFr1AG6zOCpwZ9cLrg8UUVakyUQJD7fCDIe9Z2nwTQJNPyonatNmDFQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" - } - }, - "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", - "dev": true - }, - "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true } } }, - "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "requires": { - "lodash": "^4.17.15" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" } }, - "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "dev": true + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "requires": { - "request-promise-core": "1.1.3", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" } }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, "requireindex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz", - "integrity": "sha1-5UBLgVV+91225JxacgBIk/4D4WI=", + "integrity": "sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==", "dev": true }, "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { - "resolve-from": "^3.0.0" + "resolve-from": "^5.0.0" }, "dependencies": { "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } @@ -15294,28 +12972,39 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + } } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -15325,43 +13014,50 @@ "glob": "^7.1.3" } }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "requires": { - "is-promise": "^2.1.0" + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, - "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", "dev": true, "requires": { - "tslib": "^1.9.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" } }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "requires": { - "ret": "~0.1.10" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" } }, "safer-buffer": { @@ -15370,68 +13066,46 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "lru-cache": "^6.0.0" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "yallist": "^4.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, + "sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -15440,31 +13114,48 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true + "shiki": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", + "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", + "dev": true, + "requires": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "sisteransi": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", - "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "slice-ansi": { @@ -15478,282 +13169,81 @@ "is-fullwidth-code-point": "^2.0.0" } }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, + "snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "escape-string-regexp": "^2.0.0" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true } } }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "optional": true, "requires": { - "safe-buffer": "~5.1.0" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" }, "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "optional": true + "requires": { + "ansi-regex": "^5.0.1" + } } } }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" - } - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -15764,51 +13254,64 @@ "strip-ansi": "^4.0.0" } }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, "requires": { "ansi-regex": "^3.0.0" } }, "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true }, "supports-color": { @@ -15820,10 +13323,10 @@ "has-flag": "^3.0.0" } }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, "table": { @@ -15844,6 +13347,12 @@ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -15867,33 +13376,27 @@ } }, "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" } }, "text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true }, "tmp": { "version": "0.0.33", @@ -15905,315 +13408,289 @@ } }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-number": "^7.0.0" } }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" } }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "optional": true, + "peer": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.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.1", + "yn": "3.1.1" }, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "optional": true, + "peer": true } } }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "ts-jest": { - "version": "25.2.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.2.1.tgz", - "integrity": "sha512-TnntkEEjuXq/Gxpw7xToarmHbAafgCaAzOpnajnFC6jI7oo1trMzAHA04eWpc3MhV6+yvhE8uUBAmN+teRJh0A==", + "tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "mkdirp": "0.x", - "resolve": "1.x", - "semver": "^5.5", - "yargs-parser": "^16.1.0" + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, "dependencies": { - "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "minimist": "^1.2.0" } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true } } }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, "requires": { "prelude-ls": "~1.1.2" } }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" } }, - "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", - "dev": true + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } }, - "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", - "dev": true + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" } }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "typedoc": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz", + "integrity": "sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==", "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "lunr": "^2.3.9", + "marked": "^4.3.0", + "minimatch": "^9.0.0", + "shiki": "^0.14.1" }, "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } + "balanced-match": "^1.0.0" } }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } } } }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "typedoc-plugin-rename-defaults": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/typedoc-plugin-rename-defaults/-/typedoc-plugin-rename-defaults-0.6.5.tgz", + "integrity": "sha512-DwkgwRMxgu3UrDR3VUAdnF9jYzM6p7rw6UcVIh4MD7yjEmFDR8WWyOlk6oYgELmRYHxTDx0f0GK6iSgoxSh/Qw==", "dev": true, - "optional": true + "requires": {} }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { - "punycode": "^2.1.0" + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } }, - "utf-8-validate": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", - "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", + "upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", "requires": { - "node-gyp-build": "^4.3.0" + "tslib": "^2.0.3" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true + "upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "requires": { + "tslib": "^2.0.3" + } }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - } + "punycode": "^2.1.0" } }, "uuid": { @@ -16221,146 +13698,166 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } + "optional": true, + "peer": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" } }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } + "vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true }, "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "requires": { - "makeerror": "1.0.x" + "makeerror": "1.0.12" } }, "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, - "websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "requires": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "iconv-lite": "0.4.24" + "isexe": "^2.0.0" } }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" } }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "requires": { - "isexe": "^2.0.0" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } } } @@ -16368,7 +13865,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "write": { @@ -16381,97 +13878,95 @@ } }, "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "ws": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", - "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" + "signal-exit": "^3.0.7" } }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==" + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "dependencies": { "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } } } }, "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "optional": true, + "peer": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index 485037c9..dd41e1ef 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,16 @@ { "name": "nylas", - "version": "6.11.0", + "version": "7.0.0", "description": "A NodeJS wrapper for the Nylas REST API for email, contacts, and calendar.", - "main": "lib/nylas.js", - "types": "lib/nylas.d.ts", + "main": "lib/cjs/nylas.js", + "types": "lib/types/nylas.d.ts", + "module": "lib/esm/nylas.js", "files": [ "lib" ], + "engines": { + "node": ">=16" + }, "scripts": { "test": "jest", "test:coverage": "npm run test -- --coverage", @@ -15,24 +19,15 @@ "lint:ci": "npm run lint:fix -- --quiet", "lint:prettier": "prettier --write '**/*.{ts,js}'", "lint:prettier:check": "prettier --check '**/*.{ts,js}'", - "build": "tsc", + "export-version": "node scripts/exportVersion.js", + "generate-lib-package-json": "node scripts/generateLibPackageJson.js", + "prebuild": "npm run export-version", + "build": "rm -rf lib && npm run build-esm && npm run build-cjs && npm run generate-lib-package-json", + "build-esm": "tsc -p tsconfig.esm.json", + "build-cjs": "tsc -p tsconfig.cjs.json", "prepare": "npm run build", - "watch": "nodemon -w src --exec npm run build" - }, - "jest": { - "preset": "ts-jest/presets/js-with-ts", - "globals": { - "ts-jest": { - "tsConfig": "tsconfig.test.json" - } - }, - "coverageThreshold": { - "global": { - "functions": 80, - "lines": 80, - "statements": 80 - } - } + "build:docs": "typedoc --out docs", + "version": "npm run export-version && git add src/version.ts" }, "keywords": [ "email", @@ -43,39 +38,40 @@ "author": "Nylas, Inc.", "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "backoff": "^2.5.0", + "change-case": "^4.1.2", + "eslint-plugin-import": "^2.28.1", "form-data": "^4.0.0", - "JSONStream": "^1.3.5", + "mime-types": "^2.1.35", "node-fetch": "^2.6.12", - "uuid": "^8.3.2", - "websocket": "^1.0.34" + "uuid": "^8.3.2" }, "devDependencies": { - "@babel/cli": "^7.13.16", "@babel/core": "^7.3.3", - "@babel/plugin-proposal-object-rest-spread": "^7.3.2", - "@babel/preset-env": "^7.3.1", - "@types/backoff": "^2.5.1", - "@types/jest": "^25.1.4", - "@types/node-fetch": "^2.5.8", + "@types/jest": "^29.5.2", + "@types/mime-types": "^2.1.2", + "@types/node-fetch": "^2.6.4", "@types/uuid": "^8.3.4", - "@types/websocket": "^1.0.5", "@typescript-eslint/eslint-plugin": "^2.25.0", "@typescript-eslint/parser": "^2.25.0", - "babel-eslint": "^10.0.1", "eslint": "^5.14.0", "eslint-config-prettier": "^4.0.0", "eslint-plugin-custom-rules": "^0.0.0", "eslint-plugin-prettier": "^3.0.1", - "jest": "^24.9.0", + "eslint-plugin-import": "^2.28.1", + "jest": "^29.6.1", "prettier": "^1.19.1", - "pretty-format": "^25.2.6", - "ts-jest": "^25.2.1", - "typescript": "^3.8.3" + "ts-jest": "^29.1.1", + "typedoc": "^0.24.8", + "typedoc-plugin-rename-defaults": "^0.6.5", + "typescript": "^4.9.5" }, "repository": { "type": "git", "url": "https://github.com/nylas/nylas-nodejs.git" + }, + "exports": { + "import": "./lib/esm/nylas.js", + "require": "./lib/cjs/nylas.js", + "types": "./lib/types/nylas.d.ts" } } diff --git a/scripts/exportVersion.js b/scripts/exportVersion.js new file mode 100644 index 00000000..27f13aca --- /dev/null +++ b/scripts/exportVersion.js @@ -0,0 +1,20 @@ +/** + * This script exports the version of the SDK from the package.json to src/version.ts + */ + +const fs = require('fs'); +const path = require('path'); + +// Read the version from package.json +const packageJsonPath = path.join(__dirname, '..', 'package.json'); +const packageJson = require(packageJsonPath); +const version = packageJson.version; + +// Create the output string +const comment = '// This file is generated by scripts/exportVersion.js\n'; +const varStr = `export const SDK_VERSION = '${version}';\n`; +const output = comment + varStr; + +// Write the output to src/version.ts +const outputPath = path.join(__dirname, '..', 'src', 'version.ts'); +fs.writeFileSync(outputPath, output); diff --git a/scripts/generateLibPackageJson.js b/scripts/generateLibPackageJson.js new file mode 100644 index 00000000..73ce73ef --- /dev/null +++ b/scripts/generateLibPackageJson.js @@ -0,0 +1,28 @@ +/** + * This script generates the package.json files for the CJS and ESM builds. + */ + +const fs = require('fs'); +const path = require('path'); + +// Create the "lib/cjs/package.json" file +const cjsFolderPath = path.join(__dirname, '..', 'lib', 'cjs'); +const cjsPackageJsonPath = path.join(cjsFolderPath, 'package.json'); +const cjsContent = JSON.stringify({ type: 'commonjs' }, null, 2); + +// Ensure the directory exists before writing the file +if (!fs.existsSync(cjsFolderPath)) { + fs.mkdirSync(cjsFolderPath, { recursive: true }); +} +fs.writeFileSync(cjsPackageJsonPath, cjsContent); + +// Create the "lib/esm/package.json" file +const esmFolderPath = path.join(__dirname, '..', 'lib', 'esm'); +const esmPackageJsonPath = path.join(esmFolderPath, 'package.json'); +const esmContent = JSON.stringify({ type: 'module' }, null, 2); + +// Ensure the directory exists before writing the file +if (!fs.existsSync(esmFolderPath)) { + fs.mkdirSync(esmFolderPath, { recursive: true }); +} +fs.writeFileSync(esmPackageJsonPath, esmContent); diff --git a/src/apiClient.ts b/src/apiClient.ts new file mode 100644 index 00000000..b709473b --- /dev/null +++ b/src/apiClient.ts @@ -0,0 +1,233 @@ +import fetch, { Request, Response } from 'node-fetch'; +import { NylasConfig, OverridableNylasConfig } from './config.js'; +import { + NylasApiError, + NylasOAuthError, + NylasSdkTimeoutError, +} from './models/error.js'; +import { objKeysToCamelCase, objKeysToSnakeCase } from './utils.js'; +import { SDK_VERSION } from './version.js'; +import * as FormData from 'form-data'; + +/** + * Options for a request to the Nylas API + * @property path The path to the API endpoint + * @property method The HTTP method to use + * @property headers Additional headers to send with the request + * @property queryParams Query parameters to send with the request + * @property body The body of the request + * @property overrides Overrides to the default Nylas API client configuration + * @ignore Not for public use + */ +export interface RequestOptionsParams { + path: string; + method: string; + headers?: Record; + queryParams?: Record; + body?: any; + form?: FormData; + overrides?: OverridableNylasConfig; +} + +/** + * Options for building a request for fetch to understand + * @property path The path to the API endpoint + * @property method The HTTP method to use + * @property headers Additional headers to send with the request + * @property url The URL of the request + * @property body The body of the request + * @property overrides Overrides to the default Nylas API client configuration + * @ignore Not for public use + */ +interface RequestOptions { + path: string; + method: string; + headers: Record; + url: URL; + body?: any; + overrides?: Partial; +} + +/** + * The API client for communicating with the Nylas API + * @ignore Not for public use + */ +export default class APIClient { + /** + * The API key to use for authentication + */ + apiKey: string; + /** + * The URL to use for communicating with the Nylas API + */ + serverUrl: string; + /** + * The timeout for requests to the Nylas API, in seconds + */ + timeout: number; + + constructor({ apiKey, apiUri, timeout }: Required) { + this.apiKey = apiKey; + this.serverUrl = apiUri; + this.timeout = timeout * 1000; // fetch timeout uses milliseconds + } + + private setRequestUrl({ + overrides, + path, + queryParams, + }: RequestOptionsParams): URL { + const url = new URL(`${overrides?.apiUri || this.serverUrl}${path}`); + + return this.setQueryStrings(url, queryParams); + } + + private setQueryStrings( + url: URL, + queryParams?: Record + ): URL { + if (queryParams) { + const snakeCaseParams = objKeysToSnakeCase(queryParams, ['metadataPair']); + for (const [key, value] of Object.entries(snakeCaseParams)) { + if (key == 'metadataPair') { + // The API understands a metadata_pair filter in the form of: + // : + const metadataPair: string[] = []; + for (const item in value as Record) { + metadataPair.push( + `${item}:${(value as Record)[item]}` + ); + } + url.searchParams.set('metadata_pair', metadataPair.join(',')); + } else { + url.searchParams.set(key, value as string); + } + } + } + + return url; + } + + private setRequestHeaders({ + headers, + overrides, + }: RequestOptionsParams): Record { + return { + Accept: 'application/json', + 'User-Agent': `Nylas Node SDK v${SDK_VERSION}`, + Authorization: `Bearer ${overrides?.apiKey || this.apiKey}`, + ...headers, + }; + } + + private async sendRequest(options: RequestOptionsParams): Promise { + const req = this.newRequest(options); + const controller: AbortController = new AbortController(); + const timeout = setTimeout(() => { + controller.abort(); + throw new NylasSdkTimeoutError(req.url, this.timeout); + }, this.timeout); + + try { + const response = await fetch(req, { signal: controller.signal }); + clearTimeout(timeout); + + if (typeof response === 'undefined') { + throw new Error('Failed to fetch response'); + } + + if (response.status > 299) { + const text = await response.text(); + let error: Error; + try { + const parsedError = JSON.parse(text); + const camelCaseError = objKeysToCamelCase(parsedError); + + // Check if the request is an authentication request + const isAuthRequest = + options.path.includes('connect/token') || + options.path.includes('connect/revoke'); + + if (isAuthRequest) { + error = new NylasOAuthError(camelCaseError, response.status); + } else { + error = new NylasApiError(camelCaseError, response.status); + } + } catch (e) { + throw new Error( + `Received an error but could not parse response from the server: ${text}` + ); + } + + throw error; + } + + return response; + } catch (error) { + clearTimeout(timeout); + throw error; + } + } + + requestOptions(optionParams: RequestOptionsParams): RequestOptions { + const requestOptions = {} as RequestOptions; + + requestOptions.url = this.setRequestUrl(optionParams); + requestOptions.headers = this.setRequestHeaders(optionParams); + requestOptions.method = optionParams.method; + + if (optionParams.body) { + requestOptions.body = JSON.stringify( + objKeysToSnakeCase(optionParams.body) + ); + requestOptions.headers['Content-Type'] = 'application/json'; + } + + if (optionParams.form) { + requestOptions.body = optionParams.form; + requestOptions.headers = { + ...requestOptions.headers, + ...optionParams.form.getHeaders(), + }; + } + + return requestOptions; + } + + newRequest(options: RequestOptionsParams): Request { + const newOptions = this.requestOptions(options); + return new Request(newOptions.url, { + method: newOptions.method, + headers: newOptions.headers, + body: newOptions.body, + }); + } + + async requestWithResponse(response: Response): Promise { + const text = await response.text(); + + try { + const responseJSON = JSON.parse(text); + return objKeysToCamelCase(responseJSON); + } catch (e) { + throw new Error(`Could not parse response from the server: ${text}`); + } + } + + async request(options: RequestOptionsParams): Promise { + const response = await this.sendRequest(options); + return this.requestWithResponse(response); + } + + async requestRaw(options: RequestOptionsParams): Promise { + const response = await this.sendRequest(options); + return response.buffer(); + } + + async requestStream( + options: RequestOptionsParams + ): Promise { + const response = await this.sendRequest(options); + return response.body; + } +} diff --git a/src/config.ts b/src/config.ts index c94723ef..3bdbe3f6 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,76 +1,63 @@ -import { WebhookTriggers } from './models/webhook'; -import LoggingInterface from './models/LoggingInterface'; - -export let apiServer: string | null = null; -export function setApiServer(newApiServer: string | null) { - apiServer = newApiServer; -} - -export let clientSecret = ''; -export function setClientSecret(newClientSecret: string) { - clientSecret = newClientSecret; -} - -export let timeout = 0; -export function setTimeout(newTimeout: number) { - timeout = newTimeout; -} - -export let logger: LoggingInterface | undefined = undefined; -export function setLogger(newLogger?: LoggingInterface) { - logger = newLogger; -} - +/** + * Configuration options for initializing the Nylas SDK. + * @property apiKey The Nylas API key to use for authentication + * @property apiUri The URL to use for communicating with the Nylas API + * @property timeout The timeout for requests to the Nylas API, in seconds + */ export type NylasConfig = { - /** Nylas application client ID */ - clientId: string; - /** Nylas application client secret */ - clientSecret: string; - /** API Server base URL */ - apiServer?: string; - /** Timeout for outgoing API calls, in milliseconds */ + apiKey: string; + apiUri?: string; timeout?: number; - /** Logger to redirect log messages to your application. */ - logger?: LoggingInterface; }; -export enum ResponseType { - CODE = 'code', - TOKEN = 'token', +/** + * The options that can override the default Nylas API client configuration. + */ +export type OverridableNylasConfig = Partial; + +/** + * An object that can be used to override the default Nylas API client configuration on a per-request basis. + * @property overrides Overrides to the default Nylas API client configuration + */ +export interface Overrides { + overrides?: OverridableNylasConfig; } -export type AuthenticateUrlConfig = { - redirectURI: string; - redirectOnError?: boolean; - loginHint?: string; - state?: string; - provider?: string; - scopes?: string[]; - responseType?: ResponseType; -}; - +/** + * Enum representing the available Nylas API regions. + */ export enum Region { Us = 'us', - Ireland = 'ireland', + Eu = 'eu', } +/** + * The default Nylas API region. + * @default Region.Us + */ export const DEFAULT_REGION = Region.Us; -export const regionConfig = { +/** + * The configuration options for each Nylas API region. + */ +type RegionConfig = { + nylasAPIUrl: string; +}; + +/** + * The available preset configuration values for each Nylas API region. + */ +export const REGION_CONFIG: Record = { [Region.Us]: { - nylasAPIUrl: 'https://api.nylas.com', - dashboardApiUrl: 'https://dashboard-api.nylas.com', - callbackDomain: 'cb.nylas.com', - websocketDomain: 'tunnel.nylas.com', - telemetryApiUrl: 'https://cli.nylas.com', + nylasAPIUrl: 'https://api.us.nylas.com', }, - [Region.Ireland]: { - nylasAPIUrl: 'https://ireland.api.nylas.com', - dashboardApiUrl: 'https://ireland.dashboard.nylas.com', - callbackDomain: 'cb.nylas.com', - websocketDomain: 'tunnel.nylas.com', - telemetryApiUrl: 'https://cli.nylas.com', + [Region.Eu]: { + nylasAPIUrl: 'https://api.eu.nylas.com', }, }; -export const DEFAULT_WEBHOOK_TRIGGERS = Object.values(WebhookTriggers); +/** + * The default Nylas API URL. + * @default https://api.us.nylas.com + */ +export const DEFAULT_SERVER_URL = REGION_CONFIG[DEFAULT_REGION].nylasAPIUrl; diff --git a/src/models/LoggingInterface.ts b/src/models/LoggingInterface.ts deleted file mode 100644 index 0b0150f2..00000000 --- a/src/models/LoggingInterface.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Logging interface to redirect log messages to your application. - */ -export default interface LoggingInterface { - /** - * Log a warning message. - * @param message The message to log. - */ - warn(message: string): void; - - /** - * Log an error message. - * @param message The error message to log. - */ - error(message: string): void; -} diff --git a/src/models/access-token.ts b/src/models/access-token.ts deleted file mode 100644 index 4f6ea676..00000000 --- a/src/models/access-token.ts +++ /dev/null @@ -1,45 +0,0 @@ -import Model from './model'; -import Attributes, { Attribute } from './attributes'; - -export type AccessTokenProperties = { - accessToken: string; - accountId: string; - emailAddress: string; - provider: string; - tokenType: string; -}; - -export default class AccessToken extends Model - implements AccessTokenProperties { - accessToken = ''; - accountId = ''; - emailAddress = ''; - provider = ''; - tokenType = 'bearer'; - static attributes: Record = { - accessToken: Attributes.String({ - modelKey: 'accessToken', - jsonKey: 'access_token', - }), - accountId: Attributes.String({ - modelKey: 'accountId', - jsonKey: 'account_id', - }), - emailAddress: Attributes.String({ - modelKey: 'emailAddress', - jsonKey: 'email_address', - }), - provider: Attributes.String({ - modelKey: 'provider', - }), - tokenType: Attributes.String({ - modelKey: 'tokenType', - jsonKey: 'token_type', - }), - }; - - constructor(props?: AccessTokenProperties) { - super(); - this.initAttributes(props); - } -} diff --git a/src/models/account.ts b/src/models/account.ts deleted file mode 100644 index 1379fbe5..00000000 --- a/src/models/account.ts +++ /dev/null @@ -1,72 +0,0 @@ -import RestfulModel from './restful-model'; -import Attributes, { Attribute } from './attributes'; -import NylasConnection from '../nylas-connection'; - -export type AccountProperties = { - name: string; - emailAddress: string; - provider: string; - organizationUnit: string; - syncState: string; - linkedAt: Date; - billingState?: string; - accessToken?: string; -}; - -export default class Account extends RestfulModel implements AccountProperties { - name = ''; - emailAddress = ''; - provider = ''; - organizationUnit = ''; - syncState = ''; - linkedAt = new Date(); - accessToken = ''; - billingState?: string; - static collectionName = 'accounts'; - static endpointName = 'account'; - static attributes: Record = { - ...RestfulModel.attributes, - name: Attributes.String({ - modelKey: 'name', - }), - - emailAddress: Attributes.String({ - modelKey: 'emailAddress', - jsonKey: 'email_address', - }), - - provider: Attributes.String({ - modelKey: 'provider', - }), - - organizationUnit: Attributes.String({ - modelKey: 'organizationUnit', - jsonKey: 'organization_unit', - }), - - syncState: Attributes.String({ - modelKey: 'syncState', - jsonKey: 'sync_state', - }), - - billingState: Attributes.String({ - modelKey: 'billingState', - jsonKey: 'billing_state', - }), - - linkedAt: Attributes.DateTime({ - modelKey: 'linkedAt', - jsonKey: 'linked_at', - }), - - accessToken: Attributes.String({ - modelKey: 'accessToken', - jsonKey: 'access_token', - }), - }; - - constructor(connection: NylasConnection, props?: AccountProperties) { - super(connection, props); - this.initAttributes(props); - } -} diff --git a/src/models/application-details.ts b/src/models/application-details.ts deleted file mode 100644 index aaefa9de..00000000 --- a/src/models/application-details.ts +++ /dev/null @@ -1,34 +0,0 @@ -import Model from './model'; -import Attributes, { Attribute } from './attributes'; - -export type ApplicationDetailsProperties = { - applicationName?: string; - iconUrl?: string; - redirectUris?: string[]; -}; - -export default class ApplicationDetails extends Model - implements ApplicationDetailsProperties { - applicationName = ''; - iconUrl = ''; - redirectUris: string[] = []; - static attributes: Record = { - applicationName: Attributes.String({ - modelKey: 'applicationName', - jsonKey: 'application_name', - }), - iconUrl: Attributes.String({ - modelKey: 'iconUrl', - jsonKey: 'icon_url', - }), - redirectUris: Attributes.StringList({ - modelKey: 'redirectUris', - jsonKey: 'redirect_uris', - }), - }; - - constructor(props?: ApplicationDetailsProperties) { - super(); - this.initAttributes(props); - } -} diff --git a/src/models/applicationDetails.ts b/src/models/applicationDetails.ts new file mode 100644 index 00000000..9d6456af --- /dev/null +++ b/src/models/applicationDetails.ts @@ -0,0 +1,95 @@ +import { RedirectUri } from './redirectUri.js'; + +/** + * Interface for a Nylas application details object + */ +export interface ApplicationDetails { + /** + * Public Application ID + */ + applicationId: string; + /** + * ID of organization + */ + organizationId: string; + /** + * Region identifier + */ + region: 'us' | 'eu'; + /** + * Environment identifier + */ + environment: 'production' | 'staging'; + /** + * Branding details for the application + */ + branding: Branding; + /** + * Hosted authentication branding details + */ + hostedAuthentication?: HostedAuthentication; + /** + * List of redirect URIs + */ + redirectUris?: RedirectUri[]; +} + +/** + * Interface for branding details for the application + */ +interface Branding { + /** + * Name of the application + */ + name: string; + /** + * URL points to application icon + */ + iconUrl?: string; + /** + * Application / publisher website URL + */ + websiteUrl?: string; + /** + * Description of the appli∏cati∏on + */ + description?: string; +} + +/** + * Interface for hosted authentication branding details + */ +interface HostedAuthentication { + /** + * URL of the background image + */ + backgroundImageUrl?: string; + /** + * Alignment of background image + */ + alignment?: string; + /** + * Primary color + */ + colorPrimary?: string; + /** + * Secondary color + */ + colorSecondary?: string; + /** + * Title + */ + title?: string; + /** + * Subtitle + */ + subtitle?: string; + /** + * Background color + */ + backgroundColor?: string; + /** + * CSS spacing attribute in px + */ + spacing?: number; +} diff --git a/src/models/attachments.ts b/src/models/attachments.ts new file mode 100644 index 00000000..0434b7d9 --- /dev/null +++ b/src/models/attachments.ts @@ -0,0 +1,74 @@ +/** + * Interface of an attachment object from Nylas. + */ +interface BaseAttachment { + /** + * Attachment's name. + */ + filename: string; + + /** + * Attachment's content type. + */ + contentType: string; + + /** + * If it's an inline attachment. + */ + isInline?: boolean; + + /** + * Attachment's size in bytes. + */ + size?: number; + + /** + * Content ID of the attachment. + */ + contentId?: string; + + /** + * Content disposition of the attachment. + */ + contentDisposition?: string; +} + +/** + * Interface of a create attachment request. + */ +export interface CreateAttachmentRequest extends BaseAttachment { + /** + * Content of the attachment. + */ + content: NodeJS.ReadableStream; +} + +/** + * Interface of an attachment object from Nylas. + */ +export interface Attachment extends BaseAttachment { + /** + * Attachment's ID. + */ + id: string; + + /** + * Grant ID of the Nylas account. + */ + grantId: string; +} + +/** + * Interface representing of the query parameters for finding an attachment's metadata. + */ +export interface FindAttachmentQueryParams { + /** + * ID of the message the attachment belongs to. + */ + messageId: string; +} + +/** + * Interface representing of the query parameters for downloading an attachment. + */ +export type DownloadAttachmentQueryParams = FindAttachmentQueryParams; diff --git a/src/models/attributes.ts b/src/models/attributes.ts deleted file mode 100644 index 2a9ffb19..00000000 --- a/src/models/attributes.ts +++ /dev/null @@ -1,377 +0,0 @@ -import Model from './model'; -// The Attribute class represents a single model attribute, like 'namespace_id' -// Subclasses of Attribute like AttributeDateTime know how to covert between -// the JSON representation of that type and the javascript representation. -// The Attribute class also exposes convenience methods for generating Matchers. - -type AnyModel = new (...args: any[]) => Model; -function isRestfulModel(cls: any): boolean { - // A 'RestfulModel' has 'endpointName' and 'collectionName' unlike 'Model' - return cls.endpointName !== undefined && cls.collectionName !== undefined; -} - -export abstract class Attribute { - modelKey: string; - jsonKey: string; - readOnly: boolean; - - constructor({ - modelKey, - jsonKey, - readOnly, - }: { - modelKey: string; - jsonKey?: string; - readOnly?: boolean; - }) { - this.modelKey = modelKey; - this.jsonKey = jsonKey || modelKey; - this.readOnly = readOnly || false; - } - - abstract toJSON(val: any, _parent?: any): any; - abstract fromJSON(val: any, _parent: any): any; - - saveRequestBody(val: any): any { - if (this.readOnly) { - return undefined; - } - - return this.toJSON(val); - } -} - -class AttributeObject extends Attribute { - itemClass?: any; - - constructor({ - modelKey, - jsonKey, - itemClass, - readOnly, - }: { - modelKey: string; - jsonKey?: string; - itemClass?: AnyModel; - readOnly?: boolean; - }) { - super({ modelKey, jsonKey, readOnly }); - this.itemClass = itemClass; - } - - toJSON(val: any, saveRequestBody?: boolean): unknown { - if (!val) { - return val; - } - if (saveRequestBody === true && val.saveRequestBody != null) { - return val.saveRequestBody(); - } else if (val.toJSON != null) { - return val.toJSON(); - } - return val; - } - - fromJSON(val: any, _parent: any): any { - if (!val || !this.itemClass) { - return val; - } - - if (isRestfulModel(this.itemClass)) { - return new this.itemClass(_parent.connection, val).fromJSON(val); - } - return new this.itemClass(val).fromJSON(val); - } - - saveRequestBody(val: any): unknown { - if (this.readOnly) { - return; - } - return this.toJSON(val, true); - } -} - -class AttributeNumber extends Attribute { - toJSON(val: number): number { - return val; - } - fromJSON(val: any): number | null { - if (val === null || isNaN(Number(val))) { - return null; - } - - return Number(val); - } -} - -class AttributeNumberList extends Attribute { - toJSON(val: any): number { - return val; - } - fromJSON(json: any, _parent: any): number[] { - if (!json || !(json instanceof Array)) { - return []; - } - const nums = []; - for (const num in json) { - if (!isNaN(Number(json[num]))) { - nums.push(Number(json[num])); - } - } - return nums; - } -} - -class AttributeBoolean extends Attribute { - toJSON(val: boolean): boolean { - return val; - } - fromJSON(val: string | boolean): boolean { - return val === 'true' || val === true || false; - } -} - -class AttributeString extends Attribute { - toJSON(val: string): string { - return val; - } - fromJSON(val: string): string { - return val || ''; - } -} - -class AttributeStringList extends Attribute { - toJSON(val: []): [] { - return val; - } - fromJSON(val: []): [] { - return val || []; - } -} - -class AttributeDate extends Attribute { - toJSON(val: Date): string { - if (!val) { - return val; - } - if (!(val instanceof Date)) { - throw new Error( - `Attempting to toJSON AttributeDate which is not a date: - ${this.modelKey} - = ${val}` - ); - } - return val.toISOString(); - } - - fromJSON(val: any, _parent: any): Date | null { - if (!val) { - return null; - } - return new Date(val); - } -} - -class AttributeDateTime extends Attribute { - toJSON(val: Date): number | null { - if (!val) { - return null; - } - if (!(val instanceof Date)) { - throw new Error( - `Attempting to toJSON AttributeDateTime which is not a date: - ${this.modelKey} - = ${val}` - ); - } - return val.getTime() / 1000.0; - } - - fromJSON(val: number, _parent: any): Date | null { - if (!val) { - return null; - } - return new Date(val * 1000); - } -} - -class AttributeCollection extends Attribute { - itemClass: any; - - constructor({ - modelKey, - jsonKey, - itemClass, - readOnly, - }: { - modelKey: string; - jsonKey?: string; - itemClass: AnyModel; - readOnly?: boolean; - }) { - super({ modelKey, jsonKey, readOnly }); - this.itemClass = itemClass; - } - - toJSON(vals: any, saveRequestBody?: boolean): AnyModel[] { - if (!vals) { - return []; - } - const json = []; - for (const val of vals) { - if (saveRequestBody === true && val.saveRequestBody != null) { - json.push(val.saveRequestBody()); - } else if (val.toJSON != null) { - json.push(val.toJSON()); - } else { - json.push(val); - } - } - return json; - } - - fromJSON(json: unknown[], _parent: any): AnyModel[] { - if (!json || !(json instanceof Array)) { - return []; - } - const objs = []; - for (const objJSON of json) { - let obj; - if (isRestfulModel(this.itemClass)) { - obj = new this.itemClass(_parent.connection, objJSON).fromJSON(objJSON); - } else { - obj = new this.itemClass(objJSON).fromJSON(objJSON); - } - objs.push(obj); - } - return objs; - } - - saveRequestBody(val: any): AnyModel[] | undefined { - if (this.readOnly) { - return; - } - return this.toJSON(val, true); - } -} - -class AttributeEnum extends Attribute { - itemClass: any; - - constructor({ - modelKey, - itemClass, - jsonKey, - readOnly, - }: { - modelKey: string; - itemClass: any; - jsonKey?: string; - readOnly?: boolean; - }) { - super({ modelKey, jsonKey, readOnly }); - this.itemClass = itemClass; - } - - toJSON(val: any): string { - return val.toString(); - } - - fromJSON(val: unknown): unknown { - if (Object.values(this.itemClass).includes(val)) { - return val; - } - return; - } -} - -class AttributeEnumList extends Attribute { - itemClass: any; - - constructor({ - modelKey, - itemClass, - jsonKey, - readOnly, - }: { - modelKey: string; - itemClass: any; - jsonKey?: string; - readOnly?: boolean; - }) { - super({ modelKey, jsonKey, readOnly }); - this.itemClass = itemClass; - } - - toJSON(val: any[]): string[] { - const enumList: string[] = []; - for (const v of val) { - enumList.push(v.toString()); - } - return enumList; - } - - fromJSON(val: any[], _parent: any): any[] { - const enumList: any[] = []; - for (const v of val) { - if (Object.values(this.itemClass).includes(v)) { - enumList.push(v); - } - } - return enumList; - } -} - -const Attributes = { - Number( - ...args: ConstructorParameters - ): AttributeNumber { - return new AttributeNumber(...args); - }, - NumberList( - ...args: ConstructorParameters - ): AttributeNumberList { - return new AttributeNumberList(...args); - }, - String( - ...args: ConstructorParameters - ): AttributeString { - return new AttributeString(...args); - }, - StringList( - ...args: ConstructorParameters - ): AttributeStringList { - return new AttributeStringList(...args); - }, - DateTime( - ...args: ConstructorParameters - ): AttributeDateTime { - return new AttributeDateTime(...args); - }, - Date(...args: ConstructorParameters): AttributeDate { - return new AttributeDate(...args); - }, - Collection( - ...args: ConstructorParameters - ): AttributeCollection { - return new AttributeCollection(...args); - }, - Boolean( - ...args: ConstructorParameters - ): AttributeBoolean { - return new AttributeBoolean(...args); - }, - Object( - ...args: ConstructorParameters - ): AttributeObject { - return new AttributeObject(...args); - }, - Enum(...args: ConstructorParameters): AttributeEnum { - return new AttributeEnum(...args); - }, - EnumList( - ...args: ConstructorParameters - ): AttributeEnumList { - return new AttributeEnumList(...args); - }, -}; -export default Attributes; diff --git a/src/models/auth.ts b/src/models/auth.ts new file mode 100644 index 00000000..0804198f --- /dev/null +++ b/src/models/auth.ts @@ -0,0 +1,208 @@ +/** + * Type for the access type of the authentication URL. + */ +type AccessType = 'online' | 'offline'; + +/** + * Type for the different OAuth providers Nylas supports. + */ +export type Provider = 'google' | 'imap' | 'microsoft' | 'virtual-calendar'; + +/** + * Configuration for generating a URL for OAuth 2.0 authentication. + */ +export interface URLForAuthenticationConfig { + /** + * The client ID of your application. + */ + clientId: string; + /** + * Redirect URI of the integration. + */ + redirectUri: string; + /** + * The integration provider type that you already had set up with Nylas for this application. + * If not set, the user is directed to the Hosted Login screen and prompted to select a provider. + */ + provider?: Provider; + /** + * If the exchange token should return a refresh token too. Not suitable for client side or JavaScript apps. + */ + accessType?: AccessType; + /** + * The prompt parameter is used to force the consent screen to be displayed even if the user has already given consent to your application. + */ + prompt?: string; + /** + * A space-delimited list of scopes that identify the resources that your application could access on the user's behalf. + * If no scope is given, all of the default integration's scopes are used. + */ + scope?: string[]; + /** + * If set to true, the scopes granted to the application will be included in the response. + */ + includeGrantScopes?: boolean; + /** + * Optional state to be returned after authentication + */ + state?: string; + /** + * Prefill the login name (usually email) during authorization flow. + * If a Grant for the provided email already exists, a Grant's re-auth will automatically be initiated. + */ + loginHint?: string; +} + +/** + * Configuration for generating a URL for admin consent authentication for Microsoft. + */ +export interface URLForAdminConsentConfig extends URLForAuthenticationConfig { + /** + * The credential ID for the Microsoft account + */ + credentialId: string; +} + +/** + * Interface of a Nylas code exchange request + */ +export interface CodeExchangeRequest { + /** + * Should match the same redirect URI that was used for getting the code during the initial authorization request. + */ + redirectUri: string; + /** + * OAuth 2.0 code fetched from the previous step. + */ + code: string; + /** + * Client ID of the application. + */ + clientId: string; + /** + * Client secret of the application. If not provided, the API Key will be used instead. + */ + clientSecret?: string; + /** + * The original plain text code verifier (code_challenge) used in the initial authorization request (PKCE). + */ + codeVerifier?: string; +} + +/** + * Interface of a Nylas token exchange request + */ +export interface TokenExchangeRequest { + /** + * Should match the same redirect URI that was used for getting the code during the initial authorization request. + */ + redirectUri: string; + /** + * Token to refresh/request your short-lived access token + */ + refreshToken: string; + /** + * Client ID of the application. + */ + clientId: string; + /** + * Client secret of the application. If not provided, the API Key will be used instead. + */ + clientSecret?: string; +} + +/** + * Interface of the object containing the OAuth 2.0 URL as well as the hashed secret. + */ +export interface PKCEAuthURL { + /** + * The URL for hosted authentication + */ + url: string; + /** + * Server-side challenge used in the OAuth 2.0 flow + */ + secret: string; + /** + * SHA-256 hash of the secret + */ + secretHash: string; +} + +/** + * Interface of a Nylas code exchange response + */ +export interface CodeExchangeResponse { + /** + * Supports exchanging the code for tokens, or refreshing an access token using [Auth.refreshAccessToken][com.nylas.resources.Auth.refreshAccessToken]. + */ + accessToken: string; + /** + * Nylas grant ID that is now successfully created. + */ + grantId: string; + /** + * Email address of the grant that is created. + */ + email: string; + /** + * The remaining lifetime of the access token in seconds. + */ + expiresIn: number; + /** + * List of scopes associated with this token. + */ + scope: string; + /** + * Only returned if the code was requested using [AccessType.OFFLINE][com.nylas.models.AccessType.OFFLINE]. + */ + refreshToken?: string; + /** + * A JWT that contains identity information about the user that is digitally signed by Nylas. + */ + idToken?: string; + /** + * Currently always Bearer. + */ + tokenType?: string; +} + +/** + * Interface representing the object used to set parameters for detecting a provider. + */ +export interface ProviderDetectParams { + /** + * Email address to detect the provider for. + */ + email: string; + /** + * Client ID of the Nylas application. + */ + clientId: string; + /** + * Search by all providers regardless of created integrations. If unset, defaults to false. + */ + allProviderTypes?: boolean; +} + +/** + * Interface representing the Nylas provider detect response. + */ +export interface ProviderDetectResponse { + /** + * Email provided for autodetection + */ + emailAddress: string; + /** + * Whether the provider was detected + */ + detected: boolean; + /** + * Detected provider + */ + provider?: string; + /** + * Provider type (if IMAP provider detected displays the IMAP provider) + */ + type?: string; +} diff --git a/src/models/availability.ts b/src/models/availability.ts new file mode 100644 index 00000000..1253730b --- /dev/null +++ b/src/models/availability.ts @@ -0,0 +1,166 @@ +/** + * Interface for a Nylas get availability response + */ +export interface GetAvailabilityResponse { + /** + * This property is only populated for round-robin events. + * It will contain the order in which the accounts would be next in line to attend the proposed meeting. + */ + order: string[]; + /** + * The available time slots where a new meeting can be created for the requested preferences. + */ + timeSlots: TimeSlot[]; +} + +/** + * Interface for a Nylas get availability request + */ +export interface GetAvailabilityRequest { + /** + * Unix timestamp for the start time to check availability for. + */ + startTime: number; + /** + * Unix timestamp for the end time to check availability for. + */ + endTime: number; + /** + * Participant details to check availability for. + */ + participants: AvailabilityParticipant[]; + /** + * The total number of minutes the event should last. + */ + durationMinutes: number; + /** + * Nylas checks from the nearest interval of the passed [startTime]. + * For example, to schedule 30-minute meetings ([durationMinutes]) with 15 minutes between them ([intervalMinutes]). + * If you have a meeting starting at 9:59, the API returns times starting at 10:00. 10:00-10:30, 10:15-10:45. + */ + intervalMinutes?: number; + /** + * When set to true, the availability time slots will start at 30 minutes past or on the hour. + * For example, a free slot starting at 16:10 is considered available only from 16:30. + */ + roundTo30Minutes?: boolean; + /** + * The rules to apply when checking availability. + */ + availabilityRules?: AvailabilityRules; +} + +/** + * Interface for a Nylas availability time slot + */ +export interface TimeSlot { + /** + * The emails of the participants who are available for the time slot. + */ + emails: string[]; + /** + * Unix timestamp for the start of the slot. + */ + startTime: string; + /** + * Unix timestamp for the end of the slot. + */ + endTime: string; +} + +/** + * Interface for the availability rules for a Nylas calendar. + */ +export interface AvailabilityRules { + /** + * The method used to determine availability for a meeting. + */ + availabilityMethod?: AvailabilityMethod; + /** + * The buffer to add to the start and end of a meeting. + */ + buffer?: MeetingBuffer; + /** + * A default set of open hours to apply to all participants. + * You can overwrite these open hours for individual participants by specifying [AvailabilityParticipant.openHours] + * on the participant object. + */ + defaultOpenHours?: OpenHours[]; + /** + * The ID on events that Nylas considers when calculating the order of round-robin participants. + * This is used for both max-fairness and max-availability methods. + */ + roundRobinEventId?: string; +} + +/** + * Interface for the meeting buffer object within an availability request. + */ +export interface MeetingBuffer { + /** + * The amount of buffer time in increments of 5 minutes to add before existing meetings. + * Defaults to 0. + */ + before: number; + /** + * The amount of buffer time in increments of 5 minutes to add after existing meetings. + * Defaults to 0. + */ + after: number; +} + +/** + * Interface of a participant's open hours. + */ +export interface OpenHours { + /** + * The days of the week that the open hour settings will be applied to. + * Sunday corresponds to 0 and Saturday corresponds to 6. + */ + days: number[]; + /** + * IANA time zone database formatted string (e.g. America/New_York). + * @see List of tz database time zones + */ + timezone: string; + /** + * Start time in 24-hour time format. Leading 0's are left off. + */ + start: string; + /** + * End time in 24-hour time format. Leading 0's are left off. + */ + end: string; + /** + * A list of dates that will be excluded from the open hours. + * Dates should be formatted as YYYY-MM-DD. + */ + exdates: string[]; +} + +/** + * Interface of participant details to check availability for. + */ +export interface AvailabilityParticipant { + /** + * The email address of the participant. + */ + email: string; + /** + * An optional list of the calendar IDs associated with each participant's email address. + * If not provided, Nylas uses the primary calendar ID. + */ + calendarIds?: string[]; + /** + * Open hours for this participant. The endpoint searches for free time slots during these open hours. + */ + openHours?: OpenHours[]; +} + +/** + * Enum representing the method used to determine availability for a meeting. + */ +export enum AvailabilityMethod { + MaxFairness = 'max-fairness', + MaxAvailability = 'max-availability', +} diff --git a/src/models/calendar-availability.ts b/src/models/calendar-availability.ts deleted file mode 100644 index 0279fd2b..00000000 --- a/src/models/calendar-availability.ts +++ /dev/null @@ -1,146 +0,0 @@ -import Model from './model'; -import Attributes, { Attribute } from './attributes'; -import { - FreeBusyProperties, - TimeSlot, - TimeSlotProperties, - FreeBusyCalendarProperties, -} from './free-busy'; - -export enum RoundRobin { - MaxAvailability = 'max-availability', - MaxFairness = 'max-fairness', -} - -export enum Days { - Monday = 0, - Tuesday = 1, - Wednesday = 2, - Thursday = 3, - Friday = 4, - Saturday = 5, - Sunday = 6, -} - -type AvailabilityQuery = { - duration: number; - interval: number; - startTime: number; - endTime: number; - buffer?: number; - tentativeBusy?: boolean; - freeBusy?: FreeBusyProperties[]; - openHours?: OpenHoursProperties[]; - calendars?: FreeBusyCalendarProperties[]; -}; - -export type SingleAvailabilityQuery = AvailabilityQuery & { - emails?: string[]; - eventCollectionId?: string; - roundRobin?: RoundRobin; -}; - -export type ConsecutiveAvailabilityQuery = AvailabilityQuery & { - emails?: Array; -}; - -export type OpenHoursProperties = { - emails: string[]; - days: Days[]; - timezone: string; - start: string; - end: string; -}; - -export class OpenHours extends Model implements OpenHoursProperties { - objectType = 'open_hours'; - emails: string[] = []; - days: Days[] = []; - timezone = ''; - start = ''; - end = ''; - static attributes: Record = { - objectType: Attributes.String({ - modelKey: 'objectType', - jsonKey: 'object_type', - }), - emails: Attributes.StringList({ - modelKey: 'emails', - }), - days: Attributes.NumberList({ - modelKey: 'days', - }), - timezone: Attributes.String({ - modelKey: 'timezone', - }), - start: Attributes.String({ - modelKey: 'start', - }), - end: Attributes.String({ - modelKey: 'end', - }), - }; - - constructor(props?: OpenHoursProperties) { - super(); - this.initAttributes(props); - } -} - -export type CalendarConsecutiveAvailabilityProperties = { - emails: string[]; - startTime: number; - endTime: number; -}; - -export class CalendarConsecutiveAvailability extends Model - implements CalendarConsecutiveAvailabilityProperties { - emails: string[] = []; - startTime = 0; - endTime = 0; - static attributes: Record = { - emails: Attributes.StringList({ - modelKey: 'emails', - }), - startTime: Attributes.Number({ - modelKey: 'startTime', - jsonKey: 'start_time', - }), - endTime: Attributes.Number({ - modelKey: 'endTime', - jsonKey: 'end_time', - }), - }; - - constructor(props?: CalendarConsecutiveAvailabilityProperties) { - super(); - this.initAttributes(props); - } -} - -export type CalendarAvailabilityProperties = { - timeSlots: TimeSlotProperties[]; - order?: string[]; -}; - -export default class CalendarAvailability extends Model - implements CalendarAvailabilityProperties { - object = 'availability'; - timeSlots: TimeSlot[] = []; - order?: string[]; - static attributes: Record = { - timeSlots: Attributes.Collection({ - modelKey: 'timeSlots', - jsonKey: 'time_slots', - itemClass: TimeSlot, - }), - order: Attributes.StringList({ - modelKey: 'order', - }), - }; - - constructor(props?: CalendarAvailabilityProperties) { - super(); - this.initAttributes(props); - } -} diff --git a/src/models/calendar-restful-model-collection.ts b/src/models/calendar-restful-model-collection.ts deleted file mode 100644 index bb052b89..00000000 --- a/src/models/calendar-restful-model-collection.ts +++ /dev/null @@ -1,186 +0,0 @@ -import Calendar from './calendar'; -import NylasConnection from '../nylas-connection'; -import RestfulModelCollection from './restful-model-collection'; -import FreeBusy, { FreeBusyCalendar, FreeBusyQuery } from './free-busy'; -import CalendarAvailability, { - CalendarConsecutiveAvailability, - ConsecutiveAvailabilityQuery, - OpenHours, - SingleAvailabilityQuery, -} from './calendar-availability'; - -export default class CalendarRestfulModelCollection extends RestfulModelCollection< - Calendar -> { - connection: NylasConnection; - modelClass: typeof Calendar; - - constructor(connection: NylasConnection) { - super(Calendar, connection); - this.connection = connection; - this.modelClass = Calendar; - } - - freeBusy( - options: FreeBusyQuery, - callback?: (error: Error | null, data?: Record) => void - ): Promise { - this.queryIsValid(options); - - const calendarsJson = options.calendars - ? options.calendars.map(cal => new FreeBusyCalendar(cal).toJSON(true)) - : []; - - return this.connection - .request({ - method: 'POST', - path: `/calendars/free-busy`, - body: { - start_time: options.startTime.toString(), - end_time: options.endTime.toString(), - emails: options.emails || [], - calendars: calendarsJson, - }, - }) - .then(json => { - if (callback) { - callback(null, json); - } - const freeBusy = []; - for (const fb of json) { - freeBusy.push(new FreeBusy().fromJSON(fb)); - } - return Promise.resolve(freeBusy); - }) - .catch(err => { - if (callback) { - callback(err); - } - return Promise.reject(err); - }); - } - - availability( - options: SingleAvailabilityQuery, - callback?: (error: Error | null, data?: Record) => void - ): Promise { - this.queryIsValid(options); - - return this.connection - .request({ - method: 'POST', - path: `/calendars/availability`, - body: { - ...this.buildAvailabilityPayload(options), - event_collection_id: options.eventCollectionId, - round_robin: options.roundRobin, - }, - }) - .then(json => { - if (callback) { - callback(null, json); - } - return Promise.resolve(new CalendarAvailability().fromJSON(json)); - }) - .catch(err => { - if (callback) { - callback(err); - } - return Promise.reject(err); - }); - } - - consecutiveAvailability( - options: ConsecutiveAvailabilityQuery, - callback?: (error: Error | null, data?: { [key: string]: any }) => void - ): Promise { - this.queryIsValid(options); - - if (options.emails) { - // If open hours contains any emails not present in the main emails key - // or in the free busy email list as this would raise an error on the API side - const freeBusyEmails = options.freeBusy - ? options.freeBusy.map(fb => fb.email) - : []; - if (options.openHours) { - for (const openHour of options.openHours) { - for (const email of openHour.emails) { - if ( - !options.emails.some(row => row.includes(email)) && - !freeBusyEmails.includes(email) - ) { - throw new Error( - 'Open Hours cannot contain an email not present in the main email list or the free busy email list.' - ); - } - } - } - } - } - - return this.connection - .request({ - method: 'POST', - path: `/calendars/availability/consecutive`, - body: this.buildAvailabilityPayload(options), - }) - .then(json => { - if (callback) { - callback(null, json); - } - return Promise.resolve( - new CalendarConsecutiveAvailability().fromJSON(json) - ); - }) - .catch(err => { - if (callback) { - callback(err); - } - return Promise.reject(err); - }); - } - - private buildAvailabilityPayload( - options: SingleAvailabilityQuery | ConsecutiveAvailabilityQuery - ): Record { - // Instantiate objects from properties to get JSON formatted for the API call - const freeBusyJson = options.freeBusy - ? options.freeBusy.map(fb => new FreeBusy(fb).toJSON(true)) - : []; - const openHoursJson = options.openHours - ? options.openHours.map(oh => new OpenHours(oh).toJSON(true)) - : []; - const calendarsJson = options.calendars - ? options.calendars.map(cal => new FreeBusyCalendar(cal).toJSON(true)) - : []; - - return { - emails: options.emails, - duration_minutes: options.duration, - interval_minutes: options.interval, - start_time: options.startTime, - end_time: options.endTime, - buffer: options.buffer, - tentative_busy: options.tentativeBusy, - free_busy: freeBusyJson, - open_hours: openHoursJson, - calendars: calendarsJson, - }; - } - - // Helper function to check if a query is valid - private queryIsValid( - query: - | FreeBusyQuery - | SingleAvailabilityQuery - | ConsecutiveAvailabilityQuery - ): boolean { - if ( - (!query.emails || query.emails.length == 0) && - (!query.calendars || query.calendars.length == 0) - ) { - throw new Error("Must set either 'emails' or 'calendars' in the query."); - } - return true; - } -} diff --git a/src/models/calendar.ts b/src/models/calendar.ts deleted file mode 100644 index 96c3b45e..00000000 --- a/src/models/calendar.ts +++ /dev/null @@ -1,100 +0,0 @@ -import RestfulModel, { SaveCallback } from './restful-model'; -import { GetCallback } from './model-collection'; -import Attributes, { Attribute } from './attributes'; -import NylasConnection from '../nylas-connection'; -import JobStatus from './job-status'; - -export type CalendarProperties = { - name: string; - description: string; - location: string; - timezone: string; - readOnly?: boolean; - isPrimary?: boolean; - jobStatusId?: string; - metadata?: object; - hexColor?: string; -}; - -export default class Calendar extends RestfulModel - implements CalendarProperties { - name = ''; - description = ''; - location = ''; - timezone = ''; - readOnly?: boolean; - isPrimary?: boolean; - jobStatusId?: string; - metadata?: object; - hexColor?: string; - static collectionName = 'calendars'; - static attributes: Record = { - ...RestfulModel.attributes, - name: Attributes.String({ - modelKey: 'name', - }), - description: Attributes.String({ - modelKey: 'description', - }), - readOnly: Attributes.Boolean({ - modelKey: 'readOnly', - jsonKey: 'read_only', - readOnly: true, - }), - location: Attributes.String({ - modelKey: 'location', - }), - timezone: Attributes.String({ - modelKey: 'timezone', - }), - isPrimary: Attributes.Boolean({ - modelKey: 'isPrimary', - jsonKey: 'is_primary', - readOnly: true, - }), - jobStatusId: Attributes.String({ - modelKey: 'jobStatusId', - jsonKey: 'job_status_id', - readOnly: true, - }), - metadata: Attributes.Object({ - modelKey: 'metadata', - }), - hexColor: Attributes.String({ - modelKey: 'hexColor', - jsonKey: 'hex_color', - readOnly: true, - }), - }; - - constructor(connection: NylasConnection, props?: CalendarProperties) { - super(connection, props); - this.initAttributes(props); - } - - save(params: {} | SaveCallback = {}, callback?: SaveCallback): Promise { - return super.save(params, callback); - } - - saveRequestBody(): Record { - const calendarJSON = super.saveRequestBody(); - return { - name: calendarJSON.name, - description: calendarJSON.description, - location: calendarJSON.location, - timezone: calendarJSON.timezone, - metadata: calendarJSON.metadata, - }; - } - - getJobStatus(callback?: GetCallback): Promise { - if (typeof this.jobStatusId === 'undefined') { - const err = new Error('jobStatusId must be defined'); - if (callback) { - callback(err); - } - return Promise.reject(err); - } - return this.connection.jobStatuses.find(this.jobStatusId, callback); - } -} diff --git a/src/models/calendars.ts b/src/models/calendars.ts new file mode 100644 index 00000000..103df7e4 --- /dev/null +++ b/src/models/calendars.ts @@ -0,0 +1,125 @@ +import { ListQueryParams } from './listQueryParams.js'; + +/** + * Interface of the query parameters for listing calendars. + */ +export interface ListCalendersQueryParams extends ListQueryParams { + /** + * The maximum number of objects to return. + * This field defaults to 50. The maximum allowed value is 200. + */ + limit?: number; + /** + * An identifier that specifies which page of data to return. + * This value should be taken from the [ListResponse.nextCursor] response field. + */ + pageToken?: string; + /** + * Pass in your metadata key and value pair to search for metadata. + */ + metadataPair?: Record; +} + +/** + * Interface of a Nylas create calendar request + */ +export interface CreateCalenderRequest { + /** + * Name of the Calendar. + */ + name: string; + /** + * Description of the calendar. + */ + description?: string; + /** + * Geographic location of the calendar as free-form text. + */ + location?: string; + /** + * IANA time zone database formatted string (e.g. America/New_York). + * @see List of tz database time zones + */ + timezone?: string; + /** + * A list of key-value pairs storing additional data. + */ + metadata?: Record; +} + +/** + * Interface of a Nylas update calendar request + */ +export interface UpdateCalenderRequest extends Partial { + /** + * The background color of the calendar in the hexadecimal format (e.g. #0099EE). + * Empty indicates default color. + */ + hexColor?: string; + /** + * The background color of the calendar in the hexadecimal format (e.g. #0099EE). + * Empty indicates default color. (Google only) + */ + hexForegroundColor?: string; +} + +/** + * Interface of a Nylas calendar object + */ +export interface Calendar { + /** + * Globally unique object identifier. + */ + id: string; + /** + * Grant ID of the Nylas account. + */ + grantId: string; + /** + * Name of the Calendar. + */ + name: string; + /** + * The type of object. + */ + object: string; + /** + * IANA time zone database formatted string (e.g. America/New_York). + * @see List of tz database time zones + */ + timezone: string; + /** + * If the event participants are able to edit the event. + */ + readOnly: boolean; + /** + * If the calendar is owned by the user account. + */ + isOwnedByUser: boolean; + /** + * Description of the calendar. + */ + description?: string; + /** + * Geographic location of the calendar as free-form text. + */ + location?: string; + /** + * The background color of the calendar in the hexadecimal format (e.g. #0099EE). + * Empty indicates default color. + */ + hexColor?: string; + /** + * The background color of the calendar in the hexadecimal format (e.g. #0099EE). + * Empty indicates default color. (Google only) + */ + hexForegroundColor?: string; + /** + * If the calendar is the primary calendar. + */ + isPrimary?: boolean; + /** + * A list of key-value pairs storing additional data. + */ + metadata?: Record; +} diff --git a/src/models/component-restful-model-collection.ts b/src/models/component-restful-model-collection.ts deleted file mode 100644 index f84858e3..00000000 --- a/src/models/component-restful-model-collection.ts +++ /dev/null @@ -1,20 +0,0 @@ -import RestfulModelCollection from './restful-model-collection'; -import NylasConnection from '../nylas-connection'; -import Component from './component'; - -export default class ComponentRestfulModelCollection extends RestfulModelCollection< - Component -> { - connection: NylasConnection; - modelClass: typeof Component; - - constructor(connection: NylasConnection) { - super(Component, connection); - this.connection = connection; - this.modelClass = Component; - } - - path(): string { - return `/component/${this.connection.clientId}`; - } -} diff --git a/src/models/component.ts b/src/models/component.ts deleted file mode 100644 index 598515a1..00000000 --- a/src/models/component.ts +++ /dev/null @@ -1,105 +0,0 @@ -import RestfulModel, { SaveCallback } from './restful-model'; -import Attributes, { Attribute } from './attributes'; -import NylasConnection from '../nylas-connection'; - -export type ComponentProperties = { - name?: string; - type?: string; - action?: number; - active?: boolean; - settings?: object; - allowedDomains?: string[]; - publicAccountId?: string; - publicTokenId?: string; - publicApplicationId?: string; - accessToken?: string; - createdAt?: Date; - updatedAt?: Date; -}; - -export default class Component extends RestfulModel - implements ComponentProperties { - name?: string; - type?: string; - action?: number; - active?: boolean; - settings?: object; - allowedDomains?: string[]; - publicAccountId?: string; - publicTokenId?: string; - publicApplicationId?: string; - accessToken?: string; - createdAt?: Date; - updatedAt?: Date; - static collectionName = 'component'; - static attributes: Record = { - ...RestfulModel.attributes, - name: Attributes.String({ - modelKey: 'name', - }), - type: Attributes.String({ - modelKey: 'type', - }), - action: Attributes.Number({ - modelKey: 'action', - }), - active: Attributes.Boolean({ - modelKey: 'active', - }), - settings: Attributes.Object({ - modelKey: 'settings', - }), - allowedDomains: Attributes.StringList({ - modelKey: 'allowedDomains', - jsonKey: 'allowed_domains', - }), - publicAccountId: Attributes.String({ - modelKey: 'publicAccountId', - jsonKey: 'public_account_id', - }), - publicTokenId: Attributes.String({ - modelKey: 'publicTokenId', - jsonKey: 'public_token_id', - }), - publicApplicationId: Attributes.String({ - modelKey: 'publicApplicationId', - jsonKey: 'public_application_id', - }), - accessToken: Attributes.String({ - modelKey: 'accessToken', - jsonKey: 'access_token', - }), - createdAt: Attributes.Date({ - modelKey: 'createdAt', - jsonKey: 'created_at', - }), - updatedAt: Attributes.Date({ - modelKey: 'updatedAt', - jsonKey: 'updated_at', - }), - }; - - constructor(connection: NylasConnection, props?: ComponentProperties) { - super(connection, props); - this.initAttributes(props); - } - - saveEndpoint(): string { - return `/component/${this.connection.clientId}`; - } - - save(params: {} | SaveCallback = {}, callback?: SaveCallback): Promise { - return super.save(params, callback); - } - - saveRequestBody(): Record { - const json = super.saveRequestBody(); - if (this.id) { - // Cannot cannot send these values after creation - delete json.access_token; - delete json.public_application_id; - delete json.type; - } - return json; - } -} diff --git a/src/models/connect.ts b/src/models/connect.ts deleted file mode 100644 index 3128edfc..00000000 --- a/src/models/connect.ts +++ /dev/null @@ -1,214 +0,0 @@ -import NylasConnection from '../nylas-connection'; -import Model from './model'; -import Attributes, { Attribute } from './attributes'; -import Account from './account'; - -export enum Scope { - Email = 'email', - EmailModify = 'email.modify', - EmailReadOnly = 'email.read_only', - EmailSend = 'email.send', - EmailFoldersAndLabels = 'email.folders_and_labels', - EmailMetadata = 'email.metadata', - EmailDrafts = 'email.drafts', - Calendar = 'calendar', - CalendarReadOnly = 'calendar.read_only', - RoomResourcesReadOnly = 'room_resources.read_only', - Contacts = 'contacts', - ContactsReadOnly = 'contacts.read_only', -} - -export type VirtualCalendarProperties = { - name: string; - emailAddress: string; - clientId?: string; -}; - -export class VirtualCalendar extends Model - implements VirtualCalendarProperties { - provider = 'nylas'; - name = ''; - emailAddress = ''; - scopes: Scope[]; - settings = {}; - clientId?: string; - static attributes: Record = { - provider: Attributes.String({ - modelKey: 'provider', - }), - clientId: Attributes.String({ - modelKey: 'clientId', - jsonKey: 'client_id', - }), - emailAddress: Attributes.String({ - modelKey: 'emailAddress', - jsonKey: 'email', - }), - name: Attributes.String({ - modelKey: 'name', - }), - scopes: Attributes.EnumList({ - modelKey: 'scopes', - itemClass: Scope, - }), - settings: Attributes.Object({ - modelKey: 'settings', - }), - }; - - constructor(props?: VirtualCalendarProperties) { - super(); - this.initAttributes(props); - this.scopes = [Scope.Calendar]; - } -} - -export enum NativeAuthenticationProvider { - Gmail = 'gmail', - Yahoo = 'yahoo', - Exchange = 'exchange', - Outlook = 'outlook', - Imap = 'imap', - Icloud = 'icloud', - Hotmail = 'hotmail', - Aol = 'aol', - Office365 = 'office365', -} - -export type NativeAuthenticationProperties = VirtualCalendarProperties & { - scopes: Scope[]; - settings: Record; - provider: NativeAuthenticationProvider; -}; - -type AuthorizationCode = { - code: string; -}; - -export class NativeAuthentication extends Model - implements NativeAuthenticationProperties { - name = ''; - emailAddress = ''; - provider = NativeAuthenticationProvider.Gmail; - settings = {}; - scopes: Scope[] = []; - clientId?: string; - static attributes: Record = { - clientId: Attributes.String({ - modelKey: 'clientId', - jsonKey: 'client_id', - }), - name: Attributes.String({ - modelKey: 'name', - }), - emailAddress: Attributes.String({ - modelKey: 'emailAddress', - jsonKey: 'email_address', - }), - provider: Attributes.Enum({ - modelKey: 'provider', - itemClass: NativeAuthenticationProvider, - }), - scopes: Attributes.EnumList({ - modelKey: 'scopes', - itemClass: Scope, - }), - settings: Attributes.Object({ - modelKey: 'settings', - }), - }; - - constructor(props?: NativeAuthenticationProperties) { - super(); - this.initAttributes(props); - } - - toJSON(): Record { - const json = super.toJSON(); - json['scopes'] = this.scopes.join(); - return json; - } - - fromJSON(json: Record): this { - if (json['scopes']) { - json['scopes'] = json['scopes'].split(','); - } - return super.fromJSON(json); - } -} - -export default class Connect { - connection: NylasConnection; - clientId: string; - clientSecret: string; - - constructor( - connection: NylasConnection, - clientId: string, - clientSecret: string - ) { - this.connection = connection; - this.clientId = clientId; - this.clientSecret = clientSecret; - } - - authorize( - auth: VirtualCalendarProperties | NativeAuthenticationProperties - ): Promise { - // https://docs.nylas.com/reference#connectauthorize - if (!this.clientId) { - throw new Error( - 'connect.authorize() cannot be called until you provide a clientId via Nylas.config()' - ); - } - - let authClass: VirtualCalendar | NativeAuthentication; - if (!auth.clientId) { - auth.clientId = this.clientId; - } - if (auth.hasOwnProperty('provider') && (auth as any).provider != 'nylas') { - authClass = new NativeAuthentication( - auth as NativeAuthenticationProperties - ); - } else { - authClass = new VirtualCalendar(auth as VirtualCalendarProperties); - } - - return this.connection - .request({ - method: 'POST', - path: '/connect/authorize', - body: authClass.toJSON(), - }) - .then((json: AuthorizationCode) => { - return json; - }); - } - - token(code: string): Promise { - // https://docs.nylas.com/reference#connecttoken - if (!this.clientId) { - throw new Error( - 'connect.token() cannot be called until you provide a clientId via Nylas.config()' - ); - } - if (!this.clientSecret) { - throw new Error( - 'connect.token() cannot be called until you provide a clientSecret via Nylas.config()' - ); - } - return this.connection - .request({ - method: 'POST', - path: '/connect/token', - body: { - client_id: this.clientId, - client_secret: this.clientSecret, - code: code, - }, - }) - .then(json => { - return new Account(this.connection).fromJSON(json); - }); - } -} diff --git a/src/models/connectors.ts b/src/models/connectors.ts new file mode 100644 index 00000000..2ae8c82d --- /dev/null +++ b/src/models/connectors.ts @@ -0,0 +1,139 @@ +import { Provider } from './auth.js'; +import { ListQueryParams } from './listQueryParams.js'; + +/** + * Interface representing the Nylas connector response. + */ +export interface Connector { + /** + * The provider type + */ + provider: Provider; + /** + * Optional settings from provider + */ + settings?: Record; + /** + * Default scopes for the connector + */ + scope?: string[]; +} + +/** + * Interface representing a Google connector creation request. + */ +export interface GoogleCreateConnectorSettings { + /** + * The Google Client ID + */ + clientId: string; + /** + * The Google Client Secret + */ + clientSecret: string; + /** + * The Google Pub/Sub topic name + */ + topicName?: string; +} + +/** + * Interface representing a Microsoft connector creation request. + */ +export interface MicrosoftCreateConnectorSettings { + /** + * The Microsoft Client ID + */ + clientId: string; + /** + * The Microsoft Client Secret + */ + clientSecret: string; + /** + * The Microsoft tenant ID + */ + tenant?: string; +} + +/** + * Interface representing the base Nylas connector creation request. + */ +interface BaseCreateConnectionRequest { + /** + * Custom name of the connector + */ + name: string; + /** + * The provider type + */ + provider: Provider; +} + +/** + * Interface representing the base Nylas connector creation request. + */ +export interface GoogleCreateConnectorRequest + extends BaseCreateConnectionRequest { + /** + * The Google OAuth provider credentials and settings + */ + settings: GoogleCreateConnectorSettings; + /** + * The Google OAuth scopes + */ + scope?: string[]; +} + +export interface MicrosoftCreateConnectorRequest + extends BaseCreateConnectionRequest { + /** + * The Microsoft OAuth provider credentials and settings + */ + settings: MicrosoftCreateConnectorSettings; + /** + * The Microsoft OAuth scopes + */ + scope?: string[]; +} + +/** + * Interface representing the base Nylas connector creation request. + */ +export type ImapCreateConnectorRequest = BaseCreateConnectionRequest; + +/** + * Interface representing the base Nylas connector creation request. + */ +export type VirtualCalendarsCreateConnectorRequest = BaseCreateConnectionRequest; + +/** + * The type of the Nylas connector creation request. + */ +export type CreateConnectorRequest = + | GoogleCreateConnectorRequest + | MicrosoftCreateConnectorRequest + | ImapCreateConnectorRequest + | VirtualCalendarsCreateConnectorRequest; + +/** + * Interface representing the base Nylas connector creation request. + */ +export interface UpdateConnectorRequest { + /** + * Custom name of the connector + */ + name?: string; + /** + * The OAuth provider credentials and settings + */ + settings?: Record; + /** + * The OAuth scopes + */ + scope?: string[]; +} + +/** + * Interface of the query parameters for listing connectors. + */ +export type ListConnectorsQueryParams = ListQueryParams; diff --git a/src/models/contact-restful-model-collection.ts b/src/models/contact-restful-model-collection.ts deleted file mode 100644 index d0b0ca2f..00000000 --- a/src/models/contact-restful-model-collection.ts +++ /dev/null @@ -1,41 +0,0 @@ -import Contact, { Group } from './contact'; -import NylasConnection from '../nylas-connection'; -import RestfulModelCollection from './restful-model-collection'; - -export default class ContactRestfulModelCollection extends RestfulModelCollection< - Contact -> { - connection: NylasConnection; - modelClass: typeof Contact; - - constructor(connection: NylasConnection) { - super(Contact, connection); - this.connection = connection; - this.modelClass = Contact; - } - - groups( - callback?: (error: Error | null, data?: Record) => void - ): Promise { - return this.connection - .request({ - method: 'GET', - path: `/contacts/groups`, - }) - .then(json => { - const groups: Group[] = json.map((group: Record) => { - return new Group().fromJSON(group); - }); - if (callback) { - callback(null, groups); - } - return Promise.resolve(groups); - }) - .catch(err => { - if (callback) { - callback(err); - } - return Promise.reject(err); - }); - } -} diff --git a/src/models/contact.ts b/src/models/contact.ts deleted file mode 100644 index c3e2b253..00000000 --- a/src/models/contact.ts +++ /dev/null @@ -1,355 +0,0 @@ -import RestfulModel, { SaveCallback } from './restful-model'; -import Attributes, { Attribute } from './attributes'; -import Model from './model'; -import NylasConnection from '../nylas-connection'; - -export type EmailAddressProperties = { - type: string; - email: string; -}; - -export class EmailAddress extends Model implements EmailAddressProperties { - type = ''; - email = ''; - static attributes: Record = { - type: Attributes.String({ - modelKey: 'type', - }), - email: Attributes.String({ - modelKey: 'email', - }), - }; - - constructor(props?: EmailAddressProperties) { - super(); - this.initAttributes(props); - } -} - -export type IMAddressProperties = { - type: string; - imAddress: string; -}; - -export class IMAddress extends Model implements IMAddressProperties { - type = ''; - imAddress = ''; - static attributes: Record = { - type: Attributes.String({ - modelKey: 'type', - }), - imAddress: Attributes.String({ - modelKey: 'imAddress', - jsonKey: 'im_address', - }), - }; - - constructor(props?: IMAddressProperties) { - super(); - this.initAttributes(props); - } -} - -export type PhysicalAddressProperties = { - type: string; - format: string; - streetAddress: string; - city: string; - postalCode: string; - state: string; - country: string; - address?: string; -}; - -export class PhysicalAddress extends Model - implements PhysicalAddressProperties { - type = ''; - format = ''; - streetAddress = ''; - city = ''; - postalCode = ''; - state = ''; - country = ''; - address = ''; - static attributes: Record = { - type: Attributes.String({ - modelKey: 'type', - }), - format: Attributes.String({ - modelKey: 'format', - }), - address: Attributes.String({ - modelKey: 'address', - }), - streetAddress: Attributes.String({ - modelKey: 'streetAddress', - jsonKey: 'street_address', - }), - city: Attributes.String({ - modelKey: 'city', - }), - postalCode: Attributes.String({ - modelKey: 'postalCode', - jsonKey: 'postal_code', - }), - state: Attributes.String({ - modelKey: 'state', - }), - country: Attributes.String({ - modelKey: 'country', - }), - }; - - constructor(props?: PhysicalAddressProperties) { - super(); - this.initAttributes(props); - } - - toJSON(): Record { - const json: Record = { - type: this.type, - format: this.format, - }; - if (this.format == 'unstructured') { - json.address = this.address; - } else { - json.street_address = this.streetAddress; - json.postal_code = this.postalCode; - json.state = this.state; - json.city = this.city; - json.country = this.country; - } - return json; - } -} - -export type PhoneNumberProperties = { - type: string; - number: string; -}; - -export class PhoneNumber extends Model implements PhoneNumberProperties { - type = ''; - number = ''; - static attributes: Record = { - type: Attributes.String({ - modelKey: 'type', - }), - number: Attributes.String({ - modelKey: 'number', - }), - }; - - constructor(props?: PhoneNumberProperties) { - super(); - this.initAttributes(props); - } -} - -export type WebPageProperties = { - type: string; - url: string; -}; - -export class WebPage extends Model implements WebPageProperties { - type = ''; - url = ''; - static attributes: Record = { - type: Attributes.String({ - modelKey: 'type', - }), - url: Attributes.String({ - modelKey: 'url', - }), - }; - - constructor(props?: WebPageProperties) { - super(); - this.initAttributes(props); - } -} - -export type GroupProperties = { - name: string; - path: string; - id?: string; - accountId?: string; - object?: string; -}; - -export class Group extends Model implements GroupProperties { - name = ''; - path = ''; - id?: string; - accountId?: string; - object?: string; - static attributes: Record = { - name: Attributes.String({ - modelKey: 'name', - }), - path: Attributes.String({ - modelKey: 'path', - }), - id: Attributes.String({ - modelKey: 'id', - readOnly: true, - }), - object: Attributes.String({ - modelKey: 'object', - readOnly: true, - }), - accountId: Attributes.String({ - modelKey: 'accountId', - jsonKey: 'account_id', - readOnly: true, - }), - }; - - constructor(props?: GroupProperties) { - super(); - this.initAttributes(props); - } -} - -export type ContactProperties = { - givenName?: string; - middleName?: string; - surname?: string; - suffix?: string; - nickname?: string; - birthday?: string; - companyName?: string; - jobTitle?: string; - officeLocation?: string; - notes?: string; - pictureUrl?: string; - emailAddresses?: EmailAddressProperties[]; - imAddresses?: IMAddressProperties[]; - physicalAddresses?: PhysicalAddressProperties[]; - phoneNumbers?: PhoneNumberProperties[]; - webPages?: WebPageProperties[]; - groups?: GroupProperties[]; - source?: string; -}; - -export default class Contact extends RestfulModel implements ContactProperties { - givenName?: string; - middleName?: string; - surname?: string; - suffix?: string; - nickname?: string; - birthday?: string; - companyName?: string; - jobTitle?: string; - officeLocation?: string; - notes?: string; - pictureUrl?: string; - emailAddresses?: EmailAddress[]; - imAddresses?: IMAddress[]; - physicalAddresses?: PhysicalAddress[]; - phoneNumbers?: PhoneNumber[]; - webPages?: WebPage[]; - groups?: Group[]; - source?: string; - jobStatusId?: string; - static collectionName = 'contacts'; - static attributes: Record = { - ...RestfulModel.attributes, - givenName: Attributes.String({ - modelKey: 'givenName', - jsonKey: 'given_name', - }), - middleName: Attributes.String({ - modelKey: 'middleName', - jsonKey: 'middle_name', - }), - surname: Attributes.String({ - modelKey: 'surname', - }), - suffix: Attributes.String({ - modelKey: 'suffix', - }), - nickname: Attributes.String({ - modelKey: 'nickname', - }), - birthday: Attributes.String({ - modelKey: 'birthday', - }), - companyName: Attributes.String({ - modelKey: 'companyName', - jsonKey: 'company_name', - }), - jobTitle: Attributes.String({ - modelKey: 'jobTitle', - jsonKey: 'job_title', - }), - managerName: Attributes.String({ - modelKey: 'managerName', - jsonKey: 'manager_name', - }), - officeLocation: Attributes.String({ - modelKey: 'officeLocation', - jsonKey: 'office_location', - }), - notes: Attributes.String({ - modelKey: 'notes', - }), - pictureUrl: Attributes.String({ - modelKey: 'pictureUrl', - jsonKey: 'picture_url', - }), - emailAddresses: Attributes.Collection({ - modelKey: 'emailAddresses', - jsonKey: 'emails', - itemClass: EmailAddress, - }), - imAddresses: Attributes.Collection({ - modelKey: 'imAddresses', - jsonKey: 'im_addresses', - itemClass: IMAddress, - }), - physicalAddresses: Attributes.Collection({ - modelKey: 'physicalAddresses', - jsonKey: 'physical_addresses', - itemClass: PhysicalAddress, - }), - phoneNumbers: Attributes.Collection({ - modelKey: 'phoneNumbers', - jsonKey: 'phone_numbers', - itemClass: PhoneNumber, - }), - webPages: Attributes.Collection({ - modelKey: 'webPages', - jsonKey: 'web_pages', - itemClass: WebPage, - }), - groups: Attributes.Collection({ - modelKey: 'groups', - itemClass: Group, - }), - source: Attributes.String({ - modelKey: 'source', - }), - jobStatusId: Attributes.String({ - modelKey: 'jobStatusId', - jsonKey: 'job_status_id', - readOnly: true, - }), - }; - - constructor(connection: NylasConnection, props?: ContactProperties) { - super(connection); - this.initAttributes(props); - } - - getPicture( - params: Record = {}, - callback?: (error: Error | null, result?: any) => void - ): any { - return this.get(params, callback, '/picture'); - } - - save(params: {} | SaveCallback = {}, callback?: SaveCallback): Promise { - return super.save(params, callback); - } -} diff --git a/src/models/contacts.ts b/src/models/contacts.ts new file mode 100644 index 00000000..fc2dc0cc --- /dev/null +++ b/src/models/contacts.ts @@ -0,0 +1,159 @@ +import { ListQueryParams } from './listQueryParams.js'; + +/** + * Interface representing a Nylas Contact object. + */ +export interface Contact { + id: string; + grantId: string; + object: 'contact'; + birthday?: string; + companyName?: string; + displayName: string; + emails: Email[]; + imAddresses: InstantMessagingAddress[]; + givenName?: string; + jobTitle?: string; + managerName?: string; + middleName?: string; + nickname?: string; + notes?: string; + officeLocation?: string; + pictureUrl?: string; + picture?: string; + suffix?: string; + surname?: string; + source?: SourceType; + phoneNumbers: PhoneNumber[]; + physicalAddresses: PhysicalAddress[]; + webPages: WebPage[]; + groups: ContactGroup[]; +} + +/** + * Custom Types. + */ +export type SourceType = 'address_book' | 'inbox' | 'domain'; +export type GroupType = 'user' | 'system' | 'other'; + +/** + * Interface for email addresses in a contact. + */ +export interface Email { + email?: string; + type?: string; +} + +/** + * Interface for IM addresses in a contact. + */ +export interface InstantMessagingAddress { + type?: string; + imAddress?: string; +} + +/** + * Interface for phone numbers in a contact. + */ +export interface PhoneNumber { + number?: string; + type?: string; +} + +/** + * Interface for physical addresses in a contact. + */ +export interface PhysicalAddress { + format?: string; + streetAddress?: string; + city?: string; + postalCode?: string; + state?: string; + country?: string; + type?: string; +} + +/** + * Interface for web pages in a contact. + */ +export interface WebPage { + url?: string; + type?: string; +} + +/** + * Interface representing a contact group. + */ +export interface ContactGroup { + id: string; + object: 'contact_group'; + grantId?: string; + groupType?: GroupType; + name?: string; + path?: string; +} + +/** + * Interface representing the query parameters for listing contacts. + */ +export interface ListContactQueryParams extends ListQueryParams { + /** + * Returns the contacts matching the exact contact's email. + */ + email?: string; + /** + * Returns the contacts matching the contact's exact phone number + */ + phoneNumber?: string; + /** + * Returns the contacts matching from the address book or auto-generated contacts from emails. + * For example of contacts only from the address book: /contacts?source=address_bookor for only autogenerated contacts:/contacts?source=inbox` + */ + source?: string; + /** + * Returns the contacts belonging to the Contact Group matching this ID + */ + group?: string; + /** + * When set to true, returns the contacts also within the specified Contact Group subgroups, if the group parameter is set. + */ + recurse?: boolean; +} + +/** + * Interface representing the query parameters for retrieving a single contact. + */ +export interface FindContactQueryParams { + profilePicture?: boolean; +} + +/** + * Interface for creating a contact. + */ +export type CreateContactRequest = { + displayName?: string; + birthday?: string; + companyName?: string; + emails?: Email[]; + givenName?: string; + imAddresses?: InstantMessagingAddress[]; + jobTitle?: string; + managerName?: string; + middleName?: string; + nickname?: string; + notes?: string; + officeLocation?: string; + phoneNumbers?: PhoneNumber[]; + physicalAddresses?: PhysicalAddress[]; + suffix?: string; + surname?: string; + webPages?: WebPage[]; + picture?: string; + source?: SourceType; + groups?: ContactGroup[]; +}; + +/** + * Interface for updating a contact. + */ +export type UpdateContactRequest = CreateContactRequest; diff --git a/src/models/credentials.ts b/src/models/credentials.ts new file mode 100644 index 00000000..ce2e60e3 --- /dev/null +++ b/src/models/credentials.ts @@ -0,0 +1,168 @@ +/** + * Interface representing a Nylas Credential object. + */ +export interface Credential { + /** + * Globally unique object identifier + */ + id: string; + /** + * Name of the credential + */ + name: string; + /** + * The type of credential + */ + credentialType?: CredentialType; + /** + * Hashed value of the credential that you created + */ + hashedData?: string; + /** + * Timestamp of when the credential was created + */ + createdAt?: number; + /** + * Timestamp of when the credential was updated + */ + updatedAt?: number; +} + +/** + * Interface representing additional data needed to create a credential for Microsoft Admin Consent + */ +export interface MicrosoftAdminConsentSettings { + clientId: string; + clientSecret: string; + [key: string]: string; +} + +/** + * Interface representing additional data needed to create a credential for Google Service Account + */ +export interface GoogleServiceAccountCredential { + privateKeyId: string; + privateKey: string; + clientEmail: string; + [key: string]: string; +} + +/** + * Interface representing additional data needed to create a credential for a Connector Override + */ +export type ConnectorOverrideCredential = Record; + +/** + * Type representing the data needed to create a credential + */ +export type CredentialData = + | MicrosoftAdminConsentSettings + | GoogleServiceAccountCredential + | ConnectorOverrideCredential; + +/** + * Interface representing a request to create a Microsoft Admin Consent credential + */ +export interface CreateMicrosoftCredentialRequest { + /** + * Unique name of this credential + */ + name: string; + /** + * Type of credential for the admin consent flow + */ + credentialType: CredentialType.ADMINCONSENT; + /** + * Data that specifies some special data required for this credential + */ + credentialData: MicrosoftAdminConsentSettings; +} + +/** + * Interface representing a request to create a Google Service Account credential + */ +export interface CreateGoogleCredentialRequest { + /** + * Unique name of this credential + */ + name: string; + /** + * Type of credential for the app permission flow + */ + credentialType: CredentialType.SERVICEACCOUNT; + /** + * Data that specifies some special data required for this credential + */ + credentialData: GoogleServiceAccountCredential; +} + +/** + * Interface representing a request to create a Connector Override credential + */ +export interface CreateOverrideCredentialRequest { + /** + * Unique name of this credential + */ + name: string; + /** + * Type of credential to force the override of a connector's client values + */ + credentialType: CredentialType.CONNECTOR; + /** + * Data that specifies some special data required for this credential + */ + credentialData: ConnectorOverrideCredential; +} + +/** + * Interface representing a request to create a credential + */ +export type CreateCredentialRequest = + | CreateMicrosoftCredentialRequest + | CreateGoogleCredentialRequest + | CreateOverrideCredentialRequest; + +/** + * Interface representing a request to update a credential + */ +export interface UpdateCredentialRequest { + /** + * Unique name of this credential + */ + name?: string; + /** + * Data that specifies some special data required for this credential + */ + credentialData?: CredentialData; +} + +/** + * Enum representing the type of credential + */ +export enum CredentialType { + ADMINCONSENT = 'adminconsent', + SERVICEACCOUNT = 'serviceaccount', + CONNECTOR = 'connector', +} + +/** + * Interface representing the query parameters for listing credentials. + */ +export interface ListCredentialsQueryParams { + /** + * Limit the number of results + */ + limit?: number; + /** + * Offset the results by this number + */ + offset?: number; + /** + * Sort the results by field name + */ + sortBy?: 'createdAt' | 'updatedAt'; + /** + * Order the results by ascending or descending + */ + orderBy?: 'desc' | 'asc'; +} diff --git a/src/models/delta-collection.ts b/src/models/delta-collection.ts deleted file mode 100644 index 7c3fbb44..00000000 --- a/src/models/delta-collection.ts +++ /dev/null @@ -1,95 +0,0 @@ -import NylasConnection from '../nylas-connection'; -import DeltaStream, { DeltaLongPoll } from './delta-stream'; -import { DeltaParams } from './delta'; -import { Deltas } from './deltas'; - -export type LatestCursor = { - cursor: string; -}; - -export default class DeltaCollection { - connection: NylasConnection; - private path = '/delta'; - - constructor(connection: NylasConnection) { - this.connection = connection; - } - - latestCursor( - callback: (error: Error | null, cursor: string | null) => void - ): Promise { - const reqOpts = { - method: 'POST', - path: `${this.path}/latest_cursor`, - }; - - return this.connection - .request(reqOpts) - .then((response: LatestCursor) => { - if (callback) { - callback(null, response.cursor); - } - return Promise.resolve(response.cursor); - }) - .catch(err => { - if (callback) { - callback(err, null); - } - return Promise.reject(err); - }); - } - - since(cursor: string, params?: DeltaParams): Promise { - const queryParams = this.buildDeltaParams(params); - return this.connection - .request({ - method: 'GET', - path: `${this.path}`, - qs: { - cursor: cursor, - ...queryParams, - }, - }) - .then(response => { - return Promise.resolve(new Deltas(this.connection).fromJSON(response)); - }) - .catch(err => { - return Promise.reject(err); - }); - } - - async longPoll( - cursor: string, - timeout: number, - params?: DeltaParams - ): Promise { - const queryParams = this.buildDeltaParams(params); - const stream = new DeltaLongPoll( - this.connection, - cursor, - timeout, - queryParams - ); - await stream.open(true); - return stream; - } - - async startStream( - cursor: string, - params: Record = {} - ): Promise { - const stream = new DeltaStream(this.connection, cursor, params); - await stream.open(); - return stream; - } - - private buildDeltaParams(params?: DeltaParams): Record { - return { - ...(params?.view && { view: params.view }), - ...(params?.excludeTypes && { - exclude_types: params.excludeTypes.join(), - }), - ...(params?.includeTypes && { includeTypes: params.includeTypes.join() }), - }; - } -} diff --git a/src/models/delta-stream.ts b/src/models/delta-stream.ts deleted file mode 100644 index 7c626fc8..00000000 --- a/src/models/delta-stream.ts +++ /dev/null @@ -1,196 +0,0 @@ -/* -A connection to the Nylas delta streaming API. - -Emits the following events: -- `response` when the connection is established, with one argument, a `http.IncomingMessage` -- `delta` for each delta received -- `error` when an error occurs in the connection -- `info` when the connection status changes -*/ -import { EventEmitter } from 'events'; -import NylasConnection from '../nylas-connection'; -import fetch, { Request } from 'node-fetch'; -import AbortController from 'abort-controller'; -import backoff from 'backoff'; -import JSONStream from 'JSONStream'; -import Delta, { DeltaParams } from './delta'; -import { Deltas } from './deltas'; - -export default class DeltaStream extends EventEmitter { - // Max number of times to retry a connection if we receive no data heartbeats - // from the Nylas server. - static MAX_RESTART_RETRIES = 5; - connection: NylasConnection; - path: string; - modelClass: typeof Deltas | typeof Delta; - cursor?: string; - params: DeltaParams; - requestInfo?: { - request: Request; - controller: AbortController; - }; - restartBackoff = backoff.exponential({ - randomisationFactor: 0.5, - initialDelay: 250, - maxDelay: 30000, - factor: 4, - }); - timeoutId?: number; - - // @param {string} cursor Nylas delta API cursor - // @param {Object} params object contianing query string params to be passed to the request - // @param {Array} params.excludeTypes object types to not return deltas for (e.g., {excludeTypes: ['thread']}) - // @param {Array} params.includeTypes object types to exclusively return deltas for (e.g., {includeTypes: ['thread']}) - // @param {boolean} params.expanded boolean to specify wether to request the expanded view - constructor( - connection: NylasConnection, - cursor: string, - params: Record = {} - ) { - super(); - this.connection = connection; - this.cursor = cursor; - this.params = params; - this.path = '/delta/streaming'; - this.modelClass = Delta; - if (!(this.connection instanceof NylasConnection)) { - throw new Error('Connection object not provided'); - } - this.restartBackoff.failAfter(DeltaStream.MAX_RESTART_RETRIES); - this.restartBackoff - .on('backoff', this.restartConnection.bind(this)) - .on('fail', () => { - return this.emit( - 'error', - `Nylas DeltaStream failed to reconnect after - ${DeltaStream.MAX_RESTART_RETRIES} - retries.` - ); - }); - } - - close(): void { - clearTimeout(this.timeoutId); - delete this.timeoutId; - this.restartBackoff.reset(); - if (this.requestInfo) { - this.requestInfo.controller.abort(); - } - delete this.requestInfo; - } - - async open(emitAsModel?: boolean): Promise { - this.close(); - const { excludeTypes = [], includeTypes = [], ...params } = this.params; - - const queryObj: Record = { - ...params, - cursor: this.cursor, - }; - if (excludeTypes.length > 0) { - queryObj.exclude_types = excludeTypes.join(','); - } - if (includeTypes.length > 0) { - queryObj.include_types = includeTypes.join(','); - } - - const request = this.connection.newRequest({ - method: 'GET', - path: this.path, - qs: queryObj, - }); - try { - const controller = new AbortController(); - this.requestInfo = { - request, - controller, - }; - const response = await fetch(request, { signal: controller.signal }); - if (response.status !== 200) { - response.body.on('data', (data: any) => { - let err = data; - try { - err = JSON.parse(err); - } catch (e) { - // Do nothing - } - // Do nothing, keep err as string. - return this.onError(err); - }); - return; - } - // Successfully established connection - this.emit('response', response); - this.onDataReceived(); - return ( - response.body - .on('data', this.onDataReceived.bind(this)) - // Each data block received may not be a complete JSON object. Pipe through - // JSONStream.parse(), which handles converting data blocks to JSON objects. - .pipe(JSONStream.parse()) - .on('data', (obj: any) => { - if (emitAsModel === true) { - obj = new this.modelClass(this.connection).fromJSON(obj); - } - if (obj.cursor) { - this.cursor = obj.cursor; - } - return this.emit('delta', obj); - }) - ); - } catch (error) { - this.onError(error); - } - } - - protected onDataReceived(): void { - // Nylas sends a newline heartbeat in the raw data stream once every 5 seconds. - // Automatically restart the connection if we haven't gotten any data in - // Delta.streamingTimeoutMs. The connection will restart with the last - // received cursor. - clearTimeout(this.timeoutId); - this.restartBackoff.reset(); - this.timeoutId = setTimeout( - this.restartBackoff.backoff.bind(this.restartBackoff), - Delta.streamingTimeoutMs - ) as any; - } - - private onError(err: Error): void { - this.emit('error', err); - return this.restartBackoff.reset(); - } - - private restartConnection(n: number): Promise { - this.emit( - 'info', - `Restarting Nylas DeltaStream connection (attempt ${n + 1}): ${ - this.requestInfo != null ? this.requestInfo.request.url : undefined - }` - ); - this.close(); - return this.open(); - } -} - -export class DeltaLongPoll extends DeltaStream { - constructor( - connection: NylasConnection, - cursor: string, - timeout: number, - params: Record = {} - ) { - super(connection, cursor, params); - params['timeout'] = timeout; - this.params = params; - this.path = '/delta/longpoll'; - this.modelClass = Deltas; - } - - protected onDataReceived(): void { - // For streaming we restart the connection on every data received in order - // to keep the connection alive. For long polling this is not needed as the - // server terminates the connection when data is sent - return; - } -} diff --git a/src/models/delta.ts b/src/models/delta.ts deleted file mode 100644 index 5a618655..00000000 --- a/src/models/delta.ts +++ /dev/null @@ -1,86 +0,0 @@ -import NylasConnection from '../nylas-connection'; -import Attributes, { Attribute } from './attributes'; -import RestfulModel from './restful-model'; -import Contact from './contact'; -import File from './file'; -import Message from './message'; -import Draft from './draft'; -import Thread from './thread'; -import Event from './event'; -import Folder, { Label } from './folder'; - -const DeltaClassMap: Record = Object.freeze({ - contact: Contact, - file: File, - message: Message, - draft: Draft, - thread: Thread, - event: Event, - folder: Folder, - label: Label, -}); - -export type DeltaParams = { - view?: string; - includeTypes?: string[]; - excludeTypes?: string[]; - expanded?: boolean; -}; - -export type DeltaProperties = { - id: string; - cursor: string; - event: string; - object: string; - objectAttributes?: unknown; -}; - -export default class Delta extends RestfulModel implements DeltaProperties { - id = ''; - cursor = ''; - event = ''; - object = ''; - connection: NylasConnection; - objectAttributes?: RestfulModel; - static streamingTimeoutMs = 15000; - static attributes: Record = { - id: Attributes.String({ - modelKey: 'id', - }), - cursor: Attributes.String({ - modelKey: 'cursor', - }), - event: Attributes.String({ - modelKey: 'event', - }), - object: Attributes.String({ - modelKey: 'object', - }), - objectAttributes: Attributes.Object({ - modelKey: 'objectAttributes', - jsonKey: 'attributes', - }), - }; - - constructor(connection: NylasConnection, props?: DeltaProperties) { - super(connection); - this.connection = connection; - this.initAttributes(props); - if (this.objectAttributes && DeltaClassMap[this.object]) { - this.objectAttributes = new DeltaClassMap[this.object]( - connection, - this.objectAttributes - ); - } - } - - fromJSON(json: Record): this { - super.fromJSON(json); - if (this.objectAttributes && DeltaClassMap[this.object]) { - this.objectAttributes = new DeltaClassMap[this.object]( - this.connection - ).fromJSON(this.objectAttributes); - } - return this; - } -} diff --git a/src/models/deltas.ts b/src/models/deltas.ts deleted file mode 100644 index a2e6623b..00000000 --- a/src/models/deltas.ts +++ /dev/null @@ -1,37 +0,0 @@ -import Model from './model'; -import NylasConnection from '../nylas-connection'; -import Attributes, { Attribute } from './attributes'; -import Delta, { DeltaProperties } from './delta'; - -export type DeltasProperties = { - cursorStart: string; - cursorEnd: string; - deltas: DeltaProperties[]; -}; - -export class Deltas extends Model implements DeltasProperties { - cursorStart = ''; - cursorEnd = ''; - deltas: Delta[] = []; - connection: NylasConnection; - static attributes: Record = { - cursorStart: Attributes.String({ - modelKey: 'cursorStart', - jsonKey: 'cursor_start', - }), - cursorEnd: Attributes.String({ - modelKey: 'cursorEnd', - jsonKey: 'cursor_end', - }), - deltas: Attributes.Collection({ - modelKey: 'deltas', - itemClass: Delta, - }), - }; - - constructor(connection: NylasConnection, props?: DeltasProperties) { - super(); - this.connection = connection; - this.initAttributes(props); - } -} diff --git a/src/models/draft.ts b/src/models/draft.ts deleted file mode 100644 index 021e33ea..00000000 --- a/src/models/draft.ts +++ /dev/null @@ -1,166 +0,0 @@ -import Message, { MessageProperties } from './message'; -import Attributes, { Attribute } from './attributes'; -import { SaveCallback } from './restful-model'; -import NylasConnection from '../nylas-connection'; - -export type SendCallback = ( - err: Error | null, - json?: Record -) => void; - -export type DraftProperties = MessageProperties & { - rawMime?: string; - replyToMessageId?: string; - version?: number; - fileIdsToAttach?: string[]; -}; - -export default class Draft extends Message implements DraftProperties { - rawMime?: string; - replyToMessageId?: string; - version?: number; - fileIdsToAttach?: string[]; - static collectionName = 'drafts'; - static attributes: Record = { - ...Message.attributes, - version: Attributes.Number({ - modelKey: 'version', - }), - replyToMessageId: Attributes.String({ - modelKey: 'replyToMessageId', - jsonKey: 'reply_to_message_id', - }), - rawMime: Attributes.String({ - modelKey: 'rawMime', - readOnly: true, - }), - fileIdsToAttach: Attributes.StringList({ - modelKey: 'fileIdsToAttach', - readOnly: true, - }), - }; - - constructor(connection: NylasConnection, props?: DraftProperties) { - super(connection, props); - this.initAttributes(props); - } - - fileIds(): (string | undefined)[] { - let fileIds: (string | undefined)[] = super.fileIds(); - if (this.fileIdsToAttach) { - fileIds = Array.from(new Set(fileIds.concat(this.fileIdsToAttach))); - } - return fileIds; - } - - toJSON(enforceReadOnly?: boolean): Record { - if (this.rawMime) { - throw Error('toJSON() cannot be called for raw MIME drafts'); - } - const json = super.toJSON(enforceReadOnly); - json.file_ids = this.fileIds(); - - return json; - } - - save(params: {} | SaveCallback = {}, callback?: SaveCallback): Promise { - if (this.rawMime) { - const err = new Error('save() cannot be called for raw MIME drafts'); - if (callback) { - callback(err); - } - return Promise.reject(err); - } - return super.save(params, callback); - } - - saveRequestBody(): Record { - if (this.rawMime) { - throw Error('saveRequestBody() cannot be called for raw MIME drafts'); - } - const json = super.saveRequestBody(); - if (this.replyToMessageId !== undefined && this.replyToMessageId === '') { - delete json.reply_to_message_id; - } - return json; - } - - deleteRequestBody( - params: Record = {} - ): Record { - const body: Record = {}; - body.version = params.hasOwnProperty('version') - ? params.version - : this.version; - return body; - } - - toString(): string { - if (this.rawMime) { - throw Error('toString() cannot be called for raw MIME drafts'); - } - return super.toString(); - } - - send( - trackingArg?: Record | SendCallback | null, - callbackArg?: SendCallback | Record | null - ): Promise { - // callback used to be the first argument, and tracking was the second - let callback: SendCallback | undefined; - if (typeof callbackArg === 'function') { - callback = callbackArg as SendCallback; - } else if (typeof trackingArg === 'function') { - callback = trackingArg as SendCallback; - } - let tracking: Record | undefined; - if (trackingArg && typeof trackingArg === 'object') { - tracking = trackingArg; - } else if (callbackArg && typeof callbackArg === 'object') { - tracking = callbackArg; - } - - let body: any = this.rawMime, - headers: Record = { 'Content-Type': 'message/rfc822' }, - json = false; - - if (!this.rawMime) { - headers = {}; - json = true; - if (this.id) { - body = { - draft_id: this.id, - version: this.version, - }; - } else { - body = this.saveRequestBody(); - } - if (tracking) { - body['tracking'] = tracking; - } - } - - return this.connection - .request({ - method: 'POST', - path: '/send', - headers, - body, - json, - }) - .then(json => { - const message = new Message(this.connection).fromJSON(json); - - if (callback) { - callback(null, message); - } - return Promise.resolve(message); - }) - .catch(err => { - if (callback) { - callback(err); - } - return Promise.reject(err); - }); - } -} diff --git a/src/models/drafts.ts b/src/models/drafts.ts new file mode 100644 index 00000000..70d51109 --- /dev/null +++ b/src/models/drafts.ts @@ -0,0 +1,105 @@ +import { BaseMessage, BaseCreateMessage } from './messages.js'; +import { ListQueryParams } from './listQueryParams.js'; + +/** + * Interface representing a request to create a draft. + */ +export interface CreateDraftRequest extends BaseCreateMessage { + /** + * Unix timestamp to send the message at. + */ + sendAt?: number; + /** + * The ID of the message that you are replying to. + */ + replyToMessageId?: string; + /** + * Options for tracking opens, links, and thread replies. + */ + trackingOptions?: TrackingOptions; +} + +/** + * Interface representing a request to send a message. + */ +export interface SendMessageRequest extends CreateDraftRequest { + /** + * Whether or not to use draft support. + * This is primarily used when dealing with large attachments. + */ + useDraft?: boolean; +} + +/** + * Interface representing a Nylas Draft object. + */ +export interface Draft + extends BaseMessage, + Omit { + /** + * The type of object. + */ + object: 'draft'; +} + +/** + * Interface representing a request to update a draft. + */ +export type UpdateDraftRequest = Partial & { + /** + * Return drafts that are unread. + */ + unread?: boolean; +}; + +/** + * Interface representing the different tracking options for when a message is sent. + */ +export interface TrackingOptions { + label?: string; + links?: boolean; + opens?: boolean; + threadReplies?: boolean; +} + +/** + * Interface representing the query parameters for listing drafts. + */ +export interface ListDraftsQueryParams extends ListQueryParams { + /** + * Return items with a matching literal subject. + */ + subject?: string; + /** + * Return emails that have been sent or received from this list of email addresses. + */ + anyEmail?: string[]; + /** + * Return items containing drafts to be sent these email address. + */ + to?: string[]; + /** + * Return items containing drafts cc'ing these email address. + */ + cc?: string[]; + /** + * Return items containing drafts bcc'ing these email address. + */ + bcc?: string[]; + /** + * Return drafts that are unread. + */ + unread?: boolean; + /** + * Return drafts that are starred. + */ + starred?: boolean; + /** + * Return drafts that belong to this thread. + */ + threadId?: string; + /** + * Return drafts that contain attachments. + */ + hasAttachment?: boolean; +} diff --git a/src/models/email-participant.ts b/src/models/email-participant.ts deleted file mode 100644 index 9d203b40..00000000 --- a/src/models/email-participant.ts +++ /dev/null @@ -1,34 +0,0 @@ -import Attributes, { Attribute } from './attributes'; -import Model from './model'; - -export type EmailParticipantProperties = { - email: string; - name?: string; -}; - -export default class EmailParticipant extends Model - implements EmailParticipantProperties { - email = ''; - name?: string; - static attributes: Record = { - name: Attributes.String({ - modelKey: 'name', - }), - email: Attributes.String({ - modelKey: 'email', - }), - }; - - constructor(props?: EmailParticipantProperties) { - super(); - this.initAttributes(props); - } - - toJSON(): Record { - const json = super.toJSON(); - if (!json['name']) { - json['name'] = json['email']; - } - return json; - } -} diff --git a/src/models/error.ts b/src/models/error.ts new file mode 100644 index 00000000..9b6bee0e --- /dev/null +++ b/src/models/error.ts @@ -0,0 +1,133 @@ +/** + * Base class for all Nylas API errors. + */ +export abstract class AbstractNylasApiError extends Error { + /** + * The unique identifier of the request. + */ + requestId?: string; + /** + * The HTTP status code of the error response. + */ + statusCode?: number; +} + +/** + * Base class for all Nylas SDK errors. + */ +export abstract class AbstractNylasSdkError extends Error {} + +/** + * Class representation of a general Nylas API error. + */ +export class NylasApiError extends AbstractNylasApiError + implements NylasApiErrorResponseData { + /** + * Error type. + */ + type: string; + /** + * Provider Error. + */ + providerError: any; + + constructor(apiError: NylasApiErrorResponse, statusCode?: number) { + super(apiError.error.message); + this.type = apiError.error.type; + this.requestId = apiError.requestId; + this.providerError = apiError.error.providerError; + this.statusCode = statusCode; + } +} + +/** + * Class representing an OAuth error returned by the Nylas API. + */ +export class NylasOAuthError extends AbstractNylasApiError + implements NylasOAuthErrorResponse { + /** + * Error type. + */ + error: string; + /** + * Error code used for referencing the docs, logs, and data stream. + */ + errorCode: number; + /** + * Human readable error description. + */ + errorDescription: string; + /** + * URL to the related documentation and troubleshooting regarding this error. + */ + errorUri: string; + + constructor(apiError: NylasOAuthErrorResponse, statusCode?: number) { + super(apiError.errorDescription); + this.error = apiError.error; + this.errorCode = apiError.errorCode; + this.errorDescription = apiError.errorDescription; + this.errorUri = apiError.errorUri; + this.statusCode = statusCode; + } +} + +/** + * Error thrown when the Nylas SDK times out before receiving a response from the server + */ +export class NylasSdkTimeoutError extends AbstractNylasSdkError { + /** + * The URL that timed out + */ + url: string; + /** + * The timeout value set in the Nylas SDK, in seconds + */ + timeout: number; + + constructor(url: string, timeout: number) { + super('Nylas SDK timed out before receiving a response from the server.'); + this.url = url; + this.timeout = timeout; + } +} + +/** + * Interface representing the error response from the Nylas API. + */ + +export interface NylasApiErrorResponse { + requestId: string; + error: NylasApiErrorResponseData; +} + +/** + * Interface representing the error data within the response object. + */ +export interface NylasApiErrorResponseData { + type: string; + message: string; + providerError?: any; +} + +/** + * Interface representing an OAuth error returned by the Nylas API. + */ +export interface NylasOAuthErrorResponse { + /** + * Error type. + */ + error: string; + /** + * Error code used for referencing the docs, logs, and data stream. + */ + errorCode: number; + /** + * Human readable error description. + */ + errorDescription: string; + /** + * URL to the related documentation and troubleshooting regarding this error. + */ + errorUri: string; +} diff --git a/src/models/event-conferencing.ts b/src/models/event-conferencing.ts deleted file mode 100644 index 157ce008..00000000 --- a/src/models/event-conferencing.ts +++ /dev/null @@ -1,76 +0,0 @@ -import Attributes, { Attribute } from './attributes'; -import Model from './model'; - -export type EventConferencingDetailsProperties = { - meetingCode?: string; - phone?: string[]; - password?: string; - pin?: string; - url?: string; -}; - -export class EventConferencingDetails extends Model - implements EventConferencingDetailsProperties { - meetingCode?: string; - phone?: string[]; - password?: string; - pin?: string; - url?: string; - static attributes: Record = { - meetingCode: Attributes.String({ - modelKey: 'meetingCode', - jsonKey: 'meeting_code', - }), - phone: Attributes.StringList({ - modelKey: 'phone', - }), - password: Attributes.String({ - modelKey: 'password', - }), - pin: Attributes.String({ - modelKey: 'pin', - }), - url: Attributes.String({ - modelKey: 'url', - }), - }; - - constructor(props?: EventConferencingProperties) { - super(); - this.initAttributes(props); - } -} - -export type EventConferencingProperties = { - provider: string; - details?: EventConferencingDetailsProperties; - autocreate?: { - settings?: object; - }; -}; - -export default class EventConferencing extends Model - implements EventConferencingProperties { - provider = ''; - details?: EventConferencingDetails; - autocreate?: { - settings?: Record; - }; - static attributes: Record = { - details: Attributes.Object({ - modelKey: 'details', - itemClass: EventConferencingDetails, - }), - provider: Attributes.String({ - modelKey: 'provider', - }), - autocreate: Attributes.Object({ - modelKey: 'autocreate', - }), - }; - - constructor(props?: EventConferencingProperties) { - super(); - this.initAttributes(props); - } -} diff --git a/src/models/event-notification.ts b/src/models/event-notification.ts deleted file mode 100644 index 711c94e2..00000000 --- a/src/models/event-notification.ts +++ /dev/null @@ -1,58 +0,0 @@ -import Attributes, { Attribute } from './attributes'; -import Model from './model'; - -export enum EventNotificationType { - Email = 'email', - Sms = 'sms', - Webhook = 'webhook', -} - -export type EventNotificationProperties = { - type: EventNotificationType; - minutesBeforeEvent: number; - url?: string; - payload?: string; - subject?: string; - body?: string; - message?: string; -}; - -export default class EventNotification extends Model - implements EventNotificationProperties { - type = EventNotificationType.Email; - minutesBeforeEvent = 0; - url?: string; - payload?: string; - subject?: string; - body?: string; - message?: string; - static attributes: Record = { - type: Attributes.String({ - modelKey: 'type', - }), - minutesBeforeEvent: Attributes.Number({ - modelKey: 'minutesBeforeEvent', - jsonKey: 'minutes_before_event', - }), - url: Attributes.String({ - modelKey: 'url', - }), - payload: Attributes.String({ - modelKey: 'payload', - }), - subject: Attributes.String({ - modelKey: 'subject', - }), - body: Attributes.String({ - modelKey: 'body', - }), - message: Attributes.String({ - modelKey: 'message', - }), - }; - - constructor(props?: EventNotificationProperties) { - super(); - this.initAttributes(props); - } -} diff --git a/src/models/event-participant.ts b/src/models/event-participant.ts deleted file mode 100644 index f97b9b42..00000000 --- a/src/models/event-participant.ts +++ /dev/null @@ -1,50 +0,0 @@ -import Attributes, { Attribute } from './attributes'; -import Model from './model'; - -export type EventParticipantProperties = { - email: string; - name?: string; - comment?: string; - phoneNumber?: string; - status?: string; -}; - -export default class EventParticipant extends Model - implements EventParticipantProperties { - email = ''; - name?: string; - comment?: string; - phoneNumber?: string; - status?: string; - static attributes: Record = { - name: Attributes.String({ - modelKey: 'name', - }), - email: Attributes.String({ - modelKey: 'email', - }), - comment: Attributes.String({ - modelKey: 'comment', - }), - phoneNumber: Attributes.String({ - modelKey: 'phoneNumber', - jsonKey: 'phone_number', - }), - status: Attributes.String({ - modelKey: 'status', - }), - }; - - constructor(props?: EventParticipantProperties) { - super(); - this.initAttributes(props); - } - - toJSON(enforceReadOnly?: boolean): Record { - const json = super.toJSON(enforceReadOnly) as Record; - if (!json['name']) { - json['name'] = json['email']; - } - return json; - } -} diff --git a/src/models/event-reminder-method.ts b/src/models/event-reminder-method.ts deleted file mode 100644 index 2df11382..00000000 --- a/src/models/event-reminder-method.ts +++ /dev/null @@ -1,34 +0,0 @@ -import Attributes, { Attribute } from './attributes'; -import Model from './model'; - -export enum EventReminderMethod { - Email = 'email', - Popup = 'popup', - Display = 'display', - Sound = 'sound', -} - -export type EventReminderProperties = { - reminderMinutes?: string; - reminderMethod?: EventReminderMethod; -}; - -export class EventReminder extends Model implements EventReminderProperties { - reminderMinutes?: string; - reminderMethod?: EventReminderMethod; - static attributes: Record = { - reminderMinutes: Attributes.String({ - modelKey: 'reminderMinutes', - jsonKey: 'reminder_minutes', - }), - reminderMethod: Attributes.String({ - modelKey: 'reminderMethod', - jsonKey: 'reminder_method', - }), - }; - - constructor(props?: EventReminderProperties) { - super(); - this.initAttributes(props); - } -} diff --git a/src/models/event.ts b/src/models/event.ts deleted file mode 100644 index edb27fd9..00000000 --- a/src/models/event.ts +++ /dev/null @@ -1,450 +0,0 @@ -import RestfulModel, { SaveCallback } from './restful-model'; -import Attributes, { Attribute } from './attributes'; -import EventParticipant, { - EventParticipantProperties, -} from './event-participant'; -import EventConferencing, { - EventConferencingProperties, -} from './event-conferencing'; -import When, { WhenProperties } from './when'; -import NylasConnection from '../nylas-connection'; -import EventNotification, { - EventNotificationProperties, -} from './event-notification'; -import { - EventReminder, - EventReminderMethod, - EventReminderProperties, -} from './event-reminder-method'; - -export enum ICSMethod { - Request = 'request', - Publish = 'publish', - Reply = 'reply', - Add = 'add', - Cancel = 'cancel', - Refresh = 'refresh', -} - -export type ICSOptions = { - iCalUID?: string; - prodId?: string; - method?: ICSMethod; -}; - -export type EventProperties = { - calendarId: string; - when: WhenProperties; - iCalUID?: string; - messageId?: string; - eventCollectionId?: string | number; - title?: string; - description?: string; - owner?: string; - participants?: EventParticipantProperties[]; - readOnly?: boolean; - location?: string; - busy?: boolean; - status?: string; - recurrence?: { - rrule: string[]; - timezone: string; - }; - masterEventId?: string; - originalStartTime?: Date; - capacity?: number; - conferencing?: EventConferencingProperties; - notifications?: EventNotificationProperties[]; - roundRobinOrder?: string[]; - metadata?: object; - jobStatusId?: string; - organizerEmail?: string; - organizerName?: string; - hideParticipants?: boolean; - visibility?: string; - customerEventId?: string; - reminderMinutes?: string; - reminderMethod?: EventReminderMethod; - reminders?: EventReminderProperties; -}; - -export default class Event extends RestfulModel { - calendarId = ''; - when = new When(); - iCalUID?: string; - messageId?: string; - eventCollectionId?: string | number; - title?: string; - description?: string; - owner?: string; - participants?: EventParticipant[]; - readOnly?: boolean; - location?: string; - busy?: boolean; - status?: string; - recurrence?: { - rrule: string[]; - timezone: string; - }; - masterEventId?: string; - originalStartTime?: Date; - capacity?: number; - conferencing?: EventConferencing; - readonly reminders?: EventReminder; - reminderMinutes?: string; - reminderMethod?: EventReminderMethod; - notifications?: EventNotification[]; - roundRobinOrder?: string[]; - metadata?: object; - jobStatusId?: string; - organizerEmail?: string; - organizerName?: string; - hideParticipants?: boolean; - customerEventId?: string; - private _visibility?: string; - private visibilityIsDirty = false; - static collectionName = 'events'; - static attributes: Record = { - ...RestfulModel.attributes, - calendarId: Attributes.String({ - modelKey: 'calendarId', - jsonKey: 'calendar_id', - }), - iCalUID: Attributes.String({ - modelKey: 'iCalUID', - jsonKey: 'ical_uid', - readOnly: true, - }), - messageId: Attributes.String({ - modelKey: 'messageId', - jsonKey: 'message_id', - readOnly: true, - }), - eventCollectionId: Attributes.String({ - modelKey: 'eventCollectionId', - jsonKey: 'event_collection_id', - }), - title: Attributes.String({ - modelKey: 'title', - }), - description: Attributes.String({ - modelKey: 'description', - }), - owner: Attributes.String({ - modelKey: 'owner', - readOnly: true, - }), - participants: Attributes.Collection({ - modelKey: 'participants', - itemClass: EventParticipant, - }), - readOnly: Attributes.Boolean({ - modelKey: 'readOnly', - jsonKey: 'read_only', - }), - location: Attributes.String({ - modelKey: 'location', - }), - when: Attributes.Object({ - modelKey: 'when', - itemClass: When, - }), - busy: Attributes.Boolean({ - modelKey: 'busy', - }), - status: Attributes.String({ - modelKey: 'status', - readOnly: true, - }), - recurrence: Attributes.Object({ - modelKey: 'recurrence', - }), - masterEventId: Attributes.String({ - modelKey: 'masterEventId', - jsonKey: 'master_event_id', - readOnly: true, - }), - originalStartTime: Attributes.DateTime({ - modelKey: 'originalStartTime', - jsonKey: 'original_start_time', - readOnly: true, - }), - capacity: Attributes.Number({ - modelKey: 'capacity', - }), - conferencing: Attributes.Object({ - modelKey: 'conferencing', - itemClass: EventConferencing, - }), - reminderMinutes: Attributes.String({ - modelKey: 'reminderMinutes', - jsonKey: 'reminder_minutes', - }), - reminderMethod: Attributes.String({ - modelKey: 'reminderMethod', - jsonKey: 'reminder_method', - }), - reminders: Attributes.Object({ - modelKey: 'reminders', - jsonKey: 'reminders', - itemClass: EventReminder, - readOnly: true, - }), - notifications: Attributes.Collection({ - modelKey: 'notifications', - itemClass: EventNotification, - }), - roundRobinOrder: Attributes.StringList({ - modelKey: 'roundRobinOrder', - jsonKey: 'round_robin_order', - }), - metadata: Attributes.Object({ - modelKey: 'metadata', - }), - jobStatusId: Attributes.String({ - modelKey: 'jobStatusId', - jsonKey: 'job_status_id', - readOnly: true, - }), - organizerEmail: Attributes.String({ - modelKey: 'organizerEmail', - jsonKey: 'organizer_email', - readOnly: true, - }), - organizerName: Attributes.String({ - modelKey: 'organizerName', - jsonKey: 'organizer_name', - readOnly: true, - }), - hideParticipants: Attributes.Boolean({ - modelKey: 'hideParticipants', - jsonKey: 'hide_participants', - }), - visibility: Attributes.String({ - modelKey: '_visibility', - jsonKey: 'visibility', - }), - customerEventId: Attributes.String({ - modelKey: 'customerEventId', - jsonKey: 'customer_event_id', - }), - }; - - constructor(connection: NylasConnection, props?: EventProperties) { - super(connection, props); - this.initAttributes(props); - this.visibilityIsDirty = false; - } - - get start(): string | number | undefined { - return ( - this.when?.startTime || - this.when?.startDate || - this.when?.time || - this.when?.date - ); - } - - set start(val: string | number | undefined) { - if (!this.when) { - this.when = new When(); - } - if (typeof val === 'number') { - if (val === this.when.endTime) { - this.when.time = val; - this.when.endTime = undefined; - } else { - this.when.time = undefined; - this.when.startDate = undefined; - this.when.date = undefined; - this.when.startTime = val; - } - } - if (typeof val === 'string') { - if (val === this.when.endDate) { - this.when.date = val; - this.when.endDate = undefined; - } else { - this.when.time = undefined; - this.when.startTime = undefined; - this.when.date = undefined; - this.when.startDate = val; - } - } - } - - get end(): string | number | undefined { - return ( - this.when?.endTime || - this.when?.endDate || - this.when?.time || - this.when?.date - ); - } - - set end(val: string | number | undefined) { - if (!this.when) { - this.when = new When(); - } - if (typeof val === 'number') { - if (val === this.when.startTime) { - this.when.time = val; - this.when.startTime = undefined; - } else { - this.when.time = undefined; - this.when.endDate = undefined; - this.when.date = undefined; - this.when.endTime = val; - } - } - if (typeof val === 'string') { - if (val === this.when.startDate) { - this.when.date = val; - this.when.startDate = undefined; - } else { - this.when.time = undefined; - this.when.endTime = undefined; - this.when.date = undefined; - this.when.endDate = val; - } - } - } - - get visibility(): string | undefined { - return this._visibility; - } - - set visibility(val: string | undefined) { - if (val !== this._visibility) { - this.visibilityIsDirty = true; - } - - this._visibility = val; - } - - deleteRequestQueryString( - params: Record = {} - ): Record { - const qs: Record = {}; - if (params.hasOwnProperty('notify_participants')) { - qs.notify_participants = params.notify_participants; - } - return qs; - } - - save(params: {} | SaveCallback = {}, callback?: SaveCallback): Promise { - this.validate(); - return super.save(params, callback); - } - - saveRequestBody(): Record { - const json = super.saveRequestBody(); - if (!this.notifications) { - delete json.notifications; - } - // Participant status cannot be updated - if (this.id && json.participants) { - (json.participants as Record[]).forEach( - participant => delete participant.status - ); - } - if ( - (this.visibility !== undefined && this.visibility === '') || - !this.visibilityIsDirty - ) { - delete json.visibility; - } - - return json; - } - - rsvp( - status: string, - comment?: string, - callback?: (error: Error | null, data?: Event) => void - ): Promise { - return this.connection - .request({ - method: 'POST', - body: { event_id: this.id, status: status, comment: comment }, - path: '/send-rsvp', - }) - .then(json => { - this.fromJSON(json); - if (callback) { - callback(null, this); - } - return Promise.resolve(this); - }) - .catch(err => { - if (callback) { - callback(err); - } - return Promise.reject(err); - }); - } - - generateICS(options?: ICSOptions): Promise { - if (this.calendarId == '' || !this.when.isSet()) { - throw new Error( - 'Cannot generate an ICS file for an event without a Calendar ID or when set' - ); - } - - let optionsPayload = {}; - if (options) { - optionsPayload = { - ical_uid: options.iCalUID, - prodid: options.prodId, - method: options.method, - }; - } - - return this.connection - .request({ - method: 'POST', - body: { - ...this.saveRequestBody(), - ics_options: optionsPayload, - }, - path: '/events/to-ics', - }) - .then((response: Record) => { - if (!response.ics) { - throw new Error( - "Unexpected response from the API server. Returned 200 but no 'ics' string found." - ); - } - - return response.ics; - }); - } - - fromJSON(json: Record): this { - const model = super.fromJSON(json); - model.visibilityIsDirty = false; - return model; - } - - private validate(): void { - if ( - this.conferencing && - this.conferencing.details && - this.conferencing.autocreate - ) { - throw new Error( - "Cannot set both 'details' and 'autocreate' in conferencing object." - ); - } - if ( - this.capacity && - this.capacity != -1 && - this.participants && - this.participants.length > this.capacity - ) { - throw new Error( - 'The number of participants in the event exceeds the set capacity.' - ); - } - } -} diff --git a/src/models/events.ts b/src/models/events.ts new file mode 100644 index 00000000..34aaf76e --- /dev/null +++ b/src/models/events.ts @@ -0,0 +1,585 @@ +import { ListQueryParams } from './listQueryParams.js'; +import { Subset } from '../utils.js'; + +/** + * Interface representing a Nylas Event object. + */ +export interface Event { + /** + * Globally unique object identifier. + */ + id: string; + /** + * Grant ID of the Nylas account. + */ + grantId: string; + /** + * The type of object. + */ + object: 'event'; + /** + * Calendar ID of the event. + */ + calendarId: string; + /** + * This value determines whether to show this event's time block as available on shared or public calendars. + */ + busy: boolean; + /** + * If the event participants are able to edit the event. + */ + readOnly: boolean; + /** + * Unix timestamp when the event was created. + */ + createdAt: number; + /** + * Unix timestamp when the event was last updated. + */ + updatedAt: number; + /** + * List of participants invited to the event. Participants may also be rooms or resources. + */ + participants: Participant[]; + /** + * Representation of time and duration for events. When object can be in one of four formats (sub-objects): + * - {@link Date} + * - {@link Datespan} + * - {@link Time} + * - {@link Timespan} + */ + when: When; + /** + * Representation of conferencing details for events. Conferencing object can be in one of two formats (sub-objects): + * - {@link Autocreate} + * - {@link Details} + */ + conferencing: Conferencing; + /** + * Visibility of the event, if the event is private or public. + */ + visibility: Visibility; + /** + * Description of the event. + */ + description?: string; + /** + * Location of the event, such as a physical address or meeting room name. + */ + location?: string; + /** + * Unique id for iCalendar standard, for identifying events across calendaring systems. + * Recurring events may share the same value. Can be null for events synced before the year 2020. + */ + icalUid?: string; + /** + * Title of the event. + */ + title?: string; + /** + * A link to this event in the provider's UI + */ + htmlLink?: string; + /** + * Whether participants of the event should be hidden. + */ + hideParticipants?: boolean; + /** + * List of key-value pairs storing additional data. + */ + metadata?: Record; + /** + * User who created the event. + * Not supported for all providers. + */ + creator?: EmailName; + /** + * Organizer of the event. + */ + organizer?: EmailName; + /** + * An list of RRULE and EXDATE strings. + * @see RFC-5545 + */ + recurrence?: string[]; + /** + * A list of reminders to send for the event. If left empty or omitted, the event uses the provider defaults. + */ + reminders?: Reminders; + /** + * Status of the event. + */ + status?: Status; +} + +/** + * Interface representing a request to create an event. + */ +export interface CreateEventRequest { + /** + * Representation of time and duration for events. When object can be in one of four formats (sub-objects): + * - {@link Date} + * - {@link Datespan} + * - {@link Time} + * - {@link Timespan} + */ + when: CreateWhen; + /** + * Title of the event. + */ + title?: string; + /** + * This value determines whether to show this event's time block as available on shared or public calendars. + */ + busy?: boolean; + /** + * Description of the event. + */ + description?: string; + /** + * Location of the event, such as a physical address or meeting room name. + */ + location?: string; + /** + * Representation of conferencing details for events. Conferencing object can be in one of two formats (sub-objects): + * - {@link Autocreate} + * - {@link Details} + */ + conferencing?: Conferencing; + /** + * A list of reminders to send for the event. If left empty or omitted, the event uses the provider defaults. + */ + reminders?: Reminders; + /** + * A list of key-value pairs storing additional data. + */ + metadata?: Record; + /** + * List of participants invited to the event. Participants may also be rooms or resources. + */ + participants?: Participant[]; + /** + * An list of RRULE and EXDATE strings. + * @see RFC-5545 + */ + recurrence?: string[]; + /** + * Calendar ID of the event. + */ + calendarId?: string; + /** + * If the event participants are able to edit the event. + */ + readOnly?: boolean; + /** + * Visibility of the event, if the event is private or public. + */ + visibility?: 'public' | 'private'; + /** + * The maximum number of participants that may attend the event. + */ + capacity?: number; + /** + * Whether participants of the event should be hidden. + */ + hideParticipants?: boolean; +} + +/** + * Interface representing a request to update an event. + */ +export type UpdateEventRequest = Subset; + +/** + * Interface representing a request to send RSVP to an event. + */ +export type SendRsvpRequest = { + status: RsvpStatus; +}; + +/** + * Interface representing the query parameters for listing events. + */ +export interface ListEventQueryParams extends ListQueryParams { + /** + * Return events that have a status of cancelled. + * If an event is recurring, then it returns no matter the value set. + * Different providers have different semantics for cancelled events. + */ + showCancelled?: boolean; + /** + * Specify calendar ID of the event. "primary" is a supported value indicating the user's primary calendar. + */ + calendarId: string; + /** + * Return events matching the specified title. + */ + title?: string; + /** + * Return events matching the specified description. + * Graph: NOT supported + */ + description?: string; + /** + * Return events matching the specified location. + */ + location?: string; + /** + * Return events ending before the specified unix timestamp. + * Defaults to a month from now. Not respected by metadata filtering. + */ + end?: string; + /** + * Return events starting after the specified unix timestamp. + * Defaults to the current timestamp. Not respected by metadata filtering. + */ + start?: string; + /** + * Pass in your metadata key and value pair to search for metadata. + */ + metadataPair?: Record; + /** + * If true, the response will include an event for each occurrence of a recurring event within the requested time range. + * If false, only a single primary event will be returned for each recurring event. + * Cannot be used when filtering on metadata. + * Defaults to false. + */ + expandRecurring?: boolean; + /** + * Returns events with a busy status of true. + */ + busy?: boolean; + /** + * Order results by the specified field. + * Currently only start is supported. + */ + orderBy?: string; + /** + * The maximum number of objects to return. + * This field defaults to 50. The maximum allowed value is 200. + */ + limit?: number; + /** + * An identifier that specifies which page of data to return. + * This value should be taken from the {@link NylasListResponse.nextCursor} response field. + */ + pageToken?: string; +} + +/** + * Interface representing of the query parameters for creating an event. + */ +export interface CreateEventQueryParams { + /** + * The ID of the calendar to create the event in. + */ + calendarId: string; + /** + * Email notifications containing the calendar event is sent to all event participants. + */ + notifyParticipants?: boolean; +} + +/** + * Interface representing of the query parameters for finding an event. + */ +export interface FindEventQueryParams { + /** + * Calendar ID to find the event in. "primary" is a supported value indicating the user's primary calendar. + */ + calendarId: string; +} + +/** + * Interface representing of the query parameters for updating events. + */ +export type UpdateEventQueryParams = CreateEventQueryParams; + +/** + * Interface representing of the query parameters for destroying events. + */ +export type DestroyEventQueryParams = CreateEventQueryParams; + +/** + * Interface representing of the query parameters for sending RSVP to an event. + */ +export type SendRsvpQueryParams = FindEventQueryParams; + +/** + * Enum representing the status of an event. + */ +type Status = 'confirmed' | 'tentative' | 'cancelled'; + +/** + * Enum representing the status of an RSVP response. + */ +type RsvpStatus = 'yes' | 'no' | 'maybe'; + +/** + * Enum representing the visibility of an event. + */ +type Visibility = 'default' | 'public' | 'private'; + +/** + * Enum representing the supported conferencing providers. + */ +type ConferencingProvider = + | 'Google Meet' + | 'Zoom Meeting' + | 'Microsoft Teams' + | 'GoToMeeting' + | 'WebEx'; + +/** + * Enum representing the status of an event participant. + */ +type ParticipantStatus = 'noreply' | 'yes' | 'no' | 'maybe'; + +/** + * Enum representing the different types of reminders. + */ +type ReminderMethod = 'email' | 'popup' | 'sound' | 'display'; + +/** + * Type representing the different conferencing objects. + */ +type Conferencing = Details | Autocreate; + +/** + * Type representing the different objects representing time and duration for events. + */ +type When = Time | Timespan | Date | Datespan; + +/** + * Type representing the different objects representing time and duration when creating events. + */ +type CreateWhen = + | Omit + | Omit + | Omit + | Omit; + +/** + * Enum representing the different types of when objects. + */ +export enum WhenType { + Time = 'time', + Timespan = 'timespan', + Date = 'date', + Datespan = 'datespan', +} + +/** + * Interface of a conferencing details object + */ +export interface Details { + /** + * The conferencing provider + */ + provider: ConferencingProvider; + + /** + * The conferencing details + */ + details: DetailsConfig; +} + +/** + * Interface of a the configuration for a conferencing object + */ +export interface DetailsConfig { + /** + * The conferencing meeting code. Used for Zoom. + */ + meetingCode?: string; + /** + * The conferencing meeting password. Used for Zoom. + */ + password?: string; + /** + * The conferencing meeting url. + */ + url?: string; + /** + * The conferencing meeting pin. Used for Google Meet. + */ + pin?: string; + /** + * The conferencing meeting phone numbers. Used for Google Meet. + */ + phone?: string[]; +} + +/** + * Class representation of a conferencing autocreate object + */ +export interface Autocreate { + /** + * The conferencing provider + */ + provider: ConferencingProvider; + /** + * Empty dict to indicate an intention to autocreate a video link. + * Additional provider settings may be included in autocreate.settings, but Nylas does not validate these. + */ + autocreate: Record; +} + +/** + * Class representation of a specific point in time. + * A meeting at 2pm would be represented as a time subobject. + */ +export interface Time { + /** + * A UNIX timestamp representing the time of occurrence. + */ + time: number; + /** + * If timezone is present, then the value for time will be read with timezone. + * Timezone using IANA formatted string. (e.g. "America/New_York") + * @see List of tz database time zones + */ + timezone: string; + /** + * The type of 'when' object. + */ + type: WhenType.Time; +} + +/** + * Class representation of a time span with start and end times. + * An hour lunch meeting would be represented as timespan subobjects. + */ +export interface Timespan { + /** + * The start time of the event. + */ + startTime: number; + /** + * The end time of the event. + */ + endTime: number; + /** + * The timezone of the start time. + * Timezone using IANA formatted string. (e.g. "America/New_York") + * @see List of tz database time zones + */ + startTimezone?: string; + /** + * The timezone of the end time. + * Timezone using IANA formatted string. (e.g. "America/New_York") + * @see List of tz database time zones + */ + endTimezone?: string; + /** + * The type of 'when' object. + */ + type: WhenType.Timespan; +} + +/** + * Class representation of an entire day spans without specific times. + * Your birthday and holidays would be represented as date subobjects. + */ +export interface Date { + /** + * Date of occurrence in ISO 8601 format. + * @see ISO 8601 + */ + date: string; + /** + * The type of 'when' object. + */ + type: WhenType.Date; +} + +/** + * Class representation of a specific dates without clock-based start or end times. + * A business quarter or academic semester would be represented as datespan subobjects. + */ +export interface Datespan { + /** + * The start date in ISO 8601 format. + * @see ISO 8601 + */ + startDate: string; + /** + * The end date in ISO 8601 format. + * @see ISO 8601 + */ + endDate: string; + /** + * The type of 'when' object. + */ + type: WhenType.Datespan; +} + +/** + * Interface representing an Event participant. + */ +export interface Participant { + /** + * Participant's email address. + */ + email: string; + /** + * Participant's name. + */ + name?: string; + /** + * Participant's status. + */ + status: ParticipantStatus; + /** + * Comment by the participant. + */ + comment?: string; + /** + * Participant's phone number. + */ + phoneNumber?: string; +} + +/** + * Interface representing the reminders field of an event. + */ +export interface Reminders { + /** + * Whether to use the default reminders for the calendar. + * When true, uses the default reminder settings for the calendar + */ + useDefault: boolean; + /** + * A list of reminders for the event if useDefault is set to false. + */ + overrides: ReminderOverride[]; +} + +/** + * Interface representing the reminder details for an event. + */ +export interface ReminderOverride { + /** + * The number of minutes before the event start time when a user wants a reminder for this event. + * Reminder minutes are in the following format: "[20]". + */ + reminderMinutes: string; + /** + * Method to remind the user about the event. (Google only). + */ + reminderMethod: ReminderMethod; +} + +/** + * Interface representing an email address and optional name. + */ +export interface EmailName { + /** + * Email address. + */ + email: string; + /** + * Full name. + */ + name?: string; +} diff --git a/src/models/file.ts b/src/models/file.ts deleted file mode 100644 index a09b5b79..00000000 --- a/src/models/file.ts +++ /dev/null @@ -1,143 +0,0 @@ -import Attributes, { Attribute } from './attributes'; -import RestfulModel from './restful-model'; -import NylasConnection from '../nylas-connection'; - -export type FileProperties = { - contentType?: string; - size?: number; - filename?: string; - messageIds?: string[]; - contentId?: string; - contentDisposition?: string; - data?: unknown; -}; - -export default class File extends RestfulModel implements FileProperties { - contentType?: string; - size?: number; - filename?: string; - messageIds?: string[]; - contentId?: string; - contentDisposition?: string; - data?: unknown; - static collectionName = 'files'; - static attributes: Record = { - ...RestfulModel.attributes, - contentType: Attributes.String({ - modelKey: 'contentType', - jsonKey: 'content_type', - }), - size: Attributes.Number({ - modelKey: 'size', - }), - filename: Attributes.String({ - modelKey: 'filename', - }), - messageIds: Attributes.StringList({ - modelKey: 'messageIds', - jsonKey: 'message_ids', - }), - contentId: Attributes.String({ - modelKey: 'contentId', - jsonKey: 'content_id', - }), - contentDisposition: Attributes.String({ - modelKey: 'contentDisposition', - jsonKey: 'content_disposition', - }), - data: Attributes.Object({ - modelKey: 'data', - readOnly: true, - }), - }; - - constructor(connection: NylasConnection, props?: FileProperties) { - super(connection, props); - this.initAttributes(props); - } - - upload( - callback?: (error: Error | null, model?: File) => void - ): Promise { - if (!this.filename) { - throw new Error('Please define a filename'); - } - if (!this.data) { - throw new Error('Please add some data to the file'); - } - if (!this.contentType) { - throw new Error('Please define a content-type'); - } - - const formOptions: Record = { - filename: this.filename, - contentType: this.contentType, - }; - - if (this.size) { - formOptions.knownLength = this.size; - } - - return this.connection - .request({ - method: 'POST', - path: `/${File.collectionName}`, - json: true, - formData: { - file: { - value: this.data, - options: formOptions, - }, - }, - }) - .then(json => { - // The API returns a list of files. It should - // always have a length of 1 since we only - // upload file-by-file. - if (json.length > 0) { - this.fromJSON(json[0]); - if (callback) { - callback(null, this); - } - return Promise.resolve(this); - } else { - return Promise.reject(null); - } - }) - .catch(err => { - if (callback) { - callback(err); - } - return Promise.reject(err); - }); - } - - download( - callback?: ( - error: Error | null, - file?: { body: any; [key: string]: any } - ) => void - ): Promise { - if (!this.id) { - throw new Error('Please provide a File id'); - } - - return this.connection - .request({ - path: `/files/${this.id}/download`, - downloadRequest: true, - }) - .then(file => { - if (callback) { - callback(null, file); - } - return Promise.resolve(file); - }) - .catch(err => { - if (callback) { - callback(err); - } - return Promise.reject(err); - }); - } -} diff --git a/src/models/folder.ts b/src/models/folder.ts deleted file mode 100644 index 420cdb2d..00000000 --- a/src/models/folder.ts +++ /dev/null @@ -1,51 +0,0 @@ -import RestfulModel, { SaveCallback } from './restful-model'; -import Attributes, { Attribute } from './attributes'; -import NylasConnection from '../nylas-connection'; - -export type FolderProperties = { - displayName?: string; - name?: string; -}; - -export default class Folder extends RestfulModel implements FolderProperties { - displayName?: string; - name?: string; - jobStatusId?: string; - static collectionName = 'folders'; - static attributes: Record = { - ...RestfulModel.attributes, - name: Attributes.String({ - modelKey: 'name', - jsonKey: 'name', - }), - displayName: Attributes.String({ - modelKey: 'displayName', - jsonKey: 'display_name', - }), - jobStatusId: Attributes.String({ - modelKey: 'jobStatusId', - jsonKey: 'job_status_id', - readOnly: true, - }), - }; - - constructor(connection: NylasConnection, props?: FolderProperties) { - super(connection, props); - this.initAttributes(props); - } - - save(params: {} | SaveCallback = {}, callback?: SaveCallback): Promise { - return super.save(params, callback); - } -} - -export class Label extends Folder { - static collectionName = 'labels'; - constructor(connection: NylasConnection, props?: FolderProperties) { - super(connection, props); - } - - saveRequestBody(): Record { - return { display_name: this.displayName }; - } -} diff --git a/src/models/folders.ts b/src/models/folders.ts new file mode 100644 index 00000000..41e6ab10 --- /dev/null +++ b/src/models/folders.ts @@ -0,0 +1,86 @@ +/** + * Interface of a folder object from Nylas. + */ +export interface Folder { + /** + * A globally unique object identifier. + */ + id: string; + + /** + * Folder name. + */ + name: string; + + /** + * The type of object. + */ + object: string; + + /** + * Grant ID of the Nylas account + */ + grantId: string; + + /** + * (Google only) Folder background color. + */ + backgroundColor?: string; + + /** + * (Google only) Indicates if the folder is user created or system created. + */ + systemFolder?: boolean; + + /** + * (Google only) Folder text color. + */ + textColor?: string; + + /** + * (Microsoft only) The number of immediate child folders in the current folder. + */ + childCount?: number; + + /** + * (Microsoft only) ID of the parent folder. + */ + parentId?: string; + + /** + * The number of items inside of a folder. + */ + totalCount?: number; + + /** + * The number of unread items inside of a folder. + */ + unreadCount?: number; +} + +/** + * Interface for creating a new folder. + */ +export interface CreateFolderRequest { + /** + * Creates a folder with the specified display name. (Constraints: 1 to 1024 chars) + */ + name: string; + + /** + * (Microsoft only) ID of the parent folder. + */ + parentId?: string; + + /** + * (Google only) The text color of the folder in the hexadecimal format "#0099EE". See Google Defined Values for more information. + */ + textColor?: string; + + /** + * (Google only) The background color of the folder in the hexadecimal format "#0099EE". See Google Defined Values for more information. + */ + backgroundColor?: string; +} + +export type UpdateFolderRequest = Partial; diff --git a/src/models/free-busy.ts b/src/models/free-busy.ts deleted file mode 100644 index 5218c546..00000000 --- a/src/models/free-busy.ts +++ /dev/null @@ -1,141 +0,0 @@ -import Model from './model'; -import Attributes, { Attribute } from './attributes'; - -export type FreeBusyQuery = { - startTime: number; - endTime: number; - emails?: string[]; - calendars?: FreeBusyCalendarProperties[]; -}; - -export type FreeBusyCalendarProperties = { - accountId: string; - calendarIds: string[]; -}; - -export class FreeBusyCalendar extends Model - implements FreeBusyCalendarProperties { - accountId = ''; - calendarIds: string[] = []; - static attributes: Record = { - accountId: Attributes.String({ - modelKey: 'accountId', - jsonKey: 'account_id', - }), - calendarIds: Attributes.StringList({ - modelKey: 'calendarIds', - jsonKey: 'calendar_ids', - }), - }; - - constructor(props?: FreeBusyCalendarProperties) { - super(); - this.initAttributes(props); - } -} - -export type TimeSlotCapacityProperties = { - eventId: string; - currentCapacity: number; - maxCapacity: number; -}; - -export class TimeSlotCapacity extends Model - implements TimeSlotCapacityProperties { - eventId = ''; - currentCapacity = 0; - maxCapacity = 0; - static attributes: Record = { - eventId: Attributes.String({ - modelKey: 'eventId', - jsonKey: 'event_id', - }), - currentCapacity: Attributes.Number({ - modelKey: 'currentCapacity', - jsonKey: 'current_capacity', - }), - maxCapacity: Attributes.Number({ - modelKey: 'maxCapacity', - jsonKey: 'max_capacity', - }), - }; - - constructor(props?: TimeSlotCapacityProperties) { - super(); - this.initAttributes(props); - } -} - -export type TimeSlotProperties = { - status: string; - startTime: number; - endTime: number; - emails?: string[]; - capacity?: TimeSlotCapacityProperties; -}; - -export class TimeSlot extends Model implements TimeSlotProperties { - object = 'time_slot'; - status = ''; - startTime = 0; - endTime = 0; - emails?: string[]; - capacity?: TimeSlotCapacity; - static attributes: Record = { - object: Attributes.String({ - modelKey: 'object', - }), - status: Attributes.String({ - modelKey: 'status', - }), - startTime: Attributes.Number({ - modelKey: 'startTime', - jsonKey: 'start_time', - }), - endTime: Attributes.Number({ - modelKey: 'endTime', - jsonKey: 'end_time', - }), - emails: Attributes.StringList({ - modelKey: 'emails', - }), - capacity: Attributes.Object({ - modelKey: 'capacity', - itemClass: TimeSlotCapacity, - }), - }; - - constructor(props?: TimeSlotProperties) { - super(); - this.initAttributes(props); - } -} - -export type FreeBusyProperties = { - email: string; - timeSlots: TimeSlotProperties[]; -}; - -export default class FreeBusy extends Model implements FreeBusyProperties { - object = 'free_busy'; - email = ''; - timeSlots: TimeSlot[] = []; - static attributes: Record = { - object: Attributes.String({ - modelKey: 'object', - }), - email: Attributes.String({ - modelKey: 'email', - }), - timeSlots: Attributes.Collection({ - modelKey: 'timeSlots', - jsonKey: 'time_slots', - itemClass: TimeSlot, - }), - }; - - constructor(props?: FreeBusyProperties) { - super(); - this.initAttributes(props); - } -} diff --git a/src/models/freeBusy.ts b/src/models/freeBusy.ts new file mode 100644 index 00000000..56851cfb --- /dev/null +++ b/src/models/freeBusy.ts @@ -0,0 +1,84 @@ +/** + * Interface representation of a Nylas free-busy time slot object. + */ +export interface FreeBusyTimeSlot { + /** + * Unix timestamp for the start of the slot. + */ + startTime: number; + /** + * Unix timestamp for the end of the slot. + */ + endTime: number; + /** + * The status of the time slot. + */ + status: string; +} + +/** + * Class representation of a Nylas get free-busy request + */ +export interface GetFreeBusyRequest { + /** + * Unix timestamp representing the start of the time block for assessing the account's free/busy schedule. + */ + startTime: number; + /** + * Unix timestamp representing the end of the time block for assessing the account's free/busy schedule. + */ + endTime: number; + /** + * A list of email addresses to check the free/busy schedules for. + */ + emails: string[]; +} + +/** + * Enum representing the type of free/busy information returned for a calendar. + */ +export enum FreeBusyType { + FREE_BUSY = 'free_busy', + ERROR = 'error', +} + +/** + * Union type of the possible Nylas get free busy response. + */ +export type GetFreeBusyResponse = FreeBusy | FreeBusyError; + +/** + * This interface represents a successful free-busy response. + */ +export interface FreeBusy { + /** + * The participant's email address. + */ + email: string; + /** + * A list of busy time slots. + */ + timeSlots: FreeBusyTimeSlot[]; + /** + * The type of the response. + */ + object: FreeBusyType.FREE_BUSY; +} + +/** + * This interface represents a failed free-busy response. + */ +export interface FreeBusyError { + /** + * The participant's email address. + */ + email: string; + /** + * Description of the error fetching data for this participant. + */ + error: string; + /** + * The type of the response. + */ + object: FreeBusyType.ERROR; +} diff --git a/src/models/grants.ts b/src/models/grants.ts new file mode 100644 index 00000000..d3e08fdb --- /dev/null +++ b/src/models/grants.ts @@ -0,0 +1,138 @@ +import { Provider } from './auth.js'; + +/** + * Interface representing a Nylas Grant object. + */ +export interface Grant { + /** + * Globally unique object identifier. + */ + id: string; + /** + * OAuth provider that the user authenticated with. + */ + provider: string; + /** + * Scopes specified for the grant. + */ + scope: string[]; + /** + * Unix timestamp when the grant was created. + */ + createdAt: number; + /** + * Status of the grant, if it is still valid or if the user needs to re-authenticate. + */ + grantStatus?: string; + /** + * Email address associated with the grant. + */ + email?: string; + /** + * End user's client user agent. + */ + userAgent?: string; + /** + * End user's client IP address. + */ + ip?: string; + /** + * Initial state that was sent as part of the OAuth request. + */ + state?: string; + /** + * Unix timestamp when the grant was updated. + */ + updatedAt?: number; + /** + * Provider's ID for the user this grant is associated with. + */ + providerUserId?: string; + /** + * Settings required by the provider that were sent as part of the OAuth request. + */ + settings?: Record; +} + +/** + * Interface representing a request to create a grant. + */ +export interface CreateGrantRequest { + /** + * OAuth provider + */ + provider: Provider; + /** + * Settings required by provider. + */ + settings: Record; + /** + * Optional state value to return to developer's website after authentication flow is completed. + */ + state?: string; + /** + * Optional list of scopes to request. If not specified it will use the integration default scopes. + */ + scope?: string[]; +} + +/** + * Interface representing a request to update a grant. + */ +export interface UpdateGrantRequest { + /** + * Settings required by provider. + */ + settings?: Record; + /** + * List of integration scopes for the grant. + */ + scope?: string[]; +} + +/** + * Interface representing the query parameters for listing grants. + */ +export interface ListGrantsQueryParams { + /** + * The maximum number of objects to return. + * This field defaults to 10. The maximum allowed value is 200. + */ + limit?: number; + /** + * Offset grant results by this number. + */ + offset?: number; + /** + * Sort entries by field name + */ + sortBy?: 'createdAt' | 'updatedAt'; + /** + * Specify ascending or descending order. + */ + orderBy?: 'asc' | 'desc'; + /** + * Scope grants from a specific point in time by Unix timestamp. + */ + since?: number; + /** + * Scope grants to a specific point in time by Unix timestamp. + */ + before?: number; + /** + * Filtering your query based on grant email address (if applicable) + */ + email?: string; + /** + * Filtering your query based on grant email status (if applicable) + */ + grantStatus?: string; + /** + * Filtering your query based on grant IP address + */ + ip?: string; + /** + * Filtering your query based on OAuth provider + */ + provider?: Provider; +} diff --git a/src/models/job-status-restful-model-collection.ts b/src/models/job-status-restful-model-collection.ts deleted file mode 100644 index d23899c4..00000000 --- a/src/models/job-status-restful-model-collection.ts +++ /dev/null @@ -1,25 +0,0 @@ -import RestfulModelCollection from './restful-model-collection'; -import JobStatus from './job-status'; -import NylasConnection from '../nylas-connection'; -import OutboxJobStatus from './outbox-job-status'; - -export default class JobStatusRestfulModelCollection extends RestfulModelCollection< - JobStatus -> { - connection: NylasConnection; - modelClass: typeof JobStatus; - - constructor(connection: NylasConnection) { - super(JobStatus, connection); - this.connection = connection; - this.modelClass = JobStatus; - } - - protected createModel(json: Record): JobStatus { - if (json['object'] && json['object'] === 'message') { - return new OutboxJobStatus(this.connection).fromJSON(json); - } - - return new this.modelClass(this.connection).fromJSON(json); - } -} diff --git a/src/models/job-status.ts b/src/models/job-status.ts deleted file mode 100644 index 820d7626..00000000 --- a/src/models/job-status.ts +++ /dev/null @@ -1,64 +0,0 @@ -import RestfulModel from './restful-model'; -import Attributes, { Attribute } from './attributes'; -import NylasConnection from '../nylas-connection'; -import Message from './message'; - -export type JobStatusProperties = { - action?: string; - createdAt?: Date; - jobStatusId?: string; - status?: string; - originalData?: Message; - metadata?: object; -}; - -export default class JobStatus extends RestfulModel - implements JobStatusProperties { - action?: string; - createdAt?: Date; - jobStatusId?: string; - status?: string; - originalData?: Message; - metadata?: object; - static collectionName = 'job-statuses'; - static attributes: Record = { - ...RestfulModel.attributes, - action: Attributes.String({ - modelKey: 'action', - readOnly: true, - }), - createdAt: Attributes.DateTime({ - modelKey: 'createdAt', - jsonKey: 'created_at', - readOnly: true, - }), - jobStatusId: Attributes.String({ - modelKey: 'jobStatusId', - jsonKey: 'job_status_id', - readOnly: true, - }), - status: Attributes.String({ - modelKey: 'status', - readOnly: true, - }), - originalData: Attributes.Object({ - modelKey: 'originalData', - jsonKey: 'original_data', - readOnly: true, - }), - metadata: Attributes.Object({ - modelKey: 'metadata', - readOnly: true, - }), - }; - - constructor(connection: NylasConnection, props?: JobStatusProperties) { - super(connection, props); - this.initAttributes(props); - } - - // Returns the status of a job as a boolean - isSuccessful(): boolean { - return this.status === 'successful'; - } -} diff --git a/src/models/listQueryParams.ts b/src/models/listQueryParams.ts new file mode 100644 index 00000000..b334701b --- /dev/null +++ b/src/models/listQueryParams.ts @@ -0,0 +1,4 @@ +export interface ListQueryParams { + limit?: number; + pageToken?: string; +} diff --git a/src/models/management-account.ts b/src/models/management-account.ts deleted file mode 100644 index 14b517bf..00000000 --- a/src/models/management-account.ts +++ /dev/null @@ -1,214 +0,0 @@ -import ManagementModel from './management-model'; -import Attributes, { Attribute } from './attributes'; -import NylasConnection from '../nylas-connection'; -import Model from './model'; -import { SaveCallback } from './restful-model'; - -export type ApplicationIPAddressesProperties = { - ipAddresses: string[]; - updatedAt: number; -}; - -export class ApplicationIPAddresses extends Model - implements ApplicationIPAddressesProperties { - ipAddresses: string[] = []; - updatedAt = 0; - static attributes: Record = { - ipAddresses: Attributes.StringList({ - modelKey: 'ipAddresses', - jsonKey: 'ip_addresses', - }), - updatedAt: Attributes.Number({ - modelKey: 'updatedAt', - jsonKey: 'updated_at', - }), - }; - - constructor(props?: ApplicationIPAddressesProperties) { - super(); - this.initAttributes(props); - } -} - -export type AccountTokenInfoProperties = { - scopes: string; - state: string; - createdAt: number; - updatedAt: number; -}; - -export class AccountTokenInfo extends Model - implements AccountTokenInfoProperties { - scopes = ''; - state = ''; - createdAt = 0; - updatedAt = 0; - static attributes: Record = { - scopes: Attributes.String({ - modelKey: 'scopes', - }), - state: Attributes.String({ - modelKey: 'state', - }), - createdAt: Attributes.Number({ - modelKey: 'createdAt', - jsonKey: 'created_at', - }), - updatedAt: Attributes.Number({ - modelKey: 'updatedAt', - jsonKey: 'updated_at', - }), - }; - - constructor(props?: AccountTokenInfoProperties) { - super(); - this.initAttributes(props); - } -} - -export type ManagementAccountProperties = { - billingState: string; - emailAddress: string; - namespaceId: string; - provider: string; - syncState: string; - authenticationType: string; - trial: boolean; - metadata?: object; -}; - -export type AccountOperationResponse = { - success: boolean; -}; - -export default class ManagementAccount extends ManagementModel - implements ManagementAccountProperties { - billingState = ''; - emailAddress = ''; - namespaceId = ''; - provider = ''; - syncState = ''; - authenticationType = ''; - trial = false; - metadata?: object; - static collectionName = 'accounts'; - static attributes: Record = { - ...ManagementModel.attributes, - billingState: Attributes.String({ - modelKey: 'billingState', - jsonKey: 'billing_state', - }), - emailAddress: Attributes.String({ - modelKey: 'emailAddress', - jsonKey: 'email', - }), - namespaceId: Attributes.String({ - modelKey: 'namespaceId', - jsonKey: 'namespace_id', - }), - provider: Attributes.String({ - modelKey: 'provider', - }), - syncState: Attributes.String({ - modelKey: 'syncState', - jsonKey: 'sync_state', - }), - authenticationType: Attributes.String({ - modelKey: 'authenticationType', - jsonKey: 'authentication_type', - }), - trial: Attributes.Boolean({ - modelKey: 'trial', - }), - metadata: Attributes.Object({ - modelKey: 'metadata', - }), - }; - - constructor( - connection: NylasConnection, - clientId: string, - props: ManagementAccountProperties - ) { - super(connection, clientId, props); - this.initAttributes(props); - } - - upgrade(): Promise { - return this.connection - .request({ - method: 'POST', - path: `/a/${this.clientId}/${ - (this.constructor as any).collectionName - }/${this.id}/upgrade`, - }) - .then((json: AccountOperationResponse) => Promise.resolve(json)) - .catch(err => Promise.reject(err)); - } - - downgrade(): Promise { - return this.connection - .request({ - method: 'POST', - path: `/a/${this.clientId}/${ - (this.constructor as any).collectionName - }/${this.id}/downgrade`, - }) - .then((json: AccountOperationResponse) => Promise.resolve(json)) - .catch(err => Promise.reject(err)); - } - - revokeAll(keepAccessToken?: string): Promise { - return this.connection - .request({ - method: 'POST', - path: `/a/${this.clientId}/${ - (this.constructor as any).collectionName - }/${this.id}/revoke-all`, - body: { keep_access_token: keepAccessToken }, - }) - .then((json: AccountOperationResponse) => Promise.resolve(json)) - .catch(err => Promise.reject(err)); - } - - ipAddresses(): Promise { - return this.connection - .request({ - method: 'GET', - path: `/a/${this.clientId}/ip_addresses`, - }) - .then(json => - Promise.resolve(new ApplicationIPAddresses().fromJSON(json)) - ) - .catch(err => Promise.reject(err)); - } - - tokenInfo(accessToken?: string): Promise { - return this.connection - .request({ - method: 'POST', - path: `/a/${this.clientId}/${ - (this.constructor as any).collectionName - }/${this.id}/token-info`, - body: { - access_token: accessToken, - }, - }) - .then(json => Promise.resolve(new AccountTokenInfo().fromJSON(json))) - .catch(err => Promise.reject(err)); - } - - save(params: {} | SaveCallback = {}, callback?: SaveCallback): Promise { - return super.save(params, callback); - } - - saveRequestBody(): Record { - return { - metadata: this.metadata, - }; - } - - saveEndpoint(): string { - return `/a/${this.connection.clientId}/accounts`; - } -} diff --git a/src/models/management-model-collection.ts b/src/models/management-model-collection.ts deleted file mode 100644 index 4599e4e8..00000000 --- a/src/models/management-model-collection.ts +++ /dev/null @@ -1,31 +0,0 @@ -import ManagementModel from './management-model'; -import NylasConnection from '../nylas-connection'; -import RestfulModelCollection from './restful-model-collection'; - -export default class ManagementModelCollection< - T extends ManagementModel -> extends RestfulModelCollection { - clientId: string; - - constructor( - modelClass: typeof ManagementModel, - connection: NylasConnection, - clientId: string - ) { - super(modelClass as any, connection); - this.clientId = clientId; - } - - build(args: Record): T { - return super.build(args); - } - - path(): string { - return `/a/${this.clientId}/${this.modelClass.collectionName}`; - } - - protected createModel(json: Record): T { - const props = this.modelClass.propsFromJSON(json, this); - return new (this.modelClass as any)(this.connection, this.clientId, props); - } -} diff --git a/src/models/management-model.ts b/src/models/management-model.ts deleted file mode 100644 index a202d968..00000000 --- a/src/models/management-model.ts +++ /dev/null @@ -1,15 +0,0 @@ -import RestfulModel from './restful-model'; -import NylasConnection from '../nylas-connection'; - -export default class ManagementModel extends RestfulModel { - clientId: string; - - constructor( - connection: NylasConnection, - clientId: string, - props: Record - ) { - super(connection, props); - this.clientId = clientId; - } -} diff --git a/src/models/message-restful-model-collection.ts b/src/models/message-restful-model-collection.ts deleted file mode 100644 index 82712910..00000000 --- a/src/models/message-restful-model-collection.ts +++ /dev/null @@ -1,69 +0,0 @@ -import RestfulModelCollection from './restful-model-collection'; -import Message from './message'; -import NylasConnection from '../nylas-connection'; - -export default class MessageRestfulModelCollection extends RestfulModelCollection< - Message -> { - connection: NylasConnection; - modelClass: typeof Message; - - constructor(connection: NylasConnection) { - super(Message, connection); - this.connection = connection; - this.modelClass = Message; - } - - /** - * Return Multiple Messages by a list of Message IDs. - * @param messageIds The list of message ids to find. - * @param options Additional options including: view, offset, limit, and callback - * @returns The list of messages. - */ - findMultiple( - messageIds: string[], - options?: { - view?: string; - offset?: number; - limit?: number; - callback?: (error: Error | null, results?: Message[]) => void; - } - ): Promise { - if (options && options.view) { - // view is a parameter, so move it into a params object - (options as Record).params = { - view: options.view, - }; - delete options.view; - } - - // If only one message ID was passed in, use the normal find function - if (messageIds.length == 1) { - return this.find(messageIds[0], options).then((message: Message) => { - return [message]; - }); - } - - return this.range({ - path: `${this.path()}/${messageIds.join()}`, - ...options, - }); - } - - /** - * Return raw message contents - * @param messageId The message to fetch content of - * @returns The raw message contents - */ - findRaw(messageId: string): Promise { - return this.connection - .request({ - method: 'GET', - headers: { - Accept: 'message/rfc822', - }, - path: `${this.path()}/${messageId}`, - }) - .catch(err => Promise.reject(err)); - } -} diff --git a/src/models/message.ts b/src/models/message.ts deleted file mode 100644 index f8a34cf2..00000000 --- a/src/models/message.ts +++ /dev/null @@ -1,201 +0,0 @@ -import RestfulModel, { SaveCallback } from './restful-model'; -import Attributes, { Attribute } from './attributes'; -import File, { FileProperties } from './file'; -import Event, { EventProperties } from './event'; -import EmailParticipant, { - EmailParticipantProperties, -} from './email-participant'; -import Folder, { Label, FolderProperties } from './folder'; -import NylasConnection from '../nylas-connection'; - -export type MessageProperties = { - to: EmailParticipantProperties[]; - subject?: string; - from?: EmailParticipantProperties[]; - replyTo?: EmailParticipantProperties[]; - cc?: EmailParticipantProperties[]; - bcc?: EmailParticipantProperties[]; - date?: Date; - threadId?: string; - snippet?: string; - body?: string; - unread?: boolean; - starred?: boolean; - files?: FileProperties[]; - events?: EventProperties[]; - folder?: Folder; - labels?: FolderProperties[]; - headers?: Record; - metadata?: object; - jobStatusId?: string; -}; - -export default class Message extends RestfulModel implements MessageProperties { - to: EmailParticipant[] = []; - subject?: string; - from?: EmailParticipant[]; - replyTo?: EmailParticipant[]; - cc?: EmailParticipant[]; - bcc?: EmailParticipant[]; - date?: Date; - threadId?: string; - snippet?: string; - body?: string; - unread?: boolean; - starred?: boolean; - files?: File[]; - events?: Event[]; - folder?: Folder; - labels?: Label[]; - headers?: Record; - metadata?: object; - jobStatusId?: string; - static collectionName = 'messages'; - static attributes: Record = { - ...RestfulModel.attributes, - subject: Attributes.String({ - modelKey: 'subject', - }), - from: Attributes.Collection({ - modelKey: 'from', - itemClass: EmailParticipant, - }), - replyTo: Attributes.Collection({ - modelKey: 'replyTo', - jsonKey: 'reply_to', - itemClass: EmailParticipant, - }), - to: Attributes.Collection({ - modelKey: 'to', - itemClass: EmailParticipant, - }), - cc: Attributes.Collection({ - modelKey: 'cc', - itemClass: EmailParticipant, - }), - bcc: Attributes.Collection({ - modelKey: 'bcc', - itemClass: EmailParticipant, - }), - date: Attributes.DateTime({ - modelKey: 'date', - }), - threadId: Attributes.String({ - modelKey: 'threadId', - jsonKey: 'thread_id', - }), - snippet: Attributes.String({ - modelKey: 'snippet', - }), - body: Attributes.String({ - modelKey: 'body', - }), - unread: Attributes.Boolean({ - modelKey: 'unread', - }), - starred: Attributes.Boolean({ - modelKey: 'starred', - }), - files: Attributes.Collection({ - modelKey: 'files', - itemClass: File, - readOnly: true, - }), - events: Attributes.Collection({ - modelKey: 'events', - itemClass: Event, - }), - folder: Attributes.Object({ - modelKey: 'folder', - itemClass: Folder, - }), - labels: Attributes.Collection({ - modelKey: 'labels', - itemClass: Label, - }), - metadata: Attributes.Object({ - modelKey: 'metadata', - }), - headers: Attributes.Object({ - modelKey: 'headers', - }), - jobStatusId: Attributes.String({ - modelKey: 'jobStatusId', - jsonKey: 'job_status_id', - readOnly: true, - }), - }; - - constructor(connection: NylasConnection, props?: MessageProperties) { - super(connection, props); - this.initAttributes(props); - } - - // We calculate the list of participants instead of grabbing it from - // a parent because it is a better source of ground truth, and saves us - // from more dependencies. - participants(): EmailParticipant[] { - const participants: Record = {}; - const to = this.to || []; - const cc = this.cc || []; - const from = this.from || []; - const contacts = Array.from(new Set([...to, ...cc, ...from])); - for (const contact of contacts) { - if (contact && (contact.email ? contact.email.length : '') > 0) { - participants[ - `${contact.email || ''.toLowerCase().trim()} ${(contact.name || '') - .toLowerCase() - .trim()}` - ] = new EmailParticipant(contact); - } - } - return Object.values(participants); - } - - fileIds(): (string | undefined)[] { - return this.files ? this.files.map(file => file.id) : []; - } - - getRaw(): Promise { - return this.connection - .request({ - method: 'GET', - headers: { - Accept: 'message/rfc822', - }, - path: `/${Message.collectionName}/${this.id}`, - }) - .catch(err => Promise.reject(err)); - } - - saveRequestBody(): Record { - // It's possible to update most of the fields of a draft. - if (this.constructor.name === 'Draft') { - return super.saveRequestBody(); - } - - // Messages are more limited, though. - const json: Record = {}; - if (this.labels) { - json['label_ids'] = Array.from(this.labels).map(label => label.id); - } else if (this.folder) { - json['folder_id'] = this.folder.id; - } - - json['starred'] = this.starred; - json['unread'] = this.unread; - json['metadata'] = this.metadata; - return json; - } - - save(params: {} | SaveCallback = {}, callback?: SaveCallback): Promise { - // A Message can only be updated - if (this.constructor.name === 'Message' && !this.id) { - throw new Error( - 'Cannot create a message. Please create and send a draft instead.' - ); - } - - return super.save(params, callback); - } -} diff --git a/src/models/messages.ts b/src/models/messages.ts new file mode 100644 index 00000000..a215000d --- /dev/null +++ b/src/models/messages.ts @@ -0,0 +1,283 @@ +import { EmailName } from './events.js'; +import { ListQueryParams } from './listQueryParams.js'; +import { Attachment, CreateAttachmentRequest } from './attachments.js'; + +/** + * @internal Internal interface for creating a message. + */ +export interface BaseCreateMessage { + /** + * An array of message recipients. + */ + to: EmailName[]; + /** + * An array of bcc recipients. + */ + bcc?: EmailName[]; + /** + * An array of cc recipients. + */ + cc?: EmailName[]; + /** + * An array of name and email pairs that override the sent reply-to headers. + */ + replyTo?: EmailName[]; + /** + * An array of files to attach to the message. + */ + attachments?: CreateAttachmentRequest[]; + /** + * The message subject. + */ + subject?: string; + /** + * The full HTML message body. + * Messages with only plain-text representations are up-converted to HTML. + */ + body?: string; + /** + * Whether or not the message has been starred by the user. + */ + starred?: boolean; +} + +/** + * @internal Internal interface for a message. + */ +export interface BaseMessage extends Omit { + /** + * The unique identifier for the message. + */ + id: string; + /** + * Grant ID of the Nylas account. + */ + grantId: string; + /** + * Unix timestamp of when the message was received by the mail server. + * This may be different from the unverified Date header in raw message object. + */ + date: number; + /** + * Unix timestamp of when the message was created. + */ + createdAt: number; + /** + * The ID of the folder(s) the message appears in. + */ + folders: string[]; + /** + * An array of message senders. + */ + from?: EmailName[]; + /** + * An array of files attached to the message. + */ + attachments?: Attachment[]; + /** + * A short snippet of the message body. + * This is the first 100 characters of the message body, with any HTML tags removed. + */ + snippet?: string; + /** + * A reference to the parent thread object. + * If this is a new draft, the thread will be empty. + */ + threadId?: string; + /** + * Whether or not the message has been read by the user. + */ + unread?: boolean; +} + +/** + * Interface representing a Nylas Message object. + */ +export interface Message extends BaseMessage { + /** + * The type of object. + */ + object: 'message'; + /** + * The message headers. + * Only present if the 'fields' query parameter is set to includeHeaders. + */ + headers?: MessageHeaders[]; + /** + * A list of key-value pairs storing additional data. + */ + metadata?: Record; +} + +/** + * Interface representing a request to update a message. + */ +export interface UpdateMessageRequest { + /** + * Sets the message as starred or unstarred. + */ + starred?: boolean; + /** + * Sets the message as read or unread. + */ + unread?: boolean; + /** + * The IDs of the folders the message should appear in. + */ + folders?: string[]; + /** + * A list of key-value pairs storing additional data. + */ + metadata?: Record; +} + +/** + * Interface representing a message header. + */ +export interface MessageHeaders { + /** + * The header name. + */ + name: string; + /** + * The header value. + */ + value: string; +} + +/** + * Enum representing the message fields that can be included in a response. + */ +export enum MessageFields { + STANDARD = 'standard', + INCLUDE_HEADERS = 'include_headers', +} + +/** + * Interface representing information about a scheduled message. + */ +export interface ScheduledMessage { + /** + * The unique identifier for the scheduled message. + */ + scheduleId: number; + /** + * The status of the scheduled message. + */ + status: ScheduledMessageStatus; + /** + * The time the message was sent or failed to send, in epoch time. + */ + closeTime?: number; +} + +/** + * Interface representing a list of scheduled messages. + */ +export interface ScheduledMessagesList { + /** + * The list of scheduled messages. + */ + schedules: ScheduledMessage[]; +} + +/** + * Interface representing a scheduled message status. + */ +export interface ScheduledMessageStatus { + /** + * The status code the describes the state of the scheduled message + */ + code: string; + /** + * A description of the status of the scheduled message + */ + description: string; +} + +/** + * Interface representing a response after stopping a scheduled message. + */ +export interface StopScheduledMessageResponse { + /** + * A message describing the result of the request. + */ + message: string; +} + +/** + * Interface representing the query parameters for listing messages. + */ +export interface ListMessagesQueryParams extends ListQueryParams { + /** + * Return items with a matching literal subject. + */ + subject?: string; + /** + * Return emails that have been sent or received from this list of email addresses. + */ + anyEmail?: string[]; + /** + * Return items containing messages sent to these email address. + */ + to?: string[]; + /** + * Return items containing messages sent from these email address. + */ + from?: string[]; + /** + * Return items containing messages cc'd on these email address. + */ + cc?: string[]; + /** + * Return items containing messages bcc'd on these email address. + */ + bcc?: string[]; + /** + * Return emails that are in these folder IDs. + */ + in?: string[]; + /** + * Return emails that are unread. + */ + unread?: boolean; + /** + * Return emails that are starred. + */ + starred?: boolean; + /** + * Return emails that belong to this thread. + */ + threadId?: string; + /** + * Return emails that have been received before this timestamp. + */ + receivedBefore?: number; + /** + * Return emails that have been received after this timestamp. + */ + receivedAfter?: number; + /** + * Return emails that contain attachments. + */ + hasAttachment?: boolean; + /** + * Allows you to specify to return messages with headers included. + */ + fields?: MessageFields; + /** + * The provider-specific query string used to search messages. + * Available for Google and Microsoft Graph only. + */ + searchQueryNative?: string; +} + +/** + * Interface representing the query parameters for finding a message. + */ +export interface FindMessageQueryParams { + /** + * Allows you to specify to the message with headers included. + */ + fields?: MessageFields; +} diff --git a/src/models/model-collection.ts b/src/models/model-collection.ts deleted file mode 100644 index 0f20dcd7..00000000 --- a/src/models/model-collection.ts +++ /dev/null @@ -1,258 +0,0 @@ -import NylasConnection from '../nylas-connection'; -import Model from './model'; - -export type GetCallback = (error: Error | null, result?: Model) => void; - -const REQUEST_CHUNK_SIZE = 100; - -export default class ModelCollection { - connection: NylasConnection; - modelClass: any; - _path: string; - baseUrl?: string; - - constructor(modelClass: any, connection: NylasConnection, path: string) { - this.modelClass = modelClass; - this.connection = connection; - this._path = path; - if (!this.connection) { - throw new Error('Connection object not provided'); - } - if (!this.modelClass) { - throw new Error('Model class not provided'); - } - } - - forEach( - params: Record = {}, - eachCallback: (item: T) => void, - completeCallback?: (err?: Error | null | undefined) => void - ): void { - if (params.view == 'count') { - const err = new Error('forEach() cannot be called with the count view'); - if (completeCallback) { - completeCallback(err); - } - throw err; - } - - let offset = 0; - - const iteratee = (): Promise => { - return this.getItems(params, offset, REQUEST_CHUNK_SIZE).then(items => { - for (const item of items) { - eachCallback(item); - } - offset += items.length; - const finished = items.length < REQUEST_CHUNK_SIZE; - if (!finished) { - return iteratee(); - } - }); - }; - - iteratee().then( - () => { - if (completeCallback) { - completeCallback(); - } - }, - (err: Error) => { - if (completeCallback) { - return completeCallback(err); - } - } - ); - } - - list( - params: Record = {}, - callback?: (error: Error | null, obj?: T[]) => void - ): Promise { - if (params.view == 'count') { - const err = new Error('list() cannot be called with the count view'); - if (callback) { - callback(err); - } - return Promise.reject(err); - } - - const limit = (params.limit as number) || Infinity; - const offset = params.offset as number; - return this.range({ params, offset, limit, callback }); - } - - find( - id: string, - paramsArg?: Record | GetCallback | null, - callbackArg?: GetCallback | Record | null - ): Promise { - // callback used to be the second argument, and params was the third - let callback: GetCallback | undefined; - if (typeof callbackArg === 'function') { - callback = callbackArg as GetCallback; - } else if (typeof paramsArg === 'function') { - callback = paramsArg as GetCallback; - } - - let params: Record = {}; - if (paramsArg && typeof paramsArg === 'object') { - params = paramsArg; - } else if (callbackArg && typeof callbackArg === 'object') { - params = callbackArg; - } - - if (!id) { - const err = new Error('find() must be called with an item id'); - if (callback) { - callback(err); - } - return Promise.reject(err); - } - - if (params.view == 'count' || params.view == 'ids') { - const err = new Error( - 'find() cannot be called with the count or ids view' - ); - if (callback) { - callback(err); - } - return Promise.reject(err); - } - - return this.getModel(id, params) - .then(model => { - if (callback) { - callback(null, model); - } - return Promise.resolve(model); - }) - .catch(err => { - if (callback) { - callback(err); - } - return Promise.reject(err); - }); - } - - path(): string { - return this._path; - } - - protected range({ - params = {}, - offset = 0, - limit = 100, - callback, - path, - }: { - params?: Record; - offset?: number; - limit?: number; - callback?: (error: Error | null, results?: T[]) => void; - path?: string; - }): Promise { - let accumulated: T[] = []; - - const iteratee = (): Promise => { - const chunkOffset = offset + accumulated.length; - const chunkLimit = Math.min( - REQUEST_CHUNK_SIZE, - limit - accumulated.length - ); - return this.getItems(params, chunkOffset, chunkLimit, path).then( - items => { - accumulated = accumulated.concat(items); - const finished = - items.length < REQUEST_CHUNK_SIZE || accumulated.length >= limit; - if (!finished) { - return iteratee(); - } - } - ); - }; - - // do not return rejected promise when callback is provided - // to prevent unhandled rejection warning - return iteratee().then( - () => { - if (callback) { - callback(null, accumulated); - } - return accumulated; - }, - (err: Error) => { - if (callback) { - callback(err); - } - throw err; - } - ); - } - - protected getItems( - params: Record, - offset: number, - limit: number, - path?: string - ): Promise { - // Items can be either models or ids - - if (!path) { - path = this.path(); - } - - if (params.view == 'ids') { - return this.connection.request({ - method: 'GET', - path, - qs: { ...params, offset, limit }, - baseUrl: this.baseUrl, - }); - } - - return this.getModelCollection(params, offset, limit, path); - } - - protected createModel(json: Record): T { - return new this.modelClass().fromJSON(json) as T; - } - - private getModel( - id: string, - params: Record = {} - ): Promise { - return this.connection - .request({ - method: 'GET', - path: `${this.path()}/${id}`, - qs: params, - baseUrl: this.baseUrl, - }) - .then(json => { - const model = this.createModel(json); - return Promise.resolve(model); - }); - } - - private getModelCollection( - params: Record, - offset: number, - limit: number, - path: string - ): Promise { - return this.connection - .request({ - method: 'GET', - path, - qs: { ...params, offset, limit }, - baseUrl: this.baseUrl, - }) - .then((jsonArray: []) => { - const models = jsonArray.map(json => { - return this.createModel(json); - }); - return Promise.resolve(models); - }); - } -} diff --git a/src/models/model.ts b/src/models/model.ts deleted file mode 100644 index 77fb3487..00000000 --- a/src/models/model.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { Attribute } from './attributes'; - -export type SaveCallback = (error: Error | null, result?: any) => void; - -export default class Model { - static attributes: Record; - - static propsFromJSON( - json: Record, - parent: unknown - ): Record { - const props: Record = {}; - for (const attrName in this.attributes) { - const attr = this.attributes[attrName]; - if (json[attr.jsonKey] !== undefined) { - props[attrName] = attr.fromJSON(json[attr.jsonKey], parent); - } - } - return props; - } - - attributes(): Record { - return (this.constructor as any).attributes; - } - - initAttributes(props?: Record): void { - const attributes = this.attributes(); - for (const prop in props) { - if (props.hasOwnProperty(prop)) { - const attr = attributes[prop]; - if (attr) { - (this as any)[prop] = attr.fromJSON(props[prop], this); - } - } - } - } - - fromJSON(json: Record): this { - const attributes = this.attributes(); - for (const attrName in attributes) { - const attr = attributes[attrName]; - if (json[attr.jsonKey] !== undefined) { - (this as any)[attrName] = attr.fromJSON(json[attr.jsonKey], this); - } - } - return this; - } - - toJSON(enforceReadOnly?: boolean): Record { - const json: Record = {}; - const attributes = this.attributes(); - for (const attrName in attributes) { - const attr = attributes[attrName]; - if (enforceReadOnly === true) { - json[attr.jsonKey] = attr.saveRequestBody((this as any)[attrName]); - } else { - json[attr.jsonKey] = attr.toJSON((this as any)[attrName]); - } - } - return json; - } - - // saveRequestBody is used by save(). It returns a JSON dict containing only the - // fields the API allows updating. Subclasses should override this method. - saveRequestBody(): Record { - return this.toJSON(true); - } - - toString(): string { - return JSON.stringify(this.toJSON()); - } -} diff --git a/src/models/neural-categorizer.ts b/src/models/neural-categorizer.ts deleted file mode 100644 index 382ea9bd..00000000 --- a/src/models/neural-categorizer.ts +++ /dev/null @@ -1,82 +0,0 @@ -import Attributes, { Attribute } from './attributes'; -import Message, { MessageProperties } from './message'; -import Model from './model'; -import NylasConnection from '../nylas-connection'; - -export type CategorizeProperties = { - category: string; - categorizedAt: Date; - modelVersion: string; - subcategories: string[]; -}; - -export class Categorize extends Model implements CategorizeProperties { - category = ''; - categorizedAt: Date = new Date(); - modelVersion = ''; - subcategories: string[] = []; - static attributes: Record = { - category: Attributes.String({ - modelKey: 'category', - }), - categorizedAt: Attributes.DateTime({ - modelKey: 'categorizedAt', - jsonKey: 'categorized_at', - }), - modelVersion: Attributes.String({ - modelKey: 'modelVersion', - jsonKey: 'model_version', - }), - subcategories: Attributes.StringList({ - modelKey: 'subcategories', - }), - }; - - constructor(props?: CategorizeProperties) { - super(); - this.initAttributes(props); - } -} - -export type NeuralCategorizerProperties = MessageProperties & { - categorizer: Categorize; -}; - -export default class NeuralCategorizer extends Message - implements NeuralCategorizerProperties { - categorizer = new Categorize(); - static collectionName = 'categorizer'; - static attributes: Record = { - ...Message.attributes, - categorizer: Attributes.Object({ - modelKey: 'categorizer', - itemClass: Categorize, - }), - }; - - constructor( - connection: NylasConnection, - props?: NeuralCategorizerProperties - ) { - super(connection, props); - this.initAttributes(props); - } - - reCategorize(category: string): Promise { - return this.connection - .request({ - method: 'POST', - path: '/neural/categorize/feedback', - body: { message_id: this.id, category: category }, - headers: { - 'Content-Type': 'application/json', - }, - }) - .then(async json => { - const categorizeResponse = await this.connection.neural.categorize([ - json['message_id'], - ]); - return categorizeResponse[0]; - }); - } -} diff --git a/src/models/neural-clean-conversation.ts b/src/models/neural-clean-conversation.ts deleted file mode 100644 index 1bfb6dd6..00000000 --- a/src/models/neural-clean-conversation.ts +++ /dev/null @@ -1,54 +0,0 @@ -import Message, { MessageProperties } from './message'; -import Attributes, { Attribute } from './attributes'; -import File from './file'; -import NylasConnection from '../nylas-connection'; - -const IMAGE_REGEX = /[(']cid:(.)*[)']/g; - -export type NeuralCleanConversationProperties = MessageProperties & { - conversation: string; - modelVersion: string; -}; - -export default class NeuralCleanConversation extends Message - implements NeuralCleanConversationProperties { - conversation = ''; - modelVersion = ''; - static collectionName = 'conversation'; - static attributes: Record = { - ...Message.attributes, - conversation: Attributes.String({ - modelKey: 'conversation', - }), - modelVersion: Attributes.String({ - modelKey: 'modelVersion', - jsonKey: 'model_version', - }), - }; - - constructor( - connection: NylasConnection, - props?: NeuralCleanConversationProperties - ) { - super(connection, props); - this.initAttributes(props); - } - - extractImages(): Promise { - const f: File[] = []; - if (this.conversation) { - const fileIds = this.conversation.match(IMAGE_REGEX); - if (fileIds) { - // After applying the regex, if there are IDs found they would be - // in the form of => 'cid:xxxx' (including apostrophes), so we discard - // everything before and after the file ID (denoted as xxxx above) - fileIds.forEach(async id => { - const parsedId = id.substring(5, id.length - 1); - const file = await this.connection.files.find(parsedId); - f.push(file); - }); - } - } - return Promise.resolve(f); - } -} diff --git a/src/models/neural-ocr.ts b/src/models/neural-ocr.ts deleted file mode 100644 index c523dd6f..00000000 --- a/src/models/neural-ocr.ts +++ /dev/null @@ -1,29 +0,0 @@ -import Attributes, { Attribute } from './attributes'; -import File, { FileProperties } from './file'; -import NylasConnection from '../nylas-connection'; - -export type NeuralOcrProperties = FileProperties & { - ocr: string[]; - processedPages: number; -}; - -export default class NeuralOcr extends File implements NeuralOcrProperties { - ocr: string[] = []; - processedPages = 0; - static collectionName = 'ocr'; - static attributes: Record = { - ...File.attributes, - ocr: Attributes.StringList({ - modelKey: 'ocr', - }), - processedPages: Attributes.Number({ - modelKey: 'processedPages', - jsonKey: 'processed_pages', - }), - }; - - constructor(connection: NylasConnection, props?: NeuralOcrProperties) { - super(connection, props); - this.initAttributes(props); - } -} diff --git a/src/models/neural-sentiment-analysis.ts b/src/models/neural-sentiment-analysis.ts deleted file mode 100644 index 54677449..00000000 --- a/src/models/neural-sentiment-analysis.ts +++ /dev/null @@ -1,49 +0,0 @@ -import Attributes, { Attribute } from './attributes'; -import RestfulModel from './restful-model'; -import NylasConnection from '../nylas-connection'; - -export type NeuralSentimentAnalysisProperties = { - accountId: string; - sentiment: string; - sentimentScore: number; - processedLength: number; - text: string; -}; - -export default class NeuralSentimentAnalysis extends RestfulModel - implements NeuralSentimentAnalysisProperties { - accountId = ''; - sentiment = ''; - sentimentScore = 0; - processedLength = 0; - text = ''; - static collectionName = 'sentiment'; - static attributes: Record = { - accountId: Attributes.String({ - modelKey: 'accountId', - jsonKey: 'account_id', - }), - sentiment: Attributes.String({ - modelKey: 'sentiment', - }), - sentimentScore: Attributes.Number({ - modelKey: 'sentimentScore', - jsonKey: 'sentiment_score', - }), - processedLength: Attributes.Number({ - modelKey: 'processedLength', - jsonKey: 'processed_length', - }), - text: Attributes.String({ - modelKey: 'text', - }), - }; - - constructor( - connection: NylasConnection, - props?: NeuralSentimentAnalysisProperties - ) { - super(connection, props); - this.initAttributes(props); - } -} diff --git a/src/models/neural-signature-contact.ts b/src/models/neural-signature-contact.ts deleted file mode 100644 index 8aa7b1ce..00000000 --- a/src/models/neural-signature-contact.ts +++ /dev/null @@ -1,142 +0,0 @@ -import Attributes, { Attribute } from './attributes'; -import Contact, { EmailAddress, PhoneNumber, WebPage } from './contact'; -import Model from './model'; -import NylasConnection from '../nylas-connection'; - -type LinkProperties = { - description?: string; - url?: string; -}; - -class Link extends Model implements LinkProperties { - description = ''; - url = ''; - static attributes: Record = { - description: Attributes.String({ - modelKey: 'description', - }), - url: Attributes.String({ - modelKey: 'url', - }), - }; - - constructor(props?: LinkProperties) { - super(); - this.initAttributes(props); - } -} - -type NameProperties = { - firstName?: string; - lastName?: string; -}; - -class Name extends Model implements NameProperties { - firstName = ''; - lastName = ''; - static attributes: Record = { - firstName: Attributes.String({ - modelKey: 'firstName', - jsonKey: 'first_name', - }), - lastName: Attributes.String({ - modelKey: 'lastName', - jsonKey: 'last_name', - }), - }; - - constructor(props?: NameProperties) { - super(); - this.initAttributes(props); - } -} - -export type NeuralSignatureContactProperties = { - jobTitles?: string[]; - links?: Link[]; - phoneNumbers?: string[]; - emails?: string[]; - names?: Name[]; -}; - -export default class NeuralSignatureContact extends Model - implements NeuralSignatureContactProperties { - jobTitles?: string[]; - links?: Link[]; - phoneNumbers?: string[]; - emails?: string[]; - names?: Name[]; - static attributes: Record = { - jobTitles: Attributes.StringList({ - modelKey: 'jobTitles', - jsonKey: 'job_titles', - }), - links: Attributes.Collection({ - modelKey: 'links', - itemClass: Link, - }), - phoneNumbers: Attributes.StringList({ - modelKey: 'phoneNumbers', - jsonKey: 'phone_numbers', - }), - emails: Attributes.StringList({ - modelKey: 'emails', - }), - names: Attributes.Collection({ - modelKey: 'names', - itemClass: Name, - }), - }; - - constructor(props?: NeuralSignatureContactProperties) { - super(); - this.initAttributes(props); - } - - toJSON(): Record { - return { - job_titles: this.jobTitles, - links: this.links, - phone_numbers: this.phoneNumbers, - emails: this.emails, - names: this.names ? this.names.map(name => name.toJSON()) : this.names, - }; - } - - toContactObject(connection: NylasConnection): Contact { - const contact = new Contact(connection); - - if (this.names) { - contact.givenName = this.names[0].firstName; - contact.surname = this.names[0].lastName; - } - if (this.jobTitles) { - contact.jobTitle = this.jobTitles[0]; - } - if (this.emails) { - const contactEmails: EmailAddress[] = []; - this.emails.forEach(email => - contactEmails.push(new EmailAddress({ type: 'personal', email: email })) - ); - contact.emailAddresses = contactEmails; - } - if (this.phoneNumbers) { - const contactNumbers: PhoneNumber[] = []; - this.phoneNumbers.forEach(number => - contactNumbers.push(new PhoneNumber({ type: 'mobile', number: number })) - ); - contact.phoneNumbers = contactNumbers; - } - if (this.links) { - const webPages: WebPage[] = []; - this.links.forEach(link => { - if (link['url']) { - webPages.push(new WebPage({ type: 'homepage', url: link['url'] })); - } - }); - contact.webPages = webPages; - } - - return contact; - } -} diff --git a/src/models/neural-signature-extraction.ts b/src/models/neural-signature-extraction.ts deleted file mode 100644 index d57bcf68..00000000 --- a/src/models/neural-signature-extraction.ts +++ /dev/null @@ -1,40 +0,0 @@ -import NeuralSignatureContact from './neural-signature-contact'; -import Attributes, { Attribute } from './attributes'; -import Message, { MessageProperties } from './message'; -import NylasConnection from '../nylas-connection'; - -export type NeuralSignatureExtractionProperties = MessageProperties & { - signature: string; - modelVersion: string; - contacts?: NeuralSignatureContact; -}; - -export default class NeuralSignatureExtraction extends Message - implements NeuralSignatureExtractionProperties { - signature = ''; - modelVersion = ''; - contacts?: NeuralSignatureContact; - static collectionName = 'signature'; - static attributes: Record = { - ...Message.attributes, - signature: Attributes.String({ - modelKey: 'signature', - }), - modelVersion: Attributes.String({ - modelKey: 'modelVersion', - jsonKey: 'model_version', - }), - contacts: Attributes.Object({ - modelKey: 'contacts', - itemClass: NeuralSignatureContact, - }), - }; - - constructor( - connection: NylasConnection, - props?: NeuralSignatureExtractionProperties - ) { - super(connection, props); - this.initAttributes(props); - } -} diff --git a/src/models/neural.ts b/src/models/neural.ts deleted file mode 100644 index e605006c..00000000 --- a/src/models/neural.ts +++ /dev/null @@ -1,167 +0,0 @@ -import RestfulModel from './restful-model'; -import NeuralSentimentAnalysis from './neural-sentiment-analysis'; -import NeuralSignatureExtraction from './neural-signature-extraction'; -import NeuralOcr from './neural-ocr'; -import NeuralCategorizer from './neural-categorizer'; -import NeuralCleanConversation from './neural-clean-conversation'; -import Model from './model'; -import Attributes, { Attribute } from './attributes'; - -export type NeuralMessageOptionsProperties = { - ignoreLinks?: boolean; - ignoreImages?: boolean; - ignoreTables?: boolean; - removeConclusionPhrases?: boolean; - imagesAsMarkdown?: boolean; - parseContacts?: boolean; -}; - -export class NeuralMessageOptions extends Model - implements NeuralMessageOptionsProperties { - ignoreLinks?: boolean; - ignoreImages?: boolean; - ignoreTables?: boolean; - removeConclusionPhrases?: boolean; - imagesAsMarkdown?: boolean; - parseContacts?: boolean; - static attributes: Record = { - ignoreLinks: Attributes.Boolean({ - modelKey: 'ignoreLinks', - jsonKey: 'ignore_links', - }), - ignoreImages: Attributes.Boolean({ - modelKey: 'ignoreImages', - jsonKey: 'ignore_images', - }), - ignoreTables: Attributes.Boolean({ - modelKey: 'ignoreTables', - jsonKey: 'ignore_tables', - }), - removeConclusionPhrases: Attributes.Boolean({ - modelKey: 'removeConclusionPhrases', - jsonKey: 'remove_conclusion_phrases', - }), - imagesAsMarkdown: Attributes.Boolean({ - modelKey: 'imagesAsMarkdown', - jsonKey: 'images_as_markdown', - }), - parseContacts: Attributes.Boolean({ - modelKey: 'parseContacts', - jsonKey: 'parse_contacts', - }), - }; - - constructor(props?: NeuralMessageOptionsProperties) { - super(); - this.initAttributes(props); - } - - toJSON(writeParseContact?: boolean): Record { - const body = super.toJSON() as Record; - if (writeParseContact !== true) { - delete body['parse_contacts']; - } - return body; - } -} - -export default class Neural extends RestfulModel { - sentimentAnalysisMessage( - messageIds: string[] - ): Promise { - const body = { message_id: messageIds }; - const path = 'sentiment'; - - return this.request(path, body).then((jsonArray: []) => { - return jsonArray.map(json => { - return new NeuralSentimentAnalysis(this.connection).fromJSON(json); - }); - }); - } - - sentimentAnalysisText(text: string): Promise { - const body = { text: text }; - const path = 'sentiment'; - - return this.request(path, body).then(json => { - return new NeuralSentimentAnalysis(this.connection).fromJSON(json); - }); - } - - extractSignature( - messageIds: string[], - options?: NeuralMessageOptionsProperties - ): Promise { - let body: Record = { message_id: messageIds }; - const path = 'signature'; - - if (options) { - body = { - ...body, - ...new NeuralMessageOptions(options).toJSON(true), - }; - } - - return this.request(path, body).then((jsonArray: []) => { - return jsonArray.map(json => { - return new NeuralSignatureExtraction(this.connection).fromJSON(json); - }); - }); - } - - ocrRequest(fileId: string, pages?: number[]): Promise { - const body: Record = { file_id: fileId }; - const path = 'ocr'; - - if (pages) { - body['pages'] = pages; - } - - return this.request(path, body).then(json => { - return new NeuralOcr(this.connection).fromJSON(json); - }); - } - - categorize(messageIds: string[]): Promise { - const body = { message_id: messageIds }; - const path = 'categorize'; - - return this.request(path, body).then((jsonArray: []) => { - return jsonArray.map(json => { - return new NeuralCategorizer(this.connection).fromJSON(json); - }); - }); - } - - cleanConversation( - messageIds: string[], - options?: NeuralMessageOptionsProperties - ): Promise { - let body: Record = { message_id: messageIds }; - const path = 'conversation'; - - if (options) { - body = { - ...body, - ...options, - }; - } - - return this.request(path, body).then((jsonArray: []) => { - return jsonArray.map(json => { - return new NeuralCleanConversation(this.connection).fromJSON(json); - }); - }); - } - - private request(path: string, body: object): Promise { - return this.connection.request({ - method: 'PUT', - path: `/neural/${path}`, - body: body, - headers: { - 'Content-Type': 'application/json', - }, - }); - } -} diff --git a/src/models/nylas-api-error.ts b/src/models/nylas-api-error.ts deleted file mode 100644 index 9f964093..00000000 --- a/src/models/nylas-api-error.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Extended Error class for errors returned from the Nylas API - * - * Properties: - * name - The description of the HTTP status code - * message - The error message returned from the Nylas API payload - * statusCode - The status code returned from the API call - * type - The type of error returned from the Nylas API payload - * stack - The Error stacktrace - * missingFields (optional) - The fields that were missing in the call returned from the Nylas API payload - * serverError (optional) - The error returned by the provider returned from the Nylas API payload - */ -export default class NylasApiError extends Error { - statusCode: number; - type: string; - missingFields?: string[]; - serverError?: string; - - /** - * Mapping of HTTP status codes to error descriptions - * - * For more details on what each status code means head to - * https://developer.nylas.com/docs/developer-tools/api/errors/ - */ - errorMapping: Record = { - 400: 'Bad Request', - 401: 'Unauthorized', - 402: 'Request Failed or Payment Required', - 403: 'Forbidden', - 404: 'Not Found', - 405: 'Method Not Allowed', - 409: 'Conflict', - 410: 'Gone', - 418: "I'm a Teapot", - 422: 'Sending Error', - 429: 'Too Many Requests', - 500: 'Server Error', - 502: 'Server Error', - 503: 'Server Error', - 504: 'Server Error', - }; - - constructor(statusCode: number, type: string, message: string) { - super(message); - this.statusCode = statusCode; - this.name = this.errorMapping[statusCode]; - this.type = type; - } -} diff --git a/src/models/outbox-job-status.ts b/src/models/outbox-job-status.ts deleted file mode 100644 index 7bbd5211..00000000 --- a/src/models/outbox-job-status.ts +++ /dev/null @@ -1,55 +0,0 @@ -import OutboxMessage, { OutboxMessageProperties } from './outbox-message'; -import Attributes, { Attribute } from './attributes'; -import NylasConnection from '../nylas-connection'; -import JobStatus, { JobStatusProperties } from './job-status'; - -export type OutboxJobStatusProperties = JobStatusProperties & { - messageId?: string; - threadId?: string; - sendAt?: Date; - originalSendAt?: Date; - originalData?: OutboxMessageProperties; -}; - -export default class OutboxJobStatus extends JobStatus - implements OutboxJobStatusProperties { - messageId?: string; - threadId?: string; - sendAt?: Date; - originalSendAt?: Date; - originalData?: OutboxMessage; - static attributes: Record = { - ...JobStatus.attributes, - messageId: Attributes.String({ - modelKey: 'messageId', - jsonKey: 'message_id', - readOnly: true, - }), - threadId: Attributes.String({ - modelKey: 'threadId', - jsonKey: 'thread_id', - readOnly: true, - }), - sendAt: Attributes.DateTime({ - modelKey: 'sendAt', - jsonKey: 'send_at', - readOnly: true, - }), - originalSendAt: Attributes.DateTime({ - modelKey: 'originalSendAt', - jsonKey: 'original_send_at', - readOnly: true, - }), - originalData: Attributes.Object({ - modelKey: 'originalData', - jsonKey: 'original_data', - itemClass: OutboxMessage, - readOnly: true, - }), - }; - - constructor(connection: NylasConnection, props?: OutboxJobStatusProperties) { - super(connection, props); - this.initAttributes(props); - } -} diff --git a/src/models/outbox-message.ts b/src/models/outbox-message.ts deleted file mode 100644 index ef4a6dd1..00000000 --- a/src/models/outbox-message.ts +++ /dev/null @@ -1,38 +0,0 @@ -import Draft, { DraftProperties } from './draft'; -import Attributes, { Attribute } from './attributes'; -import NylasConnection from '../nylas-connection'; - -export type OutboxMessageProperties = DraftProperties & { - sendAt: Date; - retryLimitDatetime?: Date; - originalSendAt?: Date; -}; - -export default class OutboxMessage extends Draft - implements OutboxMessageProperties { - sendAt = new Date(); - retryLimitDatetime?: Date; - originalSendAt?: Date; - static collectionName = '/v2/outbox'; - static attributes: Record = { - ...Draft.attributes, - sendAt: Attributes.DateTime({ - modelKey: 'sendAt', - jsonKey: 'send_at', - }), - retryLimitDatetime: Attributes.DateTime({ - modelKey: 'retryLimitDatetime', - jsonKey: 'retry_limit_datetime', - }), - originalSendAt: Attributes.DateTime({ - modelKey: 'originalSendAt', - jsonKey: 'original_send_at', - readOnly: true, - }), - }; - - constructor(connection: NylasConnection, props?: OutboxMessageProperties) { - super(connection, props); - this.initAttributes(props); - } -} diff --git a/src/models/outbox.ts b/src/models/outbox.ts deleted file mode 100644 index dda3bf39..00000000 --- a/src/models/outbox.ts +++ /dev/null @@ -1,185 +0,0 @@ -import NylasConnection, { AuthMethod } from '../nylas-connection'; -import Draft, { SendCallback } from './draft'; -import OutboxJobStatus from './outbox-job-status'; -import Model from './model'; -import Attributes, { Attribute } from './attributes'; - -type SendParams = { - sendAt: Date | number; - retryLimitDatetime?: Date | number; - tracking?: Record; - callback?: SendCallback; -}; - -type UpdateParams = { - updatedMessage?: Draft; - sendAt?: Date | number; - retryLimitDatetime?: Date | number; -}; - -export class SendGridVerifiedStatus extends Model { - domainVerified?: boolean; - senderVerified?: boolean; - static attributes: Record = { - domainVerified: Attributes.Boolean({ - modelKey: 'domainVerified', - jsonKey: 'domain_verified', - }), - senderVerified: Attributes.Boolean({ - modelKey: 'senderVerified', - jsonKey: 'sender_verified', - }), - }; -} - -export default class Outbox { - connection: NylasConnection; - private path = '/v2/outbox'; - - constructor(connection: NylasConnection) { - this.connection = connection; - } - - send(draft: Draft, options: SendParams): Promise { - const body = draft.saveRequestBody(); - if (options.tracking) { - body['tracking'] = options.tracking; - } - - const [sendAt, retryLimitDatetime] = Outbox.validateAndFormatDateTime( - options.sendAt, - options.retryLimitDatetime - ); - body['send_at'] = sendAt; - body['retry_limit_datetime'] = retryLimitDatetime; - - return this.request({ - method: 'POST', - path: '', - body: body, - }) - .then(json => { - const message = new OutboxJobStatus(this.connection).fromJSON(json); - - if (options.callback) { - options.callback(null, message); - } - return Promise.resolve(message); - }) - .catch(err => { - if (options.callback) { - options.callback(err); - } - return Promise.reject(err); - }); - } - - update(jobStatusId: string, options: UpdateParams): Promise { - let body: Record = {}; - if (options.updatedMessage) { - body = options.updatedMessage.saveRequestBody(); - } - - const [sendAt, retryLimitDatetime] = Outbox.validateAndFormatDateTime( - options.sendAt, - options.retryLimitDatetime - ); - body['send_at'] = sendAt; - body['retry_limit_datetime'] = retryLimitDatetime; - - return this.request({ - method: 'PATCH', - path: `/${jobStatusId}`, - body: body, - }).then(json => { - const message = new OutboxJobStatus(this.connection).fromJSON(json); - return Promise.resolve(message); - }); - } - - delete(jobStatusId: string): Promise { - return this.request({ - method: 'DELETE', - path: `/${jobStatusId}`, - }); - } - - sendGridVerificationStatus(): Promise { - return this.request({ - method: 'GET', - path: `/onboard/verified_status`, - }).then(json => { - if (json.results) { - json = json.results; - } - const verifiedStatus = new SendGridVerifiedStatus().fromJSON(json); - return Promise.resolve(verifiedStatus); - }); - } - - deleteSendGridSubUser(email: string): Promise { - return this.request({ - method: 'DELETE', - path: `/onboard/subuser`, - body: { email: email }, - }); - } - - private request(options: { - method: string; - path: string; - body?: Record; - }): Promise { - let header; - if (options.body) { - header = { - 'Content-Type': 'application/json', - }; - } - return this.connection.request({ - method: options.method, - path: `${this.path}${options.path}`, - body: options.body, - headers: header, - authMethod: AuthMethod.BEARER, - }); - } - - private static validateAndFormatDateTime( - sendAt?: Date | number, - retryLimitDatetime?: Date | number - ): [number | undefined, number | undefined] { - const sendAtEpoch = - sendAt instanceof Date ? Outbox.dateToEpoch(sendAt) : sendAt; - const retryLimitDatetimeEpoch = - retryLimitDatetime instanceof Date - ? Outbox.dateToEpoch(retryLimitDatetime) - : retryLimitDatetime; - - if (sendAtEpoch && sendAtEpoch !== 0) { - if (sendAtEpoch < Outbox.dateToEpoch(new Date())) { - throw new Error( - 'Cannot set message to be sent at a time before the current time.' - ); - } - } - - if (retryLimitDatetimeEpoch && retryLimitDatetimeEpoch !== 0) { - let validSendAt = sendAtEpoch; - if (!validSendAt || validSendAt === 0) { - validSendAt = Outbox.dateToEpoch(new Date()); - } - if (retryLimitDatetimeEpoch < validSendAt) { - throw new Error( - 'Cannot set message to stop retrying before time to send at.' - ); - } - } - - return [sendAtEpoch, retryLimitDatetimeEpoch]; - } - - private static dateToEpoch(date: Date): number { - return Math.floor(date.getTime() / 1000.0); - } -} diff --git a/src/models/rate-limit-error.ts b/src/models/rate-limit-error.ts deleted file mode 100644 index 756683e7..00000000 --- a/src/models/rate-limit-error.ts +++ /dev/null @@ -1,56 +0,0 @@ -import NylasApiError from './nylas-api-error'; -import { Headers } from 'node-fetch'; - -/** - * This error class represents a 429 error response, with details on the rate limit - */ - -export default class RateLimitError extends NylasApiError { - static RATE_LIMIT_STATUS_CODE = 429; - static RATE_LIMIT_LIMIT_HEADER = 'X-RateLimit-Limit'; - static RATE_LIMIT_RESET_HEADER = 'X-RateLimit-Reset'; - - /** - * The rate limit - */ - rateLimit?: number; - - /** - * The rate limit expiration time, in seconds - */ - rateLimitReset?: number; - - constructor( - type: string, - message: string, - rateLimit?: number, - rateLimitReset?: number - ) { - super(RateLimitError.RATE_LIMIT_STATUS_CODE, type, message); - this.rateLimit = rateLimit; - this.rateLimitReset = rateLimitReset; - } - - /** - * Parses an API response and generates a 429 error with details filled in - * @param parsedApiError The response parsed as a JSON - * @param headers The response headers - * @return The error with the rate limit details filled in - */ - static parseErrorResponse( - parsedApiError: Record, - headers: Headers - ): RateLimitError { - const rateLimit = - Number(headers.get(this.RATE_LIMIT_LIMIT_HEADER)) || undefined; - const rateLimitReset = - Number(headers.get(this.RATE_LIMIT_RESET_HEADER)) || undefined; - - return new RateLimitError( - parsedApiError.type, - parsedApiError.message, - rateLimit, - rateLimitReset - ); - } -} diff --git a/src/models/redirectUri.ts b/src/models/redirectUri.ts new file mode 100644 index 00000000..b6f207f4 --- /dev/null +++ b/src/models/redirectUri.ts @@ -0,0 +1,74 @@ +/** + * Interface representation of a Redirect URI object + */ +export type RedirectUri = { + /** + * Globally unique object identifier + */ + id: string; + /** + * Redirect URL + */ + url: string; + /** + * Platform identifier + */ + platform: string; + /** + * Configuration settings + */ + settings?: RedirectUriSettings; +}; + +/** + * Configuration settings for a Redirect URI object + */ +export type RedirectUriSettings = { + /** + * Related to JS platform + */ + origin?: string; + /** + * Related to iOS platform + */ + bundleId?: string; + /** + * Related to iOS platform + */ + appStoreId?: string; + /** + * Related to iOS platform + */ + teamId?: string; + /** + * Related to Android platform + */ + packageName?: string; + /** + * Related to Android platform + */ + sha1CertificateFingerprint?: string; +}; + +/** + * Class representing a request to create a redirect uri. + */ +export type CreateRedirectUriRequest = { + /** + * Redirect URL. + */ + url: string; + /** + * Platform identifier. + */ + platform: string; + /** + * Optional settings for the redirect uri. + */ + settings?: RedirectUriSettings; +}; + +/** + * Interface representation of a Nylas update redirect uri request + */ +export type UpdateRedirectUriRequest = Partial; diff --git a/src/models/resource.ts b/src/models/resource.ts deleted file mode 100644 index a537ed9c..00000000 --- a/src/models/resource.ts +++ /dev/null @@ -1,57 +0,0 @@ -import RestfulModel from './restful-model'; -import Attributes, { Attribute } from './attributes'; -import NylasConnection from '../nylas-connection'; - -export type ResourceProperties = { - email: string; - name: string; - capacity: string; - building: string; - floorNumber: string; - floorName?: string; -}; - -export default class Resource extends RestfulModel { - email = ''; - name = ''; - capacity = ''; - building = ''; - floorNumber = ''; - floorName?: string; - static collectionName = 'resources'; - static attributes: Record = { - object: Attributes.String({ - modelKey: 'object', - readOnly: true, - }), - email: Attributes.String({ - modelKey: 'email', - }), - name: Attributes.String({ - modelKey: 'name', - }), - capacity: Attributes.String({ - modelKey: 'capacity', - readOnly: true, - }), - building: Attributes.String({ - modelKey: 'building', - readOnly: true, - }), - floorName: Attributes.String({ - modelKey: 'floorName', - jsonKey: 'floor_name', - readOnly: true, - }), - floorNumber: Attributes.String({ - modelKey: 'floorNumber', - jsonKey: 'floor_number', - readOnly: true, - }), - }; - - constructor(connection: NylasConnection, props?: ResourceProperties) { - super(connection, props); - this.initAttributes(props); - } -} diff --git a/src/models/response.ts b/src/models/response.ts new file mode 100644 index 00000000..17211647 --- /dev/null +++ b/src/models/response.ts @@ -0,0 +1,45 @@ +/** + * Interface representing a base response to a request. + */ +export interface NylasBaseResponse { + requestId: string; +} + +/** + * Interface representation of a Nylas response object + */ +export interface NylasResponse { + /** + * The requested data object + */ + data: T; + /** + * The request ID + */ + requestId: string; +} + +/** + * Interface representation of a Nylas response object that contains a list of objects. + */ +export interface NylasListResponse { + /** + * The list of requested data objects. + */ + data: T[]; + /** + * The request ID. + */ + requestId: string; + /** + * The cursor to use to get the next page of data. + */ + nextCursor?: string; +} + +/** + * Helper type for pagination + */ +export type ListResponseInnerType = T extends NylasListResponse + ? R + : never; diff --git a/src/models/restful-model-collection.ts b/src/models/restful-model-collection.ts deleted file mode 100644 index 55bef6c7..00000000 --- a/src/models/restful-model-collection.ts +++ /dev/null @@ -1,177 +0,0 @@ -import Message from './message'; -import NylasConnection from '../nylas-connection'; -import RestfulModel from './restful-model'; -import Thread from './thread'; -import ModelCollection from './model-collection'; - -export type GetCallback = (error: Error | null, result?: RestfulModel) => void; - -export default class RestfulModelCollection< - T extends RestfulModel -> extends ModelCollection { - modelClass: typeof RestfulModel; - - constructor(modelClass: typeof RestfulModel, connection: NylasConnection) { - super(modelClass, connection, modelClass.collectionName); - this.modelClass = modelClass; - this._path = `/${this.modelClass.collectionName}`; - } - - count( - params: Record = {}, - callback?: (err: Error | null, num?: number) => void - ): Promise { - return this.connection - .request({ - method: 'GET', - path: this.path(), - qs: { view: 'count', ...params }, - baseUrl: this.baseUrl, - }) - .then((json: any) => { - if (callback) { - callback(null, json.count); - } - return Promise.resolve(json.count); - }) - .catch((err: Error) => { - if (callback) { - callback(err); - } - return Promise.reject(err); - }); - } - - first( - params: Record = {}, - callback?: (error: Error | null, model?: T) => void - ): Promise { - if (params.view == 'count') { - const err = new Error('first() cannot be called with the count view'); - if (callback) { - callback(err); - } - return Promise.reject(err); - } - - return this.getItems(params, 0, 1) - .then(items => { - if (callback) { - callback(null, items[0]); - } - return Promise.resolve(items[0]); - }) - .catch(err => { - if (callback) { - callback(err); - } - return Promise.reject(err); - }); - } - - search( - query: string, - params: Record = {}, - callback?: (error: Error | null) => void - ): Promise { - if (this.modelClass != Message && this.modelClass != Thread) { - const err = new Error( - 'search() can only be called for messages and threads' - ); - if (callback) { - callback(err); - } - return Promise.reject(err); - } - - if (!query) { - const err = new Error('search() requires a query string'); - if (callback) { - callback(err); - } - return Promise.reject(err); - } - - params.q = query; - const limit = (params.limit as number) || 40; - const offset = params.offset as number; - const path = `${this.path()}/search`; - - return this.range({ params, offset, limit, path }); - } - - delete( - itemOrId: T | string, - params: Record = {}, - callback?: (error: Error | null) => void - ): any { - if (!itemOrId) { - const err = new Error('delete() requires an item or an id'); - if (callback) { - callback(err); - } - return Promise.reject(err); - } - - if (typeof params === 'function') { - callback = params as (error: Error | null) => void; - params = {}; - } - - const item = - typeof itemOrId === 'string' ? this.build({ id: itemOrId }) : itemOrId; - - const options: Record = item.deleteRequestOptions(params); - options.item = item; - - return this.deleteItem(options, callback); - } - - deleteItem( - options: Record, - callbackArg?: (error: Error | null) => void - ): any { - const item = options.item; - // callback used to be in the options object - const callback = options.callback ? options.callback : callbackArg; - const body = options.hasOwnProperty('body') - ? options.body - : item.deleteRequestBody({}); - const qs = options.hasOwnProperty('qs') - ? options.qs - : item.deleteRequestQueryString({}); - - return this.connection - .request({ - method: 'DELETE', - qs: qs, - body: body, - path: `${this.path()}/${item.id}`, - baseUrl: this.baseUrl, - }) - .then(data => { - if (callback) { - callback(null, data); - } - return Promise.resolve(data); - }) - .catch((err: Error) => { - if (callback) { - callback(err); - } - return Promise.reject(err); - }); - } - - protected build(args: Record): T { - const model = this.createModel({}); - for (const key in args) { - (model as any)[key] = args[key]; - } - return model; - } - - protected createModel(json: Record): T { - return new this.modelClass(this.connection).fromJSON(json) as T; - } -} diff --git a/src/models/restful-model-instance.ts b/src/models/restful-model-instance.ts deleted file mode 100644 index 7bd85548..00000000 --- a/src/models/restful-model-instance.ts +++ /dev/null @@ -1,35 +0,0 @@ -import NylasConnection from '../nylas-connection'; -import RestfulModel from './restful-model'; - -export default class RestfulModelInstance { - connection: NylasConnection; - modelClass: typeof RestfulModel; - - constructor(modelClass: typeof RestfulModel, connection: NylasConnection) { - this.modelClass = modelClass; - this.connection = connection; - if (!(this.connection instanceof NylasConnection)) { - throw new Error('Connection object not provided'); - } - if (!this.modelClass) { - throw new Error('Model class not provided'); - } - } - - path(): string { - return `/${this.modelClass.endpointName}`; - } - - get(params: Record = {}): Promise { - return this.connection - .request({ - method: 'GET', - path: this.path(), - qs: params, - }) - .then(json => { - const model = new this.modelClass(this.connection).fromJSON(json) as T; - return Promise.resolve(model); - }); - } -} diff --git a/src/models/restful-model.ts b/src/models/restful-model.ts deleted file mode 100644 index 18bcc0f9..00000000 --- a/src/models/restful-model.ts +++ /dev/null @@ -1,165 +0,0 @@ -import Attributes, { Attribute } from './attributes'; -import NylasConnection from '../nylas-connection'; -import Model from './model'; - -export type SaveCallback = (error: Error | null, result?: RestfulModel) => void; - -interface RestfulModelJSON { - id: string; - object: string; - accountId: string; - [key: string]: any; -} - -type requestOptions = { - body: Record; - qs: Record; -}; - -export default class RestfulModel extends Model { - static endpointName = ''; // overrridden in subclasses - static collectionName = ''; // overrridden in subclasses - - accountId?: string; - connection: NylasConnection; - id?: string; - object?: string; - baseUrl?: string; - static attributes: Record = { - id: Attributes.String({ - modelKey: 'id', - readOnly: true, - }), - object: Attributes.String({ - modelKey: 'object', - readOnly: true, - }), - accountId: Attributes.String({ - modelKey: 'accountId', - jsonKey: 'account_id', - readOnly: true, - }), - }; - - constructor(connection: NylasConnection, props?: Partial) { - super(); - this.connection = connection; - if (!this.connection) { - throw new Error('Connection object not provided'); - } - - this.id = props?.id ? props.id : undefined; - this.accountId = props?.accountId ? props.accountId : undefined; - this.object = props?.object ? props.object : undefined; - } - - static propsFromJSON( - json: Partial = {}, - parent: unknown - ): Partial { - return super.propsFromJSON(json, parent); - } - - isEqual(other: RestfulModel): boolean { - return ( - (other ? other.id : undefined) === this.id && - (other ? other.constructor : undefined) === this.constructor - ); - } - - fromJSON(json: Partial = {}): this { - return super.fromJSON(json) as this; - } - - // Subclasses should override this method. - pathPrefix(): string { - return ''; - } - - saveEndpoint(): string { - const collectionName = (this.constructor as any).collectionName; - return `${this.pathPrefix()}/${collectionName}`; - } - - // deleteRequestQueryString is used by delete(). Subclasses should override this method. - deleteRequestQueryString( - _params: Record - ): Record { - return {}; - } - // deleteRequestBody is used by delete(). Subclasses should override this method. - deleteRequestBody(_params: Record): Record { - return {}; - } - - // deleteRequestOptions is used by delete(). Subclasses should override this method. - deleteRequestOptions(params: Record): requestOptions { - return { - body: this.deleteRequestBody(params), - qs: this.deleteRequestQueryString(params), - }; - } - - // Not every model needs to have a save function, but those who - // do shouldn't have to reimplement the same boilerplate. - // They should instead define a save() function which calls _save. - protected save( - params: {} | SaveCallback = {}, - callback?: SaveCallback - ): Promise { - if (typeof params === 'function') { - callback = params as SaveCallback; - params = {}; - } - return this.connection - .request({ - method: this.id ? 'PUT' : 'POST', - body: this.saveRequestBody(), - qs: params, - path: this.id - ? `${this.saveEndpoint()}/${this.id}` - : `${this.saveEndpoint()}`, - baseUrl: this.baseUrl, - }) - .then(json => { - const newModel = this.fromJSON(json as RestfulModelJSON); - if (callback) { - callback(null, this); - } - return Promise.resolve(newModel); - }) - .catch(err => { - if (callback) { - callback(err); - } - return Promise.reject(err); - }); - } - - protected get( - params: Record = {}, - callback?: (error: Error | null, result?: any) => void, - pathSuffix = '' - ): Promise { - const collectionName = (this.constructor as any).collectionName; - return this.connection - .request({ - method: 'GET', - path: `/${collectionName}/${this.id}${pathSuffix}`, - qs: params, - baseUrl: this.baseUrl, - }) - .then(response => { - if (callback) { - callback(null, response); - } - return Promise.resolve(response); - }) - .catch(err => { - if (callback) { - callback(err); - } - return Promise.reject(err); - }); - } -} diff --git a/src/models/scheduler-booking-request.ts b/src/models/scheduler-booking-request.ts deleted file mode 100644 index c8b2a8c2..00000000 --- a/src/models/scheduler-booking-request.ts +++ /dev/null @@ -1,183 +0,0 @@ -import Attributes, { Attribute } from './attributes'; -import SchedulerTimeSlot from './scheduler-time-slot'; -import Model from './model'; - -export type SchedulerBookingConfirmationProperties = { - id?: string; - accountId?: string; - additionalFieldValues?: object; - calendarEventId?: string; - calendarId?: string; - editHash?: string; - startTime?: Date; - endTime?: Date; - isConfirmed?: boolean; - location?: string; - recipientEmail?: string; - recipientLocale?: string; - recipientName?: string; - recipientTz?: string; - title?: string; -}; - -export class SchedulerBookingConfirmation extends Model - implements SchedulerBookingConfirmationProperties { - id?: string; - accountId?: string; - additionalFieldValues?: object; - calendarEventId?: string; - calendarId?: string; - editHash?: string; - startTime?: Date; - endTime?: Date; - isConfirmed?: boolean; - location?: string; - recipientEmail?: string; - recipientLocale?: string; - recipientName?: string; - recipientTz?: string; - title?: string; - static attributes: Record = { - id: Attributes.Number({ - modelKey: 'id', - }), - accountId: Attributes.String({ - modelKey: 'accountId', - jsonKey: 'account_id', - }), - additionalFieldValues: Attributes.Object({ - modelKey: 'additionalFieldValues', - jsonKey: 'additional_field_values', - }), - calendarEventId: Attributes.String({ - modelKey: 'calendarEventId', - jsonKey: 'calendar_event_id', - }), - calendarId: Attributes.String({ - modelKey: 'calendarId', - jsonKey: 'calendar_id', - }), - editHash: Attributes.String({ - modelKey: 'editHash', - jsonKey: 'edit_hash', - }), - startTime: Attributes.DateTime({ - modelKey: 'startTime', - jsonKey: 'start_time', - }), - endTime: Attributes.DateTime({ - modelKey: 'endTime', - jsonKey: 'end_time', - }), - isConfirmed: Attributes.Boolean({ - modelKey: 'isConfirmed', - jsonKey: 'is_confirmed', - }), - location: Attributes.String({ - modelKey: 'location', - }), - recipientEmail: Attributes.String({ - modelKey: 'recipientEmail', - jsonKey: 'recipient_email', - }), - recipientLocale: Attributes.String({ - modelKey: 'recipientLocale', - jsonKey: 'recipient_locale', - }), - recipientName: Attributes.String({ - modelKey: 'recipientName', - jsonKey: 'recipient_name', - }), - recipientTz: Attributes.String({ - modelKey: 'recipientTz', - jsonKey: 'recipient_tz', - }), - title: Attributes.String({ - modelKey: 'title', - }), - }; - - constructor(props?: SchedulerBookingConfirmationProperties) { - super(); - this.initAttributes(props); - } -} - -export type SchedulerBookingRequestProperties = { - additionalEmails?: string[]; - additionalValues?: object; - email?: string; - locale?: string; - name?: string; - pageHostname?: string; - replacesBookingHash?: string; - slot?: SchedulerTimeSlot; - timezone?: string; -}; - -export default class SchedulerBookingRequest extends Model - implements SchedulerBookingRequestProperties { - additionalEmails?: string[]; - additionalValues?: object; - email?: string; - locale?: string; - name?: string; - pageHostname?: string; - replacesBookingHash?: string; - slot?: SchedulerTimeSlot; - timezone?: string; - static attributes: Record = { - additionalEmails: Attributes.StringList({ - modelKey: 'additionalEmails', - jsonKey: 'additional_emails', - }), - additionalValues: Attributes.Object({ - modelKey: 'additionalValues', - jsonKey: 'additional_values', - }), - email: Attributes.String({ - modelKey: 'email', - }), - locale: Attributes.String({ - modelKey: 'locale', - }), - name: Attributes.String({ - modelKey: 'name', - }), - pageHostname: Attributes.String({ - modelKey: 'pageHostname', - jsonKey: 'page_hostname', - }), - replacesBookingHash: Attributes.String({ - modelKey: 'replacesBookingHash', - jsonKey: 'replaces_booking_hash', - }), - slot: Attributes.Object({ - modelKey: 'slot', - itemClass: SchedulerTimeSlot, - }), - timezone: Attributes.String({ - modelKey: 'timezone', - }), - }; - - constructor(props?: SchedulerBookingRequestProperties) { - super(); - this.initAttributes(props); - } - - /* - * The booking endpoint requires additional_values and additional_emails - to exist regardless if they are empty or not - */ - toJSON(enforceReadOnly?: boolean): Record { - const json = super.toJSON(enforceReadOnly); - if (!this.additionalEmails) { - json['additional_emails'] = []; - } - if (!this.additionalValues) { - json['additional_values'] = {}; - } - return json; - } -} diff --git a/src/models/scheduler-restful-model-collection.ts b/src/models/scheduler-restful-model-collection.ts deleted file mode 100644 index 8edf7567..00000000 --- a/src/models/scheduler-restful-model-collection.ts +++ /dev/null @@ -1,154 +0,0 @@ -import RestfulModelCollection from './restful-model-collection'; -import NylasConnection from '../nylas-connection'; -import Scheduler from './scheduler'; -import SchedulerTimeSlot from './scheduler-time-slot'; -import SchedulerBookingRequest, { - SchedulerBookingConfirmation, -} from './scheduler-booking-request'; - -export type ProviderAvailability = { - busy: [ - { - end: number; - start: number; - } - ]; - email: string; - name: string; -}; - -export default class SchedulerRestfulModelCollection extends RestfulModelCollection< - Scheduler -> { - connection: NylasConnection; - modelClass: typeof Scheduler; - baseUrl: string; - - constructor(connection: NylasConnection) { - super(Scheduler, connection); - this.baseUrl = 'https://api.schedule.nylas.com'; - this.connection = connection; - this.modelClass = Scheduler; - } - - getGoogleAvailability(): Promise { - return this.connection.request({ - method: 'GET', - path: '/schedule/availability/google', - headers: { - 'Content-Type': 'application/json', - }, - baseUrl: this.baseUrl, - }); - } - - getOffice365Availability(): Promise { - return this.connection.request({ - method: 'GET', - path: '/schedule/availability/o365', - headers: { - 'Content-Type': 'application/json', - }, - baseUrl: this.baseUrl, - }); - } - - getPageBySlug(slug: string): Promise { - return this.connection - .request({ - method: 'GET', - path: `/schedule/${slug}/info`, - headers: { - 'Content-Type': 'application/json', - }, - baseUrl: this.baseUrl, - }) - .then(json => { - return Promise.resolve(new Scheduler(this.connection).fromJSON(json)); - }); - } - - getAvailableTimeSlots(slug: string): Promise { - return this.connection - .request({ - method: 'GET', - path: `/schedule/${slug}/timeslots`, - headers: { - 'Content-Type': 'application/json', - }, - baseUrl: this.baseUrl, - }) - .then(json => { - const timeslots: SchedulerTimeSlot[] = json.map( - (timeslot: Record) => { - return new SchedulerTimeSlot().fromJSON(timeslot); - } - ); - return Promise.resolve(timeslots); - }); - } - - bookTimeSlot( - slug: string, - bookingRequest: SchedulerBookingRequest - ): Promise { - return this.connection - .request({ - method: 'POST', - path: `/schedule/${slug}/timeslots`, - headers: { - 'Content-Type': 'application/json', - }, - body: bookingRequest.toJSON(), - baseUrl: this.baseUrl, - }) - .then(json => { - return Promise.resolve( - new SchedulerBookingConfirmation().fromJSON(json) - ); - }); - } - - cancelBooking( - slug: string, - editHash: string, - reason: string - ): Record { - return this.connection - .request({ - method: 'POST', - path: `/schedule/${slug}/${editHash}/cancel`, - headers: { - 'Content-Type': 'application/json', - }, - body: { - reason: reason, - }, - baseUrl: this.baseUrl, - }) - .then(json => { - return Promise.resolve(json); - }); - } - - confirmBooking( - slug: string, - editHash: string - ): Promise { - return this.connection - .request({ - method: 'POST', - path: `/schedule/${slug}/${editHash}/confirm`, - headers: { - 'Content-Type': 'application/json', - }, - body: {}, - baseUrl: this.baseUrl, - }) - .then(json => { - return Promise.resolve( - new SchedulerBookingConfirmation().fromJSON(json) - ); - }); - } -} diff --git a/src/models/scheduler-time-slot.ts b/src/models/scheduler-time-slot.ts deleted file mode 100644 index 10dd8ec5..00000000 --- a/src/models/scheduler-time-slot.ts +++ /dev/null @@ -1,49 +0,0 @@ -import Attributes, { Attribute } from './attributes'; -import Model from './model'; - -export type SchedulerTimeSlotProperties = { - accountId?: string; - calendarId?: string; - hostName?: string; - emails?: string[]; - start?: Date; - end?: Date; -}; - -export default class SchedulerTimeSlot extends Model - implements SchedulerTimeSlotProperties { - accountId?: string; - calendarId?: string; - hostName?: string; - emails?: string[]; - start?: Date; - end?: Date; - static attributes: Record = { - accountId: Attributes.String({ - modelKey: 'accountId', - jsonKey: 'account_id', - }), - calendarId: Attributes.String({ - modelKey: 'calendarId', - jsonKey: 'calendar_id', - }), - hostName: Attributes.String({ - modelKey: 'hostName', - jsonKey: 'host_name', - }), - emails: Attributes.StringList({ - modelKey: 'emails', - }), - start: Attributes.DateTime({ - modelKey: 'start', - }), - end: Attributes.DateTime({ - modelKey: 'end', - }), - }; - - constructor(props?: SchedulerTimeSlotProperties) { - super(); - this.initAttributes(props); - } -} diff --git a/src/models/scheduler.ts b/src/models/scheduler.ts deleted file mode 100644 index a21dd0ee..00000000 --- a/src/models/scheduler.ts +++ /dev/null @@ -1,618 +0,0 @@ -import RestfulModel, { SaveCallback } from './restful-model'; -import Attributes, { Attribute } from './attributes'; -import NylasConnection from '../nylas-connection'; -import Model from './model'; -import Calendar from './calendar'; - -export type SchedulerUploadImageResponse = { - filename: string; - originalFilename: string; - publicUrl: string; - signedUrl: string; -}; - -export type SchedulerAvailableCalendarsProperties = { - id: string; - name: string; - email: string; - calendars: Calendar[]; -}; - -export class SchedulerAvailableCalendars extends Model - implements SchedulerAvailableCalendarsProperties { - id = ''; - name = ''; - email = ''; - calendars: Calendar[] = []; - static attributes: Record = { - calendars: Attributes.Collection({ - modelKey: 'calendars', - itemClass: Calendar, - }), - email: Attributes.String({ - modelKey: 'email', - }), - id: Attributes.String({ - modelKey: 'id', - }), - name: Attributes.String({ - modelKey: 'name', - }), - }; - private _connection?: NylasConnection; - - constructor(props?: SchedulerAvailableCalendarsProperties) { - super(); - this.initAttributes(props); - } - - get connection(): NylasConnection | undefined { - return this._connection; - } - - fromJSON(json: Record, connection?: NylasConnection): this { - // Allow a connection object to be passed in to instantiate a Calendar sub object - if (connection) { - this._connection = connection; - } - return super.fromJSON(json); - } -} - -export type SchedulerAppearanceProperties = { - color?: string; - companyName?: string; - logo?: string; - privacyPolicyRedirect?: string; - showAutoschedule?: boolean; - showNylasBranding?: boolean; - showTimezoneOptions?: boolean; - showWeekView?: boolean; - submitText?: string; - thankYouRedirect?: string; - thankYouText?: string; - thankYouTextSecondary?: string; -}; - -export class SchedulerAppearance extends Model - implements SchedulerAppearanceProperties { - color?: string; - companyName?: string; - logo?: string; - privacyPolicyRedirect?: string; - showAutoschedule?: boolean; - showNylasBranding?: boolean; - showTimezoneOptions?: boolean; - showWeekView?: boolean; - submitText?: string; - thankYouRedirect?: string; - thankYouText?: string; - thankYouTextSecondary?: string; - static attributes: Record = { - color: Attributes.String({ - modelKey: 'color', - }), - companyName: Attributes.String({ - modelKey: 'companyName', - jsonKey: 'company_name', - }), - logo: Attributes.String({ - modelKey: 'logo', - }), - privacyPolicyRedirect: Attributes.String({ - modelKey: 'privacyPolicyRedirect', - jsonKey: 'privacy_policy_redirect', - }), - showAutoschedule: Attributes.Boolean({ - modelKey: 'showAutoschedule', - jsonKey: 'show_autoschedule', - }), - showNylasBranding: Attributes.Boolean({ - modelKey: 'showNylasBranding', - jsonKey: 'show_nylas_branding', - }), - showTimezoneOptions: Attributes.Boolean({ - modelKey: 'showTimezoneOptions', - jsonKey: 'show_timezone_options', - }), - showWeekView: Attributes.Boolean({ - modelKey: 'showWeekView', - jsonKey: 'show_week_view', - }), - submitText: Attributes.String({ - modelKey: 'submitText', - jsonKey: 'submit_text', - }), - thankYouRedirect: Attributes.String({ - modelKey: 'thankYouRedirect', - jsonKey: 'thank_you_redirect', - }), - thankYouText: Attributes.String({ - modelKey: 'thankYouText', - jsonKey: 'thank_you_text', - }), - thankYouTextSecondary: Attributes.String({ - modelKey: 'thankYouTextSecondary', - jsonKey: 'thank_you_text_secondary', - }), - }; - - constructor(props?: SchedulerAppearanceProperties) { - super(); - this.initAttributes(props); - } -} - -export type SchedulerBookingAdditionalFieldsProperties = { - dropdownOptions?: string[]; - label?: string; - multiSelectOptions?: string[]; - name?: string; - order?: number; - pattern?: string; - required?: boolean; - type?: string; -}; - -export class SchedulerBookingAdditionalFields extends Model - implements SchedulerBookingAdditionalFieldsProperties { - dropdownOptions?: string[]; - label?: string; - multiSelectOptions?: string[]; - name?: string; - order?: number; - pattern?: string; - required?: boolean; - type?: string; - static attributes: Record = { - dropdownOptions: Attributes.StringList({ - modelKey: 'dropdownOptions', - jsonKey: 'dropdown_options', - }), - label: Attributes.String({ - modelKey: 'label', - }), - multiSelectOptions: Attributes.StringList({ - modelKey: 'multiSelectOptions', - jsonKey: 'multi_select_options', - }), - name: Attributes.String({ - modelKey: 'name', - }), - order: Attributes.Number({ - modelKey: 'order', - }), - pattern: Attributes.String({ - modelKey: 'pattern', - }), - required: Attributes.Boolean({ - modelKey: 'required', - }), - type: Attributes.String({ - modelKey: 'type', - }), - }; - - constructor(props?: SchedulerBookingAdditionalFieldsProperties) { - super(); - this.initAttributes(props); - } -} - -export type SchedulerBookingOpeningHoursProperties = { - accountId?: string; - days?: string[]; - end?: string; - start?: string; -}; - -export class SchedulerBookingOpeningHours extends Model - implements SchedulerBookingOpeningHoursProperties { - accountId?: string; - days?: string[]; - end?: string; - start?: string; - static attributes: Record = { - accountId: Attributes.String({ - modelKey: 'accountId', - jsonKey: 'account_id', - }), - days: Attributes.StringList({ - modelKey: 'days', - }), - end: Attributes.String({ - modelKey: 'end', - }), - start: Attributes.String({ - modelKey: 'start', - }), - }; - - constructor(props?: SchedulerBookingOpeningHoursProperties) { - super(); - this.initAttributes(props); - } -} - -export type SchedulerBookingProperties = { - additionalFields?: SchedulerBookingAdditionalFieldsProperties[]; - additionalGuestsHidden?: boolean; - availableDaysInFuture?: number; - calendarInviteToGuests?: boolean; - cancellationPolicy?: string; - confirmationEmailsToGuests?: boolean; - confirmationEmailToHost?: boolean; - confirmationMethod?: string; - minBookingNotice?: number; - minBuffer?: number; - minCancellationNotice?: number; - intervalMinutes?: number; - nameFieldHidden?: boolean; - openingHours?: SchedulerBookingOpeningHoursProperties[]; - schedulingMethod?: string; -}; - -export class SchedulerBooking extends Model - implements SchedulerBookingProperties { - additionalFields?: SchedulerBookingAdditionalFields[]; - additionalGuestsHidden?: boolean; - availableDaysInFuture?: number; - calendarInviteToGuests?: boolean; - cancellationPolicy?: string; - confirmationEmailsToGuests?: boolean; - confirmationEmailToHost?: boolean; - confirmationMethod?: string; - minBookingNotice?: number; - minBuffer?: number; - minCancellationNotice?: number; - intervalMinutes?: number; - nameFieldHidden?: boolean; - openingHours?: SchedulerBookingOpeningHours[]; - schedulingMethod?: string; - static attributes: Record = { - additionalFields: Attributes.Collection({ - modelKey: 'additionalFields', - jsonKey: 'additional_fields', - itemClass: SchedulerBookingAdditionalFields, - }), - additionalGuestsHidden: Attributes.Boolean({ - modelKey: 'additionalGuestsHidden', - jsonKey: 'additional_guests_hidden', - }), - availableDaysInFuture: Attributes.Number({ - modelKey: 'availableDaysInFuture', - jsonKey: 'available_days_in_future', - }), - calendarInviteToGuests: Attributes.Boolean({ - modelKey: 'calendarInviteToGuests', - jsonKey: 'calendar_invite_to_guests', - }), - cancellationPolicy: Attributes.String({ - modelKey: 'cancellationPolicy', - jsonKey: 'cancellation_policy', - }), - confirmationEmailsToGuests: Attributes.Boolean({ - modelKey: 'confirmationEmailsToGuests', - jsonKey: 'confirmation_emails_to_guests', - }), - confirmationEmailToHost: Attributes.Boolean({ - modelKey: 'confirmationEmailToHost', - jsonKey: 'confirmation_emails_to_host', - }), - confirmationMethod: Attributes.String({ - modelKey: 'confirmationMethod', - jsonKey: 'confirmation_method', - }), - minBookingNotice: Attributes.Number({ - modelKey: 'minBookingNotice', - jsonKey: 'min_booking_notice', - }), - minBuffer: Attributes.Number({ - modelKey: 'minBuffer', - jsonKey: 'min_buffer', - }), - minCancellationNotice: Attributes.Number({ - modelKey: 'minCancellationNotice', - jsonKey: 'min_cancellation_notice', - }), - intervalMinutes: Attributes.Number({ - modelKey: 'intervalMinutes', - jsonKey: 'interval_minutes', - }), - nameFieldHidden: Attributes.Boolean({ - modelKey: 'nameFieldHidden', - jsonKey: 'name_field_hidden', - }), - openingHours: Attributes.Collection({ - modelKey: 'openingHours', - jsonKey: 'opening_hours', - itemClass: SchedulerBookingOpeningHours, - }), - schedulingMethod: Attributes.String({ - modelKey: 'schedulingMethod', - jsonKey: 'scheduling_method', - }), - }; - - constructor(props?: SchedulerBookingProperties) { - super(); - this.initAttributes(props); - } -} - -export type SchedulerRemindersProperties = { - deliveryMethod?: string; - deliveryRecipient?: string; - emailSubject?: string; - timeBeforeEvent?: number; - webhookUrl?: string; -}; - -export class SchedulerReminders extends Model - implements SchedulerRemindersProperties { - deliveryMethod?: string; - deliveryRecipient?: string; - emailSubject?: string; - timeBeforeEvent?: number; - webhookUrl?: string; - static attributes: Record = { - deliveryMethod: Attributes.String({ - modelKey: 'deliveryMethod', - jsonKey: 'delivery_method', - }), - deliveryRecipient: Attributes.String({ - modelKey: 'deliveryRecipient', - jsonKey: 'delivery_recipient', - }), - emailSubject: Attributes.String({ - modelKey: 'emailSubject', - jsonKey: 'email_subject', - }), - timeBeforeEvent: Attributes.Number({ - modelKey: 'timeBeforeEvent', - jsonKey: 'time_before_event', - }), - webhookUrl: Attributes.String({ - modelKey: 'webhookUrl', - jsonKey: 'webhook_url', - }), - }; - - constructor(props?: SchedulerRemindersProperties) { - super(); - this.initAttributes(props); - } -} - -export type SchedulerConfigProperties = { - appearance?: SchedulerAppearanceProperties; - booking?: SchedulerBookingProperties; - calendarIds?: { - [accountId: string]: { - availability?: string[]; - booking?: string; - }; - }; - event?: { - duration?: number; - capacity?: number; - location?: string; - title?: string; - }; - expireAfter?: { - date?: number; - uses?: number; - }; - locale?: string; - localeForGuests?: string; - reminders?: SchedulerRemindersProperties[]; - timezone?: string; -}; - -export class SchedulerConfig extends Model - implements SchedulerConfigProperties { - appearance?: SchedulerAppearanceProperties; - booking?: SchedulerBookingProperties; - calendarIds?: { - [accountId: string]: { - availability?: string[]; - booking?: string; - }; - }; - event?: { - duration?: number; - capacity?: number; - location?: string; - title?: string; - }; - expireAfter?: { - date?: number; - uses?: number; - }; - disableEmails?: boolean; - locale?: string; - localeForGuests?: string; - reminders?: SchedulerRemindersProperties[]; - timezone?: string; - static attributes: Record = { - appearance: Attributes.Object({ - modelKey: 'appearance', - itemClass: SchedulerAppearance, - }), - booking: Attributes.Object({ - modelKey: 'booking', - itemClass: SchedulerBooking, - }), - calendarIds: Attributes.Object({ - modelKey: 'calendarIds', - jsonKey: 'calendar_ids', - }), - event: Attributes.Object({ - modelKey: 'event', - }), - expireAfter: Attributes.Object({ - modelKey: 'expireAfter', - jsonKey: 'expire_after', - }), - disableEmails: Attributes.Boolean({ - modelKey: 'disableEmails', - jsonKey: 'disable_emails', - }), - locale: Attributes.String({ - modelKey: 'locale', - }), - localeForGuests: Attributes.String({ - modelKey: 'localeForGuests', - jsonKey: 'locale_for_guests', - }), - reminders: Attributes.Collection({ - modelKey: 'reminders', - itemClass: SchedulerReminders, - }), - timezone: Attributes.String({ - modelKey: 'timezone', - }), - }; - - constructor(props?: SchedulerConfigProperties) { - super(); - this.initAttributes(props); - } -} - -export type SchedulerProperties = { - accessTokens?: string[]; - appClientId?: string; - appOrganizationId?: number; - config?: SchedulerConfig; - editToken?: string; - name?: string; - slug?: string; - createdAt?: Date; - modifiedAt?: Date; -}; - -export default class Scheduler extends RestfulModel - implements SchedulerProperties { - accessTokens?: string[]; - appClientId?: string; - appOrganizationId?: number; - config?: SchedulerConfig; - editToken?: string; - name?: string; - slug?: string; - createdAt?: Date; - modifiedAt?: Date; - static collectionName = 'manage/pages'; - static attributes: Record = { - ...RestfulModel.attributes, - accessTokens: Attributes.StringList({ - modelKey: 'accessTokens', - jsonKey: 'access_tokens', - }), - appClientId: Attributes.String({ - modelKey: 'appClientId', - jsonKey: 'app_client_id', - readOnly: true, - }), - appOrganizationId: Attributes.Number({ - modelKey: 'appOrganizationId', - jsonKey: 'app_organization_id', - readOnly: true, - }), - config: Attributes.Object({ - modelKey: 'config', - itemClass: SchedulerConfig, - }), - editToken: Attributes.String({ - modelKey: 'editToken', - jsonKey: 'edit_token', - readOnly: true, - }), - name: Attributes.String({ - modelKey: 'name', - }), - slug: Attributes.String({ - modelKey: 'slug', - }), - createdAt: Attributes.Date({ - modelKey: 'createdAt', - jsonKey: 'created_at', - readOnly: true, - }), - modifiedAt: Attributes.Date({ - modelKey: 'modifiedAt', - jsonKey: 'modified_at', - readOnly: true, - }), - }; - - constructor(connection: NylasConnection, props?: SchedulerProperties) { - super(connection, props); - this.initAttributes(props); - this.baseUrl = 'https://api.schedule.nylas.com'; - } - - save(params: {} | SaveCallback = {}, callback?: SaveCallback): Promise { - this.validate(); - return super.save(params, callback); - } - - getAvailableCalendars(): Promise { - if (!this.id) { - throw new Error('Cannot get calendars for a page without an ID.'); - } - - return this.connection - .request({ - method: 'GET', - path: `/manage/pages/${this.id}/calendars`, - headers: { - 'Content-Type': 'application/json', - }, - baseUrl: this.baseUrl, - }) - .then((json: Record[]) => { - const calendars = json.map(cal => { - return new SchedulerAvailableCalendars().fromJSON( - cal, - this.connection - ); - }); - return Promise.resolve(calendars); - }); - } - - uploadImage( - contentType: string, - objectName: string - ): Promise { - if (!this.id) { - throw new Error('Cannot upload an image to a page without an ID.'); - } - return this.connection.request({ - method: 'PUT', - path: `/manage/pages/${this.id}/upload-image`, - headers: { - 'Content-Type': 'application/json', - }, - body: { - contentType: contentType, - objectName: objectName, - }, - baseUrl: this.baseUrl, - }); - } - - private validate(): void { - const bookingIntervalMinutes = this.config?.booking?.intervalMinutes; - if ( - bookingIntervalMinutes !== undefined && - (bookingIntervalMinutes <= 0 || bookingIntervalMinutes % 5 != 0) - ) { - throw new Error( - 'SchedulerBooking.intervalMinutes must be a non-zero positive integer, divisible by 5.' - ); - } - } -} diff --git a/src/models/smartCompose.ts b/src/models/smartCompose.ts new file mode 100644 index 00000000..3b17dd0a --- /dev/null +++ b/src/models/smartCompose.ts @@ -0,0 +1,19 @@ +/** + * Interface representing a request to compose a message. + */ +export interface ComposeMessageRequest { + /** + * The prompt that smart compose will use to generate a message suggestion. + */ + prompt: string; +} + +/** + * Interface representing a response to a message composition request. + */ +export interface ComposeMessageResponse { + /** + * The message suggestion generated by smart compose. + */ + suggestion: string; +} diff --git a/src/models/thread.ts b/src/models/thread.ts deleted file mode 100644 index 5a2195fb..00000000 --- a/src/models/thread.ts +++ /dev/null @@ -1,139 +0,0 @@ -import Message, { MessageProperties } from './message'; -import RestfulModel, { SaveCallback } from './restful-model'; -import Attributes, { Attribute } from './attributes'; -import EmailParticipant, { - EmailParticipantProperties, -} from './email-participant'; -import Folder, { Label, FolderProperties } from './folder'; -import NylasConnection from '../nylas-connection'; - -export type ThreadProperties = { - subject: string; - participants: EmailParticipantProperties[]; - lastMessageTimestamp: Date; - lastMessageReceivedTimestamp: Date; - firstMessageTimestamp: Date; - messageIds: string[]; - snippet: string; - unread: boolean; - starred: boolean; - version: string; - hasAttachments?: boolean; - lastMessageSentTimestamp?: Date; - folders?: FolderProperties[]; - labels?: FolderProperties[]; - draftIds?: string[]; - messages?: MessageProperties[]; - drafts?: MessageProperties[]; -}; - -export default class Thread extends RestfulModel implements ThreadProperties { - subject = ''; - participants: EmailParticipant[] = []; - lastMessageTimestamp: Date = new Date(); - lastMessageReceivedTimestamp: Date = new Date(); - firstMessageTimestamp: Date = new Date(); - messageIds: string[] = []; - snippet = ''; - unread = false; - starred = false; - version = ''; - hasAttachments?: boolean; - lastMessageSentTimestamp?: Date; - folders?: Folder[]; - labels?: Label[]; - draftIds?: string[]; - messages?: Message[]; - drafts?: Message[]; - static collectionName = 'threads'; - static attributes: Record = { - ...RestfulModel.attributes, - subject: Attributes.String({ - modelKey: 'subject', - }), - participants: Attributes.Collection({ - modelKey: 'participants', - itemClass: EmailParticipant, - }), - lastMessageTimestamp: Attributes.DateTime({ - modelKey: 'lastMessageTimestamp', - jsonKey: 'last_message_timestamp', - }), - lastMessageReceivedTimestamp: Attributes.DateTime({ - modelKey: 'lastMessageReceivedTimestamp', - jsonKey: 'last_message_received_timestamp', - }), - lastMessageSentTimestamp: Attributes.DateTime({ - modelKey: 'lastMessageSentTimestamp', - jsonKey: 'last_message_sent_timestamp', - }), - firstMessageTimestamp: Attributes.DateTime({ - modelKey: 'firstMessageTimestamp', - jsonKey: 'first_message_timestamp', - }), - snippet: Attributes.String({ - modelKey: 'snippet', - }), - unread: Attributes.Boolean({ - modelKey: 'unread', - }), - starred: Attributes.Boolean({ - modelKey: 'starred', - }), - hasAttachments: Attributes.Boolean({ - modelKey: 'has_attachments', - }), - version: Attributes.String({ - modelKey: 'version', - jsonKey: 'version', - }), - folders: Attributes.Collection({ - modelKey: 'folders', - itemClass: Folder, - jsonKey: 'folders', - }), - labels: Attributes.Collection({ - modelKey: 'labels', - itemClass: Label, - jsonKey: 'labels', - }), - messageIds: Attributes.StringList({ - modelKey: 'messageIds', - jsonKey: 'message_ids', - }), - draftIds: Attributes.StringList({ - modelKey: 'draftIds', - jsonKey: 'draft_ids', - }), - messages: Attributes.Collection({ - modelKey: 'messages', - itemClass: Message, - }), - drafts: Attributes.Collection({ - modelKey: 'drafts', - itemClass: Message, - }), - }; - - constructor(connection: NylasConnection, props?: ThreadProperties) { - super(connection, props); - this.initAttributes(props); - } - - saveRequestBody(): Record { - const json: Record = {}; - if (this.labels) { - json['label_ids'] = this.labels.map(label => label.id); - } else if (this.folders && this.folders.length === 1) { - json['folder_id'] = this.folders[0].id; - } - - json['starred'] = this.starred; - json['unread'] = this.unread; - return json; - } - - save(params: {} | SaveCallback = {}, callback?: SaveCallback): Promise { - return super.save(params, callback); - } -} diff --git a/src/models/threads.ts b/src/models/threads.ts new file mode 100644 index 00000000..2cbc0829 --- /dev/null +++ b/src/models/threads.ts @@ -0,0 +1,156 @@ +import { Message } from './messages.js'; +import { Draft } from './drafts.js'; +import { EmailName } from './events.js'; +import { ListQueryParams } from './listQueryParams.js'; + +/** + * Interface representing a Nylas thread object. + */ +export interface Thread { + /** + * The unique identifier for the thread. + */ + id: string; + /** + * Grant ID of the Nylas account. + */ + grantId: string; + /** + * The latest message or draft in the thread. + */ + latestDraftOrMessage: Message | Draft; + /** + * Whether or not a message in a thread has attachments. + */ + hasAttachments: boolean; + /** + * Whether or not a message in a thread has drafts. + */ + hasDrafts: boolean; + /** + * A boolean indicating whether the thread is starred or not. + */ + starred: boolean; + /** + * A boolean indicating if all messages within the thread are read or not. + */ + unread: boolean; + /** + * Unix timestamp of the earliest or first message in the thread. + */ + earliestMessageDate: number; + /** + * Unix timestamp of the most recent message received in the thread. + */ + latestMessageReceivedDate: number; + /** + * Unix timestamp of the most recent message sent in the thread. + */ + latestMessageSentDate: number; + /** + * An array of participants in the thread. + */ + participants: EmailName[]; + /** + * An array of message IDs in the thread. + */ + messageIds: string[]; + /** + * An array of draft IDs in the thread. + */ + draftIds: string[]; + /** + * An array of folder IDs the thread appears in. + */ + folders: string[]; + /** + * The type of object. + */ + object: 'thread'; + /** + * A short snippet of the last received message/draft body. + * This is the first 100 characters of the message body, with any HTML tags removed. + */ + snippet?: string; + /** + * The subject line of the thread. + */ + subject?: string; +} + +/** + * Interface representing a request to update a thread. + */ +export interface UpdateThreadRequest { + /** + * Sets all messages in the thread as starred or unstarred. + */ + starred?: boolean; + /** + * Sets all messages in the thread as read or unread. + */ + unread?: boolean; + /** + * The IDs of the folders to apply, overwriting all previous folders for all messages in the thread. + */ + folders?: string[]; +} + +/** + * Interface representing the query parameters for listing drafts. + */ +export interface ListThreadsQueryParams extends ListQueryParams { + /** + * Return items with a matching literal subject. + */ + subject?: string; + /** + * Return threads that contain messages that have been sent or received from this list of email addresses. + */ + anyEmail?: string[]; + /** + * Return threads containing messages sent to these email address. + */ + to?: string[]; + /** + * Return threads containing messages sent from these email address. + */ + from?: string[]; + /** + * Return threads containing messages cc'd on these email address. + */ + cc?: string[]; + /** + * Return threads containing messages bcc'd on these email address. + */ + bcc?: string[]; + /** + * Return threads with messages that belong to these specified folder IDs. + */ + in?: string[]; + /** + * Return threads with unread messages. + */ + unread?: boolean; + /** + * Return threads with starred messages. + */ + starred?: boolean; + /** + * Return threads whose most recent message was received before this Unix timestamp. + */ + latestMessageBefore?: number; + /** + * Return threads whose most recent message was received after this Unix timestamp. + */ + latestMessageAfter?: number; + /** + * Return threads with messages that contain attachments. + */ + hasAttachment?: boolean; + /** + * The provider-specific query string used to search threads. + * Available for Google only. + */ + searchQueryNative?: string; +} diff --git a/src/models/webhook-notification.ts b/src/models/webhook-notification.ts deleted file mode 100644 index 7383bb4a..00000000 --- a/src/models/webhook-notification.ts +++ /dev/null @@ -1,388 +0,0 @@ -import crypto from 'crypto'; -import Model from './model'; -import Attributes, { Attribute } from './attributes'; -import * as config from '../config'; - -export type LinkClickProperties = { - id: number; - ip: string; - userAgent: string; - timestamp: Date; - linkIndex?: number; -}; - -export class LinkClick extends Model implements LinkClickProperties { - id = 0; - ip = ''; - userAgent = ''; - timestamp = new Date(); - linkIndex?: number; - static attributes: Record = { - id: Attributes.Number({ - modelKey: 'id', - }), - ip: Attributes.String({ - modelKey: 'ip', - }), - userAgent: Attributes.String({ - modelKey: 'userAgent', - jsonKey: 'user_agent', - }), - timestamp: Attributes.DateTime({ - modelKey: 'timestamp', - }), - linkIndex: Attributes.Number({ - modelKey: 'linkIndex', - jsonKey: 'link_index', - }), - }; - - constructor(props?: LinkClickCountProperties) { - super(); - this.initAttributes(props); - } -} - -export type LinkClickCountProperties = { - url: string; - count: number; -}; - -export class LinkClickCount extends Model implements LinkClickCountProperties { - url = ''; - count = 0; - static attributes: Record = { - url: Attributes.String({ - modelKey: 'url', - }), - count: Attributes.Number({ - modelKey: 'count', - }), - }; - - constructor(props?: LinkClickCountProperties) { - super(); - this.initAttributes(props); - } -} - -export type MessageTrackingDataProperties = { - messageId: string; - payload: string; - senderAppId: number; - threadId?: string; - replyToMessageId?: string; - timestamp?: Date; - count?: number; - fromSelf?: boolean; - recents?: LinkClickProperties[]; - linkData?: LinkClickCountProperties[]; -}; - -export class MessageTrackingData extends Model - implements MessageTrackingDataProperties { - messageId = ''; - payload = ''; - senderAppId = 0; - - // thread.replied specific fields - replyToMessageId?: string; - timestamp?: Date; - threadId?: string; - fromSelf?: boolean; - - // message.opened specific field - count?: number; - - // message.link_clicked specific fields - linkData?: LinkClickCount[]; - - // message.opened and message.link_clicked shared field - recents?: LinkClick[]; - static attributes: Record = { - messageId: Attributes.String({ - modelKey: 'messageId', - jsonKey: 'message_id', - }), - payload: Attributes.String({ - modelKey: 'payload', - }), - senderAppId: Attributes.Number({ - modelKey: 'senderAppId', - jsonKey: 'sender_app_id', - }), - replyToMessageId: Attributes.String({ - modelKey: 'replyToMessageId', - jsonKey: 'reply_to_message_id', - }), - timestamp: Attributes.DateTime({ - modelKey: 'timestamp', - }), - threadId: Attributes.String({ - modelKey: 'threadId', - jsonKey: 'thread_id', - }), - fromSelf: Attributes.Boolean({ - modelKey: 'fromSelf', - jsonKey: 'from_self', - }), - count: Attributes.Number({ - modelKey: 'count', - }), - linkData: Attributes.Collection({ - modelKey: 'linkData', - jsonKey: 'link_data', - itemClass: LinkClickCount, - }), - recents: Attributes.Collection({ - modelKey: 'recents', - itemClass: LinkClick, - }), - }; - - constructor(props?: MessageTrackingDataProperties) { - super(); - this.initAttributes(props); - } -} - -export type WebhookObjectExtrasProperties = { - reason?: string; - sendAt?: Date; - originalSendAt?: Date; -}; - -export class WebhookObjectExtras extends Model - implements WebhookObjectExtrasProperties { - reason?: string; - sendAt?: Date; - originalSendAt?: Date; - - static attributes: Record = { - reason: Attributes.String({ - modelKey: 'reason', - }), - sendAt: Attributes.DateTime({ - modelKey: 'sendAt', - jsonKey: 'send_at', - }), - originalSendAt: Attributes.DateTime({ - modelKey: 'originalSendAt', - jsonKey: 'original_send_at', - }), - }; -} - -export type WebhookObjectAttributesProperties = { - action?: string; - jobStatusId?: string; - threadId?: string; - receivedDate?: Date; -}; - -export class WebhookObjectAttributes extends Model - implements WebhookObjectAttributesProperties { - // Job Status specific fields - action?: string; - jobStatusId?: string; - messageId?: string; - extras?: WebhookObjectExtrasProperties; - - // Message specific fields - threadId?: string; - receivedDate?: Date; - - // Event specific fields - calendarId?: string; - createdBeforeAccountConnection?: boolean; - static attributes: Record = { - action: Attributes.String({ - modelKey: 'action', - }), - jobStatusId: Attributes.String({ - modelKey: 'jobStatusId', - jsonKey: 'job_status_id', - }), - messageId: Attributes.String({ - modelKey: 'messageId', - jsonKey: 'message_id', - }), - threadId: Attributes.String({ - modelKey: 'threadId', - jsonKey: 'thread_id', - }), - calendarId: Attributes.String({ - modelKey: 'calendarId', - jsonKey: 'calendar_id', - }), - receivedDate: Attributes.DateTime({ - modelKey: 'receivedDate', - jsonKey: 'received_date', - }), - createdBeforeAccountConnection: Attributes.Boolean({ - modelKey: 'createdBeforeAccountConnection', - jsonKey: 'created_before_account_connection', - }), - extras: Attributes.Object({ - modelKey: 'extras', - itemClass: WebhookObjectExtras, - }), - }; - - constructor(props?: WebhookObjectAttributesProperties) { - super(); - this.initAttributes(props); - } -} - -export type WebhookObjectDataProperties = { - id: string; - accountId: string; - namespaceId: string; - object: string; - metadata?: MessageTrackingDataProperties | Record; - objectAttributes?: WebhookObjectAttributesProperties; -}; - -export class WebhookObjectData extends Model - implements WebhookObjectDataProperties { - id = ''; - accountId = ''; - namespaceId = ''; - object = ''; - - // Message specific field - metadata?: MessageTrackingData | Record; - - // Message and Job Status specific field - objectAttributes?: WebhookObjectAttributes; - static attributes: Record = { - id: Attributes.String({ - modelKey: 'id', - }), - accountId: Attributes.String({ - modelKey: 'accountId', - jsonKey: 'account_id', - }), - namespaceId: Attributes.String({ - modelKey: 'namespaceId', - jsonKey: 'namespace_id', - }), - object: Attributes.String({ - modelKey: 'object', - }), - metadata: Attributes.Object({ - modelKey: 'metadata', - }), - objectAttributes: Attributes.Object({ - modelKey: 'objectAttributes', - jsonKey: 'attributes', - itemClass: WebhookObjectAttributes, - }), - }; - - constructor(props?: WebhookObjectDataProperties) { - super(); - this.initAttributes(props); - if ( - this.metadata && - (this.object === 'message' || this.object === 'thread') - ) { - this.metadata = new MessageTrackingData( - this.metadata as MessageTrackingDataProperties - ); - } - } - - fromJSON(json: Record): this { - const notification = super.fromJSON(json); - if ( - notification.metadata && - (notification.object === 'message' || notification.object === 'thread') - ) { - notification.metadata = new MessageTrackingData().fromJSON( - json['metadata'] as Record - ); - } - return notification; - } -} - -export type WebhookDeltaProperties = { - object: string; - type: string; - date: Date; - objectData: WebhookObjectDataProperties; -}; - -export class WebhookDelta extends Model implements WebhookDeltaProperties { - date = new Date(); - object = ''; - type = ''; - objectData = new WebhookObjectData(); - static attributes: Record = { - date: Attributes.DateTime({ - modelKey: 'date', - }), - object: Attributes.String({ - modelKey: 'object', - }), - type: Attributes.String({ - modelKey: 'type', - }), - objectData: Attributes.Object({ - modelKey: 'objectData', - jsonKey: 'object_data', - itemClass: WebhookObjectData, - }), - }; - - constructor(props?: WebhookDeltaProperties) { - super(); - this.initAttributes(props); - } -} - -export type WebhookNotificationProperties = { - deltas: WebhookDeltaProperties[]; -}; - -export default class WebhookNotification extends Model - implements WebhookNotificationProperties { - deltas: WebhookDelta[] = []; - static attributes: Record = { - deltas: Attributes.Collection({ - modelKey: 'deltas', - itemClass: WebhookDelta, - }), - }; - - constructor(props?: WebhookNotificationProperties) { - super(); - this.initAttributes(props); - } - - /** - * Verify incoming webhook signature came from Nylas - * @param xNylasSignature The signature to verify - * @param rawBody The raw body from the payload - * @param clientSecret Overriding client secret of the app receiving the webhook - * @return true if the webhook signature was verified from Nylas - */ - static verifyWebhookSignature( - xNylasSignature: string, - rawBody: Buffer, - clientSecret?: string - ): boolean { - const clientSecretToUse = clientSecret || config.clientSecret; - if (!clientSecretToUse) { - throw new Error('Client secret is required to verify webhook signature'); - } - - const digest = crypto - .createHmac('sha256', clientSecretToUse) - .update(rawBody) - .digest('hex'); - return digest === xNylasSignature; - } -} diff --git a/src/models/webhook.ts b/src/models/webhook.ts deleted file mode 100644 index 9c395d18..00000000 --- a/src/models/webhook.ts +++ /dev/null @@ -1,104 +0,0 @@ -import ManagementModel from './management-model'; -import Attributes, { Attribute } from './attributes'; -import { SaveCallback } from './restful-model'; -import NylasConnection from '../nylas-connection'; - -export enum WebhookTriggers { - AccountConnected = 'account.connected', - AccountRunning = 'account.running', - AccountStopped = 'account.stopped', - AccountInvalid = 'account.invalid', - AccountSyncError = 'account.sync_error', - MessageBounced = 'message.bounced', - MessageCreated = 'message.created', - MessageOpened = 'message.opened', - MessageUpdated = 'message.updated', - MessageLinkClicked = 'message.link_clicked', - ThreadReplied = 'thread.replied', - ContactCreated = 'contact.created', - ContactUpdated = 'contact.updated', - ContactDeleted = 'contact.deleted', - CalendarCreated = 'calendar.created', - CalendarUpdated = 'calendar.updated', - CalendarDeleted = 'calendar.deleted', - EventCreated = 'event.created', - EventUpdated = 'event.updated', - EventDeleted = 'event.deleted', - JobSuccessful = 'job.successful', - JobFailed = 'job.failed', -} - -export type WebhookProperties = { - callbackUrl: string; - state: string; - triggers: string[]; - id?: string; - applicationId?: string; - version?: string; -}; - -export default class Webhook extends ManagementModel - implements WebhookProperties { - callbackUrl = ''; - state = ''; - triggers: string[] = []; - id?: string; - applicationId?: string; - version?: string; - static collectionName = 'webhooks'; - static attributes: Record = { - id: Attributes.String({ - modelKey: 'id', - }), - - applicationId: Attributes.String({ - modelKey: 'applicationId', - jsonKey: 'application_id', - }), - - callbackUrl: Attributes.String({ - modelKey: 'callbackUrl', - jsonKey: 'callback_url', - }), - - state: Attributes.String({ - modelKey: 'state', - }), - - triggers: Attributes.StringList({ - modelKey: 'triggers', - }), - - version: Attributes.String({ - modelKey: 'version', - }), - }; - - constructor( - connection: NylasConnection, - clientId: string, - props: WebhookProperties - ) { - super(connection, clientId, props); - this.initAttributes(props); - } - - pathPrefix(): string { - return `/a/${this.clientId}`; - } - saveRequestBody(): Record { - const json: Record = {}; - // We can only update the state of an existing webhook - if (this.id) { - json['state'] = this.state; - } else { - json['callback_url'] = this.callbackUrl; - json['state'] = this.state ? this.state : 'active'; - json['triggers'] = Webhook.attributes.triggers.toJSON(this.triggers); - } - return json; - } - save(params: {} | SaveCallback = {}, callback?: SaveCallback): Promise { - return super.save(params, callback); - } -} diff --git a/src/models/webhooks.ts b/src/models/webhooks.ts new file mode 100644 index 00000000..72d633f3 --- /dev/null +++ b/src/models/webhooks.ts @@ -0,0 +1,129 @@ +/** + * Interface representing a Nylas Webhook object. + */ +export interface Webhook { + /** + * Globally unique object identifier. + */ + id: string; + /** + * List of events that triggers the webhook. + */ + triggerTypes: WebhookTriggers[]; + /** + * The url to send webhooks to. + */ + callbackUrl: string; + /** + * The status of the new destination. + */ + status: 'active' | 'failing' | 'failed' | 'pause'; + /** + * The time the status field was last updated, represented as a Unix timestamp in seconds. + */ + statusUpdatedAt: number; + /** + * The time the status field was created, represented as a Unix timestamp in seconds + */ + createdAt: number; + /** + * The time the status field was last updated, represented as a Unix timestamp in seconds. + */ + updatedAt: number; + /** + * A human-readable description of the webhook destination. + */ + description?: string; + /** + * The email addresses that Nylas notifies when a webhook is down for a while. + */ + notificationEmailAddress?: string; +} + +/** + * Class representing a Nylas webhook with secret. + */ +export interface WebhookWithSecret extends Webhook { + /** + * A secret value used to encode the X-Nylas-Signature header on webhook requests. + */ + webhookSecret: string; +} + +/** + * Class representing a Nylas webhook delete response. + */ +export interface WebhookDeleteResponse { + /** + * ID of the request. + */ + requestId: string; + /** + * Object containing the webhook deletion status. + */ + data?: { + /** + * The status of the webhook deletion. + */ + status: 'success'; + }; +} + +/** + * Class representing the response for getting a list of webhook ip addresses. + */ +export interface WebhookIpAddressesResponse { + /** + * The IP addresses that Nylas send you webhook from. + */ + ipAddresses: string[]; + /** + * UNIX timestamp when Nylas updated the list of IP addresses. + */ + updatedAt: number; +} + +/** + * Class representation of a Nylas create webhook request. + */ +export interface CreateWebhookRequest { + /** + * List of events that triggers the webhook. + */ + triggerTypes: WebhookTriggers[]; + /** + * The url to send webhooks to. + */ + callbackUrl: string; + /** + * A human-readable description of the webhook destination. + */ + description?: string; + /** + * The email addresses that Nylas notifies when a webhook is down for a while. + */ + notificationEmailAddress?: string; +} + +/** + * Class representation of a Nylas update webhook request. + */ +export type UpdateWebhookRequest = Partial; + +/** + * Enum representing the available webhook triggers. + */ +export enum WebhookTriggers { + CalendarCreated = 'calendar.created', + CalendarUpdated = 'calendar.updated', + CalendarDeleted = 'calendar.deleted', + EventCreated = 'event.created', + EventUpdated = 'event.updated', + EventDeleted = 'event.deleted', + GrantCreated = 'grant.created', + GrantUpdated = 'grant.updated', + GrantDeleted = 'grant.deleted', + GrantExpired = 'grant.expired', + MessageSendSuccess = 'message.send_success', + MessageSendFailed = 'message.send_failed', +} diff --git a/src/models/when.ts b/src/models/when.ts deleted file mode 100644 index f7c36e1a..00000000 --- a/src/models/when.ts +++ /dev/null @@ -1,82 +0,0 @@ -import Model from './model'; -import Attributes, { Attribute } from './attributes'; - -export type WhenProperties = { - startTime?: number; - endTime?: number; - startTimezone?: string; - endTimezone?: string; - time?: number; - timezone?: string; - startDate?: string; - endDate?: string; - date?: string; - object?: string; -}; - -export default class When extends Model implements WhenProperties { - startTime?: number; - endTime?: number; - startTimezone?: string; - endTimezone?: string; - time?: number; - timezone?: string; - startDate?: string; - endDate?: string; - date?: string; - object?: string; - static attributes: Record = { - startTime: Attributes.Number({ - modelKey: 'startTime', - jsonKey: 'start_time', - }), - endTime: Attributes.Number({ - modelKey: 'endTime', - jsonKey: 'end_time', - }), - startTimezone: Attributes.String({ - modelKey: 'startTimezone', - jsonKey: 'start_timezone', - }), - endTimezone: Attributes.String({ - modelKey: 'endTimezone', - jsonKey: 'end_timezone', - }), - time: Attributes.Number({ - modelKey: 'time', - }), - timezone: Attributes.String({ - modelKey: 'timezone', - }), - startDate: Attributes.String({ - modelKey: 'startDate', - jsonKey: 'start_date', - }), - endDate: Attributes.String({ - modelKey: 'endDate', - jsonKey: 'end_date', - }), - date: Attributes.String({ - modelKey: 'date', - }), - object: Attributes.String({ - modelKey: 'object', - readOnly: true, - }), - }; - - constructor(props?: WhenProperties) { - super(); - this.initAttributes(props); - } - - // Helper method to check if the When object is actually set properly or not - isSet(): boolean { - return ( - (this.startTime != undefined && this.endTime != undefined) || - this.time != undefined || - (this.startDate != undefined && this.endDate != undefined) || - this.date != undefined - ); - } -} diff --git a/src/nylas-connection.ts b/src/nylas-connection.ts deleted file mode 100644 index 0c7672fe..00000000 --- a/src/nylas-connection.ts +++ /dev/null @@ -1,345 +0,0 @@ -// TODO since node 10 URL is global -import { URL } from 'url'; -// TODO since node 15 AbortController is global -import AbortController from 'abort-controller'; -import fetch, { Request } from 'node-fetch'; -import { AbortSignal } from 'node-fetch/externals'; -import * as config from './config'; -import RestfulModelCollection from './models/restful-model-collection'; -import CalendarRestfulModelCollection from './models/calendar-restful-model-collection'; -import ContactRestfulModelCollection from './models/contact-restful-model-collection'; -import RestfulModelInstance from './models/restful-model-instance'; -import Account from './models/account'; -import Thread from './models/thread'; -import Draft from './models/draft'; -import File from './models/file'; -import Event from './models/event'; -import Resource from './models/resource'; -import Folder, { Label } from './models/folder'; -import FormData, { AppendOptions } from 'form-data'; -import Neural from './models/neural'; -import NylasApiError from './models/nylas-api-error'; -import ComponentRestfulModelCollection from './models/component-restful-model-collection'; -import SchedulerRestfulModelCollection from './models/scheduler-restful-model-collection'; -import MessageRestfulModelCollection from './models/message-restful-model-collection'; -import DeltaCollection from './models/delta-collection'; -import Outbox from './models/outbox'; -import JobStatusRestfulModelCollection from './models/job-status-restful-model-collection'; -import RateLimitError from './models/rate-limit-error'; -import { logger } from './config'; - -const PACKAGE_JSON = require('../package.json'); -const SDK_VERSION = PACKAGE_JSON.version; -const SUPPORTED_API_VERSION = '2.5'; - -export enum AuthMethod { - BASIC, - BEARER, -} - -export type RequestOptions = { - path: string; - method?: string; - headers?: Record; - qs?: Record; - downloadRequest?: boolean; - json?: boolean; - formData?: Record; - body?: any; - baseUrl?: string; - url?: URL; - authMethod?: AuthMethod; -}; - -export type FormDataType = { - value: unknown; - options?: Record | AppendOptions; -}; - -export default class NylasConnection { - accessToken: string | null | undefined; - clientId: string | null | undefined; - - threads: RestfulModelCollection = new RestfulModelCollection( - Thread, - this - ); - contacts: ContactRestfulModelCollection = new ContactRestfulModelCollection( - this - ); - messages: MessageRestfulModelCollection = new MessageRestfulModelCollection( - this - ); - drafts: RestfulModelCollection = new RestfulModelCollection( - Draft, - this - ); - files: RestfulModelCollection = new RestfulModelCollection(File, this); - calendars: CalendarRestfulModelCollection = new CalendarRestfulModelCollection( - this - ); - jobStatuses: JobStatusRestfulModelCollection = new JobStatusRestfulModelCollection( - this - ); - events: RestfulModelCollection = new RestfulModelCollection( - Event, - this - ); - resources: RestfulModelCollection = new RestfulModelCollection( - Resource, - this - ); - deltas = new DeltaCollection(this); - labels: RestfulModelCollection