diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..a56a7ef --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +node_modules + diff --git a/.eslintrc.js b/.eslintrc.js index fad69dd..4b14616 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,46 +1,42 @@ module.exports = { - env: { - commonjs: true, - es6: true, - node: true, - }, - extends: 'airbnb-base', - globals: { - Atomics: 'readonly', - SharedArrayBuffer: 'readonly', - }, + extends: [ + 'airbnb-typescript/base', + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended-requiring-type-checking', + ], + parser: "@typescript-eslint/parser", parserOptions: { - ecmaVersion: 2018, + project: './tsconfig.json', }, rules: { - 'no-trailing-spaces': 'off', - 'padded-blocks': 'off', - 'no-console': 'off', - 'arrow-parens': 'off', - 'no-return-assign': 'off', - 'no-empty': 'off', + 'no-param-reassign': 'off', + 'no-void': 'off', + 'max-len': ["error", { "code": 150 }], 'consistent-return': 'off', - 'no-shadow': 'off', - 'no-plusplus': 'off', - 'no-case-declarations': 'off', - 'class-methods-use-this': 'off' + 'object-curly-newline': 'off', + 'import/prefer-default-export': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-misused-promises': 'off', + '@typescript-eslint/no-unused-expressions': 'off', + '@typescript-eslint/restrict-template-expressions': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off' }, overrides: [ { files: [ - 'tests/**/*.test.js' + 'test/**/*.ts' ], env: { mocha: true }, rules: { 'prefer-arrow-callback': 'off', - 'func-names': 'off', - 'no-loop-func': 'off', - 'no-await-in-loop': 'off', - 'no-restricted-syntax': 'off', - 'max-len': 'off' + 'func-names': 'off' } } - ] + ], + ignorePatterns: ["*.js"] }; diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..613d882 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,16 @@ +name: Build + +on: + push: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + # Setup .npmrc file to publish to npm + - uses: actions/setup-node@v2 + with: + registry-url: 'https://npm.pkg.github.com' + - run: npm install + - run: npm run compile \ No newline at end of file diff --git a/.github/workflows/package.yaml b/.github/workflows/package.yaml index 3206088..4c521f4 100644 --- a/.github/workflows/package.yaml +++ b/.github/workflows/package.yaml @@ -29,7 +29,7 @@ jobs: env: NODE_AUTH_TOKEN: ${{ secrets.ENVOYBOT_PERSONAL_ACCESS_TOKEN }} - - run: npm publish --access public + - run: npm publish --tag beta --access public env: NODE_AUTH_TOKEN: ${{ secrets.ENVOY_NPM_AUTOMATION_TOKEN }} @@ -38,6 +38,6 @@ jobs: with: registry-url: "https://npm.pkg.github.com" - - run: npm publish + - run: npm publish --tag beta env: NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 1c5dd34..b53be68 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,4 @@ typings/ # next.js build output .next .idea +dist diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..e0e2404 --- /dev/null +++ b/.npmignore @@ -0,0 +1,2 @@ +.idea +.github diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..8351c19 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +14 diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..cba6153 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "printWidth": 120, + "bracketSameLine": false, + "htmlWhitespaceSensitivity": "ignore", + "singleQuote": true, + "jsxSingleQuote": false, + "trailingComma": "all" +} diff --git a/README.md b/README.md index 523f72c..4ee3b62 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Envoy Node.js SDK -The SDK exports several classes and functions, however the most typical way to integrate the SDK is as middleware. The `middleware()` function call returns a middleware that attaches an instance of `EnvoyPluginSDK` to the `req` object and verifies that the request came from Envoy. It is available as `req.envoy`. +The SDK exports several classes and functions, however the most typical way to integrate the SDK is as middleware. The `envoyMiddleware()` function call returns a middleware that attaches an instance of `EnvoyPluginSDK` to the `req` object and verifies that the request came from Envoy. It is available as `req.envoy`. ## Installation @@ -25,127 +25,195 @@ View our Node.js [quickstart guide](https://developers.envoy.com/hub/docs/nodejs ### Usage -Here's the typical SDK usage at a glance. +#### Define your `config` +When customers go through your integration's setup steps, that info is saved in a `config` object that is sent along with every request Envoy makes to your integration. -```javascript -const express = require('express'); -const { middleware, errorMiddleware, asyncHandler } = require('@envoy/envoy-integrations-sdk'); +Defining this object as a specific type allows us to safely type the various handlers that will use those values. + +```typescript +// defs/Config.ts +type Config = { + greeting: string +}; +export default Config; +``` + +#### Implement setup routes +As customers go through the setup steps of your integration, they may trigger several requests to your integration for things like: +- loading dropdown options +- loading text fields with remote data +- validating submitted step data + +Below, we'll implement a route that will load a list of greetings into a dropdown in our setup steps. + +View the other types of handlers [here](docs#handler-functions). + +```typescript +// greetingOptions.ts +import { optionsRouteHandler } from '@envoy/envoy-integrations-sdk'; + +export default optionsRouteHandler((req, res) => { + res.send([ + { + label: 'Hello', + value: 'Hello', + }, + { + label: 'Hola', + value: 'Hola', + }, + { + label: 'Aloha', + value: 'Aloha', + }, + ]); +}); +``` + +#### Implement event handlers +Your integration can respond to several Envoy events. Below, we'll implement a simple event handler for an `entry_sign_in` event. + +All it does is to take the greeting that the customer chose during setup, and displays it in the Envoy Dashboard when a visitor signs in. + +View the other types of handlers [here](docs#handler-functions). + +```typescript +// entrySignIn.ts +import { entryEventHandler } from '@envoy/envoy-integrations-sdk'; +import Config from './defs/Config'; + +export default entryEventHandler(async (req, res) => { + const { envoy } = req; + const { job, meta, payload: visitor } = envoy; + const hello = `${meta.config.greeting} ${visitor.attributes['full-name']}!`; // our custom greeting + await job.attach({ label: 'Greeting', value: hello }); // show in the Envoy dashboard. + res.send({ hello }); +}); +``` + + +#### Setup your `express.js` app +Use the `envoyMiddleware` to get an instance of [EnvoyPluginSDK](docs/classes/envoypluginsdk.md) attached to every request. + +View the other types of middleware [here](docs#middleware-functions). +```typescript +// index.ts +import express from 'express'; +import { envoyMiddleware, errorMiddleware } from '@envoy/envoy-integrations-sdk'; + +import greetingOptions from './greetingOptions'; +import entrySignIn from './entrySignIn' const app = express(); +app.use(envoyMiddleware()); +app.post('/greeting-options', greetingOptions); +app.post('/entry-sign-in', entrySignIn); +app.use(errorMiddleware()); +app.listen(process.env.PORT); +``` + +#### More examples +Here's some more things you can do with the `req.envoy` object. +```typescript + /** + * @type EnvoyPluginSDK + */ +const { envoy } = req; // "envoy" is the SDK +const { + meta, // the platform event request_meta object + payload, // the platform event request_body object + userAPI, // user-scoped API calls, used in routes + pluginAPI, // plugin-scoped API calls, for plugin services + installStorage, // install-scoped storage + globalStorage, // global-scoped storage + job, // update the job (if in an event handler) + jwt, // helper to encode/decode jwts +} = envoy; + +/** + * User API usage + */ +const visitorTypes = await userAPI.getFlows({ filter: { location: '1' } }); + +/** + * Storage usage + * The below can be used both at the install level or global level + */ +await installStorage.set('foo', 'bar'); // sets foo=bar in storage for this install +const { value } = await installStorage.get('foo'); // also gets the current value of foo +const { value } = await installStorage.setUnique('foo'); // creates and returns a unique text value for foo +const { value } = await installStorage.get('foo'); // also gets the current value of foo +const { value } = await installStorage.setUniqueNum('foo'); // creates and returns a unique number for foo +const { value } = await installStorage.get('foo'); // also gets the current value of foo +await installStorage.unset('foo'); // deletes foo /** - * "middleware()" returns an instance of bodyParser.json, - * that also verifies the Envoy signature in addition to - * parsing the request body as JSON. + * You can also send multiple commands at once, + * to be executed in the same transaction. + * The response will be an array of the results of each command, in order. */ -app.use(middleware()); +const results = await installStorage.pipeline().set('foo1', 'bar').unset('foo2').get('foo3').execute(); -app.post('/url-to-a-route-or-worker', asyncHandler(async (req, res) => { +/** + * Job updates + * Note that job.complete can take any number of attachments after the first argument. + */ +await job.complete('Credentials provisioned.', { label: 'password', value: 'password' }); +await job.ignore('No credentials provisioned.', 'Email was not supplied.'); +await job.fail('Could not provision credentials.', 'Server could not be reached.'); +/** + * You can also just attach things without completing the job. + * Attach more things by providing more arguments. + */ +await job.attach({ type: 'text', label: 'foo', value: 'bar' }); +/** + * If the job is some multi-step process, + * you can update it's message without changing the status. + * You can also optionally attach things by providing more arguments. + */ +await job.update('Still working...'); - /** - * @type EnvoyPluginSDK - */ - const { envoy } = req; // "envoy" is the SDK - const { - meta, // the platform event request_meta object - payload, // the platform event request_body object - userAPI, // user-scoped API calls, used in routes - pluginAPI, // plugin-scoped API calls, for plugin services - installStorage, // install-scoped storage - globalStorage, // global-scoped storage - job, // update the job (if in a worker) - jwt, // helper to encode/decode jwts - } = envoy; - - /** - * User API usage - */ - const visitorTypes = await userAPI.flows(locationId); - - /** - * Storage usage - * The below can be used both at the install level or global level - */ - await installStorage.set('foo', 'bar'); // sets foo=bar in storage for this install - const { value } = await installStorage.setUnique('foo'); // creates and returns a unique text value for foo - const { value } = await installStorage.setUniqueNum('foo'); // creates and returns a unique number for foo - const { value } = await installStorage.get('foo'); // also gets the current value of foo - await installStorage.unset('foo'); // deletes foo - /** - * You can also send multiple commands at once, - * to be executed in the same transaction. - * The response will be an array of the results of each command, in order. - */ - const results = await installStorage.pipeline().set('foo1', 'bar').unset('foo2').get('foo3').execute(); - - /** - * Job updates - * Note that job.complete can take any number of attachments after the first argument. - */ - await job.complete('Credentials provisioned.', { label: 'password', value: 'password' }); - await job.ignore('No credentials provisioned.', 'Email was not supplied.'); - await job.fail('Could not provision credentials.', 'Server could not be reached.'); - /** - * You can also just attach things without completing the job. - * Attach more things by providing more arguments. - */ - await job.attach({ type: 'text', label: 'foo', value: 'bar' }); - /** - * If the job is some multi-step process, - * you can update it's message without changing the status. - * You can also optionally attach things by providing more arguments. - */ - await job.update('Still working...'); - - /** - * JWT usage - */ - const token = await jwt.encode(visitorId, '30m'); - const { sub: visitorId } = await jwt.decode(token); - - /** - * If in a validation URL: - */ - res.send({ foo: 'bar' }); // will save foo in the installation config. - // or - res.sendFailed('This step has failed validation.'); // prevent the installer from progressing. - - /** - * If in an options URL: - */ - res.send([ { label: 'Foo', value: 1 }, { label: 'Bar', value: 2 } ]); // display these options in the dropdown. - - /** - * If in a worker: - */ - res.send({ hello: 'world' }); // the job was a success, and here's some data about it. - // or - res.sendOngoing({ hello: 'world' }); // the job is still ongoing, but here's some data about it. - // or - res.sendIgnored("We're not gonna do this one, sorry.", { hello: 'world' }); // doesnt meet the requirements to continue. - // or - res.sendFailed('We tried, but failed.', { hello: 'world' }); // we cant continue with this job. - -})); +/** + * JWT usage + */ +const token = await jwt.encode(visitorId, '30m'); +const { sub: visitorId } = await jwt.decode(token); + +/** + * If in a validation route: + */ +res.send({ foo: 'bar' }); // will save foo in the installation config. +// or +res.sendFailed('This step has failed validation.'); // prevent the installer from progressing. + +/** + * If in an options route: + */ +res.send([ { label: 'Foo', value: 1 }, { label: 'Bar', value: 2 } ]); // display these options in the dropdown. + +/** + * If in an event handler: + */ +res.send({ hello: 'world' }); // the job was a success, and here's some data about it. +// or +res.sendOngoing("We're still working on it.", { hello: 'world' }); // the job is still ongoing, but here's some data about it. +// or +res.sendIgnored("We're not gonna do this one, sorry.", { hello: 'world' }); // doesnt meet the requirements to continue. +// or +res.sendFailed('We tried, but failed.', { hello: 'world' }); // we cant continue with this job. + +/** +* Implement Axios Loggers +*/ +this.axios.interceptors.request.use(envoyAxiosRequestLogger, envoyAxiosErrorLogger); // Request interceptor + +this.axios.interceptors.response.use(envoyAxiosResponseLogger, envoyAxiosErrorLogger); // Response interceptor -app.use(errorMiddleware()); ``` + ## SDK Reference -For completeness, here is a list of each module exported by the SDK package. - -| Name | Type | -| :--- | :--- | -| EnvoyAPI | [EnvoyAPI](envoyapi.md) | -| EnvoyJWT | [EnvoyJWT](envoyjwt.md) | -| EnvoyPluginJob | [EnvoyPluginJob](envoypluginjob.md) | -| EnvoyPluginSDK | [EnvoyPluginSDK](envoypluginsdk.md) | -| EnvoyPluginStorage | [EnvoyPluginStorage](envoypluginstorage.md) | -| EnvoyPluginStoragePipeline | [EnvoyPluginStoragePipeline](envoypluginstoragepipeline.md) | -| EnvoySignatureVerifier | [EnvoySignatureVerifier](envoysignatureverifier.md) | -| middleware | [middleware](middleware.md) | -| errorMiddleware | [errorMiddleware](errormiddleware.md) | -| asyncHandler | [asyncHandler](asynchandler.md) | +Please see detailed documentation [here](docs/README.md). ### Contributing diff --git a/asynchandler.md b/asynchandler.md deleted file mode 100644 index 427a4bc..0000000 --- a/asynchandler.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -description: >- - Use this wrapper around your `async` endpoint handlers to catch Promise-based - errors. ---- - -# asyncHandler - -## Example - -```javascript -const express = require('express'); -const { middleware, asyncHandler } = require('envoy-integrations-sdk-nodejs'); - -const app = express(); -app.use(middleware()); -app.post('/foo', asyncHandler(async (req, res) => { - await somePromiseThatThrowsAnError(); -})); -``` - -## Functions - -### asyncHandler\(handler\) ⇒ `connectHandler` - -Returns a wrapped handler that catches Promise-based errors. - -**Kind**: global function - -| Param | Type | -| :--- | :--- | -| handler | `connectHandler` | - -### Related Functions and Classes - -### connectHandler : `function` - -Express/connect middleware. - -**Kind**: global typedef - -| Param | Type | -| :--- | :--- | -| req | [http://expressjs.com/en/4x/api.html\#req](http://expressjs.com/en/4x/api.html#req) | -| res | [http://expressjs.com/en/4x/api.html\#res](http://expressjs.com/en/4x/api.html#res) | - diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..03421e8 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,1797 @@ +@envoy/envoy-integrations-sdk + +# @envoy/envoy-integrations-sdk + +## Table of contents + +### API Classes + +- [EnvoyPluginAPI](classes/envoypluginapi.md) +- [EnvoyUserAPI](classes/envoyuserapi.md) + +### Helper Classes + +- [EnvoyJWT](classes/envoyjwt.md) + +### Request Object Classes + +- [EnvoyJWT](classes/envoyjwt.md) +- [EnvoyPluginAPI](classes/envoypluginapi.md) +- [EnvoyPluginJob](classes/envoypluginjob.md) +- [EnvoyPluginStorage](classes/envoypluginstorage.md) +- [EnvoyUserAPI](classes/envoyuserapi.md) + +### SDK Classes + +- [EnvoyPluginSDK](classes/envoypluginsdk.md) + +### Storage Classes + +- [EnvoyPluginStorage](classes/envoypluginstorage.md) + +### API Resource Interfaces + +- [AgreementAttributes](interfaces/agreementattributes.md) +- [CompanyAttributes](interfaces/companyattributes.md) +- [EmployeeAttributes](interfaces/employeeattributes.md) +- [EmployeeFilterFields](interfaces/employeefilterfields.md) +- [FlowAttributes](interfaces/flowattributes.md) +- [FlowFilterFields](interfaces/flowfilterfields.md) +- [InviteAttributes](interfaces/inviteattributes.md) +- [InviteCreationAttributes](interfaces/invitecreationattributes.md) +- [InviteFilterFields](interfaces/invitefilterfields.md) +- [LocationAttributes](interfaces/locationattributes.md) +- [LocationFilterFields](interfaces/locationfilterfields.md) +- [SignInFieldAttributes](interfaces/signinfieldattributes.md) + +### Base Interfaces + +- [EnvoyBaseRequest](interfaces/envoybaserequest.md) + +### Other Interfaces + +- [JSONAPIData](interfaces/jsonapidata.md) + +### Response Interfaces + +- [EnvoyResponse](interfaces/envoyresponse.md) + +### API Resource Type aliases + +- [AgreementModel](README.md#agreementmodel) +- [AgreementPageAttributes](README.md#agreementpageattributes) +- [AgreementPageModel](README.md#agreementpagemodel) +- [AgreementPageRelationships](README.md#agreementpagerelationships) +- [AgreementRelationships](README.md#agreementrelationships) +- [CompanyModel](README.md#companymodel) +- [CompanyRelationships](README.md#companyrelationships) +- [EmployeeModel](README.md#employeemodel) +- [EmployeeRelationships](README.md#employeerelationships) +- [EmployeeSortFields](README.md#employeesortfields) +- [FlowModel](README.md#flowmodel) +- [FlowRelationships](README.md#flowrelationships) +- [FlowSortFields](README.md#flowsortfields) +- [InviteCreationModel](README.md#invitecreationmodel) +- [InviteModel](README.md#invitemodel) +- [InviteRelationships](README.md#inviterelationships) +- [InviteSortFields](README.md#invitesortfields) +- [LocationModel](README.md#locationmodel) +- [LocationRelationships](README.md#locationrelationships) +- [LocationSortFields](README.md#locationsortfields) +- [SignInFieldModel](README.md#signinfieldmodel) +- [SignInFieldPageAttributes](README.md#signinfieldpageattributes) +- [SignInFieldPageModel](README.md#signinfieldpagemodel) +- [SignInFieldPageRelationships](README.md#signinfieldpagerelationships) +- [SignInFieldRelationships](README.md#signinfieldrelationships) +- [UserAttributes](README.md#userattributes) +- [UserModel](README.md#usermodel) + +### Base Type aliases + +- [EnvoyRequest](README.md#envoyrequest) + +### Event Type aliases + +- [EntryPayload](README.md#entrypayload) +- [InvitePayload](README.md#invitepayload) + +### Handler Type aliases + +- [EntryEventHandler](README.md#entryeventhandler) +- [InviteEventHandler](README.md#inviteeventhandler) +- [MigrationRouteHandler](README.md#migrationroutehandler) +- [OptionsRouteHandler](README.md#optionsroutehandler) +- [PluginUninstalledEventHandler](README.md#pluginuninstalledeventhandler) +- [RemoteValueRouteHandler](README.md#remotevalueroutehandler) +- [SelectedValuesRouteHandler](README.md#selectedvaluesroutehandler) +- [ValidationRouteHandler](README.md#validationroutehandler) + +### Helper Type aliases + +- [EnvoySignatureVerifierOptions](README.md#envoysignatureverifieroptions) + +### Meta Type aliases + +- [EnvoyEventMeta](README.md#envoyeventmeta) +- [EnvoyMetaAuth](README.md#envoymetaauth) +- [EnvoyMetaCompany](README.md#envoymetacompany) +- [EnvoyMetaJob](README.md#envoymetajob) +- [EnvoyMetaLocation](README.md#envoymetalocation) +- [EnvoyMetaZone](README.md#envoymetazone) +- [EnvoyRouteMeta](README.md#envoyroutemeta) + +### Request Type aliases + +- [EnvoyEntryEventRequest](README.md#envoyentryeventrequest) +- [EnvoyEventRequest](README.md#envoyeventrequest) +- [EnvoyInviteEventRequest](README.md#envoyinviteeventrequest) +- [EnvoyMigrationRouteRequest](README.md#envoymigrationrouterequest) +- [EnvoyOptionsRouteRequest](README.md#envoyoptionsrouterequest) +- [EnvoyRemoteValueRouteRequest](README.md#envoyremotevaluerouterequest) +- [EnvoyRouteRequest](README.md#envoyrouterequest) +- [EnvoySelectedValuesRouteRequest](README.md#envoyselectedvaluesrouterequest) +- [EnvoyValidationRouteRequest](README.md#envoyvalidationrouterequest) + +### Response Type aliases + +- [EnvoyOptionsRouteResponse](README.md#envoyoptionsrouteresponse) +- [EnvoyRemoteValueRouteResponse](README.md#envoyremotevaluerouteresponse) +- [EnvoySelectedValuesRouteResponse](README.md#envoyselectedvaluesrouteresponse) + +### Storage Type aliases + +- [EnvoyStorageItem](README.md#envoystorageitem) + +### Filter Functions + +- [employeeSignInEnabledFilterMiddleware](README.md#employeesigninenabledfiltermiddleware) +- [excludedEmployeesFilterMiddleware](README.md#excludedemployeesfiltermiddleware) +- [inviteOnlyEntryFilterMiddleware](README.md#inviteonlyentryfiltermiddleware) + +### Handler Functions + +- [asyncHandler](README.md#asynchandler) +- [entryEventHandler](README.md#entryeventhandler) +- [inviteEventHandler](README.md#inviteeventhandler) +- [migrationRouteHandler](README.md#migrationroutehandler) +- [optionsRouteHandler](README.md#optionsroutehandler) +- [pluginUninstalledEventHandler](README.md#pluginuninstalledeventhandler) +- [remoteValueRouteHandler](README.md#remotevalueroutehandler) +- [selectedValuesRouteHandler](README.md#selectedvaluesroutehandler) +- [validationRouteHandler](README.md#validationroutehandler) + +### Middleware Functions + +- [employeeSignInEnabledFilterMiddleware](README.md#employeesigninenabledfiltermiddleware) +- [envoyMiddleware](README.md#envoymiddleware) +- [errorMiddleware](README.md#errormiddleware) +- [excludedEmployeesFilterMiddleware](README.md#excludedemployeesfiltermiddleware) +- [inviteOnlyEntryFilterMiddleware](README.md#inviteonlyentryfiltermiddleware) + +## API Resource Type aliases + +### AgreementModel + +Ƭ **AgreementModel**: `JSONAPIModel`<[AgreementAttributes](interfaces/agreementattributes.md), [AgreementRelationships](README.md#agreementrelationships)\> + +#### Defined in + +[resources/AgreementResource.ts:26](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/AgreementResource.ts#L26) + +___ + +### AgreementPageAttributes + +Ƭ **AgreementPageAttributes**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `enabled?` | `boolean` | +| `position?` | `number` | + +#### Defined in + +[resources/AgreementPageResource.ts:6](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/AgreementPageResource.ts#L6) + +___ + +### AgreementPageModel + +Ƭ **AgreementPageModel**: `JSONAPIModel`<[AgreementPageAttributes](README.md#agreementpageattributes), [AgreementPageRelationships](README.md#agreementpagerelationships)\> + +#### Defined in + +[resources/AgreementPageResource.ts:19](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/AgreementPageResource.ts#L19) + +___ + +### AgreementPageRelationships + +Ƭ **AgreementPageRelationships**: ``"flow"`` \| ``"agreements"`` + +#### Defined in + +[resources/AgreementPageResource.ts:14](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/AgreementPageResource.ts#L14) + +___ + +### AgreementRelationships + +Ƭ **AgreementRelationships**: ``"agreement-page"`` + +#### Defined in + +[resources/AgreementResource.ts:21](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/AgreementResource.ts#L21) + +___ + +### CompanyModel + +Ƭ **CompanyModel**: `JSONAPIModel`<[CompanyAttributes](interfaces/companyattributes.md), [CompanyRelationships](README.md#companyrelationships)\> + +#### Defined in + +[resources/CompanyResource.ts:21](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/CompanyResource.ts#L21) + +___ + +### CompanyRelationships + +Ƭ **CompanyRelationships**: ``"locations"`` + +#### Defined in + +[resources/CompanyResource.ts:16](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/CompanyResource.ts#L16) + +___ + +### EmployeeModel + +Ƭ **EmployeeModel**: `JSONAPIModel`<[EmployeeAttributes](interfaces/employeeattributes.md), [EmployeeRelationships](README.md#employeerelationships)\> + +#### Defined in + +[resources/EmployeeResource.ts:47](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L47) + +___ + +### EmployeeRelationships + +Ƭ **EmployeeRelationships**: ``"locations"`` \| ``"company"`` + +#### Defined in + +[resources/EmployeeResource.ts:42](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L42) + +___ + +### EmployeeSortFields + +Ƭ **EmployeeSortFields**: ``"name"`` \| ``"created_at"`` \| ``"-name"`` \| ``"-created_at"`` + +#### Defined in + +[resources/EmployeeResource.ts:6](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L6) + +___ + +### FlowModel + +Ƭ **FlowModel**: `JSONAPIModel`<[FlowAttributes](interfaces/flowattributes.md), [FlowRelationships](README.md#flowrelationships)\> + +#### Defined in + +[resources/FlowResource.ts:35](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/FlowResource.ts#L35) + +___ + +### FlowRelationships + +Ƭ **FlowRelationships**: ``"location"`` \| ``"sign-in-field-page"`` \| ``"agreement-page"`` + +#### Defined in + +[resources/FlowResource.ts:30](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/FlowResource.ts#L30) + +___ + +### FlowSortFields + +Ƭ **FlowSortFields**: ``"name"`` \| ``"created_at"`` \| ``"-name"`` \| ``"-created_at"`` + +#### Defined in + +[resources/FlowResource.ts:6](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/FlowResource.ts#L6) + +___ + +### InviteCreationModel + +Ƭ **InviteCreationModel**: `JSONAPIModel`<[InviteCreationAttributes](interfaces/invitecreationattributes.md), [InviteRelationships](README.md#inviterelationships), ``"invites"``, undefined\> + +#### Defined in + +[resources/InviteResource.ts:92](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L92) + +___ + +### InviteModel + +Ƭ **InviteModel**: `JSONAPIModel`<[InviteAttributes](interfaces/inviteattributes.md), [InviteRelationships](README.md#inviterelationships), ``"invites"``\> + +#### Defined in + +[resources/InviteResource.ts:87](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L87) + +___ + +### InviteRelationships + +Ƭ **InviteRelationships**: ``"attendee"`` \| ``"creator"`` \| ``"employee"`` \| ``"entry"`` \| ``"flow"`` \| ``"location"`` + +#### Defined in + +[resources/InviteResource.ts:82](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L82) + +___ + +### InviteSortFields + +Ƭ **InviteSortFields**: ``"name"`` \| ``"created_at"`` \| ``"-name"`` \| ``"-created_at"`` + +#### Defined in + +[resources/InviteResource.ts:6](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L6) + +___ + +### LocationModel + +Ƭ **LocationModel**: `JSONAPIModel`<[LocationAttributes](interfaces/locationattributes.md), [LocationRelationships](README.md#locationrelationships)\> + +#### Defined in + +[resources/LocationResource.ts:67](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L67) + +___ + +### LocationRelationships + +Ƭ **LocationRelationships**: ``"company"`` \| ``"employees"`` \| ``"flows"`` \| ``"employee-screening-flow"`` + +#### Defined in + +[resources/LocationResource.ts:62](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L62) + +___ + +### LocationSortFields + +Ƭ **LocationSortFields**: ``"name"`` \| ``"created_at"`` \| ``"-name"`` \| ``"-created_at"`` + +#### Defined in + +[resources/LocationResource.ts:6](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L6) + +___ + +### SignInFieldModel + +Ƭ **SignInFieldModel**: `JSONAPIModel`<[SignInFieldAttributes](interfaces/signinfieldattributes.md), [SignInFieldRelationships](README.md#signinfieldrelationships)\> + +#### Defined in + +[resources/SignInFieldResource.ts:31](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/SignInFieldResource.ts#L31) + +___ + +### SignInFieldPageAttributes + +Ƭ **SignInFieldPageAttributes**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `enabled?` | `boolean` | +| `position?` | `number` | + +#### Defined in + +[resources/SignInFieldPageResource.ts:6](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/SignInFieldPageResource.ts#L6) + +___ + +### SignInFieldPageModel + +Ƭ **SignInFieldPageModel**: `JSONAPIModel`<[SignInFieldPageAttributes](README.md#signinfieldpageattributes), [SignInFieldPageRelationships](README.md#signinfieldpagerelationships)\> + +#### Defined in + +[resources/SignInFieldPageResource.ts:23](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/SignInFieldPageResource.ts#L23) + +___ + +### SignInFieldPageRelationships + +Ƭ **SignInFieldPageRelationships**: ``"flow"`` \| ``"actionable-sign-in-field-actions"`` \| ``"actionable-sign-in-fields"`` \| ``"sign-in-field-actions"`` \| ``"sign-in-fields"`` + +#### Defined in + +[resources/SignInFieldPageResource.ts:14](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/SignInFieldPageResource.ts#L14) + +___ + +### SignInFieldRelationships + +Ƭ **SignInFieldRelationships**: ``"sign-in-field-page"`` + +#### Defined in + +[resources/SignInFieldResource.ts:26](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/SignInFieldResource.ts#L26) + +___ + +### UserAttributes + +Ƭ **UserAttributes**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `email` | `string` | +| `name` | `string` | + +#### Defined in + +[resources/UserResource.ts:6](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/UserResource.ts#L6) + +___ + +### UserModel + +Ƭ **UserModel**: `JSONAPIModel`<[UserAttributes](README.md#userattributes), ``""``\> + +#### Defined in + +[resources/UserResource.ts:14](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/UserResource.ts#L14) + +___ + +## Base Type aliases + +### EnvoyRequest + +Ƭ **EnvoyRequest**: [EnvoyBaseRequest](interfaces/envoybaserequest.md)<[EnvoyRouteMeta](README.md#envoyroutemeta) \| [EnvoyEventMeta](README.md#envoyeventmeta), Payload\> + +You probably won't need to use this type directly. +For routes, use [EnvoyRouteRequest](README.md#envoyrouterequest), +and for events, use [EnvoyEntryEventRequest](README.md#envoyentryeventrequest) or [EnvoyInviteEventRequest](README.md#envoyinviteeventrequest). + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Payload` | `Payload` = `unknown` | +| `Config` | `Config` = `Record` | + +#### Defined in + +[sdk/EnvoyRequest.ts:123](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyRequest.ts#L123) + +___ + +## Event Type aliases + +### EntryPayload + +Ƭ **EntryPayload**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `attributes` | `Object` | +| `attributes.email` | `string` \| ``null`` | +| `attributes.employee-screening-flow` | `boolean` | +| `attributes.flow-name` | `string` | +| `attributes.full-name` | `string` | +| `attributes.host` | `string` \| ``null`` | +| `attributes.host-email` | `string` \| ``null`` | +| `attributes.legal-docs?` | { `agreement`: { `id`: `string` } ; `id`: `string` ; `signed-at`: `string` ; `url`: `string` }[] | +| `attributes.nda?` | `string` | +| `attributes.phone-number?` | `string` | +| `attributes.private-notes` | `string` \| ``null`` | +| `attributes.signed-in-at` | `string` | +| `attributes.signed-out-at?` | `string` | +| `attributes.thumbnails` | `Object` | +| `attributes.thumbnails.large` | `string` \| ``null`` | +| `attributes.thumbnails.original` | `string` \| ``null`` | +| `attributes.thumbnails.small` | `string` \| ``null`` | +| `attributes.user-data` | { `field`: `string` ; `value`: `string` \| ``null`` }[] | +| `id` | `string` | +| `relationships` | `Object` | +| `relationships.agreeable-ndas?` | `Object` | +| `relationships.agreeable-ndas.data` | [JSONAPIData](interfaces/jsonapidata.md)<``"agreeable-ndas"``\>[] | +| `relationships.device?` | `Object` | +| `relationships.device.data` | [JSONAPIData](interfaces/jsonapidata.md)<``"devices"``\> | +| `relationships.employee?` | `Object` | +| `relationships.employee.data` | [JSONAPIData](interfaces/jsonapidata.md)<``"employees"``\> | +| `relationships.flow?` | `Object` | +| `relationships.flow.data` | [JSONAPIData](interfaces/jsonapidata.md)<``"flows"``\> | +| `relationships.invite?` | `Object` | +| `relationships.invite.data` | [JSONAPIData](interfaces/jsonapidata.md)<``"invites"``\> | +| `relationships.location` | `Object` | +| `relationships.location.data` | [JSONAPIData](interfaces/jsonapidata.md)<``"locations"``\> | +| `relationships.visitor-entrance?` | `Object` | +| `relationships.visitor-entrance.data` | [JSONAPIData](interfaces/jsonapidata.md)<``"visitor-entrances"``\> | +| `type` | ``"entries"`` | + +#### Defined in + +[payloads/EntryPayload.ts:6](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/payloads/EntryPayload.ts#L6) + +___ + +### InvitePayload + +Ƭ **InvitePayload**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `attributes` | `Object` | +| `attributes.arrived` | `boolean` | +| `attributes.been-here-before` | `boolean` | +| `attributes.edit-token` | `string` | +| `attributes.email` | `string` \| ``null`` | +| `attributes.employee-screening-flow` | `boolean` | +| `attributes.expected-arrival-time` | `string` | +| `attributes.flow-id` | `string` | +| `attributes.flow-name` | `string` | +| `attributes.full-name` | `string` | +| `attributes.inviter-email` | `string` \| ``null`` | +| `attributes.inviter-name` | `string` \| ``null`` | +| `attributes.legal-docs?` | { `agreement`: { `id`: `string` } ; `id`: `string` ; `signed-at`: `string` ; `url`: `string` }[] | +| `attributes.nda?` | `string` | +| `attributes.photo-url` | `string` \| ``null`` | +| `attributes.preregistration-complete` | `boolean` | +| `attributes.private-notes` | `string` \| ``null`` | +| `attributes.qr-code` | `string` \| ``null`` | +| `attributes.qr-code-sent-at` | `string` \| ``null`` | +| `attributes.reminder-sent-at` | `string` \| ``null`` | +| `attributes.secret-token` | `string` | +| `attributes.signed-in-at?` | `string` | +| `attributes.signed-out-at?` | `string` | +| `attributes.user-data` | { `field`: `string` ; `value`: `string` \| ``null`` }[] | +| `id` | `string` | +| `relationships` | `Object` | +| `relationships.agreeable-ndas?` | `Object` | +| `relationships.agreeable-ndas.data` | [JSONAPIData](interfaces/jsonapidata.md)<``"agreeable-ndas"``\>[] | +| `relationships.employee?` | `Object` | +| `relationships.employee.data` | [JSONAPIData](interfaces/jsonapidata.md)<``"employees"``\> | +| `relationships.entry?` | `Object` | +| `relationships.entry.data` | [JSONAPIData](interfaces/jsonapidata.md)<``"entries"``\> | +| `relationships.flow?` | `Object` | +| `relationships.flow.data` | [JSONAPIData](interfaces/jsonapidata.md)<``"flows"``\> | +| `relationships.location` | `Object` | +| `relationships.location.data` | [JSONAPIData](interfaces/jsonapidata.md)<``"locations"``\> | +| `type` | ``"invites"`` | + +#### Defined in + +[payloads/InvitePayload.ts:6](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/payloads/InvitePayload.ts#L6) + +___ + +## Handler Type aliases + +### EntryEventHandler + +Ƭ **EntryEventHandler**: (`req`: [EnvoyEntryEventRequest](README.md#envoyentryeventrequest) & `Additions`, `res`: [EnvoyResponse](interfaces/envoyresponse.md)) => `Result` + +Handle an entry event, such as `entry_sign_in`. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `SomeObject` | +| `Additions` | `Additions` = `SomeObject` | + +#### Type declaration + +▸ (`req`, `res`): `Result` + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `req` | [EnvoyEntryEventRequest](README.md#envoyentryeventrequest) & `Additions` | +| `res` | [EnvoyResponse](interfaces/envoyresponse.md) | + +##### Returns + +`Result` + +#### Defined in + +[sdk/handlers.ts:31](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L31) + +___ + +### InviteEventHandler + +Ƭ **InviteEventHandler**: (`req`: [EnvoyInviteEventRequest](README.md#envoyinviteeventrequest) & `Additions`, `res`: [EnvoyResponse](interfaces/envoyresponse.md)) => `Result` + +Handle an invite event, such as `invite_created`. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `SomeObject` | +| `Additions` | `Additions` = `SomeObject` | + +#### Type declaration + +▸ (`req`, `res`): `Result` + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `req` | [EnvoyInviteEventRequest](README.md#envoyinviteeventrequest) & `Additions` | +| `res` | [EnvoyResponse](interfaces/envoyresponse.md) | + +##### Returns + +`Result` + +#### Defined in + +[sdk/handlers.ts:38](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L38) + +___ + +### MigrationRouteHandler + +Ƭ **MigrationRouteHandler**: (`req`: [EnvoyMigrationRouteRequest](README.md#envoymigrationrouterequest) & `Additions`, `res`: [EnvoyResponse](interfaces/envoyresponse.md)) => `Result` + +Handle a "migration" route. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `OldConfig` | `OldConfig` = `SomeObject` | +| `NewConfig` | `NewConfig` = `SomeObject` | +| `Additions` | `Additions` = `SomeObject` | + +#### Type declaration + +▸ (`req`, `res`): `Result` + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `req` | [EnvoyMigrationRouteRequest](README.md#envoymigrationrouterequest) & `Additions` | +| `res` | [EnvoyResponse](interfaces/envoyresponse.md) | + +##### Returns + +`Result` + +#### Defined in + +[sdk/handlers.ts:52](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L52) + +___ + +### OptionsRouteHandler + +Ƭ **OptionsRouteHandler**: (`req`: [EnvoyOptionsRouteRequest](README.md#envoyoptionsrouterequest) & `Additions`, `res`: [EnvoyOptionsRouteResponse](README.md#envoyoptionsrouteresponse)) => `Result` + +Handle an "options" route. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `SomeObject` | +| `Additions` | `Additions` = `SomeObject` | + +#### Type declaration + +▸ (`req`, `res`): `Result` + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `req` | [EnvoyOptionsRouteRequest](README.md#envoyoptionsrouterequest) & `Additions` | +| `res` | [EnvoyOptionsRouteResponse](README.md#envoyoptionsrouteresponse) | + +##### Returns + +`Result` + +#### Defined in + +[sdk/handlers.ts:59](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L59) + +___ + +### PluginUninstalledEventHandler + +Ƭ **PluginUninstalledEventHandler**: (`req`: [EnvoyEventRequest](README.md#envoyeventrequest)<``"plugin_uninstalled"``, never, Config\> & `Additions`, `res`: [EnvoyResponse](interfaces/envoyresponse.md)) => `Result` + +Handle a `plugin_uninstalled` event for cleaning up. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `SomeObject` | +| `Additions` | `Additions` = `SomeObject` | + +#### Type declaration + +▸ (`req`, `res`): `Result` + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `req` | [EnvoyEventRequest](README.md#envoyeventrequest)<``"plugin_uninstalled"``, never, Config\> & `Additions` | +| `res` | [EnvoyResponse](interfaces/envoyresponse.md) | + +##### Returns + +`Result` + +#### Defined in + +[sdk/handlers.ts:45](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L45) + +___ + +### RemoteValueRouteHandler + +Ƭ **RemoteValueRouteHandler**: (`req`: [EnvoyRemoteValueRouteRequest](README.md#envoyremotevaluerouterequest) & `Additions`, `res`: [EnvoyRemoteValueRouteResponse](README.md#envoyremotevaluerouteresponse)) => `Result` + +Handle a "remote value" route. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `SomeObject` | +| `Additions` | `Additions` = `SomeObject` | + +#### Type declaration + +▸ (`req`, `res`): `Result` + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `req` | [EnvoyRemoteValueRouteRequest](README.md#envoyremotevaluerouterequest) & `Additions` | +| `res` | [EnvoyRemoteValueRouteResponse](README.md#envoyremotevaluerouteresponse) | + +##### Returns + +`Result` + +#### Defined in + +[sdk/handlers.ts:66](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L66) + +___ + +### SelectedValuesRouteHandler + +Ƭ **SelectedValuesRouteHandler**: (`req`: [EnvoySelectedValuesRouteRequest](README.md#envoyselectedvaluesrouterequest) & `Additions`, `res`: [EnvoySelectedValuesRouteResponse](README.md#envoyselectedvaluesrouteresponse)) => `Result` + +Handle a "selected values" route. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `SomeObject` | +| `Additions` | `Additions` = `SomeObject` | + +#### Type declaration + +▸ (`req`, `res`): `Result` + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `req` | [EnvoySelectedValuesRouteRequest](README.md#envoyselectedvaluesrouterequest) & `Additions` | +| `res` | [EnvoySelectedValuesRouteResponse](README.md#envoyselectedvaluesrouteresponse) | + +##### Returns + +`Result` + +#### Defined in + +[sdk/handlers.ts:73](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L73) + +___ + +### ValidationRouteHandler + +Ƭ **ValidationRouteHandler**: (`req`: [EnvoyValidationRouteRequest](README.md#envoyvalidationrouterequest) & `Additions`, `res`: [EnvoyResponse](interfaces/envoyresponse.md)\>) => `Result` + +Handle a "validation" route. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `SomeObject` | +| `Payload` | `Payload` = `SomeObject` | +| `Additions` | `Additions` = `SomeObject` | + +#### Type declaration + +▸ (`req`, `res`): `Result` + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `req` | [EnvoyValidationRouteRequest](README.md#envoyvalidationrouterequest) & `Additions` | +| `res` | [EnvoyResponse](interfaces/envoyresponse.md)\> | + +##### Returns + +`Result` + +#### Defined in + +[sdk/handlers.ts:80](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L80) + +___ + +## Helper Type aliases + +### EnvoySignatureVerifierOptions + +Ƭ **EnvoySignatureVerifierOptions**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `algorithm` | ``"sha256"`` \| `string` | +| `encoding` | `BinaryToTextEncoding` | +| `header` | ``"x-envoy-signature"`` \| `string` | +| `secret` | `string` | + +#### Defined in + +[util/EnvoySignatureVerifier.ts:8](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/util/EnvoySignatureVerifier.ts#L8) + +___ + +## Meta Type aliases + +### EnvoyEventMeta + +Ƭ **EnvoyEventMeta**: `Object` + +Metadata that will be included in the request body for events. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Event` | `Event`: `string` = `string` | +| `Config` | `Config` = `Record` | + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `auth` | [EnvoyMetaAuth](README.md#envoymetaauth) \| ``null`` | +| `company` | [EnvoyMetaCompany](README.md#envoymetacompany) | +| `config` | `Config` | +| `event` | `Event` | +| `install_id` | `string` | +| `job` | [EnvoyMetaJob](README.md#envoymetajob) | +| `location` | [EnvoyMetaLocation](README.md#envoymetalocation) | +| `zone` | [EnvoyMetaZone](README.md#envoymetazone) | +| `plugin_id` | `string` | + +#### Defined in + +[sdk/EnvoyMeta.ts:66](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyMeta.ts#L66) + +___ + +### EnvoyMetaAuth + +Ƭ **EnvoyMetaAuth**: `Object` + +A short-lived `userAPI` token. +Will be used to construct the `userAPI` property found in `req.envoy.userAPI`. + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `access_token` | `string` | +| `expires_in` | `number` | +| `refresh_token` | `string` \| ``null`` | +| `refresh_token_expires_in` | `number` \| ``null`` | +| `token_type` | ``"Bearer"`` | + +#### Defined in + +[sdk/EnvoyMeta.ts:53](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyMeta.ts#L53) + +___ + +### EnvoyMetaCompany + +Ƭ **EnvoyMetaCompany**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `attributes` | `Object` | +| `attributes.active` | `boolean` | +| `attributes.created-at` | `string` | +| `attributes.name` | `string` | +| `id` | `string` | +| `type` | ``"companies"`` | + +#### Defined in + +[sdk/EnvoyMeta.ts:37](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyMeta.ts#L37) + +___ + +### EnvoyMetaJob + +Ƭ **EnvoyMetaJob**: `Object` + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Event` | `Event`: `string` = `string` | + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `id` | `string` | +| `identifier` | `string` | +| `name` | `Event` | + +#### Defined in + +[sdk/EnvoyMeta.ts:4](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyMeta.ts#L4) + +___ + +### EnvoyMetaLocation + +Ƭ **EnvoyMetaLocation**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `attributes` | `Object` | +| `attributes.address` | `string` | +| `attributes.address-line-one` | `string` \| ``null`` | +| `attributes.address-line-two` | `string` \| ``null`` | +| `attributes.city` | `string` \| ``null`` | +| `attributes.company-name-override` | `string` \| ``null`` | +| `attributes.country` | `string` \| ``null`` | +| `attributes.created-at` | `string` | +| `attributes.latitude` | `number` \| ``null`` | +| `attributes.locale` | `string` \| ``null`` | +| `attributes.longitude` | `number` \| ``null`` | +| `attributes.name` | `string` | +| `attributes.state` | `string` \| ``null`` | +| `attributes.timezone` | `string` | +| `attributes.zip` | `string` \| ``null`` | +| `id` | `string` | +| `type` | ``"locations"`` | + +#### Defined in + +[sdk/EnvoyMeta.ts:13](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyMeta.ts#L13) + +### EnvoyMetaZone + +Ƭ **EnvoyMetaZone**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `attributes` | `Object` | +| `attributes.address` | `string` \| ``null`` | +| `attributes.logo-url` | `string` \| ``null`` | +| `attributes.name` | `string` | +| `attributes.time-zone` | `string` | +| `id` | `string` | +| `type` | ``"zones"`` | + +___ + +### EnvoyRouteMeta + +Ƭ **EnvoyRouteMeta**: `Object` + +Metadata that will be included in the request body for setup routes, +like validation URLs or options URLs. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `Record` | +| `Params` | `Params` = `Record` | + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `auth` | [EnvoyMetaAuth](README.md#envoymetaauth) \| ``null`` | +| `company` | [EnvoyMetaCompany](README.md#envoymetacompany) | +| `config` | `Config` | +| `forwarded_bearer_token?` | `string` | +| `install_id` | `string` | +| `location` | [EnvoyMetaLocation](README.md#envoymetalocation) | +| `zone` | [EnvoyMetaZone](README.md#envoymetazone) | +| `params` | `Params` | +| `plugin_id` | `string` | +| `route` | `string` | + +#### Defined in + +[sdk/EnvoyMeta.ts:83](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyMeta.ts#L83) + +___ + +## Request Type aliases + +### EnvoyEntryEventRequest + +Ƭ **EnvoyEntryEventRequest**: [EnvoyEventRequest](README.md#envoyeventrequest) + +Use to type your `req` object in entry event handlers, +such as handlers for `entry_sign_in`. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `Record` | + +#### Defined in + +[sdk/EnvoyRequest.ts:104](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyRequest.ts#L104) + +___ + +### EnvoyEventRequest + +Ƭ **EnvoyEventRequest**: [EnvoyBaseRequest](interfaces/envoybaserequest.md)<[EnvoyEventMeta](README.md#envoyeventmeta), Payload\> + +Base type for event requests. +You should use [EnvoyEntryEventRequest](README.md#envoyentryeventrequest) or [EnvoyInviteEventRequest](README.md#envoyinviteeventrequest). + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Event` | `Event`: `string` = `string` | +| `Payload` | `Payload` = `unknown` | +| `Config` | `Config` = `Record` | + +#### Defined in + +[sdk/EnvoyRequest.ts:95](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyRequest.ts#L95) + +___ + +### EnvoyInviteEventRequest + +Ƭ **EnvoyInviteEventRequest**: [EnvoyEventRequest](README.md#envoyeventrequest) + +Use to type your `req` object in invite event handlers, +such as handlers for `invite_created` or `upcoming_visit`. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `Record` | + +#### Defined in + +[sdk/EnvoyRequest.ts:113](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyRequest.ts#L113) + +___ + +### EnvoyMigrationRouteRequest + +Ƭ **EnvoyMigrationRouteRequest**: [EnvoyRouteRequest](README.md#envoyrouterequest) + +Use to type your `req` object in Envoy "migration" route handlers. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `OldConfig` | `OldConfig` = `Record` | + +#### Defined in + +[sdk/EnvoyRequest.ts:54](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyRequest.ts#L54) + +___ + +### EnvoyOptionsRouteRequest + +Ƭ **EnvoyOptionsRouteRequest**: [EnvoyRouteRequest](README.md#envoyrouterequest) + +Use to type your `req` object in Envoy "options URL" route handlers. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `Record` | + +#### Defined in + +[sdk/EnvoyRequest.ts:62](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyRequest.ts#L62) + +___ + +### EnvoyRemoteValueRouteRequest + +Ƭ **EnvoyRemoteValueRouteRequest**: [EnvoyRouteRequest](README.md#envoyrouterequest) + +Use to type your `req` object in Envoy "remote value URL" route handlers. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `Record` | + +#### Defined in + +[sdk/EnvoyRequest.ts:78](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyRequest.ts#L78) + +___ + +### EnvoyRouteRequest + +Ƭ **EnvoyRouteRequest**: [EnvoyBaseRequest](interfaces/envoybaserequest.md)<[EnvoyRouteMeta](README.md#envoyroutemeta), Payload\> + +Use to type your `req` object in Envoy route handlers such as validation URLs. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Payload` | `Payload` = `unknown` | +| `Config` | `Config` = `Record` | +| `Params` | `Params` = `Record` | + +#### Defined in + +[sdk/EnvoyRequest.ts:43](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyRequest.ts#L43) + +___ + +### EnvoySelectedValuesRouteRequest + +Ƭ **EnvoySelectedValuesRouteRequest**: [EnvoyRouteRequest](README.md#envoyrouterequest) + +Use to type your `req` object in Envoy "selected values URL" route handlers. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `Record` | + +#### Defined in + +[sdk/EnvoyRequest.ts:70](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyRequest.ts#L70) + +___ + +### EnvoyValidationRouteRequest + +Ƭ **EnvoyValidationRouteRequest**: [EnvoyRouteRequest](README.md#envoyrouterequest) + +Use to type your `req` object in Envoy "validation URL" route handlers. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Payload` | `Payload` = `Record` | +| `Config` | `Config` = `Record` | + +#### Defined in + +[sdk/EnvoyRequest.ts:86](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyRequest.ts#L86) + +___ + +## Response Type aliases + +### EnvoyOptionsRouteResponse + +Ƭ **EnvoyOptionsRouteResponse**: [EnvoyResponse](interfaces/envoyresponse.md) + +Use to type your `res` object in Envoy "options URL" route handlers. + +#### Defined in + +[sdk/EnvoyResponse.ts:34](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyResponse.ts#L34) + +___ + +### EnvoyRemoteValueRouteResponse + +Ƭ **EnvoyRemoteValueRouteResponse**: [EnvoyResponse](interfaces/envoyresponse.md) + +Use to type your `res` object in Envoy "remote value URL" route handlers. + +#### Defined in + +[sdk/EnvoyResponse.ts:40](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyResponse.ts#L40) + +___ + +### EnvoySelectedValuesRouteResponse + +Ƭ **EnvoySelectedValuesRouteResponse**: [EnvoyResponse](interfaces/envoyresponse.md) + +Use to type your `res` object in Envoy "selected values URL" route handlers. + +#### Defined in + +[sdk/EnvoyResponse.ts:46](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyResponse.ts#L46) + +___ + +## Storage Type aliases + +### EnvoyStorageItem + +Ƭ **EnvoyStorageItem**: `Object` + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Value` | `Value` = `unknown` | + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `key` | `string` | +| `value` | `Value` | + +#### Defined in + +[sdk/EnvoyStorageItem.ts:4](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyStorageItem.ts#L4) + +## Filter Functions + +### employeeSignInEnabledFilterMiddleware + +▸ **employeeSignInEnabledFilterMiddleware**(`employeeSignInEnabledKey`, `message?`): `RequestHandler` + +Will only proceed if the install's `config` has a truthy value for the given `employeeSignInEnabledKey`. + +#### Type parameters + +| Name | +| :------ | +| `Config` | + +#### Parameters + +| Name | Type | Default value | +| :------ | :------ | :------ | +| `employeeSignInEnabledKey` | keyof `Config` | `undefined` | +| `message` | `string` | 'Envoy Protect is disabled.' | + +#### Returns + +`RequestHandler` + +#### Defined in + +[sdk/filters.ts:30](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/filters.ts#L30) + +___ + +### excludedEmployeesFilterMiddleware + +▸ **excludedEmployeesFilterMiddleware**(`excludeEmployeesKey`, `message?`): `RequestHandler` + +Will not proceed if the employee who's signing in is present in the excluded employees list. + +#### Type parameters + +| Name | +| :------ | +| `Config` | + +#### Parameters + +| Name | Type | Default value | +| :------ | :------ | :------ | +| `excludeEmployeesKey` | keyof `Config` | `undefined` | +| `message` | `string` | 'Employee excluded from integration.' | + +#### Returns + +`RequestHandler` + +#### Defined in + +[sdk/filters.ts:43](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/filters.ts#L43) + +___ + +### inviteOnlyEntryFilterMiddleware + +▸ **inviteOnlyEntryFilterMiddleware**(`invitesOnlyKey`, `message?`): `RequestHandler` + +Will only proceed if the entry has an invite +and the install's `config` has a truthy value for the given `invitesOnlyKey`. + +#### Type parameters + +| Name | +| :------ | +| `Config` | + +#### Parameters + +| Name | Type | Default value | +| :------ | :------ | :------ | +| `invitesOnlyKey` | keyof `Config` | `undefined` | +| `message` | `string` | 'Visitors must be invited.' | + +#### Returns + +`RequestHandler` + +#### Defined in + +[sdk/filters.ts:78](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/filters.ts#L78) + +___ + +## Handler Functions + +### asyncHandler + +▸ **asyncHandler**(`handler`): `RequestHandler` + +Wraps any express.js-based handlers +to catch Promise-based errors. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Req` | `Req`: `Request`, Req\> | +| `Res` | `Res`: `Response`, Res\> | + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `handler` | (`req`: `Req`, `res`: `Res`) => `Result` | + +#### Returns + +`RequestHandler` + +#### Defined in + +[sdk/handlers.ts:90](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L90) + +___ + +### entryEventHandler + +▸ **entryEventHandler**(`handler`): `RequestHandler`\> + +Handler for entry events. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `SomeObject` | +| `Additions` | `Additions` = `SomeObject` | + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `handler` | [EntryEventHandler](README.md#entryeventhandler) | + +#### Returns + +`RequestHandler`\> + +#### Defined in + +[sdk/handlers.ts:103](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L103) + +___ + +### inviteEventHandler + +▸ **inviteEventHandler**(`handler`): `RequestHandler`\> + +Handler for invite events. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `SomeObject` | +| `Additions` | `Additions` = `SomeObject` | + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `handler` | [InviteEventHandler](README.md#inviteeventhandler) | + +#### Returns + +`RequestHandler`\> + +#### Defined in + +[sdk/handlers.ts:115](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L115) + +___ + +### migrationRouteHandler + +▸ **migrationRouteHandler**(`handler`): `RequestHandler`\> + +Handler for a migration route. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `OldConfig` | `OldConfig` | +| `NewConfig` | `NewConfig` | +| `Additions` | `Additions` = `SomeObject` | + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `handler` | [MigrationRouteHandler](README.md#migrationroutehandler) | + +#### Returns + +`RequestHandler`\> + +#### Defined in + +[sdk/handlers.ts:139](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L139) + +___ + +### optionsRouteHandler + +▸ **optionsRouteHandler**(`handler`): `RequestHandler`\> + +Handler for options URL routes. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `SomeObject` | +| `Additions` | `Additions` = `SomeObject` | + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `handler` | [OptionsRouteHandler](README.md#optionsroutehandler) | + +#### Returns + +`RequestHandler`\> + +#### Defined in + +[sdk/handlers.ts:152](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L152) + +___ + +### pluginUninstalledEventHandler + +▸ **pluginUninstalledEventHandler**(`handler`): `RequestHandler`\> + +Handler for `plugin_uninstalled` events. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `SomeObject` | +| `Additions` | `Additions` = `SomeObject` | + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `handler` | [PluginUninstalledEventHandler](README.md#pluginuninstalledeventhandler) | + +#### Returns + +`RequestHandler`\> + +#### Defined in + +[sdk/handlers.ts:127](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L127) + +___ + +### remoteValueRouteHandler + +▸ **remoteValueRouteHandler**(`handler`): `RequestHandler`\> + +Handler for remote value URL routes. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `SomeObject` | +| `Additions` | `Additions` = `SomeObject` | + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `handler` | [RemoteValueRouteHandler](README.md#remotevalueroutehandler) | + +#### Returns + +`RequestHandler`\> + +#### Defined in + +[sdk/handlers.ts:164](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L164) + +___ + +### selectedValuesRouteHandler + +▸ **selectedValuesRouteHandler**(`handler`): `RequestHandler`\> + +Handler for selected values URL routes. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `SomeObject` | +| `Additions` | `Additions` = `SomeObject` | + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `handler` | [SelectedValuesRouteHandler](README.md#selectedvaluesroutehandler) | + +#### Returns + +`RequestHandler`\> + +#### Defined in + +[sdk/handlers.ts:176](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L176) + +___ + +### validationRouteHandler + +▸ **validationRouteHandler**(`handler`): `RequestHandler`\> + +Handler for validation URL routes. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Config` | `Config` = `SomeObject` | +| `Payload` | `Payload` = `SomeObject` | +| `Additions` | `Additions` = `SomeObject` | + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `handler` | [ValidationRouteHandler](README.md#validationroutehandler) | + +#### Returns + +`RequestHandler`\> + +#### Defined in + +[sdk/handlers.ts:188](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/handlers.ts#L188) + +___ + +## Middleware Functions + +### employeeSignInEnabledFilterMiddleware + +▸ **employeeSignInEnabledFilterMiddleware**(`employeeSignInEnabledKey`, `message?`): `RequestHandler` + +Will only proceed if the install's `config` has a truthy value for the given `employeeSignInEnabledKey`. + +#### Type parameters + +| Name | +| :------ | +| `Config` | + +#### Parameters + +| Name | Type | Default value | +| :------ | :------ | :------ | +| `employeeSignInEnabledKey` | keyof `Config` | `undefined` | +| `message` | `string` | 'Envoy Protect is disabled.' | + +#### Returns + +`RequestHandler` + +#### Defined in + +[sdk/filters.ts:30](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/filters.ts#L30) + +___ + +### envoyMiddleware + +▸ **envoyMiddleware**(`options?`): `RequestHandler` + +Sets up an [EnvoyPluginSDK](classes/envoypluginsdk.md) object in the path `req.envoy`. +Modifies the `res` object to include Envoy's helpers, per [EnvoyResponse](interfaces/envoyresponse.md). + +Also verifies that the request is coming from Envoy, +as well as managing the plugin access token lifecycle. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `options?` | [EnvoySignatureVerifierOptions](README.md#envoysignatureverifieroptions) | + +#### Returns + +`RequestHandler` + +#### Defined in + +[sdk/middleware.ts:27](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/middleware.ts#L27) + +___ + +### errorMiddleware + +▸ **errorMiddleware**(`onError?`): `ErrorRequestHandler` + +Catches errors and sets the proper status code. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `onError` | (`err`: `Error`) => `void` | + +#### Returns + +`ErrorRequestHandler` + +#### Defined in + +[sdk/middleware.ts:91](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/middleware.ts#L91) + +___ + +### excludedEmployeesFilterMiddleware + +▸ **excludedEmployeesFilterMiddleware**(`excludeEmployeesKey`, `message?`): `RequestHandler` + +Will not proceed if the employee who's signing in is present in the excluded employees list. + +#### Type parameters + +| Name | +| :------ | +| `Config` | + +#### Parameters + +| Name | Type | Default value | +| :------ | :------ | :------ | +| `excludeEmployeesKey` | keyof `Config` | `undefined` | +| `message` | `string` | 'Employee excluded from integration.' | + +#### Returns + +`RequestHandler` + +#### Defined in + +[sdk/filters.ts:43](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/filters.ts#L43) + +___ + +### inviteOnlyEntryFilterMiddleware + +▸ **inviteOnlyEntryFilterMiddleware**(`invitesOnlyKey`, `message?`): `RequestHandler` + +Will only proceed if the entry has an invite +and the install's `config` has a truthy value for the given `invitesOnlyKey`. + +#### Type parameters + +| Name | +| :------ | +| `Config` | + +#### Parameters + +| Name | Type | Default value | +| :------ | :------ | :------ | +| `invitesOnlyKey` | keyof `Config` | `undefined` | +| `message` | `string` | 'Visitors must be invited.' | + +#### Returns + +`RequestHandler` + +#### Defined in + +[sdk/filters.ts:78](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/filters.ts#L78) diff --git a/docs/classes/envoyjwt.md b/docs/classes/envoyjwt.md new file mode 100644 index 0000000..1dba864 --- /dev/null +++ b/docs/classes/envoyjwt.md @@ -0,0 +1,76 @@ +[@envoy/envoy-integrations-sdk](../README.md) / EnvoyJWT + +# Class: EnvoyJWT + +Helper to encode and decode JWTs. + +## Table of contents + +### Constructors + +- [constructor](envoyjwt.md#constructor) + +### Methods + +- [decode](envoyjwt.md#decode) +- [encode](envoyjwt.md#encode) + +## Constructors + +### constructor + +• **new EnvoyJWT**(`secret?`, `algorithm?`) + +#### Parameters + +| Name | Type | Default value | +| :------ | :------ | :------ | +| `secret` | `string` | `undefined` | +| `algorithm` | `Algorithm` | 'HS256' | + +#### Defined in + +[util/EnvoyJWT.ts:15](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/util/EnvoyJWT.ts#L15) + +## Methods + +### decode + +▸ **decode**(`token`, `options?`): `Record` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `token` | `string` | +| `options` | `VerifyOptions` | + +#### Returns + +`Record` + +#### Defined in + +[util/EnvoyJWT.ts:42](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/util/EnvoyJWT.ts#L42) + +___ + +### encode + +▸ **encode**(`subject`, `expiresIn`, `payload?`): `string` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `subject` | ``null`` \| `string` \| `number` | +| `expiresIn` | ``null`` \| `string` \| `number` | +| `payload` | `Record` | + +#### Returns + +`string` + +#### Defined in + +[util/EnvoyJWT.ts:25](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/util/EnvoyJWT.ts#L25) diff --git a/docs/classes/envoypluginapi.md b/docs/classes/envoypluginapi.md new file mode 100644 index 0000000..434cdb5 --- /dev/null +++ b/docs/classes/envoypluginapi.md @@ -0,0 +1,199 @@ +[@envoy/envoy-integrations-sdk](../README.md) / EnvoyPluginAPI + +# Class: EnvoyPluginAPI + +API endpoints for *plugin-scoped* tokens. + +## Hierarchy + +- `EnvoyAPI` + + ↳ **EnvoyPluginAPI** + +## Table of contents + +### Constructors + +- [constructor](envoypluginapi.md#constructor) + +### Properties + +- [axios](envoypluginapi.md#axios) + +### Methods + +- [createNotification](envoypluginapi.md#createnotification) +- [getPluginInstallConfig](envoypluginapi.md#getplugininstallconfig) +- [setPluginInstallConfig](envoypluginapi.md#setplugininstallconfig) +- [storagePipeline](envoypluginapi.md#storagepipeline) +- [updateJob](envoypluginapi.md#updatejob) +- [loginAsPlugin](envoypluginapi.md#loginasplugin) + +## Constructors + +### constructor + +• **new EnvoyPluginAPI**(`accessToken`) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `accessToken` | `string` | + +#### Inherited from + +EnvoyAPI.constructor + +#### Defined in + +[base/EnvoyAPI.ts:59](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/base/EnvoyAPI.ts#L59) + +## Properties + +### axios + +• `Readonly` **axios**: `AxiosInstance` + +HTTP Client with Envoy's defaults. + +#### Inherited from + +EnvoyAPI.axios + +#### Defined in + +[base/EnvoyAPI.ts:32](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/base/EnvoyAPI.ts#L32) + +## Methods + +### createNotification + +▸ **createNotification**(`installId`, `params?`): `Promise` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `installId` | `string` | +| `params` | `Object` | + +#### Returns + +`Promise` + +#### Defined in + +[sdk/EnvoyPluginAPI.ts:61](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginAPI.ts#L61) + +___ + +### getPluginInstallConfig + +▸ **getPluginInstallConfig**(`installId`): `Promise`\> + +Fetches the current `config` saved for this install during setup by the customer. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `installId` | `string` | + +#### Returns + +`Promise`\> + +#### Defined in + +[sdk/EnvoyPluginAPI.ts:27](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginAPI.ts#L27) + +___ + +### setPluginInstallConfig + +▸ **setPluginInstallConfig**(`installId`, `config`): `Promise` + +Merges changes with the current `config` saved for this install during setup by the customer. + +To remove an item from the saved `config`, set the item's key to `null`. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `installId` | `string` | +| `config` | `Record` | + +#### Returns + +`Promise` + +#### Defined in + +[sdk/EnvoyPluginAPI.ts:37](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginAPI.ts#L37) + +___ + +### storagePipeline + +▸ **storagePipeline**(`commands`, `installId?`): `Promise`<(``null`` \| [EnvoyStorageItem](../README.md#envoystorageitem))[]\> + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `commands` | `EnvoyStorageCommand`[] | +| `installId?` | `string` | + +#### Returns + +`Promise`<(``null`` \| [EnvoyStorageItem](../README.md#envoystorageitem))[]\> + +#### Defined in + +[sdk/EnvoyPluginAPI.ts:45](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginAPI.ts#L45) + +___ + +### updateJob + +▸ **updateJob**(`jobId`, `update`): `Promise` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `jobId` | `string` | +| `update` | `default` | + +#### Returns + +`Promise` + +#### Defined in + +[sdk/EnvoyPluginAPI.ts:16](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginAPI.ts#L16) + +___ + +### loginAsPlugin + +▸ `Static` **loginAsPlugin**(`id?`, `secret?`): `Promise`<[EnvoyMetaAuth](../README.md#envoymetaauth)\> + +Gets a plugin access token using `client_credentials` as the grant type. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `id` | `string` | +| `secret` | `string` | + +#### Returns + +`Promise`<[EnvoyMetaAuth](../README.md#envoymetaauth)\> + +#### Defined in + +[sdk/EnvoyPluginAPI.ts:72](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginAPI.ts#L72) diff --git a/docs/classes/envoypluginjob.md b/docs/classes/envoypluginjob.md new file mode 100644 index 0000000..1e6eead --- /dev/null +++ b/docs/classes/envoypluginjob.md @@ -0,0 +1,190 @@ +[@envoy/envoy-integrations-sdk](../README.md) / EnvoyPluginJob + +# Class: EnvoyPluginJob + +A "job" is an event, like `entry_sign_in`. +When your plugin handles the event, you can use this job concept +to update the status (e.g. complete, failed, ignored) +as well as attach extra data to the event's subject +(e.g. showing a generated card number in the dashboard for a visitor on `entry_sign_in`). + +## Table of contents + +### Constructors + +- [constructor](envoypluginjob.md#constructor) + +### Properties + +- [api](envoypluginjob.md#api) +- [id](envoypluginjob.md#id) + +### Methods + +- [attach](envoypluginjob.md#attach) +- [complete](envoypluginjob.md#complete) +- [fail](envoypluginjob.md#fail) +- [ignore](envoypluginjob.md#ignore) +- [update](envoypluginjob.md#update) + +## Constructors + +### constructor + +• **new EnvoyPluginJob**(`pluginAPI`, `jobId`) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `pluginAPI` | [EnvoyPluginAPI](envoypluginapi.md) | +| `jobId` | `string` | + +#### Defined in + +[sdk/EnvoyPluginJob.ts:17](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginJob.ts#L17) + +## Properties + +### api + +• `Readonly` **api**: [EnvoyPluginAPI](envoypluginapi.md) + +#### Defined in + +[sdk/EnvoyPluginJob.ts:15](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginJob.ts#L15) + +___ + +### id + +• `Readonly` **id**: `string` + +#### Defined in + +[sdk/EnvoyPluginJob.ts:17](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginJob.ts#L17) + +## Methods + +### attach + +▸ **attach**(...`attachments`): `Promise` + +Add attachments to this job. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `...attachments` | `EnvoyPluginJobAttachment`[] | + +#### Returns + +`Promise` + +#### Defined in + +[sdk/EnvoyPluginJob.ts:48](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginJob.ts#L48) + +___ + +### complete + +▸ **complete**(`message`, ...`attachments`): `Promise` + +Reports that the job is complete. + +Instead of calling this directly, you can return a 200 response from the job's event handler, +using {@link EnvoyRequest.send}. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `message` | `string` | +| `...attachments` | `EnvoyPluginJobAttachment`[] | + +#### Returns + +`Promise` + +#### Defined in + +[sdk/EnvoyPluginJob.ts:58](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginJob.ts#L58) + +___ + +### fail + +▸ **fail**(`message`, `reason`): `Promise` + +Reports that the job is ignored. + +Instead of calling this directly, you can return a 400 response from the job's event handler, +using {@link EnvoyRequest.sendFailed}. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `message` | `string` | +| `reason` | `string` | + +#### Returns + +`Promise` + +#### Defined in + +[sdk/EnvoyPluginJob.ts:78](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginJob.ts#L78) + +___ + +### ignore + +▸ **ignore**(`message`, `reason`): `Promise` + +Reports that the job is ignored. + +Instead of calling this directly, you can return a 400 response from the job's event handler, +using {@link EnvoyRequest.sendIgnored}. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `message` | `string` | +| `reason` | `string` | + +#### Returns + +`Promise` + +#### Defined in + +[sdk/EnvoyPluginJob.ts:68](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginJob.ts#L68) + +___ + +### update + +▸ **update**(`message`, ...`attachments`): `Promise` + +Updates the job with a new message and attachments. + +Can be used to periodically update long-running jobs. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `message` | `string` | +| `...attachments` | `EnvoyPluginJobAttachment`[] | + +#### Returns + +`Promise` + +#### Defined in + +[sdk/EnvoyPluginJob.ts:87](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginJob.ts#L87) diff --git a/docs/classes/envoypluginsdk.md b/docs/classes/envoypluginsdk.md new file mode 100644 index 0000000..dee755e --- /dev/null +++ b/docs/classes/envoypluginsdk.md @@ -0,0 +1,240 @@ +[@envoy/envoy-integrations-sdk](../README.md) / EnvoyPluginSDK + +# Class: EnvoyPluginSDK + +Sets up all relevant Envoy functions. +Attaches itself to every request object using our {@link middleware}, +to allow for easy access to Envoy functions. + +## Type parameters + +| Name | Type | +| :------ | :------ | +| `Meta` | `Meta` = `unknown` | +| `Payload` | `Payload` = `unknown` | + +## Table of contents + +### Constructors + +- [constructor](envoypluginsdk.md#constructor) + +### Accessors + +- [getJob](envoypluginsdk.md#getjob) +- [globalStorage](envoypluginsdk.md#globalstorage) +- [installStorage](envoypluginsdk.md#installstorage) +- [job](envoypluginsdk.md#job) +- [jobId](envoypluginsdk.md#jobid) +- [jwt](envoypluginsdk.md#jwt) +- [meta](envoypluginsdk.md#meta) +- [payload](envoypluginsdk.md#payload) +- [pluginAPI](envoypluginsdk.md#pluginapi) +- [userAPI](envoypluginsdk.md#userapi) + +## Constructors + +### constructor + +• **new EnvoyPluginSDK**(`body`, `isVerified?`, `pluginAccessToken?`) + +Don't create an instance of this class directly. + +Instead, use {@link middleware} to automatically attach an instance to `req` on every request. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Meta` | `Meta` = `unknown` | +| `Payload` | `Payload` = `unknown` | + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `body` | `EnvoyRequestBody` | `undefined` | Request body | +| `isVerified` | `boolean` | false | If the request has been verified via {@link EnvoySignatureVerifier} | +| `pluginAccessToken` | ``null`` \| `string` | null | An access token from [EnvoyPluginAPI.loginAsPlugin](envoypluginapi.md#loginasplugin) | + +#### Defined in + +[sdk/EnvoyPluginSDK.ts:41](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginSDK.ts#L41) + +## Accessors + +### getJob + +• `get` **getJob**(): (`jobId`: `string`) => [EnvoyPluginJob](envoypluginjob.md) + +Returns a job based on an ID. + +#### Returns + +`fn` + +▸ (`jobId`): [EnvoyPluginJob](envoypluginjob.md) + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `jobId` | `string` | + +##### Returns + +[EnvoyPluginJob](envoypluginjob.md) + +#### Defined in + +[sdk/EnvoyPluginSDK.ts:140](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginSDK.ts#L140) + +___ + +### globalStorage + +• `get` **globalStorage**(): [EnvoyPluginStorage](envoypluginstorage.md) + +Storage scoped globally (across installs). + +#### Returns + +[EnvoyPluginStorage](envoypluginstorage.md) + +#### Defined in + +[sdk/EnvoyPluginSDK.ts:133](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginSDK.ts#L133) + +___ + +### installStorage + +• `get` **installStorage**(): [EnvoyPluginStorage](envoypluginstorage.md) + +Storage scoped to the install. + +#### Returns + +[EnvoyPluginStorage](envoypluginstorage.md) + +#### Defined in + +[sdk/EnvoyPluginSDK.ts:122](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginSDK.ts#L122) + +___ + +### job + +• `get` **job**(): [EnvoyPluginJob](envoypluginjob.md) + +Perform operations on the current job. + +#### Returns + +[EnvoyPluginJob](envoypluginjob.md) + +#### Defined in + +[sdk/EnvoyPluginSDK.ts:158](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginSDK.ts#L158) + +___ + +### jobId + +• `get` **jobId**(): ``null`` \| `string` + +Returns the current job's ID. + +#### Returns + +``null`` \| `string` + +#### Defined in + +[sdk/EnvoyPluginSDK.ts:147](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginSDK.ts#L147) + +___ + +### jwt + +• `get` **jwt**(): [EnvoyJWT](envoyjwt.md) + +A utility to encode and decode JWTs. +Useful for verifiable communications between plugin endpoints. + +#### Returns + +[EnvoyJWT](envoyjwt.md) + +#### Defined in + +[sdk/EnvoyPluginSDK.ts:171](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginSDK.ts#L171) + +___ + +### meta + +• `get` **meta**(): `Meta` + +The metadata for the request. +Either an [EnvoyEventMeta](../README.md#envoyeventmeta)} or [EnvoyRouteMeta](../README.md#envoyroutemeta). + +#### Returns + +`Meta` + +#### Defined in + +[sdk/EnvoyPluginSDK.ts:61](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginSDK.ts#L61) + +___ + +### payload + +• `get` **payload**(): `Payload` + +The payload for the request. +For events, it's some Envoy event payload, like an [EntryPayload](../README.md#entrypayload) or [InvitePayload](../README.md#invitepayload). +For setup step validation URLs, it's the form submitted values for a validation URL. + +#### Returns + +`Payload` + +#### Defined in + +[sdk/EnvoyPluginSDK.ts:73](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginSDK.ts#L73) + +___ + +### pluginAPI + +• `get` **pluginAPI**(): [EnvoyPluginAPI](envoypluginapi.md) + +Envoy API scoped to the plugin. +Used to perform storage or job operations. + +#### Returns + +[EnvoyPluginAPI](envoypluginapi.md) + +#### Defined in + +[sdk/EnvoyPluginSDK.ts:101](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginSDK.ts#L101) + +___ + +### userAPI + +• `get` **userAPI**(): [EnvoyUserAPI](envoyuserapi.md) + +Envoy API scoped to the user. +Used only in routes. + +#### Returns + +[EnvoyUserAPI](envoyuserapi.md) + +#### Defined in + +[sdk/EnvoyPluginSDK.ts:84](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginSDK.ts#L84) diff --git a/docs/classes/envoypluginstorage.md b/docs/classes/envoypluginstorage.md new file mode 100644 index 0000000..69dbef7 --- /dev/null +++ b/docs/classes/envoypluginstorage.md @@ -0,0 +1,214 @@ +[@envoy/envoy-integrations-sdk](../README.md) / EnvoyPluginStorage + +# Class: EnvoyPluginStorage + +A key-value storage that can be scoped to a specific install, +or to the plugin itself. + +## Table of contents + +### Constructors + +- [constructor](envoypluginstorage.md#constructor) + +### Properties + +- [api](envoypluginstorage.md#api) +- [installId](envoypluginstorage.md#installid) + +### Methods + +- [get](envoypluginstorage.md#get) +- [pipeline](envoypluginstorage.md#pipeline) +- [set](envoypluginstorage.md#set) +- [setUnique](envoypluginstorage.md#setunique) +- [setUniqueNum](envoypluginstorage.md#setuniquenum) +- [unset](envoypluginstorage.md#unset) + +## Constructors + +### constructor + +• **new EnvoyPluginStorage**(`pluginAPI`, `installId?`) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `pluginAPI` | [EnvoyPluginAPI](envoypluginapi.md) | +| `installId?` | `string` | + +#### Defined in + +[sdk/EnvoyPluginStorage.ts:16](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginStorage.ts#L16) + +## Properties + +### api + +• `Readonly` **api**: [EnvoyPluginAPI](envoypluginapi.md) + +#### Defined in + +[sdk/EnvoyPluginStorage.ts:14](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginStorage.ts#L14) + +___ + +### installId + +• `Readonly` **installId**: `undefined` \| `string` + +#### Defined in + +[sdk/EnvoyPluginStorage.ts:16](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginStorage.ts#L16) + +## Methods + +### get + +▸ **get**(`key`): `Promise`<``null`` \| [EnvoyStorageItem](../README.md#envoystorageitem)\> + +Gets a single [EnvoyStorageItem](../README.md#envoystorageitem) from storage. + +Wrapper for single pipeline get. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Value` | `Value` = `unknown` | + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `key` | `string` | + +#### Returns + +`Promise`<``null`` \| [EnvoyStorageItem](../README.md#envoystorageitem)\> + +#### Defined in + +[sdk/EnvoyPluginStorage.ts:35](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginStorage.ts#L35) + +___ + +### pipeline + +▸ **pipeline**(): `default` + +Creates a new pipeline instance. + +#### Returns + +`default` + +#### Defined in + +[sdk/EnvoyPluginStorage.ts:26](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginStorage.ts#L26) + +___ + +### set + +▸ **set**(`key`, `value`): `Promise`<[EnvoyStorageItem](../README.md#envoystorageitem)\> + +Sets a single [EnvoyStorageItem](../README.md#envoystorageitem) from storage. + +Wrapper for single pipeline set. + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `Value` | `Value` = `unknown` | + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `key` | `string` | +| `value` | `Value` | + +#### Returns + +`Promise`<[EnvoyStorageItem](../README.md#envoystorageitem)\> + +#### Defined in + +[sdk/EnvoyPluginStorage.ts:44](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginStorage.ts#L44) + +___ + +### setUnique + +▸ **setUnique**(`key`, `options?`): `Promise`<``null`` \| [EnvoyStorageItem](../README.md#envoystorageitem)\> + +Sets a single unique string [EnvoyStorageItem](../README.md#envoystorageitem) from storage. + +Wrapper for single pipeline setUnique. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `key` | `string` | +| `options` | `EnvoyStorageSetUniqueOptions` | + +#### Returns + +`Promise`<``null`` \| [EnvoyStorageItem](../README.md#envoystorageitem)\> + +#### Defined in + +[sdk/EnvoyPluginStorage.ts:53](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginStorage.ts#L53) + +___ + +### setUniqueNum + +▸ **setUniqueNum**(`key`, `options?`): `Promise`<``null`` \| [EnvoyStorageItem](../README.md#envoystorageitem)\> + +Sets a single unique number [EnvoyStorageItem](../README.md#envoystorageitem) from storage. + +Wrapper for single pipeline setUnique. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `key` | `string` | +| `options` | `EnvoyStorageSetUniqueNumOptions` | + +#### Returns + +`Promise`<``null`` \| [EnvoyStorageItem](../README.md#envoystorageitem)\> + +#### Defined in + +[sdk/EnvoyPluginStorage.ts:62](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginStorage.ts#L62) + +___ + +### unset + +▸ **unset**(`key`): `Promise`<``null`` \| [EnvoyStorageItem](../README.md#envoystorageitem)\> + +Unsets an [EnvoyStorageItem](../README.md#envoystorageitem) from storage. Returns null if the item did not previously exist. + +Wrapper for single pipeline unset. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `key` | `string` | + +#### Returns + +`Promise`<``null`` \| [EnvoyStorageItem](../README.md#envoystorageitem)\> + +#### Defined in + +[sdk/EnvoyPluginStorage.ts:71](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyPluginStorage.ts#L71) diff --git a/docs/classes/envoyuserapi.md b/docs/classes/envoyuserapi.md new file mode 100644 index 0000000..a9f8c65 --- /dev/null +++ b/docs/classes/envoyuserapi.md @@ -0,0 +1,609 @@ +[@envoy/envoy-integrations-sdk](../README.md) / EnvoyUserAPI + +# Class: EnvoyUserAPI + +API endpoints for *user-scoped* tokens. +To access Envoy resources, this is the API you'd want. + +## Hierarchy + +- `EnvoyAPI` + + ↳ **EnvoyUserAPI** + +## Table of contents + +### Constructors + +- [constructor](envoyuserapi.md#constructor) + +### Properties + +- [axios](envoyuserapi.md#axios) + +### Methods + +- [createInvite](envoyuserapi.md#createinvite) +- [getAgreement](envoyuserapi.md#getagreement) +- [getAgreementPage](envoyuserapi.md#getagreementpage) +- [getCompany](envoyuserapi.md#getcompany) +- [getEmployee](envoyuserapi.md#getemployee) +- [getEmployeeByEmail](envoyuserapi.md#getemployeebyemail) +- [getEmployees](envoyuserapi.md#getemployees) +- [getFlow](envoyuserapi.md#getflow) +- [getFlows](envoyuserapi.md#getflows) +- [getInvites](envoyuserapi.md#getinvites) +- [getLocation](envoyuserapi.md#getlocation) +- [getLocations](envoyuserapi.md#getlocations) +- [getSignInField](envoyuserapi.md#getsigninfield) +- [getSignInFieldPage](envoyuserapi.md#getsigninfieldpage) +- [getSignInFields](envoyuserapi.md#getsigninfields) +- [me](envoyuserapi.md#me) +- [partialUpdateInvite](envoyuserapi.md#partialupdateinvite) +- [removeInvite](envoyuserapi.md#removeinvite) +- [updateInvite](envoyuserapi.md#updateinvite) +- [getAuthorizeURL](envoyuserapi.md#getauthorizeurl) +- [loginAsPluginInstaller](envoyuserapi.md#loginasplugininstaller) +- [loginAsUserWithCode](envoyuserapi.md#loginasuserwithcode) +- [loginAsUserWithPassword](envoyuserapi.md#loginasuserwithpassword) + +## Constructors + +### constructor + +• **new EnvoyUserAPI**(`accessToken`) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `accessToken` | `string` | + +#### Inherited from + +EnvoyAPI.constructor + +#### Defined in + +[base/EnvoyAPI.ts:59](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/base/EnvoyAPI.ts#L59) + +## Properties + +### axios + +• `Readonly` **axios**: `AxiosInstance` + +HTTP Client with Envoy's defaults. + +#### Inherited from + +EnvoyAPI.axios + +#### Defined in + +[base/EnvoyAPI.ts:32](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/base/EnvoyAPI.ts#L32) + +## Methods + +### createInvite + +▸ **createInvite**(`invite`): `Promise`<[InviteModel](../README.md#invitemodel)\> + +Requires `invites.write` scope. +May also require `invites.attest` scope if setting `attested: true`. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `invite` | [InviteCreationModel](../README.md#invitecreationmodel) | + +#### Returns + +`Promise`<[InviteModel](../README.md#invitemodel)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:188](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L188) + +___ + +### getAgreement + +▸ **getAgreement**(`id`, `include?`): `Promise`<[AgreementModel](../README.md#agreementmodel)\> + +Requires `agreements.read` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `id` | `string` | +| `include?` | `string` | + +#### Returns + +`Promise`<[AgreementModel](../README.md#agreementmodel)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:65](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L65) + +___ + +### getAgreementPage + +▸ **getAgreementPage**(`id`, `include?`): `Promise`<[AgreementPageModel](../README.md#agreementpagemodel)\> + +[AgreementPageModel](../README.md#agreementpagemodel) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `id` | `string` | +| `include?` | `string` | + +#### Returns + +`Promise`<[AgreementPageModel](../README.md#agreementpagemodel)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:58](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L58) + +___ + +### getCompany + +▸ **getCompany**(`id`, `include?`): `Promise`<[CompanyModel](../README.md#companymodel)\> + +Requires `companies.read` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `id` | `string` | +| `include?` | `string` | + +#### Returns + +`Promise`<[CompanyModel](../README.md#companymodel)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:72](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L72) + +___ + +### getEmployee + +▸ **getEmployee**(`id`, `include?`): `Promise`<[EmployeeModel](../README.md#employeemodel)\> + +Requires `employees.read` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `id` | `string` | +| `include?` | `string` | + +#### Returns + +`Promise`<[EmployeeModel](../README.md#employeemodel)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:79](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L79) + +___ + +### getEmployeeByEmail + +▸ **getEmployeeByEmail**(`email`, `include?`): `Promise`<[EmployeeModel](../README.md#employeemodel)\> + +Requires `employees.read` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `email` | `string` | +| `include?` | `string` | + +#### Returns + +`Promise`<[EmployeeModel](../README.md#employeemodel)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:114](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L114) + +___ + +### getEmployees + +▸ **getEmployees**(`params?`): `Promise`<[EmployeeModel](../README.md#employeemodel)[]\> + +Requires `employees.read` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `params?` | `default`<[EmployeeFilterFields](../interfaces/employeefilterfields.md), [EmployeeSortFields](../README.md#employeesortfields)\> | + +#### Returns + +`Promise`<[EmployeeModel](../README.md#employeemodel)[]\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:136](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L136) + +___ + +### getFlow + +▸ **getFlow**(`id`, `include?`): `Promise`<[FlowModel](../README.md#flowmodel)\> + +Requires `flows.read` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `id` | `string` | +| `include?` | `string` | + +#### Returns + +`Promise`<[FlowModel](../README.md#flowmodel)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:86](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L86) + +___ + +### getFlows + +▸ **getFlows**(`params?`): `Promise`<[FlowModel](../README.md#flowmodel)[]\> + +Requires `flows.read` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `params?` | `default`<[FlowFilterFields](../interfaces/flowfilterfields.md), [FlowSortFields](../README.md#flowsortfields)\> | + +#### Returns + +`Promise`<[FlowModel](../README.md#flowmodel)[]\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:146](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L146) + +___ + +### getInvites + +▸ **getInvites**(`params?`): `Promise`<[InviteModel](../README.md#invitemodel)[]\> + +Requires `invites.read` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `params?` | `default`<[InviteFilterFields](../interfaces/invitefilterfields.md), [InviteSortFields](../README.md#invitesortfields)\> | + +#### Returns + +`Promise`<[InviteModel](../README.md#invitemodel)[]\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:172](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L172) + +___ + +### getLocation + +▸ **getLocation**(`id`, `include?`): `Promise`<[LocationModel](../README.md#locationmodel)\> + +Requires `locations.read` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `id` | `string` | +| `include?` | `string` | + +#### Returns + +`Promise`<[LocationModel](../README.md#locationmodel)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:93](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L93) + +___ + +### getLocations + +▸ **getLocations**(`params?`): `Promise`<[LocationModel](../README.md#locationmodel)[]\> + +Requires `locations.read` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `params?` | `default`<[LocationFilterFields](../interfaces/locationfilterfields.md), [LocationSortFields](../README.md#locationsortfields)\> | + +#### Returns + +`Promise`<[LocationModel](../README.md#locationmodel)[]\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:154](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L154) + +___ + +### getSignInField + +▸ **getSignInField**(`id`, `include?`): `Promise`<[SignInFieldModel](../README.md#signinfieldmodel)\> + +Requires `sign-in-fields.read` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `id` | `string` | +| `include?` | `string` | + +#### Returns + +`Promise`<[SignInFieldModel](../README.md#signinfieldmodel)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:107](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L107) + +___ + +### getSignInFieldPage + +▸ **getSignInFieldPage**(`id`, `include?`): `Promise`<[SignInFieldPageModel](../README.md#signinfieldpagemodel)\> + +Requires `sign-in-field-pages.read` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `id` | `string` | +| `include?` | `string` | + +#### Returns + +`Promise`<[SignInFieldPageModel](../README.md#signinfieldpagemodel)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:100](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L100) + +___ + +### getSignInFields + +▸ **getSignInFields**(`signInFieldPageId`): `Promise`<[SignInFieldModel](../README.md#signinfieldmodel)[]\> + +Requires `sign-in-fields.read` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `signInFieldPageId` | `string` | + +#### Returns + +`Promise`<[SignInFieldModel](../README.md#signinfieldmodel)[]\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:164](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L164) + +___ + +### me + +▸ **me**(): `Promise`<[UserModel](../README.md#usermodel)\> + +#### Returns + +`Promise`<[UserModel](../README.md#usermodel)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:179](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L179) + +___ + +### partialUpdateInvite + +▸ **partialUpdateInvite**(`inviteId`, `invite`): `Promise`<[InviteModel](../README.md#invitemodel)\> + +Requires `invites.write` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `inviteId` | `string` | +| `invite` | [InviteCreationModel](../README.md#invitecreationmodel) | + +#### Returns + +`Promise`<[InviteModel](../README.md#invitemodel)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:213](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L213) + +___ + +### removeInvite + +▸ **removeInvite**(`inviteId`): `Promise` + +Requires `invites.write` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `inviteId` | `string` | + +#### Returns + +`Promise` + +#### Defined in + +[sdk/EnvoyUserAPI.ts:226](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L226) + +___ + +### updateInvite + +▸ **updateInvite**(`inviteId`, `invite`): `Promise`<[InviteModel](../README.md#invitemodel)\> + +Requires `invites.write` scope. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `inviteId` | `string` | +| `invite` | [InviteCreationModel](../README.md#invitecreationmodel) | + +#### Returns + +`Promise`<[InviteModel](../README.md#invitemodel)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:200](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L200) + +___ + +### getAuthorizeURL + +▸ `Static` **getAuthorizeURL**(`redirectURL`, `scope`, `clientId?`): `string` + +Builds the authorize URL to redirect a user to initiate the auth code oauth2 flow. + +Upon completion, they will be redirected to `redirectURL`, with a `code` query param in the url. + +Use the [loginAsUserWithCode](envoyuserapi.md#loginasuserwithcode) method to exchange that code for an access token. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `redirectURL` | `string` | +| `scope` | `string`[] | +| `clientId` | `string` | + +#### Returns + +`string` + +#### Defined in + +[sdk/EnvoyUserAPI.ts:240](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L240) + +___ + +### loginAsPluginInstaller + +▸ `Static` **loginAsPluginInstaller**(`installId`, `clientId?`, `clientSecret?`): `Promise`<[EnvoyMetaAuth](../README.md#envoymetaauth)\> + +Gets a user access token using `plugin_install` as the grant type. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `installId` | `string` | +| `clientId` | `string` | +| `clientSecret` | `string` | + +#### Returns + +`Promise`<[EnvoyMetaAuth](../README.md#envoymetaauth)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:306](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L306) + +___ + +### loginAsUserWithCode + +▸ `Static` **loginAsUserWithCode**(`code`, `scope`, `clientId?`, `clientSecret?`): `Promise`<[EnvoyMetaAuth](../README.md#envoymetaauth)\> + +Gets a user access token using `code` as the grant type. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `code` | `string` | +| `scope` | `string`[] | +| `clientId` | `string` | +| `clientSecret` | `string` | + +#### Returns + +`Promise`<[EnvoyMetaAuth](../README.md#envoymetaauth)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:280](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L280) + +___ + +### loginAsUserWithPassword + +▸ `Static` **loginAsUserWithPassword**(`username`, `password`, `scope`, `clientId?`, `clientSecret?`): `Promise`<[EnvoyMetaAuth](../README.md#envoymetaauth)\> + +Gets a user access token using `password` as the grant type (discouraged - use [loginAsUserWithCode](envoyuserapi.md#loginasuserwithcode) below). + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `username` | `string` | +| `password` | `string` | +| `scope` | `string`[] | +| `clientId` | `string` | +| `clientSecret` | `string` | + +#### Returns + +`Promise`<[EnvoyMetaAuth](../README.md#envoymetaauth)\> + +#### Defined in + +[sdk/EnvoyUserAPI.ts:252](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyUserAPI.ts#L252) diff --git a/docs/interfaces/agreementattributes.md b/docs/interfaces/agreementattributes.md new file mode 100644 index 0000000..3172a45 --- /dev/null +++ b/docs/interfaces/agreementattributes.md @@ -0,0 +1,107 @@ +[@envoy/envoy-integrations-sdk](../README.md) / AgreementAttributes + +# Interface: AgreementAttributes + +## Table of contents + +### Properties + +- [body](agreementattributes.md#body) +- [created-at](agreementattributes.md#created-at) +- [enabled](agreementattributes.md#enabled) +- [name](agreementattributes.md#name) +- [optional](agreementattributes.md#optional) +- [position](agreementattributes.md#position) +- [require-resign](agreementattributes.md#require-resign) +- [updated-at](agreementattributes.md#updated-at) +- [video-url](agreementattributes.md#video-url) + +## Properties + +### body + +• `Optional` **body**: `string` + +#### Defined in + +[resources/AgreementResource.ts:10](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/AgreementResource.ts#L10) + +___ + +### created-at + +• `Optional` **created-at**: `string` + +#### Defined in + +[resources/AgreementResource.ts:13](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/AgreementResource.ts#L13) + +___ + +### enabled + +• `Optional` **enabled**: `boolean` + +#### Defined in + +[resources/AgreementResource.ts:12](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/AgreementResource.ts#L12) + +___ + +### name + +• **name**: `string` + +#### Defined in + +[resources/AgreementResource.ts:7](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/AgreementResource.ts#L7) + +___ + +### optional + +• **optional**: `boolean` + +#### Defined in + +[resources/AgreementResource.ts:8](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/AgreementResource.ts#L8) + +___ + +### position + +• `Optional` **position**: `number` + +#### Defined in + +[resources/AgreementResource.ts:13](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/AgreementResource.ts#L13) + +___ + +### require-resign + +• **require-resign**: `boolean` + +#### Defined in + +[resources/AgreementResource.ts:8](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/AgreementResource.ts#L8) + +___ + +### updated-at + +• `Optional` **updated-at**: `string` + +#### Defined in + +[resources/AgreementResource.ts:14](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/AgreementResource.ts#L14) + +___ + +### video-url + +• `Optional` **video-url**: `string` + +#### Defined in + +[resources/AgreementResource.ts:10](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/AgreementResource.ts#L10) diff --git a/docs/interfaces/companyattributes.md b/docs/interfaces/companyattributes.md new file mode 100644 index 0000000..a05a94f --- /dev/null +++ b/docs/interfaces/companyattributes.md @@ -0,0 +1,52 @@ +[@envoy/envoy-integrations-sdk](../README.md) / CompanyAttributes + +# Interface: CompanyAttributes + +## Table of contents + +### Properties + +- [active](companyattributes.md#active) +- [created-at](companyattributes.md#created-at) +- [name](companyattributes.md#name) +- [updated-at](companyattributes.md#updated-at) + +## Properties + +### active + +• **active**: `boolean` + +#### Defined in + +[resources/CompanyResource.ts:8](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/CompanyResource.ts#L8) + +___ + +### created-at + +• **created-at**: `string` + +#### Defined in + +[resources/CompanyResource.ts:8](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/CompanyResource.ts#L8) + +___ + +### name + +• **name**: `string` + +#### Defined in + +[resources/CompanyResource.ts:7](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/CompanyResource.ts#L7) + +___ + +### updated-at + +• **updated-at**: `string` + +#### Defined in + +[resources/CompanyResource.ts:9](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/CompanyResource.ts#L9) diff --git a/docs/interfaces/employeeattributes.md b/docs/interfaces/employeeattributes.md new file mode 100644 index 0000000..4492694 --- /dev/null +++ b/docs/interfaces/employeeattributes.md @@ -0,0 +1,107 @@ +[@envoy/envoy-integrations-sdk](../README.md) / EmployeeAttributes + +# Interface: EmployeeAttributes + +## Table of contents + +### Properties + +- [company-id](employeeattributes.md#company-id) +- [created-at](employeeattributes.md#created-at) +- [deleted](employeeattributes.md#deleted) +- [deleted-at](employeeattributes.md#deleted-at) +- [email](employeeattributes.md#email) +- [name](employeeattributes.md#name) +- [phone-number](employeeattributes.md#phone-number) +- [profile-picture-url](employeeattributes.md#profile-picture-url) +- [updated-at](employeeattributes.md#updated-at) + +## Properties + +### company-id + +• `Optional` **company-id**: `string` + +#### Defined in + +[resources/EmployeeResource.ts:32](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L32) + +___ + +### created-at + +• `Optional` **created-at**: `string` + +#### Defined in + +[resources/EmployeeResource.ts:33](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L33) + +___ + +### deleted + +• `Optional` **deleted**: `boolean` + +#### Defined in + +[resources/EmployeeResource.ts:32](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L32) + +___ + +### deleted-at + +• `Optional` **deleted-at**: `string` + +#### Defined in + +[resources/EmployeeResource.ts:35](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L35) + +___ + +### email + +• **email**: `string` + +#### Defined in + +[resources/EmployeeResource.ts:29](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L29) + +___ + +### name + +• **name**: `string` + +#### Defined in + +[resources/EmployeeResource.ts:28](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L28) + +___ + +### phone-number + +• `Optional` **phone-number**: `string` + +#### Defined in + +[resources/EmployeeResource.ts:29](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L29) + +___ + +### profile-picture-url + +• `Optional` **profile-picture-url**: `string` + +#### Defined in + +[resources/EmployeeResource.ts:30](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L30) + +___ + +### updated-at + +• `Optional` **updated-at**: `string` + +#### Defined in + +[resources/EmployeeResource.ts:34](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L34) diff --git a/docs/interfaces/employeefilterfields.md b/docs/interfaces/employeefilterfields.md new file mode 100644 index 0000000..e79d48a --- /dev/null +++ b/docs/interfaces/employeefilterfields.md @@ -0,0 +1,118 @@ +[@envoy/envoy-integrations-sdk](../README.md) / EmployeeFilterFields + +# Interface: EmployeeFilterFields + +## Table of contents + +### Properties + +- [company](employeefilterfields.md#company) +- [deleted](employeefilterfields.md#deleted) +- [email](employeefilterfields.md#email) +- [except](employeefilterfields.md#except) +- [exclude-hidden](employeefilterfields.md#exclude-hidden) +- [exclude-locations](employeefilterfields.md#exclude-locations) +- [locations](employeefilterfields.md#locations) +- [manually-added](employeefilterfields.md#manually-added) +- [name](employeefilterfields.md#name) +- [query](employeefilterfields.md#query) + +## Properties + +### company + +• `Optional` **company**: `string` + +#### Defined in + +[resources/EmployeeResource.ts:13](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L13) + +___ + +### deleted + +• `Optional` **deleted**: `boolean` + +#### Defined in + +[resources/EmployeeResource.ts:12](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L12) + +___ + +### email + +• `Optional` **email**: `string` + +#### Defined in + +[resources/EmployeeResource.ts:15](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L15) + +___ + +### except + +• `Optional` **except**: `string` + +#### Defined in + +[resources/EmployeeResource.ts:16](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L16) + +___ + +### exclude-hidden + +• `Optional` **exclude-hidden**: `boolean` + +#### Defined in + +[resources/EmployeeResource.ts:17](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L17) + +___ + +### exclude-locations + +• `Optional` **exclude-locations**: `string` + +#### Defined in + +[resources/EmployeeResource.ts:16](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L16) + +___ + +### locations + +• `Optional` **locations**: `string` + +#### Defined in + +[resources/EmployeeResource.ts:14](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L14) + +___ + +### manually-added + +• `Optional` **manually-added**: `boolean` + +#### Defined in + +[resources/EmployeeResource.ts:18](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L18) + +___ + +### name + +• `Optional` **name**: `string` + +#### Defined in + +[resources/EmployeeResource.ts:20](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L20) + +___ + +### query + +• `Optional` **query**: `string` + +#### Defined in + +[resources/EmployeeResource.ts:21](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/EmployeeResource.ts#L21) diff --git a/docs/interfaces/envoybaserequest.md b/docs/interfaces/envoybaserequest.md new file mode 100644 index 0000000..fb2427d --- /dev/null +++ b/docs/interfaces/envoybaserequest.md @@ -0,0 +1,52 @@ +[@envoy/envoy-integrations-sdk](../README.md) / EnvoyBaseRequest + +# Interface: EnvoyBaseRequest + +Base type for Envoy requests. +You probably won't need to use this type directly. +For routes, use [EnvoyRouteRequest](../README.md#envoyrouterequest), +and for events, use [EnvoyEntryEventRequest](../README.md#envoyentryeventrequest) or [EnvoyInviteEventRequest](../README.md#envoyinviteeventrequest). + +## Type parameters + +| Name | Type | +| :------ | :------ | +| `Meta` | `Meta` = `EnvoyMeta` | +| `Payload` | `Payload` = `unknown` | + +## Hierarchy + +- `VerifiedRequest` + + ↳ **EnvoyBaseRequest** + +## Table of contents + +### Properties + +- [[VERIFIED]](envoybaserequest.md#[verified]) +- [envoy](envoybaserequest.md#envoy) + +## Properties + +### [VERIFIED] + +• **[VERIFIED]**: `boolean` + +#### Inherited from + +VerifiedRequest.\_\_@VERIFIED@1313 + +#### Defined in + +[sdk/EnvoyRequest.ts:23](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyRequest.ts#L23) + +___ + +### envoy + +• **envoy**: [EnvoyPluginSDK](../classes/envoypluginsdk.md) + +#### Defined in + +[sdk/EnvoyRequest.ts:35](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyRequest.ts#L35) diff --git a/docs/interfaces/envoyresponse.md b/docs/interfaces/envoyresponse.md new file mode 100644 index 0000000..28e2291 --- /dev/null +++ b/docs/interfaces/envoyresponse.md @@ -0,0 +1,138 @@ +[@envoy/envoy-integrations-sdk](../README.md) / EnvoyResponse + +# Interface: EnvoyResponse + +Use to type your `res` object in Envoy event handlers. + +## Type parameters + +| Name | Type | +| :------ | :------ | +| `Body` | `Body` = `unknown` | + +## Hierarchy + +- `Response` + + ↳ **EnvoyResponse** + +## Table of contents + +### Properties + +- [send](envoyresponse.md#send) +- [sendFailed](envoyresponse.md#sendfailed) +- [sendIgnored](envoyresponse.md#sendignored) +- [sendOngoing](envoyresponse.md#sendongoing) + +## Properties + +### send + +• **send**: (`body?`: `Body`) => [EnvoyResponse](envoyresponse.md) + +#### Type declaration + +▸ (`body?`): [EnvoyResponse](envoyresponse.md) + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `body?` | `Body` | + +##### Returns + +[EnvoyResponse](envoyresponse.md) + +#### Overrides + +Response.send + +#### Defined in + +[sdk/EnvoyResponse.ts:12](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyResponse.ts#L12) + +___ + +### sendFailed + +• **sendFailed**: (`message`: `string`, `debugInfo?`: `unknown`, ...`attachments`: `EnvoyPluginJobAttachment`[]) => `void` + +Marks the job as "failed". The message will be communicated to the Envoy Dashboard user. + +#### Type declaration + +▸ (`message`, `debugInfo?`, ...`attachments`): `void` + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `message` | `string` | +| `debugInfo?` | `unknown` | +| `...attachments` | `EnvoyPluginJobAttachment`[] | + +##### Returns + +`void` + +#### Defined in + +[sdk/EnvoyResponse.ts:27](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyResponse.ts#L27) + +___ + +### sendIgnored + +• **sendIgnored**: (`message`: `string`, `debugInfo?`: `unknown`, ...`attachments`: `EnvoyPluginJobAttachment`[]) => `void` + +Marks the job as "ignored". Useful when you explicitly do not want to handle the event. + +#### Type declaration + +▸ (`message`, `debugInfo?`, ...`attachments`): `void` + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `message` | `string` | +| `debugInfo?` | `unknown` | +| `...attachments` | `EnvoyPluginJobAttachment`[] | + +##### Returns + +`void` + +#### Defined in + +[sdk/EnvoyResponse.ts:22](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyResponse.ts#L22) + +___ + +### sendOngoing + +• **sendOngoing**: (`debugInfo?`: `unknown`) => `void` + +Marks the job as "ongoing". This is useful for long-running event handling. +Later on, you should update the job using +[EnvoyPluginJob.complete](../classes/envoypluginjob.md#complete), [EnvoyPluginJob.fail](../classes/envoypluginjob.md#fail), or [EnvoyPluginJob.ignore](../classes/envoypluginjob.md#ignore). + +#### Type declaration + +▸ (`debugInfo?`): `void` + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `debugInfo?` | `unknown` | + +##### Returns + +`void` + +#### Defined in + +[sdk/EnvoyResponse.ts:18](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/sdk/EnvoyResponse.ts#L18) diff --git a/docs/interfaces/flowattributes.md b/docs/interfaces/flowattributes.md new file mode 100644 index 0000000..2e3e09a --- /dev/null +++ b/docs/interfaces/flowattributes.md @@ -0,0 +1,63 @@ +[@envoy/envoy-integrations-sdk](../README.md) / FlowAttributes + +# Interface: FlowAttributes + +## Table of contents + +### Properties + +- [created-at](flowattributes.md#created-at) +- [employee-centric](flowattributes.md#employee-centric) +- [enabled](flowattributes.md#enabled) +- [name](flowattributes.md#name) +- [updated-at](flowattributes.md#updated-at) + +## Properties + +### created-at + +• `Optional` **created-at**: `string` + +#### Defined in + +[resources/FlowResource.ts:22](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/FlowResource.ts#L22) + +___ + +### employee-centric + +• `Optional` **employee-centric**: `boolean` + +#### Defined in + +[resources/FlowResource.ts:20](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/FlowResource.ts#L20) + +___ + +### enabled + +• `Optional` **enabled**: `boolean` + +#### Defined in + +[resources/FlowResource.ts:22](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/FlowResource.ts#L22) + +___ + +### name + +• **name**: `string` + +#### Defined in + +[resources/FlowResource.ts:20](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/FlowResource.ts#L20) + +___ + +### updated-at + +• `Optional` **updated-at**: `string` + +#### Defined in + +[resources/FlowResource.ts:23](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/FlowResource.ts#L23) diff --git a/docs/interfaces/flowfilterfields.md b/docs/interfaces/flowfilterfields.md new file mode 100644 index 0000000..b751117 --- /dev/null +++ b/docs/interfaces/flowfilterfields.md @@ -0,0 +1,30 @@ +[@envoy/envoy-integrations-sdk](../README.md) / FlowFilterFields + +# Interface: FlowFilterFields + +## Table of contents + +### Properties + +- [employee-centric](flowfilterfields.md#employee-centric) +- [location](flowfilterfields.md#location) + +## Properties + +### employee-centric + +• `Optional` **employee-centric**: `boolean` + +#### Defined in + +[resources/FlowResource.ts:11](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/FlowResource.ts#L11) + +___ + +### location + +• `Optional` **location**: `string` + +#### Defined in + +[resources/FlowResource.ts:13](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/FlowResource.ts#L13) diff --git a/docs/interfaces/inviteattributes.md b/docs/interfaces/inviteattributes.md new file mode 100644 index 0000000..9886411 --- /dev/null +++ b/docs/interfaces/inviteattributes.md @@ -0,0 +1,225 @@ +[@envoy/envoy-integrations-sdk](../README.md) / InviteAttributes + +# Interface: InviteAttributes + +## Table of contents + +### Properties + +- [additional-guests](inviteattributes.md#additional-guests) +- [approval-status](inviteattributes.md#approval-status) +- [arrived](inviteattributes.md#arrived) +- [attested](inviteattributes.md#attested) +- [created-at](inviteattributes.md#created-at) +- [created-from](inviteattributes.md#created-from) +- [email](inviteattributes.md#email) +- [entry-signed-out-at](inviteattributes.md#entry-signed-out-at) +- [expected-arrival-time](inviteattributes.md#expected-arrival-time) +- [expected-departure-time](inviteattributes.md#expected-departure-time) +- [full-name](inviteattributes.md#full-name) +- [guest-updated-at](inviteattributes.md#guest-updated-at) +- [is-presigned](inviteattributes.md#is-presigned) +- [notify-visitor](inviteattributes.md#notify-visitor) +- [phone](inviteattributes.md#phone) +- [private-notes](inviteattributes.md#private-notes) +- [reminder-sent-at](inviteattributes.md#reminder-sent-at) +- [updated-at](inviteattributes.md#updated-at) +- [user-data](inviteattributes.md#user-data) + +## Properties + +### additional-guests + +• `Optional` **additional-guests**: `number` + +#### Defined in + +[resources/InviteResource.ts:28](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L28) + +___ + +### approval-status + +• `Optional` **approval-status**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `auto_approved` | `boolean` | +| `report` | { `messages`: { `failure?`: { `header`: `string` ; `text`: `string` } } ; `reason`: `string` ; `result`: ``"pending"`` \| ``"pass"`` \| ``"fail"`` ; `source`: `string` }[] | +| `status` | ``"approved"`` \| ``"review"`` \| ``"pending"`` \| ``"denied"`` | + +#### Defined in + +[resources/InviteResource.ts:29](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L29) + +___ + +### arrived + +• `Optional` **arrived**: `boolean` + +#### Defined in + +[resources/InviteResource.ts:55](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L55) + +___ + +### attested + +• `Optional` **attested**: `boolean` + +#### Defined in + +[resources/InviteResource.ts:56](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L56) + +___ + +### created-at + +• `Optional` **created-at**: `string` + +#### Defined in + +[resources/InviteResource.ts:59](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L59) + +___ + +### created-from + +• `Optional` **created-from**: `string` + +#### Defined in + +[resources/InviteResource.ts:53](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L53) + +___ + +### email + +• `Optional` **email**: `string` + +#### Defined in + +[resources/InviteResource.ts:45](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L45) + +___ + +### entry-signed-out-at + +• `Optional` **entry-signed-out-at**: `string` + +#### Defined in + +[resources/InviteResource.ts:56](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L56) + +___ + +### expected-arrival-time + +• `Optional` **expected-arrival-time**: `string` + +#### Defined in + +[resources/InviteResource.ts:45](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L45) + +___ + +### expected-departure-time + +• `Optional` **expected-departure-time**: `string` + +#### Defined in + +[resources/InviteResource.ts:46](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L46) + +___ + +### full-name + +• `Optional` **full-name**: `string` + +#### Defined in + +[resources/InviteResource.ts:47](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L47) + +___ + +### guest-updated-at + +• `Optional` **guest-updated-at**: `string` + +#### Defined in + +[resources/InviteResource.ts:48](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L48) + +___ + +### is-presigned + +• `Optional` **is-presigned**: `boolean` + +#### Defined in + +[resources/InviteResource.ts:49](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L49) + +___ + +### notify-visitor + +• `Optional` **notify-visitor**: `boolean` + +#### Defined in + +[resources/InviteResource.ts:52](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L52) + +___ + +### phone + +• `Optional` **phone**: `string` + +#### Defined in + +[resources/InviteResource.ts:59](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L59) + +___ + +### private-notes + +• `Optional` **private-notes**: `string` + +#### Defined in + +[resources/InviteResource.ts:50](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L50) + +___ + +### reminder-sent-at + +• `Optional` **reminder-sent-at**: `string` + +#### Defined in + +[resources/InviteResource.ts:57](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L57) + +___ + +### updated-at + +• `Optional` **updated-at**: `string` + +#### Defined in + +[resources/InviteResource.ts:60](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L60) + +___ + +### user-data + +• `Optional` **user-data**: `Record` + +#### Defined in + +[resources/InviteResource.ts:51](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L51) diff --git a/docs/interfaces/invitecreationattributes.md b/docs/interfaces/invitecreationattributes.md new file mode 100644 index 0000000..4ecf348 --- /dev/null +++ b/docs/interfaces/invitecreationattributes.md @@ -0,0 +1,107 @@ +[@envoy/envoy-integrations-sdk](../README.md) / InviteCreationAttributes + +# Interface: InviteCreationAttributes + +## Table of contents + +### Properties + +- [attested](invitecreationattributes.md#attested) +- [email](invitecreationattributes.md#email) +- [expected-arrival-time](invitecreationattributes.md#expected-arrival-time) +- [expected-departure-time](invitecreationattributes.md#expected-departure-time) +- [full-name](invitecreationattributes.md#full-name) +- [notify-visitor](invitecreationattributes.md#notify-visitor) +- [phone](invitecreationattributes.md#phone) +- [private-notes](invitecreationattributes.md#private-notes) +- [user-data](invitecreationattributes.md#user-data) + +## Properties + +### attested + +• `Optional` **attested**: `boolean` + +#### Defined in + +[resources/InviteResource.ts:75](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L75) + +___ + +### email + +• `Optional` **email**: `string` + +#### Defined in + +[resources/InviteResource.ts:68](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L68) + +___ + +### expected-arrival-time + +• `Optional` **expected-arrival-time**: `string` + +#### Defined in + +[resources/InviteResource.ts:68](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L68) + +___ + +### expected-departure-time + +• `Optional` **expected-departure-time**: `string` + +#### Defined in + +[resources/InviteResource.ts:69](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L69) + +___ + +### full-name + +• `Optional` **full-name**: `string` + +#### Defined in + +[resources/InviteResource.ts:70](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L70) + +___ + +### notify-visitor + +• `Optional` **notify-visitor**: `boolean` + +#### Defined in + +[resources/InviteResource.ts:73](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L73) + +___ + +### phone + +• `Optional` **phone**: `string` + +#### Defined in + +[resources/InviteResource.ts:76](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L76) + +___ + +### private-notes + +• `Optional` **private-notes**: `string` + +#### Defined in + +[resources/InviteResource.ts:71](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L71) + +___ + +### user-data + +• `Optional` **user-data**: `Record` + +#### Defined in + +[resources/InviteResource.ts:72](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L72) diff --git a/docs/interfaces/invitefilterfields.md b/docs/interfaces/invitefilterfields.md new file mode 100644 index 0000000..a2b99f7 --- /dev/null +++ b/docs/interfaces/invitefilterfields.md @@ -0,0 +1,129 @@ +[@envoy/envoy-integrations-sdk](../README.md) / InviteFilterFields + +# Interface: InviteFilterFields + +## Table of contents + +### Properties + +- [date-from](invitefilterfields.md#date-from) +- [date-to](invitefilterfields.md#date-to) +- [datetime-from](invitefilterfields.md#datetime-from) +- [datetime-to](invitefilterfields.md#datetime-to) +- [email](invitefilterfields.md#email) +- [employee](invitefilterfields.md#employee) +- [employee-centric](invitefilterfields.md#employee-centric) +- [flow](invitefilterfields.md#flow) +- [for-date](invitefilterfields.md#for-date) +- [location](invitefilterfields.md#location) +- [scope](invitefilterfields.md#scope) + +## Properties + +### date-from + +• `Optional` **date-from**: `string` + +#### Defined in + +[resources/InviteResource.ts:15](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L15) + +___ + +### date-to + +• `Optional` **date-to**: `string` + +#### Defined in + +[resources/InviteResource.ts:16](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L16) + +___ + +### datetime-from + +• `Optional` **datetime-from**: `string` + +#### Defined in + +[resources/InviteResource.ts:17](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L17) + +___ + +### datetime-to + +• `Optional` **datetime-to**: `string` + +#### Defined in + +[resources/InviteResource.ts:18](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L18) + +___ + +### email + +• `Optional` **email**: `string` + +#### Defined in + +[resources/InviteResource.ts:12](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L12) + +___ + +### employee + +• `Optional` **employee**: `string` + +#### Defined in + +[resources/InviteResource.ts:13](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L13) + +___ + +### employee-centric + +• `Optional` **employee-centric**: `boolean` + +#### Defined in + +[resources/InviteResource.ts:20](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L20) + +___ + +### flow + +• `Optional` **flow**: `string` + +#### Defined in + +[resources/InviteResource.ts:14](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L14) + +___ + +### for-date + +• `Optional` **for-date**: `string` + +#### Defined in + +[resources/InviteResource.ts:19](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L19) + +___ + +### location + +• `Optional` **location**: `string` + +#### Defined in + +[resources/InviteResource.ts:15](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L15) + +___ + +### scope + +• `Optional` **scope**: ``"hosted"`` \| ``"mine"`` \| ``"include_execs"`` + +#### Defined in + +[resources/InviteResource.ts:22](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/InviteResource.ts#L22) diff --git a/docs/interfaces/jsonapidata.md b/docs/interfaces/jsonapidata.md new file mode 100644 index 0000000..1168826 --- /dev/null +++ b/docs/interfaces/jsonapidata.md @@ -0,0 +1,37 @@ +[@envoy/envoy-integrations-sdk](../README.md) / JSONAPIData + +# Interface: JSONAPIData + +## Type parameters + +| Name | Type | +| :------ | :------ | +| `Type` | `Type` = `string` | +| `ID` | `ID` = `string` | + +## Table of contents + +### Properties + +- [id](jsonapidata.md#id) +- [type](jsonapidata.md#type) + +## Properties + +### id + +• **id**: `ID` + +#### Defined in + +[util/json-api/JSONAPIData.ts:2](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/util/json-api/JSONAPIData.ts#L2) + +___ + +### type + +• **type**: `Type` + +#### Defined in + +[util/json-api/JSONAPIData.ts:3](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/util/json-api/JSONAPIData.ts#L3) diff --git a/docs/interfaces/locationattributes.md b/docs/interfaces/locationattributes.md new file mode 100644 index 0000000..ac56b30 --- /dev/null +++ b/docs/interfaces/locationattributes.md @@ -0,0 +1,415 @@ +[@envoy/envoy-integrations-sdk](../README.md) / LocationAttributes + +# Interface: LocationAttributes + +## Table of contents + +### Properties + +- [address](locationattributes.md#address) +- [address-line-1](locationattributes.md#address-line-1) +- [address-line-2](locationattributes.md#address-line-2) +- [auto-sign-out-at-midnight](locationattributes.md#auto-sign-out-at-midnight) +- [average-monthly-visitors](locationattributes.md#average-monthly-visitors) +- [capacity-limit](locationattributes.md#capacity-limit) +- [city](locationattributes.md#city) +- [company-name-override](locationattributes.md#company-name-override) +- [created-at](locationattributes.md#created-at) +- [disabled](locationattributes.md#disabled) +- [employee-screening-enabled](locationattributes.md#employee-screening-enabled) +- [host-approval-enabled](locationattributes.md#host-approval-enabled) +- [latitude](locationattributes.md#latitude) +- [locale](locationattributes.md#locale) +- [logo-small-url](locationattributes.md#logo-small-url) +- [logo-thumb-url](locationattributes.md#logo-thumb-url) +- [logo-url](locationattributes.md#logo-url) +- [longitude](locationattributes.md#longitude) +- [multiple-languages-enabled](locationattributes.md#multiple-languages-enabled) +- [name](locationattributes.md#name) +- [near-visit-screening-enabled](locationattributes.md#near-visit-screening-enabled) +- [pre-registration-enabled](locationattributes.md#pre-registration-enabled) +- [pre-registration-required-enabled](locationattributes.md#pre-registration-required-enabled) +- [printer-notifications-enabled](locationattributes.md#printer-notifications-enabled) +- [registration-eligibility-end-offset](locationattributes.md#registration-eligibility-end-offset) +- [registration-eligibility-start-offset](locationattributes.md#registration-eligibility-start-offset) +- [security-desk-link-enabled](locationattributes.md#security-desk-link-enabled) +- [state](locationattributes.md#state) +- [timezone](locationattributes.md#timezone) +- [touchless-signin-enabled](locationattributes.md#touchless-signin-enabled) +- [updated-at](locationattributes.md#updated-at) +- [visitor-registration-eligibility-start-offset](locationattributes.md#visitor-registration-eligibility-start-offset) +- [visitor-survey-enabled](locationattributes.md#visitor-survey-enabled) +- [visitors-onboarding-complete](locationattributes.md#visitors-onboarding-complete) +- [visual-compliance-enabled](locationattributes.md#visual-compliance-enabled) +- [welcome-email-preference](locationattributes.md#welcome-email-preference) +- [zip](locationattributes.md#zip) + +## Properties + +### address + +• **address**: `string` + +#### Defined in + +[resources/LocationResource.ts:21](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L21) + +___ + +### address-line-1 + +• `Optional` **address-line-1**: `string` + +#### Defined in + +[resources/LocationResource.ts:21](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L21) + +___ + +### address-line-2 + +• `Optional` **address-line-2**: `string` + +#### Defined in + +[resources/LocationResource.ts:22](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L22) + +___ + +### auto-sign-out-at-midnight + +• `Optional` **auto-sign-out-at-midnight**: `boolean` + +#### Defined in + +[resources/LocationResource.ts:42](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L42) + +___ + +### average-monthly-visitors + +• `Optional` **average-monthly-visitors**: `number` + +#### Defined in + +[resources/LocationResource.ts:40](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L40) + +___ + +### capacity-limit + +• `Optional` **capacity-limit**: `number` + +#### Defined in + +[resources/LocationResource.ts:41](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L41) + +___ + +### city + +• `Optional` **city**: `string` + +#### Defined in + +[resources/LocationResource.ts:24](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L24) + +___ + +### company-name-override + +• `Optional` **company-name-override**: `string` + +#### Defined in + +[resources/LocationResource.ts:30](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L30) + +___ + +### created-at + +• `Optional` **created-at**: `string` + +#### Defined in + +[resources/LocationResource.ts:54](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L54) + +___ + +### disabled + +• `Optional` **disabled**: `boolean` + +#### Defined in + +[resources/LocationResource.ts:35](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L35) + +___ + +### employee-screening-enabled + +• `Optional` **employee-screening-enabled**: `boolean` + +#### Defined in + +[resources/LocationResource.ts:43](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L43) + +___ + +### host-approval-enabled + +• `Optional` **host-approval-enabled**: `boolean` + +#### Defined in + +[resources/LocationResource.ts:46](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L46) + +___ + +### latitude + +• `Optional` **latitude**: `number` + +#### Defined in + +[resources/LocationResource.ts:27](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L27) + +___ + +### locale + +• `Optional` **locale**: `string` + +#### Defined in + +[resources/LocationResource.ts:29](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L29) + +___ + +### logo-small-url + +• `Optional` **logo-small-url**: `string` + +#### Defined in + +[resources/LocationResource.ts:31](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L31) + +___ + +### logo-thumb-url + +• `Optional` **logo-thumb-url**: `string` + +#### Defined in + +[resources/LocationResource.ts:32](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L32) + +___ + +### logo-url + +• `Optional` **logo-url**: `string` + +#### Defined in + +[resources/LocationResource.ts:33](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L33) + +___ + +### longitude + +• `Optional` **longitude**: `number` + +#### Defined in + +[resources/LocationResource.ts:28](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L28) + +___ + +### multiple-languages-enabled + +• `Optional` **multiple-languages-enabled**: `boolean` + +#### Defined in + +[resources/LocationResource.ts:47](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L47) + +___ + +### name + +• **name**: `string` + +#### Defined in + +[resources/LocationResource.ts:20](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L20) + +___ + +### near-visit-screening-enabled + +• `Optional` **near-visit-screening-enabled**: `boolean` + +#### Defined in + +[resources/LocationResource.ts:48](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L48) + +___ + +### pre-registration-enabled + +• `Optional` **pre-registration-enabled**: `boolean` + +#### Defined in + +[resources/LocationResource.ts:44](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L44) + +___ + +### pre-registration-required-enabled + +• `Optional` **pre-registration-required-enabled**: `boolean` + +#### Defined in + +[resources/LocationResource.ts:45](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L45) + +___ + +### printer-notifications-enabled + +• `Optional` **printer-notifications-enabled**: `boolean` + +#### Defined in + +[resources/LocationResource.ts:49](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L49) + +___ + +### registration-eligibility-end-offset + +• `Optional` **registration-eligibility-end-offset**: `number` + +#### Defined in + +[resources/LocationResource.ts:36](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L36) + +___ + +### registration-eligibility-start-offset + +• `Optional` **registration-eligibility-start-offset**: `number` + +#### Defined in + +[resources/LocationResource.ts:37](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L37) + +___ + +### security-desk-link-enabled + +• `Optional` **security-desk-link-enabled**: `boolean` + +#### Defined in + +[resources/LocationResource.ts:50](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L50) + +___ + +### state + +• `Optional` **state**: `string` + +#### Defined in + +[resources/LocationResource.ts:25](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L25) + +___ + +### timezone + +• `Optional` **timezone**: `string` + +#### Defined in + +[resources/LocationResource.ts:30](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L30) + +___ + +### touchless-signin-enabled + +• `Optional` **touchless-signin-enabled**: `boolean` + +#### Defined in + +[resources/LocationResource.ts:51](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L51) + +___ + +### updated-at + +• `Optional` **updated-at**: `string` + +#### Defined in + +[resources/LocationResource.ts:55](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L55) + +___ + +### visitor-registration-eligibility-start-offset + +• `Optional` **visitor-registration-eligibility-start-offset**: `number` + +#### Defined in + +[resources/LocationResource.ts:38](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L38) + +___ + +### visitor-survey-enabled + +• `Optional` **visitor-survey-enabled**: `boolean` + +#### Defined in + +[resources/LocationResource.ts:52](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L52) + +___ + +### visitors-onboarding-complete + +• `Optional` **visitors-onboarding-complete**: `boolean` + +#### Defined in + +[resources/LocationResource.ts:35](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L35) + +___ + +### visual-compliance-enabled + +• `Optional` **visual-compliance-enabled**: `boolean` + +#### Defined in + +[resources/LocationResource.ts:53](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L53) + +___ + +### welcome-email-preference + +• `Optional` **welcome-email-preference**: `string` + +#### Defined in + +[resources/LocationResource.ts:39](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L39) + +___ + +### zip + +• `Optional` **zip**: `string` + +#### Defined in + +[resources/LocationResource.ts:26](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L26) diff --git a/docs/interfaces/locationfilterfields.md b/docs/interfaces/locationfilterfields.md new file mode 100644 index 0000000..5209a5e --- /dev/null +++ b/docs/interfaces/locationfilterfields.md @@ -0,0 +1,30 @@ +[@envoy/envoy-integrations-sdk](../README.md) / LocationFilterFields + +# Interface: LocationFilterFields + +## Table of contents + +### Properties + +- [company](locationfilterfields.md#company) +- [disabled](locationfilterfields.md#disabled) + +## Properties + +### company + +• `Optional` **company**: `string` + +#### Defined in + +[resources/LocationResource.ts:13](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L13) + +___ + +### disabled + +• `Optional` **disabled**: `boolean` + +#### Defined in + +[resources/LocationResource.ts:12](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/LocationResource.ts#L12) diff --git a/docs/interfaces/signinfieldattributes.md b/docs/interfaces/signinfieldattributes.md new file mode 100644 index 0000000..51a96e9 --- /dev/null +++ b/docs/interfaces/signinfieldattributes.md @@ -0,0 +1,118 @@ +[@envoy/envoy-integrations-sdk](../README.md) / SignInFieldAttributes + +# Interface: SignInFieldAttributes + +## Table of contents + +### Properties + +- [created-at](signinfieldattributes.md#created-at) +- [identifier](signinfieldattributes.md#identifier) +- [ipad-localized-names](signinfieldattributes.md#ipad-localized-names) +- [kind](signinfieldattributes.md#kind) +- [localized](signinfieldattributes.md#localized) +- [name](signinfieldattributes.md#name) +- [position](signinfieldattributes.md#position) +- [required](signinfieldattributes.md#required) +- [store-response](signinfieldattributes.md#store-response) +- [updated-at](signinfieldattributes.md#updated-at) + +## Properties + +### created-at + +• `Optional` **created-at**: `string` + +#### Defined in + +[resources/SignInFieldResource.ts:18](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/SignInFieldResource.ts#L18) + +___ + +### identifier + +• `Optional` **identifier**: `string` + +#### Defined in + +[resources/SignInFieldResource.ts:10](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/SignInFieldResource.ts#L10) + +___ + +### ipad-localized-names + +• **ipad-localized-names**: { `display-name`: `string` ; `language-code`: `string` ; `region-code?`: `string` }[] + +#### Defined in + +[resources/SignInFieldResource.ts:11](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/SignInFieldResource.ts#L11) + +___ + +### kind + +• **kind**: `string` + +#### Defined in + +[resources/SignInFieldResource.ts:8](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/SignInFieldResource.ts#L8) + +___ + +### localized + +• `Optional` **localized**: `string` + +#### Defined in + +[resources/SignInFieldResource.ts:11](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/SignInFieldResource.ts#L11) + +___ + +### name + +• **name**: `string` + +#### Defined in + +[resources/SignInFieldResource.ts:7](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/SignInFieldResource.ts#L7) + +___ + +### position + +• `Optional` **position**: `number` + +#### Defined in + +[resources/SignInFieldResource.ts:17](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/SignInFieldResource.ts#L17) + +___ + +### required + +• **required**: `boolean` + +#### Defined in + +[resources/SignInFieldResource.ts:9](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/SignInFieldResource.ts#L9) + +___ + +### store-response + +• `Optional` **store-response**: `boolean` + +#### Defined in + +[resources/SignInFieldResource.ts:17](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/SignInFieldResource.ts#L17) + +___ + +### updated-at + +• `Optional` **updated-at**: `string` + +#### Defined in + +[resources/SignInFieldResource.ts:19](https://github.com/envoy/envoy-integrations-sdk-nodejs/blob/410ee70/src/resources/SignInFieldResource.ts#L19) diff --git a/envoyapi.md b/envoyapi.md deleted file mode 100644 index 4ca3ce0..0000000 --- a/envoyapi.md +++ /dev/null @@ -1,150 +0,0 @@ ---- -description: Makes calls to the Envoy API. ---- - -# EnvoyAPI - -Note that there are many API calls not covered by this class. Please add to this class as necessary! - -## Constructor - -#### const api = new EnvoyAPI\(token\) - -| Param | Type | -| :--- | :--- | -| token | `string` | - -## Properties and Methods - -* _instance_ - * .flows\(locationId\) ⇒ `Promise.>` - * .signInPage\(flowId\) ⇒ `Promise.` - * .signInFields\(pageId\) ⇒ `Promise.>` - * .createNotificationEvent\(event\) ⇒ `Promise.` - * .updateJob\(jobId, updates\) ⇒ `Promise.` - * .storagePipeline\(commands, \[installId\]\) ⇒ `Promise.>` -* _static_ - * .login\(\[id\], \[secret\]\) - -#### envoyAPI.flows\(locationId\) ⇒ `Promise.>` - -Fetches the visitor types for this location. - -**Kind**: instance method of `EnvoyAPI` - -| Param | Type | -| :--- | :--- | -| locationId | `string` \| `number` | - -#### envoyAPI.signInPage\(flowId\) ⇒ `Promise.` - -Fetches the sign-in page details for this flow. - -**Kind**: instance method of `EnvoyAPI` - -| Param | Type | -| :--- | :--- | -| flowId | `string` \| `number` | - -#### envoyAPI.signInFields\(pageId\) ⇒ `Promise.>` - -Fetches the sign-in fields for this page. - -**Kind**: instance method of `EnvoyAPI` - -| Param | Type | -| :--- | :--- | -| pageId | `string` \| `number` | - -#### envoyAPI.createNotificationEvent\(event\) ⇒ `Promise.` - -Creates a notification event. - -**Kind**: instance method of `EnvoyAPI` - -| Param | Type | -| :--- | :--- | -| event | `Object` | - -#### envoyAPI.updateJob\(jobId, updates\) ⇒ `Promise.` - -Updates the job. - -**Kind**: instance method of `EnvoyAPI` - -| Param | Type | -| :--- | :--- | -| jobId | `string` \| `uuid` | -| updates | `JobUpdate` | - -#### envoyAPI.storagePipeline\(commands, \[installId\]\) ⇒ `Promise.>` - -Runs the storage pipeline. - -**Kind**: instance method of `EnvoyAPI` - -| Param | Type | Default | -| :--- | :--- | :--- | -| commands | `Array.` | | -| \[installId\] | `string` \| `uuid` \| `number` | `null` | - -#### EnvoyAPI.login\(\[id\], \[secret\]\) - -Gets an access token using client\_credentials as the grant type. - -**Kind**: static method of `EnvoyAPI` - -| Param | Type | Default | -| :--- | :--- | :--- | -| \[id\] | `string` | `process.env.ENVOY_CLIENT_ID` | -| \[secret\] | `string` | `process.env.ENVOY_CLIENT_SECRET` | - -## Related Classes - -### EnvoyObject : `Object` - -**Properties** - -| Name | Type | Description | -| :--- | :--- | :--- | -| id | `string` \| `number` \| `uuid` | the ID of the object | -| attributes | `Object` | the object's attributes, in dash-case. | - -### Attachment : `Object` - -**Properties** - -| Name | Type | Description | -| :--- | :--- | :--- | -| type | `string` | only "password" supported :\( | -| label | `string` | the label to display in Garaje | -| value | `string` | the value to display in Garaje | - -### JobUpdate : `Object` - -**Properties** - -| Name | Type | -| :--- | :--- | -| \[status\] | `string` | -| \[status\_message\] | `string` | -| \[failure\_reason\] | `string` | -| \[attachments\] | `Array.` | - -### PluginStorageItem : `Object` - -**Properties** - -| Name | Type | -| :--- | :--- | -| key | `string` | -| value | | - -### Command : `Object` - -**Properties** - -| Name | Type | Description | -| :--- | :--- | :--- | -| action | `string` | the type of command to run | -| key | `string` | the key to operate on | diff --git a/envoyjwt.md b/envoyjwt.md deleted file mode 100644 index 6f7408c..0000000 --- a/envoyjwt.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -description: Encodes/decodes JWTs ---- - -# EnvoyJWT - -## Constructor - -#### const jwt = new EnvoyJWT\(\[secret\], \[algorithm\]\) - -| Param | Type | Default | -| :--- | :--- | :--- | -| \[secret\] | `string` | `process.env.JWT_SECRET` | -| \[algorithm\] | `string` | `"HS256"` | - -## Properties and Methods - -* _instance_ - * .encode\(subject, expiresIn, \[payload\]\) ⇒ `Promise.` - * .decode\(token, \[options\]\) ⇒ `Promise.<{}>` - -#### envoyJWT.encode\(subject, expiresIn, \[payload\]\) ⇒ `Promise.` - -Creates a JWT. - -**Kind**: instance method of `EnvoyJWT` - -| Param | Type | Description | -| :--- | :--- | :--- | -| subject | `string` \| `number` \| `null` | | -| expiresIn | `string` \| `number` \| `null` | seconds or string like: [https://github.com/zeit/ms](https://github.com/zeit/ms) | -| \[payload\] | `Object` | | - -#### envoyJWT.decode\(token, \[options\]\) ⇒ `Promise.<{}>` - -**Kind**: instance method of `EnvoyJWT` - -| Param | Type | -| :--- | :--- | -| token | `string` | -| \[options\] | `JWTOptions` | - -### JWTOptions : `Object` - -[https://www.npmjs.com/package/jsonwebtoken\#jwtverifytoken-secretorpublickey-options-callback](https://www.npmjs.com/package/jsonwebtoken#jwtverifytoken-secretorpublickey-options-callback) - diff --git a/envoypluginjob.md b/envoypluginjob.md deleted file mode 100644 index 14febbe..0000000 --- a/envoypluginjob.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -description: 'Updates jobs by updating statuses, adding attachments, etc.' ---- - -# EnvoyPluginJob - -## Constructor - -#### const job = new EnvoyPluginJob\(pluginAPI, jobId\) - -| Param | Type | -| :--- | :--- | -| pluginAPI | `EnvoyAPI` | -| jobId | `string` \| `uuid` | - -## Properties and Methods - -* _instance_ - * .api : `EnvoyAPI` - * .id : `string` \| `uuid` - * .execute\(status, message, \[reason\], \[attachments\]\) ⇒ `Promise.` - * .attach\(...attachments\) ⇒ `Promise.` - * .complete\(message, \[...attachments\]\) ⇒ `Promise.` - * .ignore\(message, reason\) ⇒ `Promise.` - * .fail\(message, reason\) ⇒ `Promise.` - * .update\(message, \[...attachments\]\) ⇒ `Promise.` - -#### envoyPluginJob.execute\(status, message, \[reason\], \[attachments\]\) ⇒ `Promise.` - -Updates a job. - -**Kind**: instance method of `EnvoyPluginJob` - -| Param | Type | -| :--- | :--- | -| status | `string` \| `null` | -| message | `string` \| `null` | -| \[reason\] | `string` \| `null` | -| \[attachments\] | `Array.` \| `null` | - -#### envoyPluginJob.attach\(...attachments\) ⇒ `Promise.` - -Attaches items to an in-progress job. - -**Kind**: instance method of `EnvoyPluginJob` - -| Param | Type | -| :--- | :--- | -| ...attachments | `Attachment` | - -#### envoyPluginJob.complete\(message, \[...attachments\]\) ⇒ `Promise.` - -Completes the job. - -**Kind**: instance method of `EnvoyPluginJob` - -| Param | Type | -| :--- | :--- | -| message | `string` | -| \[...attachments\] | `Attachment` | - -#### envoyPluginJob.ignore\(message, reason\) ⇒ `Promise.` - -Ignores the job. - -**Kind**: instance method of `EnvoyPluginJob` - -| Param | Type | -| :--- | :--- | -| message | `string` | -| reason | `string` | - -#### envoyPluginJob.fail\(message, reason\) ⇒ `Promise.` - -Fails the job. - -**Kind**: instance method of `EnvoyPluginJob` - -| Param | Type | -| :--- | :--- | -| message | `string` | -| reason | `string` | - -#### envoyPluginJob.update\(message, \[...attachments\]\) ⇒ `Promise.` - -Updates the job's message, with optional attachments. Useful for multi-step jobs. - -**Kind**: instance method of `EnvoyPluginJob` - -| Param | Type | -| :--- | :--- | -| message | | -| \[...attachments\] | `Attachment` | - -## Related Classes - -### Attachment : `Object` - -**Properties** - -| Name | Type | Description | -| :--- | :--- | :--- | -| \[type\] | `string` | only "password" supported :\( | -| label | `string` | the label to display in Garaje | -| value | `string` | the value to display in Garaje | - diff --git a/envoypluginsdk.md b/envoypluginsdk.md deleted file mode 100644 index 0d6c41e..0000000 --- a/envoypluginsdk.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -description: The Envoy SDK. Typically you'd interact with this directly. ---- - -# EnvoyPluginSDK - -## Constructor - -#### const envoy = new EnvoyPluginSDK\(body, \[isVerified=false\], \[pluginAccessToken=null\]\) - -| Param | Type | Default | -| :--- | :--- | :--- | -| body | `Object` | | -| \[isVerified\] | `boolean` | `false` | -| \[pluginAccessToken\] | `string` | `null` | - -## Properties and Methods - -* _instance_ - * .body : `Object` - * Comes from `req.body` - * .isVerified : `boolean` - * If the request is verified to have come from Envoy - * .pluginAccessToken : `string` - * Access token for use with plugin-scoped endpoints - * .meta : `Meta` - * Metadata associated with this request - * .payload : `EnvoyObject` \| `Object` - * The object that the event is about - * .userAPI : `EnvoyAPI` - * Envoy's API scoped to the installer \(user\) - * Applicable only in setup routes - * .pluginAPI : `EnvoyAPI` - * Envoy's API scoped to the plugin itself - * For use with jobs and storage - * .installStorage : `EnvoyPluginStorage` - * Key/value storage scoped to the current install - * .globalStorage : `EnvoyPluginStorage` - * Key/value storage scoped across installs - * .job : `EnvoyPluginJob` - * Represents the current job - * Applicable only in workers \(event listeners\) - * .jobId : `string` \| `uuid` \| `null` - * The current job ID - * Applicable only in workers - * .jwt : `EnvoyJWT` - * Helper to encode and decode JWTs - * .getJob\(jobId\) ⇒ `EnvoyPluginJob` - * Load a job other than the current - -#### envoyPluginSDK.getJob\(jobId\) ⇒ `EnvoyPluginJob` - -Returns a job based on an ID. - -**Kind**: instance method of `EnvoyPluginSDK` - -| Param | Type | -| :--- | :--- | -| jobId | `string` \| `uuid` | - -## Related Classes - -### EnvoyObject : `Object` - -**Properties** - -| Name | Type | Description | -| :--- | :--- | :--- | -| id | `string` \| `number` \| `uuid` | the ID of the object | -| attributes | `Object` | the object's attributes, in dash-case. | - -### Meta : `Object` - -**Properties** - -| Name | Type | Description | -| :--- | :--- | :--- | -| event | `string` | the name of the event \(workers only\) | -| route | `string` | the name of the route \(routes only\) | -| plugin\_id | `number` | the plugin ID | -| install\_id | `number` | the plugin install ID | -| config | `Object` | config data for this install | -| params | `Object` | The optional URL query params sent in the request \(routes only\) | -| location | `EnvoyObject` | the location this event happened \(location installs only\) | -| company | `EnvoyObject` | the company that installed the plugin | -| auth | `Object` | contains the installer's `access_token` | - diff --git a/envoypluginstorage.md b/envoypluginstorage.md deleted file mode 100644 index 8aa0288..0000000 --- a/envoypluginstorage.md +++ /dev/null @@ -1,95 +0,0 @@ ---- -description: Interacts with the key/value storage system. ---- - -# EnvoyPluginStorage - -## Constructor - -#### const storage = new EnvoyPluginStorage\(pluginAPI, \[installId\]\) - -| Param | Type | Default | -| :--- | :--- | :--- | -| pluginAPI | `EnvoyAPI` | | -| \[installId\] | `number` \| `null` | | - -## Properties and Methods - -* _instance_ - * .api : `EnvoyAPI` - * .installId : `number` \| `null` - * .pipeline\(\) ⇒ `EnvoyPluginStoragePipeline` - * .get\(key\) ⇒ `Promise.<(PluginStorageItem|null)>` - * .set\(key, value\) ⇒ `Promise.` - * .setUnique\(key, options\) ⇒ `Promise.` - * .unset\(key\) ⇒ `Promise.<(PluginStorageItem|null)>` - -#### envoyPluginStorage.pipeline\(\) ⇒ `EnvoyPluginStoragePipeline` - -Creates a new pipeline instance. - -**Kind**: instance method of `EnvoyPluginStorage` - - -#### envoyPluginStorage.get\(key\) ⇒ `Promise.<(PluginStorageItem|null)>` - -Wrapper for single pipeline get. - -**Kind**: instance method of `EnvoyPluginStorage` - -| Param | Type | -| :--- | :--- | -| key | `string` | - -#### envoyPluginStorage.set\(key, value\) ⇒ `Promise.` - -Wrapper for single pipeline set. - -**Kind**: instance method of `EnvoyPluginStorage` - -| Param | Type | -| :--- | :--- | -| key | `string` | -| value | `*` | - -#### envoyPluginStorage.setUnique\(key, \[options\]\) ⇒ `Promise.` - -Wrapper for single pipeline setUnique. - -**Kind**: instance method of `EnvoyPluginStorage` - -| Param | Type | -| :--- | :--- | -| key | `string` | -| \[options\] | `UniqueOptions` | - -#### envoyPluginStorage.unset\(key\) ⇒ `Promise.<(PluginStorageItem|null)>` - -Wrapper for single pipeline unset. Returns null if the item did not previously exist. - -**Kind**: instance method of `EnvoyPluginStorage` - -| Param | Type | -| :--- | :--- | -| key | `string` | - -## Related Classes - -### PluginStorageItem : `Object` - -**Properties** - -| Name | Type | -| :--- | :--- | -| key | `string` | -| value | | - -### UniqueOptions : `Object` - -**Properties** - -| Name | Type | Default | Description | -| :--- | :--- | :--- | :--- | -| chars | `string` | `"0123456789"` | the possible characters to pick from | -| size | `number` | `12` | the length of the value | - diff --git a/envoypluginstoragepipeline.md b/envoypluginstoragepipeline.md deleted file mode 100644 index e87f1f4..0000000 --- a/envoypluginstoragepipeline.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -description: Interacts with the storage pipeline system. ---- - -# EnvoyPluginStoragePipeline - -## Constructor - -#### const storagePipeline = new EnvoyPluginStoragePipeline\(pluginAPI, \[installId\]\) - -| Param | Type | Default | -| :--- | :--- | :--- | -| pluginAPI | `EnvoyAPI` | | -| \[installId\] | `number` \| `null` | | - -## Properties and Methods - -* _instance_ - * .api : `EnvoyAPI` - * .installId : `number` \| `null` - * .commands : `Array.` - * .execute\(\) ⇒ `Promise.>` - * .executeSingle\(\) ⇒ `Promise.` - * .addCommand\(command\) ⇒ `EnvoyPluginStoragePipeline` - * .get\(key\) ⇒ `EnvoyPluginStoragePipeline` - * .set\(key, value\) ⇒ `EnvoyPluginStoragePipeline` - * .setUnique\(key, \[options\]\) ⇒ `EnvoyPluginStoragePipeline` - * .unset\(key\) ⇒ `EnvoyPluginStoragePipeline` - -#### envoyPluginStoragePipeline.execute\(\) ⇒ `Promise.>` - -Executes all the commands in the pipeline. - -**Kind**: instance method of `EnvoyPluginStoragePipeline` - - -#### envoyPluginStoragePipeline.executeSingle\(\) ⇒ `Promise.` - -Executes the pipeline and returns the first result. - -**Kind**: instance method of `EnvoyPluginStoragePipeline` - - -#### envoyPluginStoragePipeline.addCommand\(command\) ⇒ `EnvoyPluginStoragePipeline` - -**Kind**: instance method of `EnvoyPluginStoragePipeline` - -| Param | Type | -| :--- | :--- | -| command | `Command` | - -#### envoyPluginStoragePipeline.get\(key\) ⇒ `EnvoyPluginStoragePipeline` - -Gets a storage item. - -**Kind**: instance method of `EnvoyPluginStoragePipeline` - -| Param | Type | -| :--- | :--- | -| key | `string` | - -#### envoyPluginStoragePipeline.set\(key, value\) ⇒ `EnvoyPluginStoragePipeline` - -Sets a value for a storage item, and returns that item. - -**Kind**: instance method of `EnvoyPluginStoragePipeline` - -| Param | Type | -| :--- | :--- | -| key | `string` | -| value | | - -#### envoyPluginStoragePipeline.setUnique\(key, \[options\]\) ⇒ `EnvoyPluginStoragePipeline` - -Sets a unique value for a storage item, and returns that item. - -**Kind**: instance method of `EnvoyPluginStoragePipeline` - -| Param | Type | -| :--- | :--- | -| key | `string` | -| \[options\] | `UniqueOptions` | - -#### envoyPluginStoragePipeline.unset\(key\) ⇒ `EnvoyPluginStoragePipeline` - -Unsets a storage item. - -**Kind**: instance method of `EnvoyPluginStoragePipeline` - -| Param | Type | -| :--- | :--- | -| key | `string` | - -## Related Classes - -### PluginStorageItem : `Object` - -**Kind**: global typedef -**Properties** - -| Name | Type | -| :--- | :--- | -| key | `string` | -| value | | - -### Command : `Object` - -**Kind**: global typedef -**Properties** - -| Name | Type | Description | -| :--- | :--- | :--- | -| action | `string` | the type of command to run | -| key | `string` | the key to operate on | - -### UniqueOptions : `Object` - -**Kind**: global typedef -**Properties** - -| Name | Type | Default | Description | -| :--- | :--- | :--- | :--- | -| chars | `string` | `"\"0123456789\""` | the possible characters to pick from | -| size | `number` | `12` | the length of the value | - diff --git a/envoysignatureverifier.md b/envoysignatureverifier.md deleted file mode 100644 index 40f26dc..0000000 --- a/envoysignatureverifier.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -description: Verifies that request bodies are from Envoy and are meant for your plugin. ---- - -# EnvoySignatureVerifier - -## Constructor - -#### const signatureVerifier = new EnvoySignatureVerifier\(\[options\]\) - -| Param | Type | -| :--- | :--- | -| \[options\] | `SignatureVerifierOptions` | - -## Properties and Methods - -* _instance_ - * .verify\(req, rawBody\) ⇒ `boolean` - -#### envoySignatureVerifier.verify\(req, rawBody\) ⇒ `boolean` - -Verifies that the signature provided matches the request body. - -**Kind**: instance method of `EnvoySignatureVerifier` - -| Param | Type | -| :--- | :--- | -| req | | -| rawBody | `Buffer` | - -## Related Classes - -### SignatureVerifierOptions : `Object` - -**Properties** - -| Name | Type | Default | -| :--- | :--- | :--- | -| algorithm | `string` | `"sha256"` | -| encoding | `string` | `"base64"` | -| secret | `string` | `process.env.ENVOY_CLIENT_SECRET` | -| header | `string` | `"x-envoy-signature"` | - diff --git a/errormiddleware.md b/errormiddleware.md deleted file mode 100644 index 9fbe575..0000000 --- a/errormiddleware.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -description: Use this middleware to safely catch and serialize unexpected errors. ---- - -# errorMiddleware - -## Example - -```javascript -const express = require('express'); -const { middleware, errorMiddleware } = require('envoy-integrations-sdk-nodejs'); - -const app = express(); -app.use(middleware()); -// define endpoints here -app.use(errorMiddleware()); -``` - -## Functions - -### errorMiddleware\(\) ⇒ `expressErrorMiddleware` - -Returns an [Express.js error middleware](http://expressjs.com/en/guide/error-handling.html#writing-error-handlers), which serializes unexpected errors. - -**Kind**: global function - -### Related Functions and Classes - -### `expressErrorMiddleware` : `function` - -Express/connect middleware. - -**Kind**: global typedef - -| Param | Type | -| :--- | :--- | -| err | `Error` | -| req | [http://expressjs.com/en/4x/api.html\#req](http://expressjs.com/en/4x/api.html#req) | -| res | [http://expressjs.com/en/4x/api.html\#res](http://expressjs.com/en/4x/api.html#res) | -| next | `function` | - diff --git a/index.js b/index.js deleted file mode 100644 index 4b33fe4..0000000 --- a/index.js +++ /dev/null @@ -1,47 +0,0 @@ -require('dotenv').config(); -const EnvoyAPI = require('./lib/EnvoyAPI'); -const EnvoyJWT = require('./lib/EnvoyJWT'); -const EnvoyPluginJob = require('./lib/EnvoyPluginJob'); -const EnvoyPluginSDK = require('./lib/EnvoyPluginSDK'); -const EnvoyPluginStorage = require('./lib/EnvoyPluginStorage'); -const EnvoyPluginStoragePipeline = require('./lib/EnvoyPluginStoragePipeline'); -const EnvoyResponseError = require('./lib/EnvoyResponseError'); -const EnvoySignatureVerifier = require('./lib/EnvoySignatureVerifier'); -const HttpStatus = require('./lib/HttpStatus'); -const middleware = require('./lib/middleware'); -const errorMiddleware = require('./lib/errorMiddleware'); -const asyncHandler = require('./lib/asyncHandler'); - -/** - * @typedef {Object} Envoy - * @property {EnvoyAPI} EnvoyAPI - * @property {EnvoyJWT} EnvoyJWT - * @property {EnvoyPluginJob} EnvoyPluginJob - * @property {EnvoyPluginSDK} EnvoyPluginSDK - * @property {EnvoyPluginStorage} EnvoyPluginStorage - * @property {EnvoyPluginStoragePipeline} EnvoyPluginStoragePipeline - * @property {EnvoyResponseError} EnvoyResponseError - * @property {EnvoySignatureVerifier} EnvoySignatureVerifier - * @property {HttpStatus} HttpStatus - * @property {Function} middleware - * @property {Function} errorMiddleware - * @property {Function} asyncHandler - */ - -/** - * @type {Envoy} - */ -module.exports = { - EnvoyAPI, - EnvoyJWT, - EnvoyPluginJob, - EnvoyPluginSDK, - EnvoyPluginStorage, - EnvoyPluginStoragePipeline, - EnvoyResponseError, - EnvoySignatureVerifier, - HttpStatus, - middleware, - errorMiddleware, - asyncHandler, -}; diff --git a/lib/EnvoyAPI.js b/lib/EnvoyAPI.js deleted file mode 100644 index 5ab3048..0000000 --- a/lib/EnvoyAPI.js +++ /dev/null @@ -1,477 +0,0 @@ -const request = require('request-promise-native'); -const EnvoyResponseError = require('./EnvoyResponseError'); - -/** - * @typedef {Object} EnvoyObject - * @property {string|number|uuid} id - the ID of the object - * @property {{}} attributes - the object's attributes, in dash-case. - */ - -/** - * @typedef {Object} Attachment - * @property {string} type - only "password" supported :( - * @property {string} label - the label to display in Garaje - * @property {string} value - the value to display in Garaje - */ - -/** - * @typedef {Object} JobUpdate - * @property {string} [status] - * @property {string} [status_message] - * @property {string} [failure_reason] - * @property {Attachment[]} [attachments] - */ - -/** - * @typedef {Object} PluginStorageItem - * @property {string} key - * @property value - */ - -/** - * @typedef {Object} Command - * @property {string} action - the type of command to run - * @property {string} key - the key to operate on - */ - -class EnvoyAPI { - - /** - * @param {string} token - */ - constructor(token) { - - if (!token) { - throw new Error('No token supplied.'); - } - - this.baseUrl = process.env.ENVOY_BASE_URL || 'https://app.envoy.com'; - this.request = request.defaults({ - headers: { - Authorization: `Bearer ${token}`, - 'Content-Type': 'application/vnd.api+json', - Accept: 'application/vnd.api+json', - }, - json: true, - baseUrl: this.baseUrl, - }); - } - - /** - * Fetches the visitor types for this location. - * - * @param {string|number} locationId - * @returns {Promise} - */ - async flows(locationId) { - - const body = await this.request({ - url: '/api/v3/flows', - qs: { - filter: { - location: locationId, - }, - include: 'location', - }, - }); - - return EnvoyAPI.getDataFromBody(body, data => Array.isArray(data)); - } - - async flow(flowId) { - - const body = await this.request({ - url: `/api/v3/flows/${flowId}`, - }); - - return EnvoyAPI.getDataFromBody(body); - } - - async locations() { - - const body = await this.request({ - url: `/api/v3/locations`, - }); - - return EnvoyAPI.getDataFromBody(body); - } - - async location(locationId) { - - const body = await this.request({ - url: `/api/v3/locations/${locationId}`, - }); - - return EnvoyAPI.getDataFromBody(body); - } - - async company() { - - const body = await this.request({ - url: '/api/v2/companies', - }); - - return EnvoyAPI.getDataFromBody(body); - } - - async me() { - - const body = await this.request({ - url: '/api/v2/users/me', - }); - - return EnvoyAPI.getDataFromBody(body); - } - - async companyRoles(userId) { - - const body = await this.request({ - url: `/api/v3/users/${userId}/relationships/company-roles`, - }); - - return EnvoyAPI.getDataFromBody(body, data => Array.isArray(data)); - } - - async employee(companyRoleId) { - - const body = await this.request({ - url: `/api/v3/company-roles/${companyRoleId}/employee`, - }); - - return EnvoyAPI.getDataFromBody(body); - } - - /** - * Fetches the employees for this location. - * - * @param {string|number} locationId - * @param {{}} params - * @returns {Promise} - */ - async locationEmployees(locationId, params = {}) { - - const body = await this.request({ - url: `/api/v3/locations/${locationId}/employees`, - qs: params, - }); - - return EnvoyAPI.getDataFromBody(body, data => Array.isArray(data)); - } - - /** - * Fetches an employee. - * - * @param {string|number} employeeId - * @returns {Promise} - */ - async locationEmployee(employeeId) { - - const body = await this.request({ - url: `/api/v3/employees/${employeeId}`, - }); - - return EnvoyAPI.getDataFromBody(body); - } - - /** - * Fetches the sign-in page details for this flow. - * - * @param {string|number} flowId - * @returns {Promise} - */ - async flowBadge(flowId) { - - const body = await this.request({ - url: `/api/v3/flows/${flowId}/badge`, - }); - - return EnvoyAPI.getDataFromBody(body); - } - - /** - * Fetches the sign-in page details for this flow. - * - * @param {string|number} flowId - * @returns {Promise} - */ - async signInPage(flowId) { - - const body = await this.request({ - url: `/api/v3/flows/${flowId}/sign-in-field-page`, - }); - - return EnvoyAPI.getDataFromBody(body); - } - - /** - * Fetches the sign-in fields for this page. - * - * @param {string|number} pageId - * @returns {Promise} - */ - async signInFields(pageId) { - - const body = await this.request({ - url: `/api/v3/sign-in-field-pages/${pageId}/sign-in-fields`, - }); - - return EnvoyAPI.getDataFromBody(body, data => Array.isArray(data)); - } - - /** - * Creates a notification event. - * - * @param {{}} event - * @returns {Promise} - */ - async createNotificationEvent(event) { - - const body = await this.request({ - method: 'POST', - url: '/api/v2/platform/notification-events', - body: event, - }); - - return EnvoyAPI.getDataFromBody(body); - } - - /** - * Creates an invite. - * - * @param {{}} invite - * @returns {Promise} - */ - async createInvite(invite) { - - const body = await this.request({ - method: 'POST', - url: '/api/v3/invites', - body: invite, - }); - - return EnvoyAPI.getDataFromBody(body); - } - - /** - * Updates an invite. - * - * @param inviteId - * @param {{}} invite - * @returns {Promise} - */ - async updateInvite(inviteId, invite) { - - // eslint-disable-next-line no-param-reassign - invite.data.id = inviteId; - const body = await this.request({ - method: 'PUT', - url: `/api/v3/invites/${inviteId}`, - body: invite, - }); - - return EnvoyAPI.getDataFromBody(body); - } - - /** - * Updates an invite. - * - * @param inviteId - * @param {{}} invite - * @returns {Promise} - */ - async partialUpdateInvite(inviteId, invite) { - - // eslint-disable-next-line no-param-reassign - invite.data.id = inviteId; - const body = await this.request({ - method: 'PATCH', - url: `/api/v3/invites/${inviteId}`, - body: invite, - }); - - return EnvoyAPI.getDataFromBody(body); - } - - /** - * Removes an invite. - * - * @param inviteId - * @returns {Promise} - */ - async removeInvite(inviteId) { - return this.request({ - method: 'DELETE', - url: `/api/v3/invites/${inviteId}`, - }); - } - - /** - * Updates the job. - * - * @param {string|uuid} jobId - * @param {JobUpdate} updates - * @returns {Promise} - */ - async updateJob(jobId, updates) { - - const body = await this.request({ - method: 'PATCH', - url: `/api/v2/plugin-services/jobs/${jobId}`, - body: updates, - }); - - return EnvoyAPI.getDataFromBody(body); - } - - /** - * Gets the plugin install's config. - * - * @param {number} installId - * @returns {Promise<{}>} - */ - async getPluginInstallConfig(installId) { - return new Promise((resolve, reject) => { - this.request({ - method: 'GET', - url: `/api/v2/plugin-services/installs/${installId}/config`, - }).then(body => resolve(EnvoyAPI.getDataFromBody(body))) - .catch(err => reject(err)); - }); - } - - /** - * Sets the plugin install's config. - * - * @param {number} installId - * @param {{}} config - * @returns {Promise<{}>} - */ - async setPluginInstallConfig(installId, config = {}) { - const body = await this.request({ - method: 'PUT', - url: `/api/v2/plugin-services/installs/${installId}/config`, - body: config, - }); - - return EnvoyAPI.getDataFromBody(body); - } - - /** - * Runs the storage pipeline. - * - * @param {Command[]} commands - * @param {string|uuid|number} [installId] - * @returns {Promise} - */ - async storagePipeline(commands, installId = null) { - - const request = { commands }; - if (installId) { - request.install_id = installId; - } - const body = await this.request({ - method: 'POST', - url: '/api/v2/plugin-services/storage', - body: request, - }); - - return EnvoyAPI.getDataFromBody(body, data => Array.isArray(data)); - } - - async createNotification(installId, params = {}) { - const body = await this.request({ - method: 'POST', - url: `/api/v2/plugin-services/installs/${installId}/notifications`, - body: params, - }); - return EnvoyAPI.getDataFromBody(body); - } - - static getDataFromBody(body, isValid = () => true) { - - /** - * Valid response bodies look like: - * { data: * } - */ - if (body.data === undefined || !isValid(body.data)) { - throw new EnvoyResponseError(body); - } - - return body.data; - } - - /** - * Gets an access token using client_credentials as the grant type. - * - * @param {string} [id=process.env.ENVOY_CLIENT_ID] - * @param {string} [secret=process.env.ENVOY_CLIENT_SECRET] - */ - static login(id = process.env.ENVOY_CLIENT_ID, secret = process.env.ENVOY_CLIENT_SECRET) { - const baseUrl = process.env.ENVOY_BASE_URL || 'https://app.envoy.com'; - return request({ - auth: { - user: id, - pass: secret, - }, - json: true, - method: 'POST', - body: { - grant_type: 'client_credentials', - client_id: id, - client_secret: secret, - scope: 'plugin,token.refresh', - }, - url: '/a/auth/v0/token', - baseUrl, - }); - } - - static loginAsUser( - username, - password, - id = process.env.ENVOY_CLIENT_ID, - secret = process.env.ENVOY_CLIENT_SECRET, - ) { - const baseUrl = process.env.ENVOY_BASE_URL || 'https://app.envoy.com'; - return request({ - auth: { - user: id, - pass: secret, - }, - json: true, - method: 'POST', - body: { - grant_type: 'password', - username, - password, - scope: 'plugin,token.refresh', - }, - url: '/a/auth/v0/token', - baseUrl, - }); - } - - static loginAsPluginInstaller( - installId, - id = process.env.ENVOY_CLIENT_ID, - secret = process.env.ENVOY_CLIENT_SECRET, - ) { - const baseUrl = process.env.ENVOY_BASE_URL || 'https://app.envoy.com'; - return request({ - auth: { - user: id, - pass: secret, - }, - json: true, - method: 'POST', - body: { - grant_type: 'plugin_install', - install_id: installId, - }, - url: '/a/auth/v0/token', - baseUrl, - }); - } -} - -module.exports = EnvoyAPI; diff --git a/lib/EnvoyJWT.js b/lib/EnvoyJWT.js deleted file mode 100644 index 107d952..0000000 --- a/lib/EnvoyJWT.js +++ /dev/null @@ -1,72 +0,0 @@ -const util = require('util'); -const jwt = require('jsonwebtoken'); - -const sign = util.promisify(jwt.sign); -const verify = util.promisify(jwt.verify); - -/** - * @typedef {Object} JWTOptions - https://www.npmjs.com/package/jsonwebtoken#jwtverifytoken-secretorpublickey-options-callback - */ - - -class EnvoyJWT { - - /** - * - * @param {string} [secret=process.env.JWT_SECRET] - * @param {string} [algorithm='HS256'] - */ - constructor(secret = process.env.JWT_SECRET, algorithm = 'HS256') { - - if (!secret) { - throw new Error('JWT secret missing.'); - } - this.secret = secret; - this.algorithm = algorithm; - } - - /** - * Creates a JWT. - * - * @param {string|number|null} subject - * @param {string|number|null} expiresIn - seconds or string like: https://github.com/zeit/ms - * @param {{}} [payload] - * @returns {Promise} - */ - encode(subject, expiresIn, payload = {}) { - - const { secret, algorithm } = this; - const options = { algorithm }; - if (subject) { - options.subject = subject; - } - if (expiresIn) { - options.expiresIn = expiresIn; - } - - return sign(payload, secret, options); - } - - /** - * - * @param {string} token - * @param {JWTOptions} [options] - * @returns {Promise<{}>} - */ - decode(token, options = {}) { - - const { secret, algorithm } = this; - return verify(token, secret, Object.assign( - { - ignoreExpiration: false, - ignoreNotBefore: false, - }, - options, - { - algorithms: [algorithm], // force the algorithm - }, - )); - } -} - -module.exports = EnvoyJWT; diff --git a/lib/EnvoyPluginJob.js b/lib/EnvoyPluginJob.js deleted file mode 100644 index 9bfb45d..0000000 --- a/lib/EnvoyPluginJob.js +++ /dev/null @@ -1,124 +0,0 @@ -/** - * @typedef {Object} Attachment - * @property {string} [type] - only "password" supported :( - * @property {string} label - the label to display in Garaje - * @property {string} value - the value to display in Garaje - */ - -class EnvoyPluginJob { - - /** - * @param {EnvoyAPI} pluginAPI - * @param {string|uuid} jobId - */ - constructor(pluginAPI, jobId) { - - /** - * @type {EnvoyAPI} - */ - this.api = pluginAPI; - /** - * @type {string|uuid} - */ - this.id = jobId; - } - - /** - * Updates a job. - * - * @param {string|null} status - * @param {string|null} message - * @param {string|null} [reason] - * @param {Attachment[]|null} [attachments] - * @returns {Promise} - */ - execute(status, message, reason, attachments = []) { - - const updates = {}; - if (status) { - updates.status = status; - } - if (message) { - updates.status_message = message; - } - if (reason) { - updates.failure_reason = reason; - } - if (attachments) { - if (!Array.isArray(attachments)) { - throw new Error('Attachments must be an array of objects: [{type, label, value}].'); - } - if (attachments.length) { - updates.attachments = attachments.map(attachment => { - if (!attachment.label || !attachment.value) { - throw new Error('Attachments must be an array of objects: [{type, label, value}].'); - } - return Object.assign({ type: 'password' }, attachment); - }); - } - } - return this.api.updateJob(this.id, updates); - } - - /** - * Attaches items to an in-progress job. - * - * @param {...Attachment} attachments - * @returns {Promise} - */ - attach(...attachments) { - - return this.execute(null, null, null, attachments); - } - - /** - * Completes the job. - * - * @param {string} message - * @param {...Attachment} [attachments] - * @returns {Promise} - */ - complete(message, ...attachments) { - - return this.execute('done', message, null, attachments); - } - - /** - * Ignores the job. - * - * @param {string} message - * @param {string} reason - * @returns {Promise} - */ - ignore(message, reason) { - - return this.execute('ignored', message, reason); - } - - /** - * Fails the job. - * - * @param {string} message - * @param {string} reason - * @returns {Promise} - */ - fail(message, reason) { - - return this.execute('failed', message, reason); - } - - /** - * Updates the job's message, with optional attachments. - * Useful for multi-step jobs. - * - * @param message - * @param {...Attachment} [attachments] - * @returns {Promise} - */ - update(message, ...attachments) { - - return this.execute(null, message, null, attachments); - } -} - -module.exports = EnvoyPluginJob; diff --git a/lib/EnvoyPluginSDK.js b/lib/EnvoyPluginSDK.js deleted file mode 100644 index 8454f29..0000000 --- a/lib/EnvoyPluginSDK.js +++ /dev/null @@ -1,192 +0,0 @@ -const EnvoyAPI = require('./EnvoyAPI'); -const EnvoyJWT = require('./EnvoyJWT'); -const EnvoyPluginStorage = require('./EnvoyPluginStorage'); -const EnvoyPluginJob = require('./EnvoyPluginJob'); - -/** - * @typedef {Object} EnvoyObject - * @property {string|number|uuid} id - the ID of the object - * @property {{}} attributes - the object's attributes, in dash-case. - */ - -/** - * @typedef {Object} Meta - * @property {string} event - the name of the event - * @property {string} route - the name of the route - * @property {number} plugin_id - the plugin ID - * @property {number} install_id - the plugin install ID - * @property {Object} env - config data for this install - * @property {EnvoyObject} location - the location this event happened - * @property {EnvoyObject} company - the company that installed the plugin - * @property {string} forwarded_bearer_token - the Garaje user's token - */ - -class EnvoyPluginSDK { - - /** - * Usually comes from req.body in Express. - * @param {{}} body - * @param {boolean} [isVerified] - * @param {string} [pluginAccessToken] - */ - constructor(body, isVerified = false, pluginAccessToken = null) { - - /** - * @type {{}} - */ - this.body = body; - /** - * @type {boolean} - */ - this.isVerified = isVerified; - /** - * @type {string} - */ - this.pluginAccessToken = pluginAccessToken; - } - - /** - * The request_meta of the platform_event. - * - * @returns {Meta} - */ - get meta() { - - if (!this.isVerified) { - throw new Error('Could not verify meta.'); - } - return this.body.meta; - } - - /** - * The request_body of the platform_event. - * - * @returns {{}|EnvoyObject} - */ - get payload() { - - if (!this.isVerified) { - throw new Error('Could not verify payload.'); - } - return this.body.payload; - } - - /** - * Envoy API scoped to the user. - * Used only in routes. - * - * @returns {EnvoyAPI} - */ - get userAPI() { - - const { forwarded_bearer_token: token, auth } = this.meta; - const accessToken = token || (auth ? auth.access_token : null); - if (!accessToken) { - throw new Error("This user's API token was not found. Are you in a route?"); - } - return new EnvoyAPI(accessToken); - } - - /** - * Envoy API scoped to the plugin. - * Used to perform storage or job operations. - * - * @returns {EnvoyAPI} - */ - get pluginAPI() { - - const { pluginAccessToken } = this; - if (!pluginAccessToken) { - throw new Error('No API token found. Are your Envoy client ID and secret set?'); - } - return new EnvoyAPI(pluginAccessToken); - } - - /** - * Storage scoped to the install. - * - * @returns {EnvoyPluginStorage} - */ - get installStorage() { - - const { install_id: installId } = this.meta; - if (!installId) { - throw new Error('No install ID found in meta.'); - } - return this.getStorage(installId); - } - - /** - * Storage scoped globally (across installs). - * - * @returns {EnvoyPluginStorage} - */ - get globalStorage() { - - return this.getStorage(); - } - - /** - * Perform operations on the current job. - * - * @returns {EnvoyPluginJob} - */ - get job() { - - const { jobId } = this; - if (!jobId) { - throw new Error('No job found in meta. Are you in a worker?'); - } - return this.getJob(jobId); - } - - /** - * Returns the current job's ID. - * - * @returns {string|uuid|null} - */ - get jobId() { - const { job } = this.meta; - return job ? job.id : null; - } - - /** - * A utility to encode and decode JWTs. - * Useful for verifiable communications between plugin endpoints. - * - * @returns {EnvoyJWT} - */ - get jwt() { - - const { JWT_SECRET: secret } = process.env; - if (!secret) { - throw new Error('No JWT_SECRET environment variable set.'); - } - return new EnvoyJWT(secret); - } - - /** - * Returns a job based on an ID. - * - * @returns {Function} - */ - get getJob() { - - /** - * @param {string|uuid} jobId - * @returns {EnvoyPluginJob} - */ - return jobId => new EnvoyPluginJob(this.pluginAPI, jobId); - } - - get getStorage() { - - /** - * @param {string|number} installId - * @returns {EnvoyPluginStorage} - */ - return (installId = null) => new EnvoyPluginStorage(this.pluginAPI, installId); - } -} - -module.exports = EnvoyPluginSDK; diff --git a/lib/EnvoyPluginStorage.js b/lib/EnvoyPluginStorage.js deleted file mode 100644 index 083e8ba..0000000 --- a/lib/EnvoyPluginStorage.js +++ /dev/null @@ -1,109 +0,0 @@ -const EnvoyPluginStoragePipeline = require('./EnvoyPluginStoragePipeline'); - -/** - * @typedef {Object} PluginStorageItem - * @property {string} key - * @property value - */ - -/** - * @typedef {Object} UniqueOptions - * @property {string} chars="0123456789" - the possible characters to pick from - * @property {number} size=12 - the length of the value - */ - -/** - * @typedef {Object} UniqueNumOptions - * @property {number} min=0 - the minimum number to pick from - * @property {number} max=Number.MAX_SAFE_INTEGER - the maximum number to pick from - */ - -class EnvoyPluginStorage { - - /** - * @param {EnvoyAPI} pluginAPI - * @param {number|null} [installId] - */ - constructor(pluginAPI, installId = null) { - - /** - * @type {EnvoyAPI} - */ - this.api = pluginAPI; - /** - * @type {number|null} - */ - this.installId = installId; - } - - /** - * Creates a new pipeline instance. - * - * @returns {EnvoyPluginStoragePipeline} - */ - pipeline() { - - return new EnvoyPluginStoragePipeline(this.api, this.installId); - } - - /** - * Wrapper for single pipeline get. - * - * @param {string} key - * @returns {Promise} - */ - get(key) { - - return this.pipeline().get(key).executeSingle(); - } - - /** - * Wrapper for single pipeline set. - * - * @param {string} key - * @param {*} value - * @returns {Promise} - */ - set(key, value) { - - return this.pipeline().set(key, value).executeSingle(); - } - - /** - * Wrapper for single pipeline setUnique. - * - * @param {string} key - * @param {UniqueOptions} [options] - * @returns {Promise} - */ - setUnique(key, options = {}) { - - return this.pipeline().setUnique(key, options).executeSingle(); - } - - /** - * Wrapper for single pipeline setUnique. - * - * @param {string} key - * @param {UniqueNumOptions} [options] - * @returns {Promise} - */ - setUniqueNum(key, options = {}) { - - return this.pipeline().setUniqueNum(key, options).executeSingle(); - } - - /** - * Wrapper for single pipeline unset. - * Returns null if the item did not previously exist. - * - * @param {string} key - * @returns {Promise} - */ - unset(key) { - - return this.pipeline().unset(key).executeSingle(); - } -} - -module.exports = EnvoyPluginStorage; diff --git a/lib/EnvoyPluginStoragePipeline.js b/lib/EnvoyPluginStoragePipeline.js deleted file mode 100644 index 9f6b622..0000000 --- a/lib/EnvoyPluginStoragePipeline.js +++ /dev/null @@ -1,142 +0,0 @@ -/** - * @typedef {Object} PluginStorageItem - * @property {string} key - * @property value - */ - -/** - * @typedef {Object} Command - * @property {string} action - the type of command to run - * @property {string} key - the key to operate on - */ - -/** - * @typedef {Object} UniqueOptions - * @property {string} chars="0123456789" - the possible characters to pick from - * @property {number} size=12 - the length of the value - */ - -/** - * @typedef {Object} UniqueNumOptions - * @property {number} min=0 - the minimum number to pick from - * @property {number} max=Number.MAX_SAFE_INTEGER - the maximum number to pick from - */ - -class EnvoyPluginStoragePipeline { - - /** - * - * @param {EnvoyAPI} pluginAPI - * @param {number|null} [installId] - */ - constructor(pluginAPI, installId = null) { - - /** - * @type {EnvoyAPI} - */ - this.api = pluginAPI; - /** - * @type {number|null} - */ - this.installId = installId; - /** - * @type {Command[]} - */ - this.commands = []; - } - - /** - * Executes all the commands in the pipeline. - * - * @returns {Promise.>} - */ - execute() { - - return this.api.storagePipeline(this.commands, this.installId); - } - - /** - * Executes the pipeline and returns the first result. - * - * @returns {Promise} - */ - async executeSingle() { - - const [result] = await this.execute(); - return result; - } - - /** - * - * @param {Command} command - * @returns {EnvoyPluginStoragePipeline} - */ - addCommand(command) { - - this.commands.push(command); - return this; - } - - /** - * Gets a storage item. - * - * @param {string} key - * @returns {EnvoyPluginStoragePipeline} - */ - get(key) { - - return this.addCommand({ action: 'get', key }); - } - - /** - * Sets a value for a storage item, - * and returns that item. - * - * @param {string} key - * @param value - * @returns {EnvoyPluginStoragePipeline} - */ - set(key, value) { - - return this.addCommand({ action: 'set', key, value }); - } - - /** - * Sets a unique value for a storage item, - * and returns that item. - * - * @param {string} key - * @param {UniqueOptions} [options] - * @returns {EnvoyPluginStoragePipeline} - */ - setUnique(key, options = {}) { - - return this.addCommand(Object.assign({ action: 'set_unique', key }, options)); - } - - /** - * Sets a unique number value for a storage item, - * and returns that item. - * - * @param {string} key - * @param {UniqueNumOptions} [options] - * @returns {EnvoyPluginStoragePipeline} - */ - setUniqueNum(key, options = {}) { - - return this.addCommand(Object.assign({ action: 'set_unique_num', key }, options)); - } - - /** - * Unsets a storage item. - * - * @param {string} key - * @returns {EnvoyPluginStoragePipeline} - */ - unset(key) { - - return this.addCommand({ action: 'unset', key }); - } -} - -module.exports = EnvoyPluginStoragePipeline; diff --git a/lib/EnvoyResponseError.js b/lib/EnvoyResponseError.js deleted file mode 100644 index aac98a9..0000000 --- a/lib/EnvoyResponseError.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Using a custom error for easy identification in logs, - * and for checking error types if necessary. - */ -class EnvoyResponseError extends Error { - - constructor(body, message = 'Envoy API response caused an error.') { - super(message); - // Ensure the name of this error is the same as the class name - this.name = this.constructor.name; - this.body = body; - // This clips the constructor invocation from the stack trace. - // It's not absolutely essential, but it does make the stack trace a little nicer. - Error.captureStackTrace(this, this.constructor); - } -} - -module.exports = EnvoyResponseError; diff --git a/lib/EnvoySignatureVerifier.js b/lib/EnvoySignatureVerifier.js deleted file mode 100644 index 0e75830..0000000 --- a/lib/EnvoySignatureVerifier.js +++ /dev/null @@ -1,67 +0,0 @@ -const crypto = require('crypto'); - -/** - * @typedef {Object} SignatureVerifierOptions - * @property {string} algorithm="sha256" - * @property {string} encoding="base64" - * @property {string} secret=process.env.ENVOY_CLIENT_SECRET - * @property {string} header="x-envoy-signature" - */ - -/** - * - * @type {SignatureVerifierOptions} - */ -const defaultOptions = { - algorithm: 'sha256', - encoding: 'base64', - secret: process.env.ENVOY_CLIENT_SECRET, - header: 'x-envoy-signature', -}; - -class EnvoySignatureVerifier { - - /** - * - * @param {SignatureVerifierOptions} [options] - */ - constructor(options = defaultOptions) { - - this.options = Object.assign({}, defaultOptions, options); - - if (!this.options.secret) { - throw new Error('No client secret found in the ENVOY_CLIENT_SECRET environment variable.'); - } - } - - /** - * Verifies that the signature provided matches the request body. - * - * @param req - * @param {Buffer} rawBody - * @returns {boolean} - */ - verify(req, rawBody) { - - const { - algorithm, - encoding, - secret, - header, - } = this.options; - - if (!req.headers[header]) { - return false; - } - const receivedDigest = req.headers[header]; - const computedHmac = crypto.createHmac(algorithm, secret); - computedHmac.update(rawBody); - - return crypto.timingSafeEqual( - Buffer.from(receivedDigest), - Buffer.from(computedHmac.digest(encoding)), - ); - } -} - -module.exports = EnvoySignatureVerifier; diff --git a/lib/HttpStatus.js b/lib/HttpStatus.js deleted file mode 100644 index 651eac5..0000000 --- a/lib/HttpStatus.js +++ /dev/null @@ -1,20 +0,0 @@ -class HttpStatus { - - static get ONGOING() { - return 202; - } - - static get IGNORED() { - return 400; - } - - static get FAILED() { - return 412; - } - - static get UNEXPECTED_FAILURE() { - return 500; - } -} - -module.exports = HttpStatus; diff --git a/lib/asyncHandler.js b/lib/asyncHandler.js deleted file mode 100644 index 92cc0fe..0000000 --- a/lib/asyncHandler.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Catches Promise-based errors. - * - * @param {Function} handler - * @returns {Function} - */ -function asyncHandler(handler) { - return async (req, res, next) => { - try { - await handler(req, res, next); - } catch (err) { - next(err); - } - }; -} - -module.exports = asyncHandler; diff --git a/lib/errorMiddleware.js b/lib/errorMiddleware.js deleted file mode 100644 index 1acd5a3..0000000 --- a/lib/errorMiddleware.js +++ /dev/null @@ -1,27 +0,0 @@ -const HttpStatus = require('./HttpStatus'); - -/** - * - * @param {Function} onError - * @returns {Function} - */ -function errorMiddleware(onError = () => {}) { - - /** - * @param err - * @param req - * @param res - * @param next - */ - return (err, req, res, next) => { - onError(err); - if (res.headersSent) { - return next(err); - } - res.statusCode = HttpStatus.UNEXPECTED_FAILURE; - res.setHeader('Content-Type', 'application/json'); - res.end(JSON.stringify({ message: err.message })); - }; -} - -module.exports = errorMiddleware; diff --git a/lib/middleware.js b/lib/middleware.js deleted file mode 100644 index 4a2f769..0000000 --- a/lib/middleware.js +++ /dev/null @@ -1,110 +0,0 @@ -const bodyParser = require('body-parser'); -const EnvoyAPI = require('./EnvoyAPI'); -const EnvoyPluginSDK = require('./EnvoyPluginSDK'); -const EnvoySignatureVerifier = require('./EnvoySignatureVerifier'); -const HttpStatus = require('./HttpStatus'); - -const VERIFIED = Symbol('verified'); - -/** - * Express/connect middleware. - * - * @callback connectMiddleware - * @param req - * @param res - * @param {Function} next - */ - -/** - * @typedef {Object} EnvoyRequest - * @property {EnvoyPluginSDK} envoy - the SDK - */ - -/** - * @typedef {Object} EnvoyResponse - * @property {Function} sendOngoing - * @property {Function} sendIgnored - * @property {Function} sendFailed - */ - -/** - * Returns an instance of bodyParser.json, - * which also verifies that the request came from Envoy. - * - * @param {SignatureVerifierOptions} [options] - * @returns {connectMiddleware} - */ -function middleware(options) { - - const signatureVerifier = new EnvoySignatureVerifier(options); - const verify = (req, res, rawBody) => { - - req[VERIFIED] = signatureVerifier.verify(req, rawBody); - }; - const json = bodyParser.json({ verify }); - let accessToken = null; - let threshold = 0; - - return (req, res, next) => { - - json(req, res, async err => { - - if (err) { - return next(err); - } - try { - const now = Date.now(); - if (now > threshold) { - const { - access_token: rawAccessToken, - expires_in: expiresIn, - } = await EnvoyAPI.login(); - accessToken = rawAccessToken; - threshold = now + (expiresIn * 1000) - (1000 * 60 * 10); - } - - /** - * @type {EnvoyPluginSDK} - */ - req.envoy = new EnvoyPluginSDK(req.body, req[VERIFIED], accessToken); - /** - * @param {object} [data] - */ - res.sendOngoing = (data = {}) => { - res.statusCode = HttpStatus.ONGOING; - res.setHeader('Content-Type', 'application/json'); - res.end(JSON.stringify(data)); - }; - /** - * @param {string} [message] - * @param {object} [data] - */ - res.sendIgnored = (message = '', data = {}) => { - if (message && data.message) { - console.warn('Data to be sent already has a message.'); - } - res.statusCode = HttpStatus.IGNORED; - res.setHeader('Content-Type', 'application/json'); - res.end(JSON.stringify(Object.assign({ message }, data))); - }; - /** - * @param {string} [message] - * @param {object} [data] - */ - res.sendFailed = (message = '', data = {}) => { - if (message && data.message) { - console.warn('Data to be sent already has a message.'); - } - res.statusCode = HttpStatus.FAILED; - res.setHeader('Content-Type', 'application/json'); - res.end(JSON.stringify(Object.assign({ message }, data))); - }; - next(); - } catch (err) { - next(err); - } - }); - }; -} - -module.exports = middleware; diff --git a/middleware.md b/middleware.md deleted file mode 100644 index e7ea882..0000000 --- a/middleware.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -description: Use this middleware to automatically and safely include Envoy in your plugin. ---- - -# middleware - -## Example - -```javascript -const express = require('express'); -const { middleware } = require('envoy-integrations-sdk-nodejs'); - -const app = express(); -app.use(middleware()); -``` - -## Functions - -### middleware\(\[options\]\) ⇒ `connectMiddleware` - -Returns an instance of `bodyParser.json`, which also verifies that the request came from Envoy. It also attaches an instance of `EnvoyPluginSDK` attached to the `req` object, accessible at `req.envoy`. - -**Kind**: global function - -| Param | Type | -| :--- | :--- | -| \[options\] | `SignatureVerifierOptions` | - -### Related Functions and Classes - -### connectMiddleware : `function` - -Express/connect middleware. - -**Kind**: global typedef - -| Param | Type | -| :--- | :--- | -| req | [http://expressjs.com/en/4x/api.html\#req](http://expressjs.com/en/4x/api.html#req) | -| res | [http://expressjs.com/en/4x/api.html\#res](http://expressjs.com/en/4x/api.html#res) | -| next | `function` | - -### SignatureVerifierOptions : `Object` - -**Properties** - -| Name | Type | Default | -| :--- | :--- | :--- | -| algorithm | `string` | `"sha256"` | -| encoding | `string` | `"base64"` | -| secret | `string` | `process.env.ENVOY_CLIENT_SECRET` | -| header | `string` | `"x-envoy-signature"` | - diff --git a/package-lock.json b/package-lock.json index 9786be7..c7e2d6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,1622 +1,3913 @@ { "name": "@envoy/envoy-integrations-sdk", - "version": "1.0.0", - "lockfileVersion": 1, + "version": "2.2.3", + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "packages": { + "": { + "name": "@envoy/envoy-integrations-sdk", + "version": "2.2.3", + "license": "ISC", + "dependencies": { + "@types/dotenv": "^8.2.0", + "@types/faker": "^5.5.6", + "@types/jsonwebtoken": "^9.0.0", + "@types/node": "^15.12.0", + "@types/qs": "^6.9.6", + "axios": "^1.4.0", + "body-parser": "^1.19.0", + "chalk": "^4.1.2", + "dataloader": "^2.0.0", + "dotenv-flow": "^3.2.0", + "factory.ts": "^0.5.2", + "faker": "^5.5.3", + "jsonwebtoken": "^9.0.0", + "lodash.ismatch": "^4.4.0", + "luxon": "^1.27.0", + "qs": "^6.10.1" + }, + "devDependencies": { + "@types/dotenv-flow": "^3.1.1", + "@types/express": "^4.17.12", + "@types/lodash.ismatch": "^4.4.6", + "@types/luxon": "^1.27.0", + "@typescript-eslint/eslint-plugin": "^4.26.0", + "@typescript-eslint/parser": "^4.26.0", + "chai": "^4.2.0", + "eslint": "^7.27.0", + "eslint-config-airbnb-typescript": "^12.3.1", + "eslint-plugin-import": "^2.23.4", + "jsdoc-to-markdown": "^5.0.0", + "mocha": "^6.1.4", + "proxyquire": "^2.1.0", + "sinon": "^7.3.2", + "typedoc": "^0.20.36", + "typedoc-github-wiki-theme": "^0.3.0", + "typedoc-plugin-markdown": "^3.9.0", + "typescript": "4.2" + }, + "peerDependencies": { + "@types/express": "^4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" + "dependencies": { + "@babel/highlight": "^7.10.4" } }, - "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "dev": true, - "requires": { + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.5.tgz", + "integrity": "sha512-TM8C+xtH/9n1qzX+JNHi7AN2zHMTiPUtspO0ZdHflW8KaskkALhMmuMHb4bCmNdv9VAPzJX3/bXqkVLnAvsPfg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" } }, - "@babel/parser": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", - "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "node_modules/@eslint/eslintrc/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 }, - "@sinonjs/commons": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.6.0.tgz", - "integrity": "sha512-w4/WHG7C4WWFyE5geCieFJF6MZkbW4VAriol5KlmQXpAQdxvV0p26sqNZOW6Qyw6Y0l9K4g+cHvvczR2sEEpqg==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", + "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "dev": true, - "requires": { + "dependencies": { "type-detect": "4.0.8" } }, - "@sinonjs/formatio": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.1.tgz", - "integrity": "sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ==", + "node_modules/@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", "dev": true, - "requires": { + "dependencies": { "@sinonjs/commons": "^1", "@sinonjs/samsam": "^3.1.0" } }, - "@sinonjs/samsam": { + "node_modules/@sinonjs/samsam": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", "dev": true, - "requires": { + "dependencies": { "@sinonjs/commons": "^1.3.0", "array-from": "^2.1.1", "lodash": "^4.17.15" } }, - "@sinonjs/text-encoding": { + "node_modules/@sinonjs/text-encoding": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, - "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", - "dev": true - }, - "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 - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "node_modules/@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" } }, - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-escape-sequences": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz", - "integrity": "sha512-dzW9kHxH011uBsidTXd14JXgzye/YLb2LzeKZ4bsgl/Knwx8AtbSFkkGxagdNOoh0DlqHCmfiEjWKBaqjOanVw==", + "node_modules/@types/connect": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", + "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", "dev": true, - "requires": { - "array-back": "^3.0.1" + "dependencies": { + "@types/node": "*" } }, - "ansi-escapes": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", - "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", - "dev": true, - "requires": { - "type-fest": "^0.5.2" + "node_modules/@types/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-ylSC9GhfRH7m1EUXBXofhgx4lUWmFeQDINW5oLuS+gxWdfUeW4zJdeVTYVkexEW+e2VUvlZR2kGnGGipAWR7kw==", + "deprecated": "This is a stub types definition. dotenv provides its own type definitions, so you do not need this installed.", + "dependencies": { + "dotenv": "*" } }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "node_modules/@types/dotenv-flow": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/dotenv-flow/-/dotenv-flow-3.1.1.tgz", + "integrity": "sha512-khxgP+KkHPL72SP0Wqn1gB6EHj6yk79OBGJEKW64XL13RbyDGTkRbbA47VICOLRrvgKOpZeun2uMsgO7pAsExQ==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@types/express": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.12.tgz", + "integrity": "sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q==", "dev": true, - "requires": { - "color-convert": "^1.9.0" + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@types/express-serve-static-core": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.21.tgz", + "integrity": "sha512-gwCiEZqW6f7EoR8TTEfalyEhb1zA5jQJnRngr97+3pzMaO1RKoI1w2bw07TK72renMUVWcWS5mLI6rk1NqN0nA==", "dev": true, - "requires": { - "sprintf-js": "~1.0.2" + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" } }, - "array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "node_modules/@types/faker": { + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/@types/faker/-/faker-5.5.6.tgz", + "integrity": "sha512-UCRj0kLg4sXs2XFVm48OU/wIjyJZkpRkwxhRGVQb5l5GmemkeW22WTz9iiDhYPBUqTzDsIWzhFRuF/4DD5+q2Q==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" + "node_modules/@types/jsonwebtoken": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", + "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", + "dependencies": { + "@types/node": "*" } }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } + "node_modules/@types/lodash": { + "version": "4.14.171", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.171.tgz", + "integrity": "sha512-7eQ2xYLLI/LsicL2nejW9Wyko3lcpN6O/z0ZLHrEQsg280zIdCv1t/0m6UtBjUHokCGBQ3gYTbHzDkZ1xOBwwg==", + "dev": true }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "node_modules/@types/lodash.ismatch": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/lodash.ismatch/-/lodash.ismatch-4.4.6.tgz", + "integrity": "sha512-Qy6R9c+LOc3M+kBTDgQGAWxzcrXFKznXuIyg8tbw2/Ct3D3lBmQd3yMTD+NjGzIATgUr0v4uWzW3+ALid+LXsQ==", + "dev": true, + "dependencies": { + "@types/lodash": "*" + } }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "node_modules/@types/luxon": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-1.27.0.tgz", + "integrity": "sha512-rr2lNXsErnA/ARtgFn46NtQjUa66cuwZYeo/2K7oqqxhJErhXgHBPyNKCo+pfOC3L7HFwtao8ebViiU9h4iAxA==", "dev": true }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "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=" - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "node_modules/@types/node": { + "version": "15.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", + "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==" }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } + "node_modules/@types/qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==" }, - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "node_modules/@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", "dev": true }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "node_modules/@types/serve-static": { + "version": "1.13.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", + "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.26.1.tgz", + "integrity": "sha512-aoIusj/8CR+xDWmZxARivZjbMBQTT9dImUtdZ8tVCVRXgBUuuZyM5Of5A9D9arQPxbi/0rlJLcuArclz/rCMJw==", "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "dependencies": { + "@typescript-eslint/experimental-utils": "4.26.1", + "@typescript-eslint/scope-manager": "4.26.1", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.21", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "cache-point": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-0.4.1.tgz", - "integrity": "sha512-4TgWfe9SF+bUy5cCql8gWHqKNrviufNwSYxLjf2utB0pY4+bdcuFwMmY1hDB+67Gz/L1vmhFNhePAjJTFBtV+Q==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, - "requires": { - "array-back": "^2.0.0", - "fs-then-native": "^2.0.0", - "mkdirp2": "^1.0.3" - }, "dependencies": { - "array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "requires": { - "typical": "^2.6.1" - } + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@typescript-eslint/eslint-plugin/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 }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "catharsis": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", - "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, - "requires": { - "lodash": "^4.17.14" + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.26.1.tgz", + "integrity": "sha512-sQHBugRhrXzRCs9PaGg6rowie4i8s/iD/DpTB+EXte8OMDfdCG5TvO73XlO9Wc/zi0uyN4qOmX9hIjQEyhnbmQ==", "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.26.1", + "@typescript-eslint/types": "4.26.1", + "@typescript-eslint/typescript-estree": "4.26.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@typescript-eslint/parser": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.26.1.tgz", + "integrity": "sha512-q7F3zSo/nU6YJpPJvQveVlIIzx9/wu75lr6oDbDzoeIRWxpoc/HQ43G4rmMoCc5my/3uSj2VEpg/D83LYZF5HQ==", "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "dependencies": { + "@typescript-eslint/scope-manager": "4.26.1", + "@typescript-eslint/types": "4.26.1", + "@typescript-eslint/typescript-estree": "4.26.1", + "debug": "^4.3.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, - "requires": { - "restore-cursor": "^3.1.0" + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "node_modules/@typescript-eslint/parser/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 }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.26.1.tgz", + "integrity": "sha512-TW1X2p62FQ8Rlne+WEShyd7ac2LA6o27S9i131W4NwDSfyeVlQWhw8ylldNNS8JG6oJB9Ha9Xyc+IUcqipvheQ==", "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, "dependencies": { - "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=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - } + "@typescript-eslint/types": "4.26.1", + "@typescript-eslint/visitor-keys": "4.26.1" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collect-all": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-1.0.3.tgz", - "integrity": "sha512-0y0rBgoX8IzIjBAUnO73SEtSb4Mhk3IoceWJq5zZSxb9mWORhWH8xLYo4EDSOE1jRBk1LhmfjqWFFt10h/+MEA==", + "node_modules/@typescript-eslint/types": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.26.1.tgz", + "integrity": "sha512-STyMPxR3cS+LaNvS8yK15rb8Y0iL0tFXq0uyl6gY45glyI7w0CsyqyEXl/Fa0JlQy+pVANeK3sbwPneCbWE7yg==", "dev": true, - "requires": { - "stream-connect": "^1.0.2", - "stream-via": "^1.0.4" + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.26.1.tgz", + "integrity": "sha512-l3ZXob+h0NQzz80lBGaykdScYaiEbFqznEs99uwzm8fPHhDjwaBFfQkjUC/slw6Sm7npFL8qrGEAMxcfBsBJUg==", "dev": true, - "requires": { - "color-name": "1.1.3" + "dependencies": { + "@typescript-eslint/types": "4.26.1", + "@typescript-eslint/visitor-keys": "4.26.1", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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 }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "command-line-args": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.1.1.tgz", - "integrity": "sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.26.1.tgz", + "integrity": "sha512-IGouNSSd+6x/fHtYRyLOM6/C+QxMDzWlDtN41ea+flWuSF9g02iqcIlX8wM53JkfljoIjP0U+yp7SiTS1onEkw==", "dev": true, - "requires": { - "array-back": "^3.0.1", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, "dependencies": { - "typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true - } + "@typescript-eslint/types": "4.26.1", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "command-line-tool": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/command-line-tool/-/command-line-tool-0.8.0.tgz", - "integrity": "sha512-Xw18HVx/QzQV3Sc5k1vy3kgtOeGmsKIqwtFFoyjI4bbcpSgnw2CWVULvtakyw4s6fhyAdI6soQQhXc2OzJy62g==", + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, - "requires": { - "ansi-escape-sequences": "^4.0.0", - "array-back": "^2.0.0", - "command-line-args": "^5.0.0", - "command-line-usage": "^4.1.0", - "typical": "^2.6.1" + "bin": { + "acorn": "bin/acorn" }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { - "array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "requires": { - "typical": "^2.6.1" - } - } + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" } }, - "command-line-usage": { + "node_modules/ansi-escape-sequences": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz", - "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==", + "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz", + "integrity": "sha512-dzW9kHxH011uBsidTXd14JXgzye/YLb2LzeKZ4bsgl/Knwx8AtbSFkkGxagdNOoh0DlqHCmfiEjWKBaqjOanVw==", "dev": true, - "requires": { - "ansi-escape-sequences": "^4.0.0", - "array-back": "^2.0.0", - "table-layout": "^0.4.2", - "typical": "^2.6.1" + "dependencies": { + "array-back": "^3.0.1" }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/ansi-escape-sequences/node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "requires": { - "typical": "^2.6.1" - } - } + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", "dev": true, - "optional": true + "peer": true, + "dependencies": { + "deep-equal": "^2.0.5" + } }, - "common-sequence": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/common-sequence/-/common-sequence-1.0.2.tgz", - "integrity": "sha1-MOB/P49vf5s97oVPILLTnu4Ibeg=", - "dev": true + "node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, - "config-master": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/config-master/-/config-master-3.1.0.tgz", - "integrity": "sha1-ZnZjWQUFooO/JqSE1oSJ10xUhdo=", + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, - "requires": { - "walk-back": "^2.0.1" + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "peer": true, "dependencies": { - "walk-back": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-2.0.1.tgz", - "integrity": "sha1-VU4qnYdPrEeoywBr9EwvDEmYoKQ=", - "dev": true - } + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "confusing-browser-globals": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.8.tgz", - "integrity": "sha512-lI7asCibVJ6Qd3FGU7mu4sfG4try4LX3+GVS+Gv8UlrEf2AeW57piecapnog2UHZSbcX/P/1UDWVaTsblowlZg==", + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "peer": true + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", + "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "peer": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "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 }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } }, - "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=" + "node_modules/body-parser/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "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==" + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-1.0.0.tgz", + "integrity": "sha512-ZqrZp9Hi5Uq7vfSGmNP2bUT/9DzZC2Y/GXjHB8rUJN1a+KLmbV05+vxHipNsg8+CSVgjcVVzLV8VZms6w8ZeRw==", + "dev": true, + "dependencies": { + "array-back": "^4.0.0", + "fs-then-native": "^2.0.0", + "mkdirp2": "^1.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/chalk/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==" + }, + "node_modules/chalk/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/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/cliui/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=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/collect-all": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-1.0.4.tgz", + "integrity": "sha512-RKZhRwJtJEP5FWul+gkSMEnaK6H3AGPTTWOiRimCcs+rc/OmQE3Yhy1Q7A7KsdkG3ZXVdZq68Y6ONSdvkeEcKA==", + "dev": true, + "dependencies": { + "stream-connect": "^1.0.2", + "stream-via": "^1.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-line-args": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.1.1.tgz", + "integrity": "sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg==", + "dev": true, + "dependencies": { + "array-back": "^3.0.1", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-args/node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/command-line-args/node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-tool": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/command-line-tool/-/command-line-tool-0.8.0.tgz", + "integrity": "sha512-Xw18HVx/QzQV3Sc5k1vy3kgtOeGmsKIqwtFFoyjI4bbcpSgnw2CWVULvtakyw4s6fhyAdI6soQQhXc2OzJy62g==", + "dev": true, + "dependencies": { + "ansi-escape-sequences": "^4.0.0", + "array-back": "^2.0.0", + "command-line-args": "^5.0.0", + "command-line-usage": "^4.1.0", + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-tool/node_modules/array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, + "dependencies": { + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz", + "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==", + "dev": true, + "dependencies": { + "ansi-escape-sequences": "^4.0.0", + "array-back": "^2.0.0", + "table-layout": "^0.4.2", + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, + "dependencies": { + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/common-sequence": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/common-sequence/-/common-sequence-2.0.2.tgz", + "integrity": "sha512-jAg09gkdkrDO9EWTdXfv80WWH3yeZl5oT69fGfedBNS9pXUKYInVJ1bJ+/ht2+Moeei48TmSbQDYMc8EOx9G0g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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=", + "dev": true + }, + "node_modules/config-master": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/config-master/-/config-master-3.1.0.tgz", + "integrity": "sha1-ZnZjWQUFooO/JqSE1oSJ10xUhdo=", + "dev": true, + "dependencies": { + "walk-back": "^2.0.1" + } + }, + "node_modules/config-master/node_modules/walk-back": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-2.0.1.tgz", + "integrity": "sha1-VU4qnYdPrEeoywBr9EwvDEmYoKQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "dev": true + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "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": ">= 8" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "peer": true + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dataloader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz", + "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==" + }, + "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/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-equal/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "peer": true + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "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-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dmd": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/dmd/-/dmd-4.0.6.tgz", + "integrity": "sha512-7ZYAnFQ6jGm4SICArwqNPylJ83PaOdPTAkds3Z/s1ueFqSc5ilJ2F0b7uP+35W1PUbemH++gn5/VlC3KwEgiHQ==", + "dev": true, + "dependencies": { + "array-back": "^4.0.1", + "cache-point": "^1.0.0", + "common-sequence": "^2.0.0", + "file-set": "^3.0.0", + "handlebars": "^4.5.3", + "marked": "^0.7.0", + "object-get": "^2.1.0", + "reduce-flatten": "^3.0.0", + "reduce-unique": "^2.0.1", + "reduce-without": "^1.0.1", + "test-value": "^3.0.0", + "walk-back": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dmd/node_modules/reduce-flatten": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-3.0.1.tgz", + "integrity": "sha512-bYo+97BmUUOzg09XwfkwALt4PQH1M5L0wzKerBt6WLm3Fhdd43mMS89HiT1B9pJIqko/6lWx3OnV4J9f2Kqp5Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-flow": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/dotenv-flow/-/dotenv-flow-3.2.0.tgz", + "integrity": "sha512-GEB6RrR4AbqDJvNSFrYHqZ33IKKbzkvLYiD5eo4+9aFXr4Y4G+QaFrB/fNp0y6McWBmvaPn3ZNjIufnj8irCtg==", + "dependencies": { + "dotenv": "^8.0.0" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/dotenv-flow/node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "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/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "peer": true + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz", + "integrity": "sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^14.2.1", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-react": "^7.21.5", + "eslint-plugin-react-hooks": "^4 || ^3 || ^2.3.0 || ^1.7.0" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", + "eslint-plugin-import": "^2.22.1" + } + }, + "node_modules/eslint-config-airbnb-typescript": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-12.3.1.tgz", + "integrity": "sha512-ql/Pe6/hppYuRp4m3iPaHJqkBB7dgeEmGPQ6X0UNmrQOfTF+dXw29/ZjU2kQ6RDoLxaxOA+Xqv07Vbef6oVTWw==", + "dev": true, + "dependencies": { + "@typescript-eslint/parser": "^4.4.1", + "eslint-config-airbnb": "^18.2.0", + "eslint-config-airbnb-base": "^14.2.0" + } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" + "node_modules/eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" + "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" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "node_modules/eslint-module-utils/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "node_modules/eslint-plugin-import": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", "dev": true, - "requires": { - "type-detect": "^4.0.0" + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "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=", - "dev": true + "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" + } }, - "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==", + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", + "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", "dev": true, - "requires": { - "object-keys": "^1.0.12" + "peer": true, + "dependencies": { + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.9.1", + "axobject-query": "~3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "peer": true }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true + "node_modules/eslint-plugin-react": { + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", + "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", + "dev": true, + "peer": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } }, - "dmd": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/dmd/-/dmd-4.0.0.tgz", - "integrity": "sha512-J+4CgbQiMuJHiU9dvTVN8iOOZGeR3bef1wBqz6eVvvX17jkpkKVd8TeeutA/FJAeFbLQfXnyQ3o4qY7W+c5cxQ==", - "dev": true, - "requires": { - "array-back": "^3.1.0", - "cache-point": "^0.4.1", - "common-sequence": "^1.0.2", - "file-set": "^2.0.0", - "handlebars": "^4.1.2", - "marked": "^0.6.2", - "object-get": "^2.1.0", - "reduce-flatten": "^2.0.0", - "reduce-unique": "^2.0.1", - "reduce-without": "^1.0.1", - "test-value": "^3.0.0", - "walk-back": "^3.0.1" + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" }, - "dependencies": { - "reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true - } + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "requires": { + "peer": true, + "dependencies": { "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "dotenv": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz", - "integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA==" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "node_modules/eslint-plugin-react/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, + "peer": true, + "engines": { + "node": ">=4.0" } }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "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 - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, - "requires": { - "once": "^1.4.0" + "peer": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/eslint-plugin-react/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, - "requires": { - "is-arrayish": "^0.2.1" + "peer": true, + "bin": { + "semver": "bin/semver.js" } }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "node_modules/eslint-scope": { + "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": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "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=", - "dev": true + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } }, - "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "node_modules/eslint/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "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==", - "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 + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "eslint-config-airbnb-base": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.2.0.tgz", - "integrity": "sha512-1mg/7eoB4AUeB0X1c/ho4vb2gYkNH8Trr/EgCT/aGmKhhG+F6vF5s8+iRBlWAzFIAphxIdp3YfEKgEl0f9Xg+w==", + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.5", - "object.assign": "^4.1.0", - "object.entries": "^1.1.0" + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "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, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.5.0" + "engines": { + "node": ">=4" } }, - "eslint-module-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", - "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, - "requires": { - "debug": "^2.6.8", - "pkg-dir": "^2.0.0" + "engines": { + "node": ">= 4" } }, - "eslint-plugin-import": { - "version": "2.18.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", - "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.11.0" - }, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.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 }, - "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==", + "node_modules/eslint/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "eslint-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", - "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, - "requires": { - "eslint-visitor-keys": "^1.0.0" + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.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==", - "dev": true - }, - "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "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, - "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "engines": { + "node": ">=4" } }, - "esprima": { + "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, - "requires": { - "estraverse": "^4.0.0" + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "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": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true, - "requires": { - "estraverse": "^4.1.0" + "engines": { + "node": ">=4.0" } }, - "estraverse": { + "node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "dev": true, + "engines": { + "node": ">=4.0" + } }, - "esutils": { + "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "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" + "engines": { + "node": ">=0.10.0" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "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" + "node_modules/factory.ts": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/factory.ts/-/factory.ts-0.5.2.tgz", + "integrity": "sha512-I4YDKuyMW+s2PocnWh/Ekv9wSStt/MNN1ZRb1qhy0Kv056ndlzbLHDsW9KEmTAqMpLI3BtjSqEdZ7ZfdnaXn9w==", + "dependencies": { + "clone-deep": "^4.0.1", + "source-map-support": "^0.5.19" + }, + "engines": { + "node": ">= 14" } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "node_modules/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==" }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "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=" + "node_modules/fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } }, - "fast-levenshtein": { + "node_modules/fast-json-stable-stringify": { + "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=", "dev": true }, - "figures": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", - "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", + "node_modules/fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" + "dependencies": { + "reusify": "^1.0.4" } }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "requires": { - "flat-cache": "^2.0.1" + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "file-set": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/file-set/-/file-set-2.0.1.tgz", - "integrity": "sha512-XgOUUpgR6FbbfYcniLw0qm1Am7PnNYIAkd+eXxRt42LiYhjaso0WiuQ+VmrNdtwotyM+cLCfZ56AZrySP3QnKA==", + "node_modules/file-set": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/file-set/-/file-set-3.0.0.tgz", + "integrity": "sha512-B/SdeSIeRv7VlOgIjtH3dkxMI+tEy5m+OeCXfAUsirBoVoY+bGtsmvmmTFPm/G23TBY4RiTtjpcgePCfwXRjqA==", "dev": true, - "requires": { - "array-back": "^2.0.0", - "glob": "^7.1.3" - }, "dependencies": { - "array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "requires": { - "typical": "^2.6.1" - } - } + "array-back": "^4.0.0", + "glob": "^7.1.5" + }, + "engines": { + "node": ">=8" } }, - "fill-keys": { + "node_modules/fill-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", "dev": true, - "requires": { + "dependencies": { "is-object": "~1.0.1", "merge-descriptors": "~1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "find-replace": { + "node_modules/find-replace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, - "requires": { - "array-back": "^3.0.1" + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-replace/node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "engines": { + "node": ">=6" } }, - "find-up": { + "node_modules/find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, - "requires": { + "dependencies": { "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "node_modules/flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", "dev": true, - "requires": { + "dependencies": { "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" } }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "node_modules/flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "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==", - "requires": { + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "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, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "fs-then-native": { + "node_modules/fs-then-native": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fs-then-native/-/fs-then-native-2.0.0.tgz", "integrity": "sha1-GaEk2U2QwiyOBF8ujdbr6jbUjGc=", - "dev": true + "dev": true, + "engines": { + "node": ">=4.0.0" + } }, - "fs.realpath": { + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "functional-red-black-tree": { + "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=", "dev": true }, - "get-caller-file": { + "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/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "get-func-name": { + "node_modules/get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "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" + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "requires": { + "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": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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 + "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, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } }, - "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==", + "node_modules/globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, - "growl": { + "node_modules/growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4.x" + } }, - "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, - "requires": { + "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.0", "source-map": "^0.6.1", - "uglify-js": "^3.1.4", "wordwrap": "^1.0.0" }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "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==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "has": { + "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, - "requires": { + "dependencies": { "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" } }, - "has-flag": { + "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=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } }, - "he": { + "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true + "dev": true, + "bin": { + "he": "bin/he" + } }, - "hosted-git-info": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", - "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, - "http-errors": { + "node_modules/http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { + "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "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", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "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=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "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=", + "dev": true + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "node_modules/is-date-object": { + "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": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "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=", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "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, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "engines": { + "node": ">=8" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "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==", "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "inherits": { + "node_modules/is-map": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "inquirer": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz", - "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true + "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, + "engines": { + "node": ">=0.12.0" + } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "node_modules/is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true + "node_modules/is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true + "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==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true + "node_modules/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, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "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 + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "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-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-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "is-regex": { + "node_modules/is-symbol": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "requires": { - "has": "^1.0.1" + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "is-symbol": { + "node_modules/is-weakref": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "requires": { - "has-symbols": "^1.0.0" + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, - "isexe": { + "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 }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "peer": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } }, - "js-tokens": { + "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 }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "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, - "requires": { + "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "js2xmlparser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.0.tgz", - "integrity": "sha512-WuNgdZOXVmBk5kUPMcTcVUpbGRzLfNkv7+7APq7WiDihpXVKrgxo6wwRpRl9OQeEBgKCVk9mR7RbzrnNWC8oBw==", + "node_modules/js2xmlparser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.1.tgz", + "integrity": "sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw==", "dev": true, - "requires": { - "xmlcreate": "^2.0.0" + "dependencies": { + "xmlcreate": "^2.0.3" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdoc": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.3.tgz", - "integrity": "sha512-Yf1ZKA3r9nvtMWHO1kEuMZTlHOF8uoQ0vyo5eH7SQy5YeIiHM+B0DgKnn+X6y6KDYZcF7G2SPkKF+JORCXWE/A==", + "node_modules/jsdoc": { + "version": "3.6.7", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.7.tgz", + "integrity": "sha512-sxKt7h0vzCd+3Y81Ey2qinupL6DpRSZJclS04ugHDNmRUXGzqicMJ6iwayhSA0S0DwwX30c5ozyUthr1QKF6uw==", "dev": true, - "requires": { - "@babel/parser": "^7.4.4", - "bluebird": "^3.5.4", - "catharsis": "^0.8.11", + "dependencies": { + "@babel/parser": "^7.9.4", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.0", + "js2xmlparser": "^4.0.1", "klaw": "^3.0.0", - "markdown-it": "^8.4.2", - "markdown-it-anchor": "^5.0.2", - "marked": "^0.7.0", - "mkdirp": "^0.5.1", + "markdown-it": "^10.0.0", + "markdown-it-anchor": "^5.2.7", + "marked": "^2.0.3", + "mkdirp": "^1.0.4", "requizzle": "^0.2.3", - "strip-json-comments": "^3.0.1", + "strip-json-comments": "^3.1.0", "taffydb": "2.6.2", - "underscore": "~1.9.1" + "underscore": "~1.13.1" }, - "dependencies": { - "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 - }, - "marked": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", - "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", - "dev": true - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - } + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=8.15.0" } }, - "jsdoc-api": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-5.0.2.tgz", - "integrity": "sha512-nC5uvd907gbqTRinrHeX5EBNw2Yc/0/7qONbRu5R5wrq/1OaRHtqDWGLDu+6BFI6RyuEgp87IH/IdOz4CdN6RA==", + "node_modules/jsdoc-api": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-5.0.4.tgz", + "integrity": "sha512-1KMwLnfo0FyhF06TQKzqIm8BiY1yoMIGICxRdJHUjzskaHMzHMmpLlmNFgzoa4pAC8t1CDPK5jWuQTvv1pBsEQ==", "dev": true, - "requires": { - "array-back": "^3.1.0", - "cache-point": "^0.4.1", + "dependencies": { + "array-back": "^4.0.0", + "cache-point": "^1.0.0", "collect-all": "^1.0.3", "file-set": "^2.0.1", "fs-then-native": "^2.0.0", - "jsdoc": "^3.6.2", + "jsdoc": "^3.6.3", "object-to-spawn-args": "^1.1.1", "temp-path": "^1.0.0", "walk-back": "^3.0.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "jsdoc-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-3.0.1.tgz", - "integrity": "sha512-btZLp4wYl90vcAfgk4hoGQbO17iBVrhh3LJRMKZNtZgniO3F8H2CjxXld0owBIB1XxN+j3bAcWZnZKMnSj3iMA==", + "node_modules/jsdoc-api/node_modules/file-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/file-set/-/file-set-2.0.1.tgz", + "integrity": "sha512-XgOUUpgR6FbbfYcniLw0qm1Am7PnNYIAkd+eXxRt42LiYhjaso0WiuQ+VmrNdtwotyM+cLCfZ56AZrySP3QnKA==", "dev": true, - "requires": { + "dependencies": { "array-back": "^2.0.0", + "glob": "^7.1.3" + } + }, + "node_modules/jsdoc-api/node_modules/file-set/node_modules/array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, + "dependencies": { + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jsdoc-api/node_modules/walk-back": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-3.0.1.tgz", + "integrity": "sha512-umiNB2qLO731Sxbp6cfZ9pwURJzTnftxE4Gc7hq8n/ehkuXC//s9F65IEIJA2ZytQZ1ZOsm/Fju4IWx0bivkUQ==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/jsdoc-parse": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-4.0.1.tgz", + "integrity": "sha512-qIObw8yqYZjrP2qxWROB5eLQFLTUX2jRGLhW9hjo2CC2fQVlskidCIzjCoctwsDvauBp2a/lR31jkSleczSo8Q==", + "dev": true, + "dependencies": { + "array-back": "^4.0.0", "lodash.omit": "^4.5.0", "lodash.pick": "^4.4.0", "reduce-extract": "^1.0.0", "sort-array": "^2.0.0", "test-value": "^3.0.0" }, - "dependencies": { - "array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "requires": { - "typical": "^2.6.1" - } - } + "engines": { + "node": ">=8" } }, - "jsdoc-to-markdown": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-5.0.0.tgz", - "integrity": "sha512-3gKEnbay7dSdyvtMDDkUf4r7pmBVgs3aqeT0Cg/ngTILPpJUzf8iKgASIo5psF007L45OIJtIuRX5VL/YUXKaA==", + "node_modules/jsdoc-to-markdown": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-5.0.3.tgz", + "integrity": "sha512-tQv5tBV0fTYidRQtE60lJKxE98mmuLcYuITFDKQiDPE9hGccpeEGUNFcVkInq1vigyuPnZmt79bQ8wv2GKjY0Q==", "dev": true, - "requires": { - "array-back": "^3.1.0", + "dependencies": { + "array-back": "^4.0.1", "command-line-tool": "^0.8.0", "config-master": "^3.1.0", - "dmd": "^4.0.0", - "jsdoc-api": "^5.0.1", - "jsdoc-parse": "^3.0.1", - "walk-back": "^3.0.1" + "dmd": "^4.0.5", + "jsdoc-api": "^5.0.4", + "jsdoc-parse": "^4.0.1", + "walk-back": "^4.0.0" + }, + "bin": { + "jsdoc2md": "bin/cli.js" + }, + "engines": { + "node": ">=8.0.0" } }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "node_modules/jsdoc/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdoc/node_modules/marked": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.7.tgz", + "integrity": "sha512-BJXxkuIfJchcXOJWTT2DOL+yFWifFv2yGYOUzvXg8Qz610QKw+sHCvTMYwA+qWGhlA2uivBezChZ/pBy1tWdkQ==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 8.16.2" + } + }, + "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==", + "dev": true }, - "json-schema-traverse": { + "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, - "json-stable-stringify-without-jsonify": { + "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 }, - "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=" - }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "requires": { + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", @@ -1626,307 +3917,465 @@ "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", "ms": "^2.1.1", - "semver": "^5.6.0" + "semver": "^7.5.4" }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } + "engines": { + "node": ">=12", + "npm": ">=6" } }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "peer": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, - "jwa": { + "node_modules/jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { + "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, - "jws": { + "node_modules/jws": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { + "dependencies": { "jwa": "^1.4.1", "safe-buffer": "^5.0.1" } }, - "klaw": { + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.9" } }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "peer": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, - "requires": { - "invert-kv": "^2.0.0" + "peer": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "linkify-it": { + "node_modules/linkify-it": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", "dev": true, - "requires": { + "dependencies": { "uc.micro": "^1.0.1" } }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "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, - "requires": { + "dependencies": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", + "parse-json": "^4.0.0", + "pify": "^3.0.0", "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "locate-path": { + "node_modules/locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, - "requires": { + "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, - "lodash.camelcase": { + "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", "dev": true }, - "lodash.includes": { + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" }, - "lodash.isboolean": { + "node_modules/lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" }, - "lodash.isinteger": { + "node_modules/lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" }, - "lodash.isnumber": { + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=" + }, + "node_modules/lodash.isnumber": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" }, - "lodash.isplainobject": { + "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" }, - "lodash.isstring": { + "node_modules/lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, - "lodash.omit": { + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.omit": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", "dev": true }, - "lodash.once": { + "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, - "lodash.padend": { + "node_modules/lodash.padend": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", "dev": true }, - "lodash.pick": { + "node_modules/lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", "dev": true }, - "log-symbols": { + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, - "requires": { + "dependencies": { "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/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=", + "dev": true, + "engines": { + "node": ">=0.8.0" } }, - "lolex": { + "node_modules/lolex": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", "dev": true }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "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==", + "dev": true, + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "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, - "requires": { - "p-defer": "^1.0.0" + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/luxon": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.27.0.tgz", + "integrity": "sha512-VKsFsPggTA0DvnxtJdiExAucKdAnwbCCNlMM5ENvHlxubqWd0xhZcdb4XgZ7QFNhaRhilXCFxHuoObP5BNA4PA==", + "engines": { + "node": "*" } }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "node_modules/markdown-it": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", "dev": true, - "requires": { + "dependencies": { "argparse": "^1.0.7", - "entities": "~1.1.1", + "entities": "~2.0.0", "linkify-it": "^2.0.0", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" } }, - "markdown-it-anchor": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.2.4.tgz", - "integrity": "sha512-n8zCGjxA3T+Mx1pG8HEgbJbkB8JFUuRkeTZQuIM8iPY6oQ8sWOPRZJDFC9a/pNg2QkHEjjGkhBEl/RSyzaDZ3A==", - "dev": true + "node_modules/markdown-it-anchor": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", + "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", + "dev": true, + "peerDependencies": { + "markdown-it": "*" + } }, - "marked": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.3.tgz", - "integrity": "sha512-Fqa7eq+UaxfMriqzYLayfqAE40WN03jf+zHjT18/uXNuzjq3TY0XTbrAoPeqSJrAmPz11VuUA+kBPYOhHt9oOQ==", - "dev": true + "node_modules/marked": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", + "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">=0.10.0" + } }, - "mdurl": { + "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", "dev": true }, - "media-typer": { + "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" } }, - "merge-descriptors": { + "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, - "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==" + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" + "node_modules/mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "engines": { + "node": ">= 0.6" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "node_modules/mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dependencies": { + "mime-db": "1.48.0" + }, + "engines": { + "node": ">= 0.6" + } }, - "minimatch": { + "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "requires": { - "minimist": "0.0.8" + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, - "mkdirp2": { + "node_modules/mkdirp2": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp2/-/mkdirp2-1.0.4.tgz", "integrity": "sha512-Q2PKB4ZR4UPtjLl76JfzlgSCUZhSV1AXQgAZa1qt5RiaALFjP/CDrGvFBrOz7Ck6McPcwMAxTsJvWOUjOU8XMw==", "dev": true }, - "mocha": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.0.tgz", - "integrity": "sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ==", + "node_modules/mocha": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", + "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", "dev": true, - "requires": { + "dependencies": { "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", "debug": "3.2.6", @@ -1939,7 +4388,7 @@ "js-yaml": "3.13.1", "log-symbols": "2.2.0", "minimatch": "3.0.4", - "mkdirp": "0.5.1", + "mkdirp": "0.5.4", "ms": "2.1.1", "node-environment-flags": "1.0.5", "object.assign": "4.1.0", @@ -1947,1612 +4396,2529 @@ "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/mocha/node_modules/ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.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==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "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" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, - "requires": { - "p-try": "^2.0.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==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "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 - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "ms": "^2.1.1" + } + }, + "node_modules/mocha/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=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mocha/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==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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/mocha/node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/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==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/mocha/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==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mocha/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-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/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==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/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=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "module-not-found-error": { + "node_modules/module-not-found-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", "dev": true }, - "ms": { + "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "natural-compare": { + "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=", "dev": true }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "nise": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.1.tgz", - "integrity": "sha512-edFWm0fsFG2n318rfEnKlTZTkjlbVOFF9XIA+fj+Ed+Qz1laYW2lobwavWoMzGrYDHH1EpiNJgDfvGnkZztR/g==", + "node_modules/nise": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", "dev": true, - "requires": { + "dependencies": { "@sinonjs/formatio": "^3.2.1", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", - "lolex": "^4.1.0", + "lolex": "^5.0.1", "path-to-regexp": "^1.7.0" } }, - "node-environment-flags": { + "node_modules/nise/node_modules/lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/node-environment-flags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", "dev": true, - "requires": { + "dependencies": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" } }, - "normalize-package-data": { + "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, - "requires": { + "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, - "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=", + "node_modules/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, - "requires": { - "path-key": "^2.0.0" + "peer": true, + "engines": { + "node": ">=0.10.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "node_modules/object-get": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-get/-/object-get-2.1.1.tgz", + "integrity": "sha512-7n4IpLMzGGcLEMiQKsNR7vCe+N5E9LORFrtNUVy4sO3dj9a3HedZCxEL2T7QuLhcHN1NBuBsMOKaOsAYI9IIvg==", "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==" + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "object-get": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object-get/-/object-get-2.1.0.tgz", - "integrity": "sha1-ciu9tgA576R8rTxtws5RqFwCxa4=", - "dev": true + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "object-keys": { + "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + } }, - "object-to-spawn-args": { + "node_modules/object-to-spawn-args": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-to-spawn-args/-/object-to-spawn-args-1.1.1.tgz", "integrity": "sha1-d9qIJ/Bz0BHJ4bFz+JV4FHAkZ4U=", "dev": true }, - "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.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object.entries": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", "dev": true, - "requires": { + "dependencies": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "on-finished": { + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { + "dependencies": { "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, - "requires": { + "dependencies": { "wrappy": "1" } }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "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=", + "node_modules/onigasm": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", + "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "dependencies": { + "lru-cache": "^5.1.1" } }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "node_modules/onigasm/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, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "dependencies": { + "yallist": "^3.0.2" } }, - "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-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "node_modules/onigasm/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } }, - "p-limit": { + "node_modules/p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, - "requires": { + "dependencies": { "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "p-locate": { + "node_modules/p-locate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, - "requires": { + "dependencies": { "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" } }, - "p-try": { + "node_modules/p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "parent-module": { + "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "requires": { + "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "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=", "dev": true, - "requires": { - "error-ex": "^1.2.0" + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" } }, - "path-exists": { + "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=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "path-is-absolute": { + "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=", - "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=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "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": ">=8" + } }, - "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==", + "node_modules/path-parse": { + "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-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, - "requires": { - "isarray": "0.0.1" - }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } + "isarray": "0.0.1" } }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "requires": { - "pify": "^2.0.0" + "engines": { + "node": ">=8" } }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } }, - "pify": { + "node_modules/picomatch": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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" + } }, - "pkg-dir": { + "node_modules/pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, - "requires": { + "dependencies": { "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" } }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "node_modules/pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "progress": { + "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "peer": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "proxyquire": { + "node_modules/proxyquire": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", "dev": true, - "requires": { + "dependencies": { "fill-keys": "^1.0.2", "module-not-found-error": "^1.0.1", "resolve": "^1.11.1" } }, - "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==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "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==", "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "engines": { + "node": ">=6" } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "node_modules/qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "raw-body": { + "node_modules/raw-body": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { + "dependencies": { "bytes": "3.1.0", "http-errors": "1.7.2", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, - "requires": { - "load-json-file": "^2.0.0", + "peer": 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=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, - "requires": { + "dependencies": { "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/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/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" } }, - "reduce-extract": { + "node_modules/reduce-extract": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/reduce-extract/-/reduce-extract-1.0.0.tgz", "integrity": "sha1-Z/I4W+2mUGG19fQxJmLosIDKFSU=", "dev": true, - "requires": { + "dependencies": { "test-value": "^1.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reduce-extract/node_modules/array-back": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", + "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", + "dev": true, + "dependencies": { + "typical": "^2.6.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/reduce-extract/node_modules/test-value": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/test-value/-/test-value-1.1.0.tgz", + "integrity": "sha1-oJE29y7AQ9J8iTcHwrFZv6196T8=", + "dev": true, "dependencies": { - "array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", - "dev": true, - "requires": { - "typical": "^2.6.0" - } - }, - "test-value": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/test-value/-/test-value-1.1.0.tgz", - "integrity": "sha1-oJE29y7AQ9J8iTcHwrFZv6196T8=", - "dev": true, - "requires": { - "array-back": "^1.0.2", - "typical": "^2.4.2" - } - } + "array-back": "^1.0.2", + "typical": "^2.4.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "reduce-flatten": { + "node_modules/reduce-flatten": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "reduce-unique": { + "node_modules/reduce-unique": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/reduce-unique/-/reduce-unique-2.0.1.tgz", "integrity": "sha512-x4jH/8L1eyZGR785WY+ePtyMNhycl1N2XOLxhCbzZFaqF4AXjLzqSxa2UHgJ2ZVR/HHyPOvl1L7xRnW8ye5MdA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "reduce-without": { + "node_modules/reduce-without": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/reduce-without/-/reduce-without-1.0.1.tgz", "integrity": "sha1-aK0OrRGFXJo31OglbBW7+Hly/Iw=", "dev": true, - "requires": { + "dependencies": { "test-value": "^2.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reduce-without/node_modules/array-back": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", + "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", + "dev": true, "dependencies": { - "array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", - "dev": true, - "requires": { - "typical": "^2.6.0" - } - }, - "test-value": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", - "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=", - "dev": true, - "requires": { - "array-back": "^1.0.3", - "typical": "^2.6.0" - } - } + "typical": "^2.6.0" + }, + "engines": { + "node": ">=0.12.0" } }, - "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 - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "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": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - } + "node_modules/reduce-without/node_modules/test-value": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", + "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=", + "dev": true, + "dependencies": { + "array-back": "^1.0.3", + "typical": "^2.6.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "requires": { - "lodash": "^4.17.11" + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", - "requires": { - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "require-directory": { + "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 + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "require-main-filename": { + "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 }, - "requizzle": { + "node_modules/requizzle": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", "dev": true, - "requires": { + "dependencies": { "lodash": "^4.17.14" } }, - "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, - "requires": { + "dependencies": { + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-from": { + "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 + "dev": true, + "engines": { + "node": ">=4" + } }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "requires": { - "is-promise": "^2.1.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, - "requires": { - "tslib": "^1.9.0" + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/safe-array-concat/node_modules/isarray": { + "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/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "semver": { + "node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } }, - "set-blocking": { + "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 }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "engines": { + "node": ">=8" + } }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "node_modules/shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", "dev": true, - "requires": { - "shebang-regex": "^1.0.0" + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "node_modules/shiki": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.3.tgz", + "integrity": "sha512-NEjg1mVbAUrzRv2eIcUt3TG7X9svX7l3n3F5/3OdFq+/BxUdmBOeKGiH4icZJBLHy354Shnj6sfBTemea2e7XA==", + "dev": true, + "dependencies": { + "onigasm": "^2.2.5", + "vscode-textmate": "^5.2.0" + } }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "sinon": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.4.1.tgz", - "integrity": "sha512-7s9buHGHN/jqoy/v4bJgmt0m1XEkCEd/tqdHXumpBp0JSujaT4Ng84JU5wDdK4E85ZMq78NuDe0I3NAqXY8TFg==", + "node_modules/sinon": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", + "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "deprecated": "16.1.1", "dev": true, - "requires": { + "dependencies": { "@sinonjs/commons": "^1.4.0", "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.3.2", + "@sinonjs/samsam": "^3.3.3", "diff": "^3.5.0", "lolex": "^4.2.0", - "nise": "^1.5.1", + "nise": "^1.5.2", "supports-color": "^5.5.0" } }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-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": { - "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=", - "dev": true - } + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-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" } }, - "sort-array": { + "node_modules/slice-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/sort-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/sort-array/-/sort-array-2.0.0.tgz", "integrity": "sha1-OKnG2if9fRR7QuYFVPKBGHtN9HI=", "dev": true, - "requires": { + "dependencies": { "array-back": "^1.0.4", "object-get": "^2.1.0", "typical": "^2.6.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sort-array/node_modules/array-back": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", + "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", + "dev": true, "dependencies": { - "array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", - "dev": true, - "requires": { - "typical": "^2.6.0" - } - } + "typical": "^2.6.0" + }, + "engines": { + "node": ">=0.12.0" } }, - "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" + } }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, - "requires": { + "dependencies": { "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==", + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "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==", + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "requires": { + "dependencies": { "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==", + "node_modules/spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", "dev": true }, - "sprintf-js": { + "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 }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "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" - } - }, - "statuses": { + "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } }, - "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/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "peer": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } }, - "stream-connect": { + "node_modules/stream-connect": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-connect/-/stream-connect-1.0.2.tgz", "integrity": "sha1-GLyB8u2zW4tdmoAJIAqYUxRCipc=", "dev": true, - "requires": { + "dependencies": { "array-back": "^1.0.2" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-connect/node_modules/array-back": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", + "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", + "dev": true, "dependencies": { - "array-back": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", - "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=", - "dev": true, - "requires": { - "typical": "^2.6.0" - } - } + "typical": "^2.6.0" + }, + "engines": { + "node": ">=0.12.0" } }, - "stream-via": { + "node_modules/stream-via": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/stream-via/-/stream-via-1.0.4.tgz", "integrity": "sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "string-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", - "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, - "requires": { + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^5.2.0" + "strip-ansi": "^6.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", + "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "dev": true, + "peer": true, "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, - "requires": { - "ansi-regex": "^3.0.0" + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "peer": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "strip-bom": { + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "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=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "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=", - "dev": true + "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": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "supports-color": { + "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "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, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "peer": true, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, "dependencies": { - "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 - }, - "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=", - "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==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, - "table-layout": { + "node_modules/table-layout": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz", "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==", "dev": true, - "requires": { + "dependencies": { "array-back": "^2.0.0", "deep-extend": "~0.6.0", "lodash.padend": "^4.6.1", "typical": "^2.6.1", "wordwrapjs": "^3.0.0" }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, + "dependencies": { + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, "dependencies": { - "array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "requires": { - "typical": "^2.6.1" - } - } + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "taffydb": { + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/taffydb": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", "dev": true }, - "temp-path": { + "node_modules/temp-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/temp-path/-/temp-path-1.0.0.tgz", "integrity": "sha1-JLFUOXOrRCiW2a02fdnL2/r+kYs=", "dev": true }, - "test-value": { + "node_modules/test-value": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz", "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==", "dev": true, - "requires": { + "dependencies": { "array-back": "^2.0.0", "typical": "^2.6.1" }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/test-value/node_modules/array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, "dependencies": { - "array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dev": true, - "requires": { - "typical": "^2.6.1" - } - } + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4" } }, - "text-table": { + "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 }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "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": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "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 }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/tsutils": { + "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" + }, + "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/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "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==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, + "node_modules/typedoc": { + "version": "0.20.36", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.36.tgz", + "integrity": "sha512-qFU+DWMV/hifQ9ZAlTjdFO9wbUIHuUBpNXzv68ZyURAP9pInjZiO4+jCPeAzHVcaBCHER9WL/+YzzTt6ZlN/Nw==", + "dev": true, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } + "colors": "^1.4.0", + "fs-extra": "^9.1.0", + "handlebars": "^4.7.7", + "lodash": "^4.17.21", + "lunr": "^2.3.9", + "marked": "^2.0.3", + "minimatch": "^3.0.0", + "progress": "^2.0.3", + "shelljs": "^0.8.4", + "shiki": "^0.9.3", + "typedoc-default-themes": "^0.12.10" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 10.8.0" + }, + "peerDependencies": { + "typescript": "3.9.x || 4.0.x || 4.1.x || 4.2.x" } }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" + "node_modules/typedoc-default-themes": { + "version": "0.12.10", + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.10.tgz", + "integrity": "sha512-fIS001cAYHkyQPidWXmHuhs8usjP5XVJjWB8oZGqkTowZaz3v7g3KDZeeqE82FBrmkAnIBOY3jgy7lnPnqATbA==", + "dev": true, + "engines": { + "node": ">= 8" } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "node_modules/typedoc-github-wiki-theme": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/typedoc-github-wiki-theme/-/typedoc-github-wiki-theme-0.3.0.tgz", + "integrity": "sha512-YMnpahBvsk0FlmHM3Djq+U25YZgiXSXdNzPRqu/mQY9QXHHzIKJmLm6r3Qz2U2NfD7xWyfoODpX/UY5Zz9434g==", "dev": true, - "requires": { - "prelude-ls": "~1.1.2" + "peerDependencies": { + "typedoc": ">=0.20.0", + "typedoc-plugin-markdown": ">=3.4.0" } }, - "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 + "node_modules/typedoc-plugin-markdown": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.9.0.tgz", + "integrity": "sha512-s445YeUe8bH7me15T+hsHZgNmAvvF7QIpX02vFgseLGtghAwmtdZYVOqPneWoKqRv/JNpPSuyZb3CeblML9jOg==", + "dev": true, + "dependencies": { + "handlebars": "^4.7.7" + }, + "engines": { + "node": ">= 10.8.0" + }, + "peerDependencies": { + "typedoc": ">=0.20.0" + } }, - "type-fest": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", - "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", - "dev": true + "node_modules/typedoc/node_modules/marked": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.7.tgz", + "integrity": "sha512-BJXxkuIfJchcXOJWTT2DOL+yFWifFv2yGYOUzvXg8Qz610QKw+sHCvTMYwA+qWGhlA2uivBezChZ/pBy1tWdkQ==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 8.16.2" + } }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "node_modules/typescript": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" } }, - "typical": { + "node_modules/typical": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=", "dev": true }, - "uc.micro": { + "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, - "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "node_modules/uglify-js": { + "version": "3.13.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.9.tgz", + "integrity": "sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g==", "dev": true, "optional": true, - "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "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": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", + "node_modules/underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==", "dev": true }, - "unpipe": { + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } }, - "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==", - "requires": { + "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, + "dependencies": { "punycode": "^2.1.0" } }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true }, - "validate-npm-package-license": { + "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, - "requires": { + "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "walk-back": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-3.0.1.tgz", - "integrity": "sha512-umiNB2qLO731Sxbp6cfZ9pwURJzTnftxE4Gc7hq8n/ehkuXC//s9F65IEIJA2ZytQZ1ZOsm/Fju4IWx0bivkUQ==", + "node_modules/vscode-textmate": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.4.0.tgz", + "integrity": "sha512-c0Q4zYZkcLizeYJ3hNyaVUM2AA8KDhNCA3JvXY8CeZSJuBdAy3bAvSbv46RClC4P3dSO9BdwhnKEx2zOo6vP/w==", "dev": true }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/walk-back": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-4.0.0.tgz", + "integrity": "sha512-kudCA8PXVQfrqv2mFTG72vDBRi8BKWxGgFLwPpzHcpZnSwZk93WMwUDVcLHWNsnm+Y0AC4Vb6MUNRgaHfyV2DQ==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "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, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "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": { + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "peer": true, + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "peer": true + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "peer": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "which-module": { + "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 }, - "wide-align": { + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, - "requires": { + "dependencies": { "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/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=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "dependencies": { - "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=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - } + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "engines": { + "node": ">=0.10.0" } }, - "wordwrap": { + "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "wordwrapjs": { + "node_modules/wordwrapjs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", "dev": true, - "requires": { + "dependencies": { "reduce-flatten": "^1.0.1", "typical": "^2.6.1" + }, + "engines": { + "node": ">=4.0.0" } }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "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==", "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/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/wrap-ansi/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=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" } }, - "wrappy": { + "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==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } + "node_modules/xmlcreate": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.3.tgz", + "integrity": "sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ==", + "dev": true }, - "xmlcreate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.1.tgz", - "integrity": "sha512-MjGsXhKG8YjTKrDCXseFo3ClbMGvUD4en29H2Cev1dv4P/chlpw6KdYmlCWDkhosBVKRDjM836+3e3pm1cBNJA==", + "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==", "dev": true }, - "y18n": { + "node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, - "requires": { - "cliui": "^4.0.0", + "dependencies": { + "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "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.0.0" - }, - "dependencies": { - "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 - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "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=", - "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==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, - "requires": { - "p-try": "^2.0.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==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "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 - }, - "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==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "yargs-parser": "^13.1.2" } }, - "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "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==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, - "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "node_modules/yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, - "requires": { + "dependencies": { "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "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=", - "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==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, - "requires": { - "p-try": "^2.0.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==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "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 - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/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/yargs/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==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/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=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/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==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/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-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/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==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/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, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } } } diff --git a/package.json b/package.json index bfa2dd6..c4b5d36 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,24 @@ { "name": "@envoy/envoy-integrations-sdk", - "version": "1.2.1", - "description": "", - "main": "index.js", + "version": "2.2.3", + "description": "SDK for building Envoy integrations.", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "directories": { + "lib": "src", + "doc": "docs" + }, + "files": [ + "dist/*.d.ts", + "dist/*.d.ts.map", + "dist", + "src" + ], "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "docs:generate": "typedoc", + "prepublishOnly": "tsc", + "compile": "tsc" }, "repository": { "type": "git", @@ -17,20 +31,44 @@ }, "homepage": "https://github.com/envoy/envoy-integrations-sdk-nodejs#readme", "dependencies": { + "@types/dotenv": "^8.2.0", + "@types/faker": "^5.5.6", + "@types/jsonwebtoken": "^9.0.0", + "@types/node": "^15.12.0", + "@types/qs": "^6.9.6", + "axios": "^1.4.0", "body-parser": "^1.19.0", - "dotenv": "^8.1.0", - "jsonwebtoken": "^8.5.1", - "request": "^2.88.0", - "request-promise-native": "^1.0.7" + "chalk": "^4.1.2", + "dataloader": "^2.0.0", + "dotenv-flow": "^3.2.0", + "factory.ts": "^0.5.2", + "faker": "^5.5.3", + "jsonwebtoken": "^9.0.0", + "lodash.ismatch": "^4.4.0", + "luxon": "^1.27.0", + "qs": "^6.10.1" }, "devDependencies": { + "@types/dotenv-flow": "^3.1.1", + "@types/express": "^4.17.12", + "@types/lodash.ismatch": "^4.4.6", + "@types/luxon": "^1.27.0", + "@typescript-eslint/eslint-plugin": "^4.26.0", + "@typescript-eslint/parser": "^4.26.0", "chai": "^4.2.0", - "eslint": "^5.16.0", - "eslint-config-airbnb-base": "^13.1.0", - "eslint-plugin-import": "^2.17.3", + "eslint": "^7.27.0", + "eslint-config-airbnb-typescript": "^12.3.1", + "eslint-plugin-import": "^2.23.4", "jsdoc-to-markdown": "^5.0.0", "mocha": "^6.1.4", "proxyquire": "^2.1.0", - "sinon": "^7.3.2" + "sinon": "^7.3.2", + "typedoc": "^0.20.36", + "typedoc-github-wiki-theme": "^0.3.0", + "typedoc-plugin-markdown": "^3.9.0", + "typescript": "4.2" + }, + "peerDependencies": { + "@types/express": "^4" } } diff --git a/src/base/EnvoyAPI.ts b/src/base/EnvoyAPI.ts new file mode 100644 index 0000000..4fef6f5 --- /dev/null +++ b/src/base/EnvoyAPI.ts @@ -0,0 +1,87 @@ +import qs from 'qs'; +import DataLoader from 'dataloader'; +import JSONAPIData from '../util/json-api/JSONAPIData'; +import { envoyBaseURL } from '../constants'; +import { createAxiosClient } from '../util/axiosConstructor'; + +interface EnvoyWebDataLoaderKey extends JSONAPIData { + include?: string; +} + +/** + * Sometimes envoy-web will give us back some relationship data + * with the "type" set to the relationships name instead of the actual model's name. + * This mapping allows us to alias those cases. + */ +const TYPE_ALIASES = new Map([ + ['employee-screening-flows', 'flows'], +]); + +/** + * Make typed API calls to Envoy. + * Uses a data loader to leverage JSONAPI's "include" functionality. + * This allows us to save everything that was included in the initial response + * to be used later without re-fetching from the API. + * + * @category Base + */ +export default class EnvoyAPI { + /** + * HTTP Client with Envoy's defaults. + */ + readonly axios = createAxiosClient({ + baseURL: envoyBaseURL, + headers: { + 'Content-Type': 'application/vnd.api+json', + Accept: 'application/vnd.api+json', + }, + paramsSerializer: (params) => qs.stringify(params, { + arrayFormat: 'brackets', + encode: false, + }), + }); + + /** + * A dataloader: https://github.com/graphql/dataloader + * Will fetch individual resources from the API, + * unless they exist in cache (which they usually will). + */ + protected readonly dataLoader = new DataLoader( + (keys) => Promise.all( + keys.map(async ({ type, id, include }) => { + const { data } = await this.axios.get(`api/v3/${type}/${id}`, { params: { include } }); + return data.data; + }), + ), + { + cacheKeyFn: (key) => `${key.type}_${key.id}`, + }, + ); + + constructor(accessToken: string) { + this.axios.defaults.headers.authorization = `Bearer ${accessToken}`; + /** + * Saves every model that was "include"ed in the response, + * which saves us the trouble of fetching related data. + */ + this.axios.interceptors.response.use((response) => { + const { + data: { + data: modelOrModels, + included, + }, + } = response; + + (included || []) + .concat(modelOrModels) + .forEach((model: JSONAPIData) => { + this.dataLoader.prime({ type: model.type, id: model.id }, model); + const alias = TYPE_ALIASES.get(model.type); + if (alias) { + this.dataLoader.prime({ type: alias, id: model.id }, model); + } + }); + return response; + }, (error) => Promise.reject(error)); + } +} diff --git a/src/base/EnvoyPluginStoragePipeline.ts b/src/base/EnvoyPluginStoragePipeline.ts new file mode 100644 index 0000000..e150d0d --- /dev/null +++ b/src/base/EnvoyPluginStoragePipeline.ts @@ -0,0 +1,99 @@ +import EnvoyStorageCommand, { + EnvoyStorageSetUniqueNumOptions, + EnvoyStorageSetUniqueOptions, +} from '../internal/EnvoyStorageCommand'; +import EnvoyStorageResult from '../internal/EnvoyStorageResult'; +import EnvoyPluginAPI from '../sdk/EnvoyPluginAPI'; + +/** + * Builds up a request pipeline for submitting storage commands. + * + * @category Base + */ +export default class EnvoyPluginStoragePipeline { + protected readonly api: EnvoyPluginAPI; + + readonly installId: string | undefined; + + protected readonly commands: Array; + + constructor(pluginAPI: EnvoyPluginAPI, installId?: string) { + this.api = pluginAPI; + this.installId = installId; + this.commands = []; + } + + /** + * Executes all the commands in the pipeline. + */ + execute(): Promise> { + return this.api.storagePipeline(this.commands, this.installId); + } + + /** + * Executes the pipeline and returns the first result. + */ + async executeSingle(): Promise { + const [result] = await this.execute(); + return result; + } + + addCommand(command: EnvoyStorageCommand): EnvoyPluginStoragePipeline { + this.commands.push(command); + return this; + } + + /** + * Gets a storage item. + */ + get(key: string): EnvoyPluginStoragePipeline { + return this.addCommand({ action: 'get', key }); + } + + /** + * Sets a value for a storage item, + * and returns that item. + */ + set(key: string, value: unknown): EnvoyPluginStoragePipeline { + return this.addCommand({ action: 'set', key, value }); + } + + /** + * Sets a unique value for a storage item, + * and returns that item. + */ + setUnique(key: string, options: EnvoyStorageSetUniqueOptions = {}): EnvoyPluginStoragePipeline { + return this.addCommand({ action: 'set_unique', key, ...options }); + } + + /** + * Sets a unique number value for a storage item, + * and returns that item. + */ + setUniqueNum(key: string, options: EnvoyStorageSetUniqueNumOptions = {}): EnvoyPluginStoragePipeline { + if (options.min) { + options.min = Number(options.min); + } + if (options.max) { + options.max = Number(options.max); + } + return this.addCommand({ action: 'set_unique_num', key, ...options }); + } + + /** + * Unsets a storage item. + */ + unset(key: string): EnvoyPluginStoragePipeline { + return this.addCommand({ action: 'unset', key }); + } + + /** + * Lists storage items. + */ + list(page = 1): EnvoyPluginStoragePipeline { + if (!page) { + page = 1; + } + return this.addCommand({ action: 'list', page }); + } +} diff --git a/src/constants.ts b/src/constants.ts new file mode 100644 index 0000000..f0b66e7 --- /dev/null +++ b/src/constants.ts @@ -0,0 +1,7 @@ +import dotenv from 'dotenv-flow'; + +dotenv.config(); +export const envoyBaseURL = process.env.ENVOY_BASE_URL || 'https://app.envoy.com'; +export const envoyClientId = process.env.ENVOY_CLIENT_ID as string; +export const envoyClientSecret = process.env.ENVOY_CLIENT_SECRET as string; +export const jwtSecret = process.env.JWT_SECRET as string; diff --git a/src/factories/entryEventBodyFactory.ts b/src/factories/entryEventBodyFactory.ts new file mode 100644 index 0000000..aa13fff --- /dev/null +++ b/src/factories/entryEventBodyFactory.ts @@ -0,0 +1,124 @@ +import { Sync, each } from 'factory.ts'; +import faker from 'faker'; + +import EntryPayload from '../payloads/EntryPayload'; +import EnvoyEntryEvent from '../internal/EnvoyEntryEvent'; +import { EnvoyUserAPIScope } from '../sdk/EnvoyUserAPI'; +import eventBodyFactory from './eventBodyFactory'; + +export type EntryPayloadFactoryVisitorOptions = { + isProtectFlow: false, + isSignedIn: boolean, + hasEmail: boolean, + hasHost: boolean, + hasInvite: boolean, + hasDevice: boolean, + hasPhoneNumber?: boolean, + hasPhoto?: boolean, +}; + +export type EntryPayloadFactoryProtectOptions = { + isProtectFlow: true, + isSignedIn: boolean, + hasPhoneNumber?: boolean, + hasPhoto?: boolean, +}; + +export type EntryPayloadFactoryOptions = EntryPayloadFactoryVisitorOptions | EntryPayloadFactoryProtectOptions; + +export const entryEventBodyFactoryDefaultIds = { + location: '1', + company: '1', + flow: '1', + invite: '1', + device: '1', + employee: '1', +}; + +export function entryPayloadFactory( + options: EntryPayloadFactoryOptions, + ids: Partial = entryEventBodyFactoryDefaultIds, +): Sync.Factory { + const signedInDate = faker.date.past(); + const allIds = { ...entryEventBodyFactoryDefaultIds, ...ids }; + return Sync.makeFactory({ + id: each((i) => `${i + 1}`), + type: 'entries', + attributes: { + 'full-name': faker.name.findName(), + 'phone-number': options.hasPhoneNumber ? faker.phone.phoneNumber() : undefined, + email: (options.isProtectFlow || options.hasEmail) ? faker.internet.email() : null, + 'employee-screening-flow': options.isProtectFlow, + host: (!options.isProtectFlow && options.hasHost) ? faker.name.findName() : null, + 'host-email': (!options.isProtectFlow && options.hasHost) ? faker.internet.email() : null, + 'private-notes': null, + 'signed-in-at': signedInDate.toISOString(), + 'signed-out-at': options.isSignedIn ? undefined : faker.date.between(signedInDate, new Date()).toISOString(), + thumbnails: options.hasPhoto ? { + large: faker.image.avatar(), + original: faker.image.avatar(), + small: faker.image.avatar(), + } : { + large: null, + original: null, + small: null, + }, + 'flow-name': options.isProtectFlow ? 'Employee registration' : 'Visitor', + 'user-data': [] as Array<{ field: string, value: string | null }>, + }, + relationships: { + location: { + data: { + id: allIds.location, + type: 'locations', + }, + }, + flow: { + data: { + id: allIds.flow, + type: 'flows', + }, + }, + invite: (options.isProtectFlow || options.hasInvite) ? { + data: { + id: allIds.invite, + type: 'invites', + }, + } : undefined, + device: (!options.isProtectFlow && options.hasDevice) ? { + data: { + id: allIds.device, + type: 'devices', + }, + } : undefined, + employee: (options.isProtectFlow || options.hasHost) ? { + data: { + id: allIds.employee, + type: 'employees', + }, + } : undefined, + }, + }); +} + +export type EntryEventBodyFactoryOptions = Record> = { + event: EnvoyEntryEvent, + config: Partial, + payloadOptions: EntryPayloadFactoryOptions, + scope?: Array, + ids?: Partial, +}; + +export default function entryEventBodyFactory = Record>( + options: EntryEventBodyFactoryOptions, +) { + const ids = options.ids || entryEventBodyFactoryDefaultIds; + return eventBodyFactory({ + event: options.event, + config: options.config, + scope: options.scope || [], + locationId: options.ids?.location || entryEventBodyFactoryDefaultIds.location, + companyId: options.ids?.company || entryEventBodyFactoryDefaultIds.company, + payload: entryPayloadFactory(options.payloadOptions, ids).build(), + }); +} diff --git a/src/factories/eventBodyFactory.ts b/src/factories/eventBodyFactory.ts new file mode 100644 index 0000000..57f8024 --- /dev/null +++ b/src/factories/eventBodyFactory.ts @@ -0,0 +1,38 @@ +import { EnvoyUserAPIScope } from '../sdk/EnvoyUserAPI'; +import { eventMetaFactory } from './metaFactory'; + +export const eventBodyFactoryDefaultIds = { + locationId: '1', + companyId: '1', + zoneId: '1', +}; + +export type EventBodyFactoryOptions = { + event: Event, + config: Partial, + payload: Payload, + scope: Array, + locationId?: string, + companyId?: string, + zoneId?: string, +}; + +export default function eventBodyFactory< + Event extends string = string, + Config extends Record = Record, + Payload extends Record = Record, + >( + options: EventBodyFactoryOptions, +) { + return { + meta: eventMetaFactory( + options.event, + options.config, + options.scope, + options.locationId || eventBodyFactoryDefaultIds.locationId, + options.companyId || eventBodyFactoryDefaultIds.companyId, + options.zoneId || eventBodyFactoryDefaultIds.zoneId, + ).build(), + payload: options.payload, + }; +} diff --git a/src/factories/inviteEventBodyFactory.ts b/src/factories/inviteEventBodyFactory.ts new file mode 100644 index 0000000..4ad4069 --- /dev/null +++ b/src/factories/inviteEventBodyFactory.ts @@ -0,0 +1,107 @@ +import { Sync, each } from 'factory.ts'; +import faker from 'faker'; + +import InvitePayload from '../payloads/InvitePayload'; +import EnvoyInviteEvent from '../internal/EnvoyInviteEvent'; +import { EnvoyUserAPIScope } from '../sdk/EnvoyUserAPI'; +import eventBodyFactory from './eventBodyFactory'; + +export type InvitePayloadFactoryVisitorOptions = { + isProtectFlow: false, + hasEmail: boolean, + hasHost: boolean, + preregistrationComplete: boolean, + hasPhoto?: boolean, +}; + +export type InvitePayloadFactoryProtectOptions = { + isProtectFlow: true, + preregistrationComplete: boolean, + hasPhoto?: boolean, +}; + +export type InvitePayloadFactoryOptions = InvitePayloadFactoryVisitorOptions | InvitePayloadFactoryProtectOptions; + +export const inviteEventBodyFactoryDefaultIds = { + location: '1', + company: '1', + flow: '1', + invite: '1', + device: '1', + employee: '1', +}; + +export function invitePayloadFactory( + options: InvitePayloadFactoryOptions, + ids: Partial = inviteEventBodyFactoryDefaultIds, +): Sync.Factory { + const signedInDate = faker.date.past(); + const allIds = { ...inviteEventBodyFactoryDefaultIds, ...ids }; + return Sync.makeFactory({ + id: each((i) => `${i + 1}`), + type: 'invites', + attributes: { + 'employee-screening-flow': options.isProtectFlow, + 'full-name': faker.name.findName(), + email: (options.isProtectFlow || options.hasEmail) ? faker.internet.email() : null, + 'inviter-name': (!options.isProtectFlow && options.hasHost) ? faker.name.findName() : null, + 'inviter-email': (!options.isProtectFlow && options.hasHost) ? faker.internet.email() : null, + 'expected-arrival-time': faker.date.future().toISOString(), + 'private-notes': null, + arrived: false, + 'been-here-before': false, + 'flow-name': options.isProtectFlow ? 'Employee registration' : 'Visitor', + 'flow-id': allIds.flow, + 'user-data': [] as Array<{ field: string, value: string | null }>, + 'secret-token': faker.random.alphaNumeric(10), + 'edit-token': faker.random.alphaNumeric(10), + 'photo-url': faker.image.avatar(), + 'qr-code': null, + 'qr-code-sent-at': null, + 'preregistration-complete': options.preregistrationComplete, + 'reminder-sent-at': null, + }, + relationships: { + location: { + data: { + id: allIds.location, + type: 'locations', + }, + }, + flow: { + data: { + id: allIds.flow, + type: 'flows', + }, + }, + employee: (options.isProtectFlow || options.hasHost) ? { + data: { + id: allIds.employee, + type: 'employees', + }, + } : undefined, + }, + }); +} + +export type InviteEventBodyFactoryOptions = Record> = { + event: EnvoyInviteEvent, + config: Partial, + payloadOptions: InvitePayloadFactoryOptions, + scope?: Array, + ids?: Partial, +}; + +export default function entryEventBodyFactory = Record>( + options: InviteEventBodyFactoryOptions, +) { + const ids = options.ids || inviteEventBodyFactoryDefaultIds; + return eventBodyFactory({ + event: options.event, + config: options.config, + scope: options.scope || [], + locationId: options.ids?.location || inviteEventBodyFactoryDefaultIds.location, + companyId: options.ids?.company || inviteEventBodyFactoryDefaultIds.company, + payload: invitePayloadFactory(options.payloadOptions, ids).build(), + }); +} diff --git a/src/factories/metaFactory.ts b/src/factories/metaFactory.ts new file mode 100644 index 0000000..d593622 --- /dev/null +++ b/src/factories/metaFactory.ts @@ -0,0 +1,128 @@ +import { Sync } from 'factory.ts'; +import faker from 'faker'; +import { + EnvoyEventMeta, + EnvoyMetaAuth, + EnvoyMetaCompany, + EnvoyMetaJob, + EnvoyMetaLocation, + EnvoyMetaZone, + EnvoyRouteMeta, +} from '../sdk/EnvoyMeta'; +import { EnvoyUserAPIScope } from '../sdk/EnvoyUserAPI'; + +export function jobFactory(name: string): Sync.Factory { + return Sync.makeFactory({ + id: faker.datatype.uuid(), + identifier: faker.datatype.string(), + name, + }); +} + +export function locationFactory(id: string): Sync.Factory { + const cityName = faker.address.cityName(); + const street = faker.address.streetAddress(); + return Sync.makeFactory({ + id, + type: 'locations', + attributes: { + name: cityName, + 'company-name-override': null, + timezone: faker.address.timeZone(), + locale: null, + address: street, + 'address-line-one': street, + 'address-line-two': null, + city: cityName, + state: faker.address.stateAbbr(), + country: faker.address.country(), + zip: faker.address.zipCode(), + longitude: null, + latitude: null, + 'created-at': faker.date.past().toISOString(), + }, + }); +} + +export function companyFactory(id: string): Sync.Factory { + return Sync.makeFactory({ + id, + type: 'companies', + attributes: { + name: faker.company.companyName(), + active: true, + 'created-at': faker.date.past().toISOString(), + }, + }); +} + +export function zoneFactory(id: string): Sync.Factory { + const street = faker.address.streetAddress(); + return Sync.makeFactory({ + id, + type: 'zones', + attributes: { + address: street, + 'logo-url': null, + name: faker.company.companyName(), + 'time-zone': faker.address.timeZone(), + }, + }); +} + +export function authFactory(): Sync.Factory { + return Sync.makeFactory({ + token_type: 'Bearer', + access_token: faker.random.alphaNumeric(), + expires_in: faker.date.future().getSeconds(), + refresh_token: null, + refresh_token_expires_in: null, + }); +} + +export function routeMetaFactory< + Config extends Record = Record, + Params extends Record = Record, + >( + route: string, + config: Partial, + params: Params, + scope: Array, + locationId: string, + companyId: string, + zoneId: string, +): Sync.Factory { + return Sync.makeFactory({ + plugin_id: faker.datatype.uuid(), + install_id: Math.ceil(Math.abs(faker.datatype.number())).toString(), + location: locationFactory(locationId).build(), + company: companyFactory(companyId).build(), + zone: zoneFactory(zoneId).build(), + auth: scope.length ? authFactory().build() : null, + forwarded_bearer_token: faker.random.alphaNumeric(), + route, + config, + params, + }); +} + +export function eventMetaFactory = Record>( + event: string, + config: Partial, + scope: Array, + locationId: string, + companyId: string, + zoneId: string, +): Sync.Factory { + return Sync.makeFactory({ + plugin_id: faker.datatype.uuid(), + install_id: Math.ceil(Math.abs(faker.datatype.number())).toString(), + job: jobFactory(event).build(), + location: locationFactory(locationId).build(), + company: companyFactory(companyId).build(), + zone: zoneFactory(zoneId).build(), + auth: scope.length ? authFactory().build() : null, + event, + config, + }); +} diff --git a/src/factories/routeBodyFactory.ts b/src/factories/routeBodyFactory.ts new file mode 100644 index 0000000..322c2d6 --- /dev/null +++ b/src/factories/routeBodyFactory.ts @@ -0,0 +1,40 @@ +import { EnvoyUserAPIScope } from '../sdk/EnvoyUserAPI'; +import { routeMetaFactory } from './metaFactory'; + +export const routeBodyFactoryDefaultIds = { + locationId: '1', + companyId: '1', + zoneId: '1', +}; + +export type RouteBodyFactoryOptions = { + config: Partial, + params: Params, + payload: Payload, + scope?: Array, + locationId?: string, + companyId?: string, + zoneId?: string, + route?: string, +}; + +export default function routeBodyFactory< + Config extends Record = Record, + Params extends Record = Record, + Payload extends Record = Record, + >( + options: RouteBodyFactoryOptions, +) { + return { + meta: routeMetaFactory( + options.route || '', + options.config, + options.params, + options.scope || [], + options.locationId || routeBodyFactoryDefaultIds.locationId, + options.companyId || routeBodyFactoryDefaultIds.companyId, + options.zoneId || routeBodyFactoryDefaultIds.zoneId, + ).build(), + payload: options.payload, + }; +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..86b66ee --- /dev/null +++ b/src/index.ts @@ -0,0 +1,86 @@ +import './constants'; + +import EnvoyPluginStoragePipeline from './base/EnvoyPluginStoragePipeline'; + +import entryEventBodyFactory from './factories/entryEventBodyFactory'; +import eventBodyFactory from './factories/eventBodyFactory'; +import inviteEventBodyFactory from './factories/inviteEventBodyFactory'; +import routeBodyFactory from './factories/routeBodyFactory'; + +import HttpStatus from './internal/HttpStatus'; + +import EnvoyPluginJobMock from './mocks/EnvoyPluginJobMock'; +import EnvoyPluginStoragePipelineMock from './mocks/EnvoyPluginStoragePipelineMock'; + +import EntryPayload from './payloads/EntryPayload'; +import InvitePayload from './payloads/InvitePayload'; + +import EnvoyMeta from './sdk/EnvoyMeta'; +import EnvoyPluginJob from './sdk/EnvoyPluginJob'; +import EnvoyPluginSDK from './sdk/EnvoyPluginSDK'; +import EnvoyPluginStorage from './sdk/EnvoyPluginStorage'; +import EnvoyRequest from './sdk/EnvoyRequest'; +import EnvoyResponse from './sdk/EnvoyResponse'; +import EnvoyStorageItem from './sdk/EnvoyStorageItem'; +import EnvoyUserAPI from './sdk/EnvoyUserAPI'; +import EnvoyPluginAPI from './sdk/EnvoyPluginAPI'; + +import EnvoyJWT from './util/EnvoyJWT'; +import EnvoySignatureVerifier from './util/EnvoySignatureVerifier'; +import JSONAPIData from './util/json-api/JSONAPIData'; + +export * from './factories/entryEventBodyFactory'; +export * from './factories/eventBodyFactory'; +export * from './factories/inviteEventBodyFactory'; +export * from './factories/metaFactory'; +export * from './factories/routeBodyFactory'; + +export * from './resources/AgreementPageResource'; +export * from './resources/AgreementResource'; +export * from './resources/CompanyResource'; +export * from './resources/CompanyRoleResource'; +export * from './resources/CurrentUserResource'; +export * from './resources/EmployeeResource'; +export * from './resources/FlowResource'; +export * from './resources/InviteResource'; +export * from './resources/LocationResource'; +export * from './resources/LocationRoleResource'; +export * from './resources/SignInFieldPageResource'; +export * from './resources/SignInFieldResource'; +export * from './resources/UserResource'; + +export * from './sdk/EnvoyMeta'; +export * from './sdk/EnvoyRequest'; +export * from './sdk/EnvoyResponse'; +export * from './sdk/filters'; +export * from './sdk/handlers'; +export * from './sdk/loggers'; +export * from './sdk/middleware'; + +export * from './util/EnvoySignatureVerifier'; +export * from './util/axiosConstructor'; + +export { + EntryPayload, + InvitePayload, + EnvoyJWT, + EnvoyMeta, + EnvoyPluginJob, + EnvoyPluginJobMock, + EnvoyPluginSDK, + EnvoyPluginStorage, + EnvoyPluginStoragePipeline, + EnvoyPluginStoragePipelineMock, + EnvoyRequest, + EnvoyResponse, + EnvoySignatureVerifier, + EnvoyStorageItem, + EnvoyPluginAPI, + EnvoyUserAPI, + JSONAPIData, + HttpStatus, + entryEventBodyFactory, + eventBodyFactory, + inviteEventBodyFactory, + routeBodyFactory, +}; diff --git a/src/internal/EnvoyEntryEvent.ts b/src/internal/EnvoyEntryEvent.ts new file mode 100644 index 0000000..8c379dd --- /dev/null +++ b/src/internal/EnvoyEntryEvent.ts @@ -0,0 +1,10 @@ +type EnvoyEntryEvent = + 'entry_sign_in' | + 'entry_sign_out' | + 'entry_blacklist_review' | + 'entry_blacklist_deny' | + 'employee_entry_sign_in' | + 'employee_entry_sign_out' | + string; + +export default EnvoyEntryEvent; diff --git a/src/internal/EnvoyInviteEvent.ts b/src/internal/EnvoyInviteEvent.ts new file mode 100644 index 0000000..8af2f0f --- /dev/null +++ b/src/internal/EnvoyInviteEvent.ts @@ -0,0 +1,13 @@ +type EnvoyInviteEvent = + 'invite_created' | + 'invite_updated' | + 'invite_removed' | + 'upcoming_visit' | + 'qr_code_sent' | + 'employee_invite_created' | + 'employee_invite_updated' | + 'employee_invite_removed' | + 'employee_upcoming_visit' | + string; + +export default EnvoyInviteEvent; diff --git a/src/internal/EnvoyLocationEvent.ts b/src/internal/EnvoyLocationEvent.ts new file mode 100644 index 0000000..7e96030 --- /dev/null +++ b/src/internal/EnvoyLocationEvent.ts @@ -0,0 +1,3 @@ +type EnvoyLocationEvent = 'location_capacity_updated' | string; + +export default EnvoyLocationEvent; diff --git a/src/internal/EnvoyOption.ts b/src/internal/EnvoyOption.ts new file mode 100644 index 0000000..edebdea --- /dev/null +++ b/src/internal/EnvoyOption.ts @@ -0,0 +1,6 @@ +type EnvoyOption = { + label: string, + value: string, +}; + +export default EnvoyOption; diff --git a/src/internal/EnvoyOptionsRouteParams.ts b/src/internal/EnvoyOptionsRouteParams.ts new file mode 100644 index 0000000..c6205f8 --- /dev/null +++ b/src/internal/EnvoyOptionsRouteParams.ts @@ -0,0 +1,7 @@ +type EnvoyOptionsRouteParams = { + search?: string, + page?: number, + cursor?: string, +}; + +export default EnvoyOptionsRouteParams; diff --git a/src/internal/EnvoyOptionsRouteResponseBody.ts b/src/internal/EnvoyOptionsRouteResponseBody.ts new file mode 100644 index 0000000..1dbe54e --- /dev/null +++ b/src/internal/EnvoyOptionsRouteResponseBody.ts @@ -0,0 +1,4 @@ +import EnvoyOption from './EnvoyOption'; + +type EnvoyOptionsRouteResponseBody = Array; +export default EnvoyOptionsRouteResponseBody; diff --git a/src/internal/EnvoyPluginJobUpdate.ts b/src/internal/EnvoyPluginJobUpdate.ts new file mode 100644 index 0000000..c4f05d3 --- /dev/null +++ b/src/internal/EnvoyPluginJobUpdate.ts @@ -0,0 +1,11 @@ +import EnvoyPluginJobAttachment from '../sdk/EnvoyPluginJobAttachment'; + +/** + * @internal + */ +export default interface EnvoyPluginJobUpdate { + status?: string, + status_message?: string, + failure_reason?: string, + attachments: Array, +} diff --git a/src/internal/EnvoyRemoteValueRouteResponseBody.ts b/src/internal/EnvoyRemoteValueRouteResponseBody.ts new file mode 100644 index 0000000..7254e29 --- /dev/null +++ b/src/internal/EnvoyRemoteValueRouteResponseBody.ts @@ -0,0 +1,4 @@ +type EnvoyRemoteValueRouteResponseBody = { + value: string, +}; +export default EnvoyRemoteValueRouteResponseBody; diff --git a/src/internal/EnvoySelectedValuesRouteParams.ts b/src/internal/EnvoySelectedValuesRouteParams.ts new file mode 100644 index 0000000..86815b3 --- /dev/null +++ b/src/internal/EnvoySelectedValuesRouteParams.ts @@ -0,0 +1,5 @@ +type EnvoySelectedValuesRouteParams = { + value: Array | string, +}; + +export default EnvoySelectedValuesRouteParams; diff --git a/src/internal/EnvoySelectedValuesRouteResponseBody.ts b/src/internal/EnvoySelectedValuesRouteResponseBody.ts new file mode 100644 index 0000000..49aa79e --- /dev/null +++ b/src/internal/EnvoySelectedValuesRouteResponseBody.ts @@ -0,0 +1,4 @@ +import EnvoyOption from './EnvoyOption'; + +type EnvoySelectedValuesRouteResponseBody = Array | EnvoyOption | null; +export default EnvoySelectedValuesRouteResponseBody; diff --git a/src/internal/EnvoyStorageCommand.ts b/src/internal/EnvoyStorageCommand.ts new file mode 100644 index 0000000..6fad4e7 --- /dev/null +++ b/src/internal/EnvoyStorageCommand.ts @@ -0,0 +1,60 @@ +export const UNIQUE_OPTIONS_DEFAULT_CHARS = '0123456789'; + +export const UNIQUE_OPTIONS_DEFAULT_SIZE = 12; + +export const UNIQUE_NUM_OPTIONS_DEFAULT_MIN = 0; + +export const UNIQUE_NUM_OPTIONS_DEFAULT_MAX = 9_007_199_254_740_991; + +export interface EnvoyStorageSetUniqueOptions { + chars?: string, + size?: number, +} + +export interface EnvoyStorageSetUniqueNumOptions { + min?: number, + max?: number, +} + +export interface EnvoyBaseStorageCommand { + action: 'get' | 'set' | 'set_unique' | 'set_unique_num' | 'unset', + key: string, +} + +export interface EnvoyGetStorageCommand extends EnvoyBaseStorageCommand { + action: 'get', +} + +export interface EnvoySetStorageCommand extends EnvoyBaseStorageCommand { + action: 'set', + value: unknown, +} + +export interface EnvoySetUniqueStorageCommand extends EnvoyBaseStorageCommand, EnvoyStorageSetUniqueOptions { + action: 'set_unique', +} + +export interface EnvoySetUniqueNumStorageCommand extends EnvoyBaseStorageCommand, EnvoyStorageSetUniqueNumOptions { + action: 'set_unique_num', +} + +export interface EnvoyUnsetStorageCommand extends EnvoyBaseStorageCommand { + action: 'unset', +} + +export interface EnvoyListStorageCommand { + action: 'list', + page: number, +} + +/** + * @internal + */ +type EnvoyStorageCommand = EnvoyGetStorageCommand +| EnvoySetStorageCommand +| EnvoySetUniqueStorageCommand +| EnvoySetUniqueNumStorageCommand +| EnvoyUnsetStorageCommand +| EnvoyListStorageCommand; + +export default EnvoyStorageCommand; diff --git a/src/internal/EnvoyStorageResult.ts b/src/internal/EnvoyStorageResult.ts new file mode 100644 index 0000000..eb62365 --- /dev/null +++ b/src/internal/EnvoyStorageResult.ts @@ -0,0 +1,5 @@ +import EnvoyStorageItem from '../sdk/EnvoyStorageItem'; + +type EnvoyStorageResult = EnvoyStorageItem | Array> | null; + +export default EnvoyStorageResult; diff --git a/src/internal/HttpStatus.ts b/src/internal/HttpStatus.ts new file mode 100644 index 0000000..feba2b0 --- /dev/null +++ b/src/internal/HttpStatus.ts @@ -0,0 +1,12 @@ +/** + * Use these status codes to inform Envoy of a job's or route's status. + * + * @internal + */ +enum HttpStatus { + ONGOING = 202, + IGNORED = 400, + FAILED = 412, + UNEXPECTED_FAILURE = 500, +} +export default HttpStatus; diff --git a/src/mocks/EnvoyPluginJobMock.ts b/src/mocks/EnvoyPluginJobMock.ts new file mode 100644 index 0000000..c399711 --- /dev/null +++ b/src/mocks/EnvoyPluginJobMock.ts @@ -0,0 +1,33 @@ +import isMatch from 'lodash.ismatch'; +import EnvoyPluginJob from '../sdk/EnvoyPluginJob'; +import EnvoyPluginAPI from '../sdk/EnvoyPluginAPI'; +import EnvoyPluginJobUpdate from '../internal/EnvoyPluginJobUpdate'; +import EnvoyPluginJobAttachment from '../sdk/EnvoyPluginJobAttachment'; + +export default class EnvoyPluginJobMock extends EnvoyPluginJob { + constructor(pluginAPI: EnvoyPluginAPI, jobId: string) { + super(pluginAPI, jobId); + this.api.updateJob = (id, updates) => { + EnvoyPluginJobMock.updates.push(updates); + return Promise.resolve(); + }; + } + + private static updates: Array = []; + + static attachmentLike(partialAttachment: Partial) { + return EnvoyPluginJobMock.updates.find( + ({ attachments }) => attachments.find( + (attachment) => isMatch(attachment, partialAttachment), + ), + ); + } + + static get lastStatus() { + return [...EnvoyPluginJobMock.updates].reverse().find(({ status }) => !!status); + } + + static reset() { + EnvoyPluginJobMock.updates = []; + } +} diff --git a/src/mocks/EnvoyPluginStoragePipelineMock.ts b/src/mocks/EnvoyPluginStoragePipelineMock.ts new file mode 100644 index 0000000..b7f051a --- /dev/null +++ b/src/mocks/EnvoyPluginStoragePipelineMock.ts @@ -0,0 +1,204 @@ +import EnvoyPluginStoragePipeline from '../base/EnvoyPluginStoragePipeline'; +import EnvoyStorageItem from '../sdk/EnvoyStorageItem'; +import { + EnvoyStorageSetUniqueNumOptions, + EnvoyStorageSetUniqueOptions, + UNIQUE_NUM_OPTIONS_DEFAULT_MAX, + UNIQUE_NUM_OPTIONS_DEFAULT_MIN, + UNIQUE_OPTIONS_DEFAULT_CHARS, + UNIQUE_OPTIONS_DEFAULT_SIZE, +} from '../internal/EnvoyStorageCommand'; +import EnvoyStorageResult from '../internal/EnvoyStorageResult'; + +const DEFAULT_UNIQUE_OPTIONS: EnvoyStorageSetUniqueOptions = { + chars: UNIQUE_OPTIONS_DEFAULT_CHARS, + size: UNIQUE_OPTIONS_DEFAULT_SIZE, +}; + +const DEFAULT_UNIQUE_NUM_OPTIONS: EnvoyStorageSetUniqueNumOptions = { + min: UNIQUE_NUM_OPTIONS_DEFAULT_MIN, + max: UNIQUE_NUM_OPTIONS_DEFAULT_MAX, +}; + +export default class EnvoyPluginStoragePipelineMock extends EnvoyPluginStoragePipeline { + execute(): Promise> { + return Promise.resolve( + this.commands.map((command) => { + const isGlobal = !this.installId; + switch (command.action) { + case 'get': { + const value = EnvoyPluginStoragePipelineMock.get(command.key, isGlobal); + if (value === null) { + return null; + } + return EnvoyPluginStoragePipelineMock.itemFromKeyValue(command.key, value); + } + case 'set': { + const value = EnvoyPluginStoragePipelineMock.set(command.key, command.value, isGlobal); + return EnvoyPluginStoragePipelineMock.itemFromKeyValue(command.key, value); + } + case 'set_unique': + try { + const value = EnvoyPluginStoragePipelineMock.setUnique(command.key, command as EnvoyStorageSetUniqueOptions, isGlobal); + return EnvoyPluginStoragePipelineMock.itemFromKeyValue(command.key, value); + } catch (err) { + return null; + } + case 'set_unique_num': { + try { + const value = EnvoyPluginStoragePipelineMock.setUniqueNum(command.key, command as EnvoyStorageSetUniqueNumOptions, isGlobal); + return EnvoyPluginStoragePipelineMock.itemFromKeyValue(command.key, value); + } catch (err) { + return null; + } + } + case 'unset': { + const value = EnvoyPluginStoragePipelineMock.unset(command.key, isGlobal); + if (value === null) { + return null; + } + return EnvoyPluginStoragePipelineMock.itemFromKeyValue(command.key, value); + } + case 'list': + return EnvoyPluginStoragePipelineMock.list(command.page); + default: + return null; + } + }) as Array, + ); + } + + private static storage: Record = {}; + + private static uniqueStringKeys = new Set(); + + private static uniqueStringValues = new Set(); + + private static uniqueNumberKeys = new Set(); + + private static uniqueNumberValues = new Set(); + + private static normalizeKey(key: string, isGlobal: boolean) { + return isGlobal ? `global_${key}` : `install_${key}`; + } + + private static itemFromKeyValue(key: string, value: Value) { + return { key, value } as EnvoyStorageItem; + } + + static get(key: string, isGlobal = false): Value | null { + key = EnvoyPluginStoragePipelineMock.normalizeKey(key, isGlobal); + if (!Object.keys(EnvoyPluginStoragePipelineMock.storage).includes(key)) { + return null; + } + return EnvoyPluginStoragePipelineMock.storage[key] as Value; + } + + static set(key: string, value: Value, isGlobal = false) { + key = EnvoyPluginStoragePipelineMock.normalizeKey(key, isGlobal); + EnvoyPluginStoragePipelineMock.unset(key); + EnvoyPluginStoragePipelineMock.storage[key] = value; + return value; + } + + static setUnique(key:string, options = DEFAULT_UNIQUE_OPTIONS, isGlobal = false) { + key = EnvoyPluginStoragePipelineMock.normalizeKey(key, isGlobal); + const chars = (options.chars && options.chars.length) ? options.chars : UNIQUE_OPTIONS_DEFAULT_CHARS; + const size = options.size || UNIQUE_OPTIONS_DEFAULT_SIZE; + if (!chars || !size) { + throw new Error('Invalid "chars" or "size" arguments'); + } + let value = EnvoyPluginStoragePipelineMock.makeUniqueString(chars, size); + let numTries = 0; + while (EnvoyPluginStoragePipelineMock.uniqueStringValues.has(value)) { + value = EnvoyPluginStoragePipelineMock.makeUniqueString(chars, size); + // eslint-disable-next-line no-plusplus + if (++numTries > 1000) { + throw new Error('Max tries reached'); + } + } + EnvoyPluginStoragePipelineMock.unset(key); + EnvoyPluginStoragePipelineMock.uniqueStringValues.add(value); + EnvoyPluginStoragePipelineMock.uniqueStringKeys.add(key); + EnvoyPluginStoragePipelineMock.storage[key] = value; + return value; + } + + static setUniqueNum(key: string, options = DEFAULT_UNIQUE_NUM_OPTIONS, isGlobal = false) { + key = EnvoyPluginStoragePipelineMock.normalizeKey(key, isGlobal); + const min = options.min || UNIQUE_NUM_OPTIONS_DEFAULT_MIN; + const max = options.max || UNIQUE_NUM_OPTIONS_DEFAULT_MAX; + if (min >= max) { + throw new Error('"min" must be lower than "max"'); + } + let value = EnvoyPluginStoragePipelineMock.makeUniqueNumber(min, max); + let numTries = 0; + while (EnvoyPluginStoragePipelineMock.uniqueNumberValues.has(value)) { + value = EnvoyPluginStoragePipelineMock.makeUniqueNumber(min, max); + // eslint-disable-next-line no-plusplus + if (++numTries > 1000) { + throw new Error('Max tries reached'); + } + } + EnvoyPluginStoragePipelineMock.unset(key); + EnvoyPluginStoragePipelineMock.uniqueNumberValues.add(value); + EnvoyPluginStoragePipelineMock.uniqueNumberKeys.add(key); + EnvoyPluginStoragePipelineMock.storage[key] = value; + return value; + } + + static unset(key: string, isGlobal = false) { + key = EnvoyPluginStoragePipelineMock.normalizeKey(key, isGlobal); + if (!Object.keys(EnvoyPluginStoragePipelineMock.storage).includes(key)) { + return null; + } + const value = EnvoyPluginStoragePipelineMock.storage[key]; + if (EnvoyPluginStoragePipelineMock.uniqueStringKeys.has(key)) { + EnvoyPluginStoragePipelineMock.uniqueStringValues.delete(value as string); + EnvoyPluginStoragePipelineMock.uniqueStringKeys.delete(key); + } + if (EnvoyPluginStoragePipelineMock.uniqueNumberKeys.has(key)) { + EnvoyPluginStoragePipelineMock.uniqueNumberValues.delete(value as number); + EnvoyPluginStoragePipelineMock.uniqueNumberKeys.delete(key); + } + delete EnvoyPluginStoragePipelineMock.storage[key]; + return value as Value; + } + + static list(page = 1, isGlobal = false) { + const limit = 100; + const offset = (page - 1) * limit; + return Object.keys(EnvoyPluginStoragePipelineMock.storage) + .filter((key) => (key.startsWith('global_') && isGlobal) || (key.startsWith('install_') && !isGlobal)) + .sort() + .slice(offset, limit) + .map((key) => { + const value = EnvoyPluginStoragePipelineMock.storage[key]; + const pieces = key.split('_'); + pieces.shift(); + const normalizedKey = pieces.join(); + return { key: normalizedKey, value } as EnvoyStorageItem; + }); + } + + static reset() { + EnvoyPluginStoragePipelineMock.storage = {}; + EnvoyPluginStoragePipelineMock.uniqueStringKeys.clear(); + EnvoyPluginStoragePipelineMock.uniqueStringValues.clear(); + EnvoyPluginStoragePipelineMock.uniqueNumberKeys.clear(); + EnvoyPluginStoragePipelineMock.uniqueNumberValues.clear(); + } + + static makeUniqueString(chars: string, size: number) { + let result = ''; + // eslint-disable-next-line no-plusplus + for (let i = 0; i < size; i++) { + result += chars.charAt(Math.floor(Math.random() * chars.length)); + } + return result; + } + + static makeUniqueNumber(min: number, max: number) { + return Math.random() * (max - min) + min; + } +} diff --git a/src/payloads/EntryPayload.ts b/src/payloads/EntryPayload.ts new file mode 100644 index 0000000..88b0edc --- /dev/null +++ b/src/payloads/EntryPayload.ts @@ -0,0 +1,101 @@ +import { DateTime } from 'luxon'; +import JSONAPIData from '../util/json-api/JSONAPIData'; + +/** + * @category Event + */ +type EntryPayload = { + id: string, + type: 'entries', + attributes: { + 'full-name': string, + 'phone-number'?: string, + email: string | null, + 'employee-screening-flow': boolean, + host: string | null, + 'host-email': string | null, + 'private-notes': string | null, + 'signed-in-at': string, + 'signed-out-at'?: string, + thumbnails: { + large: string | null, + original: string | null, + small: string | null, + }, + 'flow-name': string, + nda?: string, + 'legal-docs'?: Array<{ + id: string, + url: string, + 'signed-at': string, + agreement: { + id: string, + }, + }>, + 'user-data': Array<{ + field: string, + value: string | null, + }>, + 'approval-status'?: { + status: string, + 'auto-approved': boolean, + report: Array<{ + reason?: string, + result: string, + source: string, + messages: Array<{ + failure: { + text: string, + header: string, + }, + }>, + }>, + blacklistReportUUID?: string, + }, + }, + relationships: { + location: { + data: JSONAPIData<'locations'>, + }, + 'visitor-entrance'?: { + data: JSONAPIData<'visitor-entrances'>, + }, + device?: { + data: JSONAPIData<'devices'>, + }, + employee?: { + data: JSONAPIData<'employees'>, + }, + invite?: { + data: JSONAPIData<'invites'>, + }, + flow?: { + data: JSONAPIData<'flows'>, + }, + 'agreeable-ndas'?: { + data: Array>, + } + } +}; + +export function normalizeEntryPayload(payload : EntryPayload): EntryPayload { + const { + 'signed-in-at': signedInAt, + 'signed-out-at': signedOutAt, + 'legal-docs': legalDocs, + } = payload.attributes; + const normalized = { ...payload }; + normalized.attributes['signed-in-at'] = DateTime.fromSQL(signedInAt, { zone: 'UTC' }).toISO(); + if (signedOutAt) { + normalized.attributes['signed-out-at'] = DateTime.fromSQL(signedOutAt, { zone: 'UTC' }).toISO(); + } + if (Array.isArray(legalDocs) && legalDocs.length) { + normalized.attributes['legal-docs'] = legalDocs.map((doc) => ({ + ...doc, + 'signed-at': DateTime.fromSQL(doc['signed-at'], { zone: 'UTC' }).toISO(), + })); + } + return normalized; +} + +export default EntryPayload; diff --git a/src/payloads/InvitePayload.ts b/src/payloads/InvitePayload.ts new file mode 100644 index 0000000..5e48bb4 --- /dev/null +++ b/src/payloads/InvitePayload.ts @@ -0,0 +1,79 @@ +import { DateTime } from 'luxon'; +import JSONAPIData from '../util/json-api/JSONAPIData'; + +/** + * @category Event + */ +type InvitePayload = { + id: string, + type: 'invites', + attributes: { + 'employee-screening-flow': boolean, + 'full-name': string, + email: string | null, + 'inviter-name': string | null, + 'inviter-email': string | null, + 'expected-arrival-time': string, + 'private-notes': string | null, + arrived: boolean, + 'been-here-before': boolean, + 'flow-name': string, + 'flow-id': string, + 'user-data': Array<{ + field: string, + value: string | null, + }>, + nda?: string, + 'secret-token': string, + 'edit-token': string, + 'photo-url': string | null, + 'qr-code': string | null, + 'qr-code-sent-at': string | null, + 'preregistration-complete': boolean, + 'reminder-sent-at': string | null, + 'legal-docs'?: Array<{ + id: string, + url: string, + 'signed-at': string, + agreement: { + id: string, + }, + }>, + 'signed-in-at'?: string, + 'signed-out-at'?: string, + }, + relationships: { + entry?: { + data: JSONAPIData<'entries'>, + }, + location: { + data: JSONAPIData<'locations'>, + }, + flow?: { + data: JSONAPIData<'flows'>, + }, + employee?: { + data: JSONAPIData<'employees'>, + }, + 'agreeable-ndas'?: { + data: Array>, + }, + 'tenant'?: { + data: JSONAPIData<'tenants'>, + }, + } +}; + +export function normalizeInvitePayload(payload: InvitePayload): InvitePayload { + const { 'legal-docs': legalDocs } = payload.attributes; + const normalized = { ...payload }; + if (Array.isArray(legalDocs) && legalDocs.length) { + normalized.attributes['legal-docs'] = legalDocs.map((doc) => ({ + ...doc, + 'signed-at': DateTime.fromSQL(doc['signed-at'], { zone: 'UTC' }).toISO(), + })); + } + return normalized; +} + +export default InvitePayload; diff --git a/src/payloads/LocationPayload.ts b/src/payloads/LocationPayload.ts new file mode 100644 index 0000000..7e74a97 --- /dev/null +++ b/src/payloads/LocationPayload.ts @@ -0,0 +1,8 @@ +import { LocationModel } from '../resources/LocationResource'; + +/** + * @category Event + */ +type LocationPayload = LocationModel; + +export default LocationPayload; diff --git a/src/payloads/NotificationPayload.ts b/src/payloads/NotificationPayload.ts new file mode 100644 index 0000000..7a104c0 --- /dev/null +++ b/src/payloads/NotificationPayload.ts @@ -0,0 +1,54 @@ +type NotificationPayload = { + recipient: { + name: { + full: string, + }, + email: string | null, + user_id: number | null, + employee_id: number | null, + phone_number: string | null, + }, + message?: string, + details?: Array<{ + label: string, + value: string, + }>, + actions?: Array<{ + label: string, + callback_url: string, + }>, + attachments?: Array<{ + url: string, + }>, + channel_overrides?: { + slack?: { + dm_only?: boolean, + footer_text?: string, + short_details?: boolean, + large_image?: boolean, + attachments?: Array>, + message?: string, + text?: string, + }, + email?: { + from: string, + subject: string, + html_body: string, + text_body: string, + reply_to?: { + name: { + full: string, + }, + email: string, + }, + bcc?: Array<{ + name: { + full: string, + }, + email: string, + }> + } + }, +}; + +export default NotificationPayload; diff --git a/src/resources/AgreementPageResource.ts b/src/resources/AgreementPageResource.ts new file mode 100644 index 0000000..199553b --- /dev/null +++ b/src/resources/AgreementPageResource.ts @@ -0,0 +1,19 @@ +import JSONAPIModel from '../util/json-api/JSONAPIModel'; + +/** + * @category API Resource + */ +export type AgreementPageAttributes = { + enabled?: boolean; + position?: number; +}; + +/** + * @category API Resource + */ +export type AgreementPageRelationships = 'flow' | 'agreements'; + +/** + * @category API Resource + */ +export type AgreementPageModel = JSONAPIModel; diff --git a/src/resources/AgreementResource.ts b/src/resources/AgreementResource.ts new file mode 100644 index 0000000..ce0a77f --- /dev/null +++ b/src/resources/AgreementResource.ts @@ -0,0 +1,26 @@ +import JSONAPIModel from '../util/json-api/JSONAPIModel'; + +/** + * @category API Resource + */ +export interface AgreementAttributes { + name: string; + optional: boolean; + 'require-resign': boolean; + body?: string; + 'video-url'?: string; + enabled?: boolean; + position?: number; + 'created-at'?: string; + 'updated-at'?: string; +} + +/** + * @category API Resource + */ +export type AgreementRelationships = 'agreement-page'; + +/** + * @category API Resource + */ +export type AgreementModel = JSONAPIModel; diff --git a/src/resources/CompanyResource.ts b/src/resources/CompanyResource.ts new file mode 100644 index 0000000..acf38a4 --- /dev/null +++ b/src/resources/CompanyResource.ts @@ -0,0 +1,21 @@ +import JSONAPIModel from '../util/json-api/JSONAPIModel'; + +/** + * @category API Resource + */ +export interface CompanyAttributes { + name: string; + active: boolean; + 'created-at': string; + 'updated-at': string; +} + +/** + * @category API Resource + */ +export type CompanyRelationships = 'locations'; + +/** + * @category API Resource + */ +export type CompanyModel = JSONAPIModel; diff --git a/src/resources/CompanyRoleResource.ts b/src/resources/CompanyRoleResource.ts new file mode 100644 index 0000000..f09bd72 --- /dev/null +++ b/src/resources/CompanyRoleResource.ts @@ -0,0 +1,10 @@ +import JSONAPIModel from '../util/json-api/JSONAPIModel'; + +export interface CompanyRoleAttributes { + 'role-name': string; + 'confirmed-at': string; +} + +export type CompanyRoleRelationships = 'company'; + +export type CompanyRoleModel = JSONAPIModel; diff --git a/src/resources/CurrentUserResource.ts b/src/resources/CurrentUserResource.ts new file mode 100644 index 0000000..e21d2fe --- /dev/null +++ b/src/resources/CurrentUserResource.ts @@ -0,0 +1,10 @@ +import JSONAPIModel from '../util/json-api/JSONAPIModel'; + +export interface CurrentUserAttributes { + 'full-name': string; + email: string; +} + +export type CurrentUserRelationships = 'location-roles' | 'company-roles'; + +export type CurrentUserModel = JSONAPIModel; diff --git a/src/resources/EmployeeResource.ts b/src/resources/EmployeeResource.ts new file mode 100644 index 0000000..172b281 --- /dev/null +++ b/src/resources/EmployeeResource.ts @@ -0,0 +1,47 @@ +import JSONAPIModel from '../util/json-api/JSONAPIModel'; + +/** + * @category API Resource + */ +export type EmployeeSortFields = 'name' | 'created_at' | '-name' | '-created_at'; + +/** + * @category API Resource + */ +export interface EmployeeFilterFields { + deleted?: boolean; + company?: string; + locations?: string; + email?: string; + except?: string; + 'exclude-locations'?: string; + 'exclude-hidden'?: boolean; + 'manually-added'?: boolean; + name?: string; + query?: string; +} + +/** + * @category API Resource + */ +export interface EmployeeAttributes { + name: string; + email: string; + 'phone-number'?: string; + 'profile-picture-url'?: string; + deleted?: boolean; + 'company-id'?: string; + 'created-at'?: string; + 'updated-at'?: string; + 'deleted-at'?: string; +} + +/** + * @category API Resource + */ +export type EmployeeRelationships = 'locations' | 'company'; + +/** + * @category API Resource + */ +export type EmployeeModel = JSONAPIModel; diff --git a/src/resources/FlowResource.ts b/src/resources/FlowResource.ts new file mode 100644 index 0000000..705bb73 --- /dev/null +++ b/src/resources/FlowResource.ts @@ -0,0 +1,36 @@ +import JSONAPIModel from '../util/json-api/JSONAPIModel'; + +/** + * @category API Resource + */ +export type FlowSortFields = 'name' | 'created_at' | '-name' | '-created_at'; + +/** + * @category API Resource + */ +export interface FlowFilterFields { + 'employee-centric'?: boolean; + enabled?: boolean; + location?: string; +} + +/** + * @category API Resource + */ +export interface FlowAttributes { + name: string; + 'employee-centric': boolean; + enabled: boolean; + 'created-at': string; + 'updated-at': string; +} + +/** + * @category API Resource + */ +export type FlowRelationships = 'location' | 'sign-in-field-page' | 'agreement-page'; + +/** + * @category API Resource + */ +export type FlowModel = JSONAPIModel; diff --git a/src/resources/InviteResource.ts b/src/resources/InviteResource.ts new file mode 100644 index 0000000..648a400 --- /dev/null +++ b/src/resources/InviteResource.ts @@ -0,0 +1,119 @@ +import JSONAPIData from '../util/json-api/JSONAPIData'; +import JSONAPIModel from '../util/json-api/JSONAPIModel'; + +/** + * @category API Resource + */ +export type InviteSortFields = 'name' | 'created_at' | '-name' | '-created_at'; + +/** + * @category API Resource + */ +export interface InviteFilterFields { + email?: string; + employee?: string; + flow?: string; + location?: string; + 'date-from'?: string; + 'date-to'?: string; + 'datetime-from'?: string; + 'datetime-to'?: string; + 'for-date'?: string; + 'employee-centric'?: boolean; + scope?: 'hosted' | 'mine' | 'include_execs'; +} + +/** + * @category API Resource + */ +export interface InviteAttributes { + 'additional-guests'?: number; + 'approval-status'?: { + status: 'approved' | 'review' | 'pending' | 'denied'; + auto_approved: boolean; + report: Array<{ + reason: string; + result: 'pass' | 'fail' | 'pending'; + source: string; + messages: { + failure?: { + text: string; + header: string; + }; + }; + }>; + }; + email?: string; + 'expected-arrival-time'?: string; + 'expected-departure-time'?: string; + 'full-name'?: string; + 'guest-updated-at'?: string; + 'is-presigned'?: boolean; + 'private-notes'?: string; + 'user-data'?: Record; + 'notify-visitor'?: boolean; + 'created-from'?: string; + arrived?: boolean; + attested?: boolean; + 'entry-signed-out-at'?: string; + 'reminder-sent-at'?: string; + phone?: string; + 'created-at'?: string; + 'updated-at'?: string; +} + +/** + * @category API Resource + */ +export interface InviteCreationAttributes { + email?: string; + 'expected-arrival-time'?: string; + 'expected-departure-time'?: string; + 'full-name'?: string; + 'private-notes'?: string; + 'user-data'?: Record; + 'notify-visitor'?: boolean; + attested?: boolean; + phone?: string; +} + +/** + * @category API Resource + */ +export type InviteRelationships = 'attendee' | 'creator' | 'employee' | 'entry' | 'flow' | 'location'; + +/** + * @category API Resource + */ +export type InviteModel = JSONAPIModel; + +/** + * @category API Resource + */ +type InviteCreationRequiredRelationships = 'location'; // surprising, but flow is not required. if not provided, it will be defaulted +type InviteCreationProhibitedRelationships = 'creator'; +type InviteCreationOptionalRelationships = Exclude< + InviteRelationships, + InviteCreationRequiredRelationships | InviteCreationProhibitedRelationships +>; + +/** + * Here we are going to do a little surgery on JSONAPIModel to allow us to specify required and optional relationships. + * We do this by first omitting the relationships field from JSONAPIModel, then adding it back in with modified type. + */ +export type InviteCreationModel = Omit< + JSONAPIModel, + 'relationships' +> & { + relationships: { + [key in InviteCreationRequiredRelationships]: { + data: JSONAPIData | Array; + }; + } & { + [key in InviteCreationOptionalRelationships]?: { + data: JSONAPIData | Array | null; + }; + } & { + [key in InviteCreationProhibitedRelationships]?: never; + }; +}; diff --git a/src/resources/LocationResource.ts b/src/resources/LocationResource.ts new file mode 100644 index 0000000..7bd3689 --- /dev/null +++ b/src/resources/LocationResource.ts @@ -0,0 +1,68 @@ +import JSONAPIModel from '../util/json-api/JSONAPIModel'; + +/** + * @category API Resource + */ +export type LocationSortFields = 'name' | 'created_at' | '-name' | '-created_at'; + +/** + * @category API Resource + */ +export interface LocationFilterFields { + disabled?: boolean; + company?: string; +} + +/** + * @category API Resource + */ +export interface LocationAttributes { + name: string; + address: string; + 'address-line-1': string | null; + 'address-line-2': string | null; + city: string | null; + state: string | null; + country: string | null; + zip: string | null; + latitude: number | null; + longitude: number | null; + locale: string | null; + timezone: string; + 'company-name-override': string | null; + 'logo-small-url': string | null; + 'logo-thumb-url': string | null; + 'logo-url': string | null; + disabled: boolean | null; + 'visitors-onboarding-complete': boolean | null; + 'registration-eligibility-end-offset': number | null; + 'registration-eligibility-start-offset': number | null; + 'visitor-registration-eligibility-start-offset': number | null; + 'welcome-email-preference': string | null; + 'average-monthly-visitors': number | null; + 'capacity-limit': number | null; + 'auto-sign-out-at-midnight': boolean | null; + 'employee-screening-enabled': boolean | null; + 'pre-registration-enabled': boolean | null; + 'pre-registration-required-enabled': boolean | null; + 'host-approval-enabled': boolean | null; + 'multiple-languages-enabled': boolean | null; + 'near-visit-screening-enabled': boolean | null; + 'printer-notifications-enabled': boolean | null; + 'security-desk-link-enabled': boolean | null; + 'touchless-signin-enabled': boolean | null; + 'visitor-survey-enabled': boolean | null; + 'visual-compliance-enabled': boolean | null; + 'created-at': string; + 'updated-at': string; +} + +/** + * @category API Resource + */ +export type LocationRelationships = 'company' | 'employees' | 'flows' | 'employee-screening-flow'; + +/** + * @category API Resource + */ +export type LocationModel = JSONAPIModel; diff --git a/src/resources/LocationRoleResource.ts b/src/resources/LocationRoleResource.ts new file mode 100644 index 0000000..b3d947d --- /dev/null +++ b/src/resources/LocationRoleResource.ts @@ -0,0 +1,10 @@ +import JSONAPIModel from '../util/json-api/JSONAPIModel'; + +export interface LocationRoleAttributes { + 'role-name': string; + 'confirmed-at': string; +} + +export type LocationRoleRelationships = 'location'; + +export type LocationRoleModel = JSONAPIModel; diff --git a/src/resources/ReservationResource.ts b/src/resources/ReservationResource.ts new file mode 100644 index 0000000..39f537b --- /dev/null +++ b/src/resources/ReservationResource.ts @@ -0,0 +1,40 @@ +import JSONAPIModel from "../util/json-api/JSONAPIModel"; + +export interface ReservationAttributes { + 'is-partial-day': boolean; + 'updated-at': number; + 'is-assignable': boolean; + 'name': string; + 'assigned-to': string | null; + 'neighborhood-id': number; + 'created-at': number; + 'neighborhood': number | null; + 'parent-desk-id': string | null; + 'availability': string | null; + 'enabled': boolean; + 'x-pos': number | null; + 'y-pos': number | null; +} + +export interface ReservationCreationAttributes { + // Required fields + userId: number; + + // Optional fields + deskId?: number | null; + locationId?: number | null; + inviteId?: number | null; + entryId?: number | null; + startTime?: number | null; // Unix timestamp + endTime?: number | null; // Unix timestamp + + meta?: { + autoAssignDesk?: boolean; + }; +} + +export type ReservationRelationships = 'location' | 'desk' | 'company' | 'floor' | 'employee' | 'entry' | 'invite' | 'user'; + +export type ReservationModel = JSONAPIModel + + diff --git a/src/resources/SignInFieldPageResource.ts b/src/resources/SignInFieldPageResource.ts new file mode 100644 index 0000000..943101e --- /dev/null +++ b/src/resources/SignInFieldPageResource.ts @@ -0,0 +1,23 @@ +import JSONAPIModel from '../util/json-api/JSONAPIModel'; + +/** + * @category API Resource + */ +export type SignInFieldPageAttributes = { + enabled?: boolean; + position?: number; +}; + +/** + * @category API Resource + */ +export type SignInFieldPageRelationships = 'flow' +| 'actionable-sign-in-field-actions' +| 'actionable-sign-in-fields' +| 'sign-in-field-actions' +| 'sign-in-fields'; + +/** + * @category API Resource + */ +export type SignInFieldPageModel = JSONAPIModel; diff --git a/src/resources/SignInFieldResource.ts b/src/resources/SignInFieldResource.ts new file mode 100644 index 0000000..cd589ea --- /dev/null +++ b/src/resources/SignInFieldResource.ts @@ -0,0 +1,35 @@ +import JSONAPIModel from '../util/json-api/JSONAPIModel'; + +/** + * @category API Resource + */ +export interface SignInFieldAttributes { + name: string; + kind: string; + required: boolean; + identifier?: string; + localized?: string; + 'ipad-localized-names': Array<{ + 'language-code': string; + 'region-code'?: string; + 'display-name': string; + }>; + options?: Array<{ + value: string, + position: number, + }>, + position?: number; + 'store-response'?: boolean; + 'created-at'?: string; + 'updated-at'?: string; +} + +/** + * @category API Resource + */ +export type SignInFieldRelationships = 'sign-in-field-page'; + +/** + * @category API Resource + */ +export type SignInFieldModel = JSONAPIModel; diff --git a/src/resources/UserResource.ts b/src/resources/UserResource.ts new file mode 100644 index 0000000..492cc2c --- /dev/null +++ b/src/resources/UserResource.ts @@ -0,0 +1,14 @@ +import JSONAPIModel from '../util/json-api/JSONAPIModel'; + +/** + * @category API Resource + */ +export type UserAttributes = { + name: string; + email: string; +}; + +/** + * @category API Resource + */ +export type UserModel = JSONAPIModel; diff --git a/src/sdk/EnvoyMeta.ts b/src/sdk/EnvoyMeta.ts new file mode 100644 index 0000000..013bdd3 --- /dev/null +++ b/src/sdk/EnvoyMeta.ts @@ -0,0 +1,117 @@ +/** + * @category Meta + */ +export type EnvoyMetaJob = { + id: string, + name: Event, + identifier: string, +}; + +/** + * @category Meta + */ +export type EnvoyMetaLocation = { + id: string, + type: 'locations', + attributes: { + name: string, + 'company-name-override': string | null, + timezone: string, + locale: string | null, + address: string, + 'address-line-one': string | null, + 'address-line-two': string | null, + city: string | null, + state: string | null, + country: string | null, + zip: string | null, + longitude: number | null, + latitude: number | null, + 'created-at': string, + } +}; + +/** + * @category Meta + */ +export type EnvoyMetaCompany = { + id: string, + type: 'companies', + attributes: { + name: string, + active: boolean, + 'created-at': string, + } +}; + +/** + * @category Meta + */ +export type EnvoyMetaZone = { + id: string, + type: 'zones', + attributes: { + address: string | null, + 'logo-url': string | null, + name: string, + 'time-zone': string, + } +}; + +/** + * A short-lived `userAPI` token. + * Will be used to construct the `userAPI` property found in `req.envoy.userAPI`. + * + * @category Meta + */ +export type EnvoyMetaAuth = { + token_type: 'Bearer', + access_token: string, + expires_in: number, + refresh_token: string | null, + refresh_token_expires_in: number | null, +}; + +/** + * Metadata that will be included in the request body for events. + * + * @category Meta + */ +export type EnvoyEventMeta> = { + event: Event, + plugin_id: string, + install_id: string, + config: Config, + job: EnvoyMetaJob, + location: EnvoyMetaLocation, + company: EnvoyMetaCompany, + zone: EnvoyMetaZone, + auth: EnvoyMetaAuth | null, +}; + +/** + * Metadata that will be included in the request body for setup routes, + * like validation URLs or options URLs. + * + * @category Meta + */ +export type EnvoyRouteMeta, Params = Record> = { + route: string, + plugin_id: string, + install_id: string, + config: Config, + params: Params, + location: EnvoyMetaLocation, + company: EnvoyMetaCompany, + zone: EnvoyMetaZone, + auth: EnvoyMetaAuth | null, + forwarded_bearer_token?: string, +}; + +/** + * Metadata that will be included in every request Envoy sends to your plugin. + * + * @category Meta + */ +type EnvoyMeta = EnvoyEventMeta | EnvoyRouteMeta; +export default EnvoyMeta; diff --git a/src/sdk/EnvoyPluginAPI.ts b/src/sdk/EnvoyPluginAPI.ts new file mode 100644 index 0000000..951e93d --- /dev/null +++ b/src/sdk/EnvoyPluginAPI.ts @@ -0,0 +1,95 @@ +import axios from 'axios'; +import EnvoyAPI from '../base/EnvoyAPI'; +import EnvoyPluginJobUpdate from '../internal/EnvoyPluginJobUpdate'; +import EnvoyStorageCommand from '../internal/EnvoyStorageCommand'; +import EnvoyStorageResult from '../internal/EnvoyStorageResult'; +import { envoyBaseURL, envoyClientId, envoyClientSecret } from '../constants'; +import { EnvoyMetaAuth } from './EnvoyMeta'; +import { sanitizeAxiosError } from '../util/axiosConstructor'; + +/** + * API endpoints for *plugin-scoped* tokens. + * + * @category API + * @category Request Object + */ +export default class EnvoyPluginAPI extends EnvoyAPI { + async updateJob(jobId: string, update: EnvoyPluginJobUpdate): Promise { + await this.axios({ + method: 'PATCH', + url: `/api/v2/plugin-services/jobs/${jobId}`, + data: update, + }); + } + + /** + * Fetches the current `config` saved for this install during setup by the customer. + */ + async getPluginInstallConfig(installId: string): Promise> { + const { data } = await this.axios.get(`/api/v2/plugin-services/installs/${installId}/config`); + return data.data; + } + + /** + * Merges changes with the current `config` saved for this install during setup by the customer. + * + * To remove an item from the saved `config`, set the item's key to `null`. + */ + async setPluginInstallConfig(installId: string, config: Record): Promise { + await this.axios({ + method: 'PUT', + url: `/api/v2/plugin-services/installs/${installId}/config`, + data: config, + }); + } + + async storagePipeline( + commands: Array, + installId?: string, + ): Promise> { + const request: Record = { commands }; + if (installId) { + request.install_id = installId; + } + const { data } = await this.axios({ + method: 'POST', + url: '/api/v2/plugin-services/storage', + data: request, + }); + return data.data; + } + + async createNotification(installId: string, params = {}): Promise { + await this.axios({ + method: 'POST', + url: `/api/v2/plugin-services/installs/${installId}/notifications`, + data: params, + }); + } + + /** + * Gets a plugin access token using `client_credentials` as the grant type. + */ + static async loginAsPlugin(id = envoyClientId, secret = envoyClientSecret, scope: string[] = ['plugin', 'token.refresh']): Promise { + try { + const { data } = await axios({ + auth: { + username: id, + password: secret, + }, + method: 'POST', + data: { + grant_type: 'client_credentials', + client_id: id, + client_secret: secret, + scope: scope.join(','), + }, + url: '/a/auth/v0/token', + baseURL: envoyBaseURL, + }); + return data; + } catch (error) { + throw sanitizeAxiosError(error); + } + } +} diff --git a/src/sdk/EnvoyPluginJob.ts b/src/sdk/EnvoyPluginJob.ts new file mode 100644 index 0000000..dad334c --- /dev/null +++ b/src/sdk/EnvoyPluginJob.ts @@ -0,0 +1,90 @@ +import EnvoyPluginJobAttachment from './EnvoyPluginJobAttachment'; +import EnvoyPluginJobUpdate from '../internal/EnvoyPluginJobUpdate'; +import EnvoyPluginAPI from './EnvoyPluginAPI'; + +/** + * A "job" is an event, like `entry_sign_in`. + * When your plugin handles the event, you can use this job concept + * to update the status (e.g. complete, failed, ignored) + * as well as attach extra data to the event's subject + * (e.g. showing a generated card number in the dashboard for a visitor on `entry_sign_in`). + * + * @category Request Object + */ +export default class EnvoyPluginJob { + protected readonly api: EnvoyPluginAPI; + + readonly id: string; + + constructor(pluginAPI: EnvoyPluginAPI, jobId: string) { + this.api = pluginAPI; + this.id = jobId; + } + + private execute( + status: string | null, + message: string | null, + reason: string | null, + attachments: Array = [], + ): Promise { + const updates: EnvoyPluginJobUpdate = { + attachments: attachments.map((attachment) => ({ type: 'text', ...attachment })), + }; + if (status) { + Object.assign(updates, { status }); + } + if (message) { + Object.assign(updates, { status_message: message }); + } + if (reason) { + Object.assign(updates, { failure_reason: reason }); + } + return this.api.updateJob(this.id, updates); + } + + /** + * Add attachments to this job. + */ + attach(...attachments: Array): Promise { + return this.execute(null, null, null, attachments); + } + + /** + * Reports that the job is complete. + * + * Instead of calling this directly, you can return a 200 response from the job's event handler, + * using {@link EnvoyRequest.send}. + */ + complete(message: string, ...attachments: Array): Promise { + return this.execute('done', message, null, attachments); + } + + /** + * Reports that the job is ignored. + * + * Instead of calling this directly, you can return a 400 response from the job's event handler, + * using {@link EnvoyRequest.sendIgnored}. + */ + ignore(message: string, reason: string): Promise { + return this.execute('ignored', message, reason); + } + + /** + * Reports that the job is ignored. + * + * Instead of calling this directly, you can return a 400 response from the job's event handler, + * using {@link EnvoyRequest.sendFailed}. + */ + fail(message: string, reason: string): Promise { + return this.execute('failed', message, reason); + } + + /** + * Updates the job with a new message and attachments. + * + * Can be used to periodically update long-running jobs. + */ + update(message: string, ...attachments: Array): Promise { + return this.execute(null, message, null, attachments); + } +} diff --git a/src/sdk/EnvoyPluginJobAttachment.ts b/src/sdk/EnvoyPluginJobAttachment.ts new file mode 100644 index 0000000..9570f56 --- /dev/null +++ b/src/sdk/EnvoyPluginJobAttachment.ts @@ -0,0 +1,48 @@ +/** + * Display some text in Envoy's dashboard. + * + * @category Attachment + */ +export interface EnvoyPluginTextJobAttachment { + type?: 'text' | 'password' | string, + label: string, + value: string, +} + +/** + * Display a link in Envoy's dashboard. + * + * @category Attachment + */ +export interface EnvoyPluginLinkJobAttachment extends EnvoyPluginTextJobAttachment { + type: 'link', + url: string, +} + +/** + * Display a credential in Envoy's dashboard, + * and include the credential's image in the invitee's welcome email. + * + * @category Attachment + */ +export interface EnvoyPluginCredentialJobAttachment extends EnvoyPluginTextJobAttachment { + type: 'credential_image', + title: string, + image: { + type: 's3', + link: string, + }, +} + +/** + * Attachments to jobs, which will be displayed in the Envoy dashboard. + * Some attachments like `credential_image` can show up in other places, + * like an invitee's welcome email. + * + * @category Attachment + */ +type EnvoyPluginJobAttachment = EnvoyPluginTextJobAttachment +| EnvoyPluginLinkJobAttachment +| EnvoyPluginCredentialJobAttachment; + +export default EnvoyPluginJobAttachment; diff --git a/src/sdk/EnvoyPluginSDK.ts b/src/sdk/EnvoyPluginSDK.ts new file mode 100644 index 0000000..d0eb156 --- /dev/null +++ b/src/sdk/EnvoyPluginSDK.ts @@ -0,0 +1,185 @@ +import EnvoyMeta, { EnvoyEventMeta, EnvoyRouteMeta } from './EnvoyMeta'; +import EnvoyPluginStorage from './EnvoyPluginStorage'; +import EnvoyPluginJob from './EnvoyPluginJob'; +import EnvoyJWT from '../util/EnvoyJWT'; +import EnvoyUserAPI from './EnvoyUserAPI'; +import EnvoyPluginAPI from './EnvoyPluginAPI'; +import JSONAPIData from '../util/json-api/JSONAPIData'; +import EntryPayload, { normalizeEntryPayload } from '../payloads/EntryPayload'; +import InvitePayload, { normalizeInvitePayload } from '../payloads/InvitePayload'; + +/** + * Every Envoy request has a `meta` and `payload`. + * @category Request + */ +export interface EnvoyRequestBody { + meta: Meta, + payload: Payload, +} + +/** + * Sets up all relevant Envoy functions. + * Attaches itself to every request object using our {@link middleware}, + * to allow for easy access to Envoy functions. + * + * @category SDK + */ +export default class EnvoyPluginSDK { + /** + * Body of the request. + * use `meta` or `payload` to access the relevant properties, + * instead of this directly. + */ + private readonly body: EnvoyRequestBody; + + /** + * Verified that the request comes from Envoy. + */ + private readonly isVerified: boolean; + + /** + * The internally managed plugin access token. + * Use the `pluginAPI` instead of this directly. + */ + private readonly pluginAccessToken: string | null = null; + + /** + * Don't create an instance of this class directly. + * + * Instead, use {@link middleware} to automatically attach an instance to `req` on every request. + * @param body - Request body + * @param isVerified - If the request has been verified via {@link EnvoySignatureVerifier} + * @param pluginAccessToken - An access token from {@link EnvoyPluginAPI.loginAsPlugin} + */ + constructor(body: EnvoyRequestBody, isVerified = false, pluginAccessToken: string | null = null) { + this.body = body; + this.isVerified = isVerified; + this.pluginAccessToken = pluginAccessToken; + } + + /** + * The metadata for the request. + * Either an {@link EnvoyEventMeta}} or {@link EnvoyRouteMeta}. + */ + get meta(): Meta { + if (!this.isVerified) { + throw new Error('Could not verify meta.'); + } + return this.body.meta; + } + + /** + * The payload for the request. + * For events, it's some Envoy event payload, like an {@link EntryPayload} or {@link InvitePayload}. + * For setup step validation URLs, it's the form submitted values for a validation URL. + */ + get payload(): Payload { + if (!this.isVerified) { + throw new Error('Could not verify payload.'); + } + const payload = this.body.payload as unknown as JSONAPIData; + switch (payload.type) { + case 'entries': + return normalizeEntryPayload(payload as unknown as EntryPayload) as unknown as Payload; + case 'invites': + return normalizeInvitePayload(payload as unknown as InvitePayload) as unknown as Payload; + default: + return payload as unknown as Payload; + } + } + + /** + * Envoy API scoped to the user. + * Used only in routes. + */ + get userAPI(): EnvoyUserAPI { + const meta = this.meta as unknown as EnvoyRouteMeta; + const { auth } = meta; + let accessToken: string | undefined = auth?.access_token; + if (!accessToken && ('forwarded_bearer_token' in meta)) { + accessToken = meta.forwarded_bearer_token; + } + if (!accessToken) { + throw new Error("This user's API token was not found. Either no scopes were asked for, or this is a route."); + } + return new EnvoyUserAPI(accessToken); + } + + /** + * Envoy API scoped to the plugin. + * Used to perform storage or job operations. + */ + get pluginAPI(): EnvoyPluginAPI { + const { pluginAccessToken } = this; + if (!pluginAccessToken) { + throw new Error('No API token found. Are your Envoy client ID and secret set?'); + } + return new EnvoyPluginAPI(pluginAccessToken); + } + + /** + * A function that returns an instance of EnvoyPluginStorage, + * optionally scoped to an install ID. + * + * Use {@link installStorage} or {@link globalStorage} instead of this directly. + */ + private get getStorage(): (installId?: string) => EnvoyPluginStorage { + return (installId?) => new EnvoyPluginStorage(this.pluginAPI, installId); + } + + /** + * Storage scoped to the install. + */ + get installStorage(): EnvoyPluginStorage { + const { install_id: installId } = this.meta as unknown as EnvoyMeta; + if (!installId) { + throw new Error('No install ID found in meta.'); + } + return this.getStorage(installId); + } + + /** + * Storage scoped globally (across installs). + */ + get globalStorage(): EnvoyPluginStorage { + return this.getStorage(); + } + + /** + * Returns a job based on an ID. + */ + get getJob(): (jobId: string) => EnvoyPluginJob { + return (jobId: string) => new EnvoyPluginJob(this.pluginAPI, jobId); + } + + /** + * Returns the current job's ID. + */ + get jobId(): string | null { + const { meta } = this; + if ('job' in meta) { + return (meta as unknown as EnvoyEventMeta).job.id; + } + return null; + } + + /** + * Perform operations on the current job. + */ + get job(): EnvoyPluginJob { + const { jobId } = this; + if (!jobId) { + throw new Error('No job found in meta. Are you in a worker?'); + } + return this.getJob(jobId); + } + + /** + * A utility to encode and decode JWTs. + * Useful for verifiable communications between plugin endpoints. + */ + // eslint-disable-next-line class-methods-use-this + get jwt(): EnvoyJWT { + return new EnvoyJWT(); + } +} diff --git a/src/sdk/EnvoyPluginStorage.ts b/src/sdk/EnvoyPluginStorage.ts new file mode 100644 index 0000000..828653f --- /dev/null +++ b/src/sdk/EnvoyPluginStorage.ts @@ -0,0 +1,83 @@ +import EnvoyPluginStoragePipeline from '../base/EnvoyPluginStoragePipeline'; +import { EnvoyStorageSetUniqueNumOptions, EnvoyStorageSetUniqueOptions } from '../internal/EnvoyStorageCommand'; +import EnvoyStorageItem from './EnvoyStorageItem'; +import EnvoyPluginAPI from './EnvoyPluginAPI'; + +/** + * A key-value storage that can be scoped to a specific install, + * or to the plugin itself. + * + * @category Storage + * @category Request Object + */ +export default class EnvoyPluginStorage { + protected readonly api: EnvoyPluginAPI; + + readonly installId: string | undefined; + + constructor(pluginAPI: EnvoyPluginAPI, installId?: string) { + this.api = pluginAPI; + this.installId = installId; + } + + /** + * Creates a new pipeline instance. + */ + pipeline(): EnvoyPluginStoragePipeline { + return new EnvoyPluginStoragePipeline(this.api, this.installId); + } + + /** + * Gets a single {@link EnvoyStorageItem} from storage. + * + * Wrapper for single pipeline get. + */ + get(key: string) { + return this.pipeline().get(key).executeSingle | { key: string, 'value': undefined }>(); + } + + /** + * Sets a single {@link EnvoyStorageItem} from storage. + * + * Wrapper for single pipeline set. + */ + set(key: string, value: Value) { + return this.pipeline().set(key, value).executeSingle>(); + } + + /** + * Sets a single unique string {@link EnvoyStorageItem} from storage. + * + * Wrapper for single pipeline setUnique. + */ + setUnique(key: string, options: EnvoyStorageSetUniqueOptions = {}) { + return this.pipeline().setUnique(key, options).executeSingle | { key: string, 'value': undefined }>(); + } + + /** + * Sets a single unique number {@link EnvoyStorageItem} from storage. + * + * Wrapper for single pipeline setUnique. + */ + setUniqueNum(key: string, options: EnvoyStorageSetUniqueNumOptions = {}) { + return this.pipeline().setUniqueNum(key, options).executeSingle | { key: string, 'value': undefined }>(); + } + + /** + * Unsets an {@link EnvoyStorageItem} from storage. Returns null if the item did not previously exist. + * + * Wrapper for single pipeline unset. + */ + unset(key: string) { + return this.pipeline().unset(key).executeSingle | { key: string, 'value': undefined }>(); + } + + /** + * Returns an array of {@link EnvoyStorageItem} from storage. + * + * Wrapper for single pipeline list. + */ + list(page = 1) { + return this.pipeline().list(page).executeSingle>>(); + } +} diff --git a/src/sdk/EnvoyRequest.ts b/src/sdk/EnvoyRequest.ts new file mode 100644 index 0000000..ff40004 --- /dev/null +++ b/src/sdk/EnvoyRequest.ts @@ -0,0 +1,145 @@ +import { Request } from 'express'; +import EnvoyPluginSDK from './EnvoyPluginSDK'; +import EnvoyMeta, { EnvoyEventMeta, EnvoyRouteMeta } from './EnvoyMeta'; +import EntryPayload from '../payloads/EntryPayload'; +import InvitePayload from '../payloads/InvitePayload'; +import LocationPayload from '../payloads/LocationPayload'; +import NotificationPayload from '../payloads/NotificationPayload'; +import EnvoyEntryEvent from '../internal/EnvoyEntryEvent'; +import EnvoyInviteEvent from '../internal/EnvoyInviteEvent'; +import EnvoyLocationEvent from '../internal/EnvoyLocationEvent'; +import EnvoyOptionsRouteResponseBody from '../internal/EnvoyOptionsRouteResponseBody'; +import EnvoyOptionsRouteParams from '../internal/EnvoyOptionsRouteParams'; +import EnvoySelectedValuesRouteResponseBody from '../internal/EnvoySelectedValuesRouteResponseBody'; +import EnvoySelectedValuesRouteParams from '../internal/EnvoySelectedValuesRouteParams'; +import EnvoyRemoteValueRouteResponseBody from '../internal/EnvoyRemoteValueRouteResponseBody'; + +/** + * @internal + */ +export const VERIFIED = Symbol('verified'); + +/** + * @internal + */ +export interface VerifiedRequest extends Request { + [VERIFIED]: boolean +} + +/** + * Base type for Envoy requests. + * You probably won't need to use this type directly. + * For routes, use {@link EnvoyRouteRequest}, + * and for events, use {@link EnvoyEntryEventRequest} or {@link EnvoyInviteEventRequest}. + * + * @category Base + */ +export interface EnvoyBaseRequest extends VerifiedRequest { + envoy: EnvoyPluginSDK +} + +/** + * Use to type your `req` object in Envoy route handlers such as validation URLs. + * + * @category Request + */ +export type EnvoyRouteRequest< + Payload = unknown, + Config = Record, + Params = Record, + > = EnvoyBaseRequest, Payload>; + +/** + * Use to type your `req` object in Envoy "migration" route handlers. + * + * @category Request + */ +export type EnvoyMigrationRouteRequest> = + EnvoyRouteRequest; + +/** + * Use to type your `req` object in Envoy "options URL" route handlers. + * + * @category Request + */ +export type EnvoyOptionsRouteRequest> = + EnvoyRouteRequest; + +/** + * Use to type your `req` object in Envoy "selected values URL" route handlers. + * + * @category Request + */ +export type EnvoySelectedValuesRouteRequest> = + EnvoyRouteRequest; + +/** + * Use to type your `req` object in Envoy "remote value URL" route handlers. + * + * @category Request + */ +export type EnvoyRemoteValueRouteRequest> = + EnvoyRouteRequest; + +/** + * Use to type your `req` object in Envoy "validation URL" route handlers. + * + * @category Request + */ +export type EnvoyValidationRouteRequest, Config = Record> = + EnvoyRouteRequest; + +/** + * Base type for event requests. + * You should use {@link EnvoyEntryEventRequest} or {@link EnvoyInviteEventRequest}. + * + * @category Request + */ +export type EnvoyEventRequest> = + EnvoyBaseRequest, Payload>; + +/** + * Use to type your `req` object in entry event handlers, + * such as handlers for `entry_sign_in`. + * + * @category Request + */ +export type EnvoyEntryEventRequest> = + EnvoyEventRequest; + +/** + * Use to type your `req` object in invite event handlers, + * such as handlers for `invite_created` or `upcoming_visit`. + * + * @category Request + */ +export type EnvoyInviteEventRequest> = + EnvoyEventRequest; + +/** + * Use to type your `req` object in location event handlers, + * such as handlers for `location_capacity_updated`. + * + * @category Request + */ +export type EnvoyLocationEventRequest> = + EnvoyEventRequest; + +/** + * Use to type your `req` object in your notification event handler. + * + * @category Request + */ +export type EnvoyNotificationEventRequest> = + EnvoyEventRequest; + +/** + * You probably won't need to use this type directly. + * For routes, use {@link EnvoyRouteRequest}, + * and for events, use {@link EnvoyEntryEventRequest} or {@link EnvoyInviteEventRequest}. + * + * @category Base + */ +type EnvoyRequest> = + EnvoyBaseRequest | EnvoyEventMeta, Payload>; +export default EnvoyRequest; diff --git a/src/sdk/EnvoyResponse.ts b/src/sdk/EnvoyResponse.ts new file mode 100644 index 0000000..bb4ccb7 --- /dev/null +++ b/src/sdk/EnvoyResponse.ts @@ -0,0 +1,46 @@ +import { Response } from 'express'; +import EnvoyPluginJobAttachment from './EnvoyPluginJobAttachment'; +import EnvoyOptionsRouteResponseBody from '../internal/EnvoyOptionsRouteResponseBody'; +import EnvoySelectedValuesRouteResponseBody from '../internal/EnvoySelectedValuesRouteResponseBody'; +import EnvoyRemoteValueRouteResponseBody from '../internal/EnvoyRemoteValueRouteResponseBody'; + +/** + * Use to type your `res` object in Envoy event handlers. + * @category Response + */ +export default interface EnvoyResponse extends Response { + send: (body?: Body) => this; + /** + * Marks the job as "ongoing". This is useful for long-running event handling. + * Later on, you should update the job using + * {@link EnvoyPluginJob.complete}, {@link EnvoyPluginJob.fail}, or {@link EnvoyPluginJob.ignore}. + */ + sendOngoing: (debugInfo?: unknown) => void; + /** + * Marks the job as "ignored". Useful when you explicitly do not want to handle the event. + */ + sendIgnored: (message: string, debugInfo?: unknown, ...attachments: Array) => void; + + /** + * Marks the job as "failed". The message will be communicated to the Envoy Dashboard user. + */ + sendFailed: (message: string, debugInfo?: unknown, ...attachments: Array) => void; +} + +/** + * Use to type your `res` object in Envoy "options URL" route handlers. + * @category Response + */ +export type EnvoyOptionsRouteResponse = EnvoyResponse; + +/** + * Use to type your `res` object in Envoy "remote value URL" route handlers. + * @category Response + */ +export type EnvoyRemoteValueRouteResponse = EnvoyResponse; + +/** + * Use to type your `res` object in Envoy "selected values URL" route handlers. + * @category Response + */ +export type EnvoySelectedValuesRouteResponse = EnvoyResponse; diff --git a/src/sdk/EnvoyStorageItem.ts b/src/sdk/EnvoyStorageItem.ts new file mode 100644 index 0000000..5238940 --- /dev/null +++ b/src/sdk/EnvoyStorageItem.ts @@ -0,0 +1,9 @@ +/** + * @category Storage + */ +type EnvoyStorageItem = { + key: string, + value: Value, +}; + +export default EnvoyStorageItem; diff --git a/src/sdk/EnvoyUserAPI.ts b/src/sdk/EnvoyUserAPI.ts new file mode 100644 index 0000000..c867520 --- /dev/null +++ b/src/sdk/EnvoyUserAPI.ts @@ -0,0 +1,377 @@ +import { Url } from 'url'; +import axios from 'axios'; +import EnvoyAPI from '../base/EnvoyAPI'; +import { AgreementPageModel } from '../resources/AgreementPageResource'; +import { AgreementModel } from '../resources/AgreementResource'; +import { CompanyModel } from '../resources/CompanyResource'; +import { EmployeeFilterFields, EmployeeModel, EmployeeSortFields } from '../resources/EmployeeResource'; +import { FlowFilterFields, FlowModel, FlowSortFields } from '../resources/FlowResource'; +import { LocationFilterFields, LocationModel, LocationSortFields } from '../resources/LocationResource'; +import { SignInFieldPageModel } from '../resources/SignInFieldPageResource'; +import { SignInFieldModel } from '../resources/SignInFieldResource'; +import JSONAPIPaginationParams from '../util/json-api/JSONAPIPaginationParams'; +import { + InviteCreationModel, InviteFilterFields, InviteModel, InviteSortFields, +} from '../resources/InviteResource'; +import { UserModel } from '../resources/UserResource'; +import { envoyBaseURL, envoyClientId, envoyClientSecret } from '../constants'; +import { EnvoyMetaAuth } from './EnvoyMeta'; +import { sanitizeAxiosError } from '../util/axiosConstructor'; +import { ReservationCreationAttributes, ReservationModel } from "../resources/ReservationResource"; + +export type EnvoyUserAPIScope = + 'flows.read' | + 'entries.read' | + 'entries.write' | + 'invites.read' | + 'invites.write' | + 'invites.attest' | + 'locations.read' | + 'companies.read' | + 'agreements.read' | + 'agreements.write' | + 'sign-in-field-pages.read' | + 'sign-in-fields.read' | + 'sign-in-fields.write' | + 'employees.read' | + 'employees.write' | + 'badges.read' | + 'blacklist-filters.read' | + 'blacklist-filters.write' | + 'tickets.read' | + 'tickets.write' | + 'spaces.read' | + 'reservations.read' | + 'reservations.write' | + string; + +/** + * API endpoints for *user-scoped* tokens. + * To access Envoy resources, this is the API you'd want. + * + * @category API + * @category Request Object + */ +export default class EnvoyUserAPI extends EnvoyAPI { + /** + * + * {@link AgreementPageModel} + */ + async getAgreementPage(id: string, include?: string): Promise { + return this.dataLoader.load({ type: 'agreement-pages', id, include }); + } + + /** + * Requires `agreements.read` scope. + */ + async getAgreement(id: string, include?: string): Promise { + return this.dataLoader.load({ type: 'agreements', id, include }); + } + + /** + * Requires `companies.read` scope. + */ + async getCompany(id: string, include?: string): Promise { + return this.dataLoader.load({ type: 'companies', id, include }); + } + + /** + * Requires `employees.read` scope. + */ + async getEmployee(id: string, include?: string): Promise { + return this.dataLoader.load({ type: 'employees', id, include }); + } + + /** + * Requires `flows.read` scope. + */ + async getFlow(id: string, include?: string): Promise { + return this.dataLoader.load({ type: 'flows', id, include }); + } + + /** + * Requires `locations.read` scope. + */ + async getLocation(id: string, include?: string): Promise { + return this.dataLoader.load({ type: 'locations', id, include }); + } + + /** + * Requires `sign-in-field-pages.read` scope. + */ + async getSignInFieldPage(id: string, include?: string): Promise { + return this.dataLoader.load({ type: 'sign-in-field-pages', id, include }); + } + + /** + * Requires `sign-in-fields.read` scope. + */ + async getSignInField(id: string, include?: string): Promise { + return this.dataLoader.load({ type: 'sign-in-fields', id, include }); + } + + /** + * Requires `employees.read` scope. + */ + async getEmployeeByEmail(email: string, include?: string): Promise { + const paginationParams: JSONAPIPaginationParams = { + filter: { + email, + }, + page: { + limit: 1, + }, + }; + const { data: { data: [employee] } } = await this.axios.get('/api/v3/employees', { + params: { + include, + ...paginationParams, + }, + }); + + return employee; + } + + /** + * Requires `employees.read` scope. + */ + async getEmployees( + params?: JSONAPIPaginationParams, + ): Promise> { + const { data } = await this.axios.get('/api/v3/employees', { params }); + return data.data; + } + + /** + * Requires `flows.read` scope. + */ + async getFlows(params?: JSONAPIPaginationParams): Promise> { + const { data } = await this.axios.get('/api/v3/flows', { params }); + return data.data; + } + + /** + * Requires `locations.read` scope. + */ + async getLocations( + params?: JSONAPIPaginationParams, + ): Promise> { + const { data } = await this.axios.get('/api/v3/locations', { params }); + return data.data; + } + + /** + * Requires `sign-in-fields.read` scope. + */ + async getSignInFields(signInFieldPageId: string): Promise> { + const { data } = await this.axios.get(`/api/v3/sign-in-field-pages/${signInFieldPageId}/sign-in-fields`); + return data.data; + } + + /** + * Requires `invites.read` scope. + */ + async getInvites( + params?: JSONAPIPaginationParams, + ): Promise> { + const { data } = await this.axios.get('/api/v3/invites', { params }); + return data.data; + } + + async me(): Promise { + const { data } = await this.axios.get('/api/v2/users/me'); + return data.data; + } + + /** + * Requires `invites.write` scope. + * May also require `invites.attest` scope if setting `attested: true`. + */ + async createInvite(invite: InviteCreationModel): Promise { + const { data } = await this.axios({ + method: 'POST', + url: '/api/v3/invites', + data: { data: invite }, + }); + return data.data; + } + + async createReservation(reservationDetails: ReservationCreationAttributes): Promise { + let createReservationBody = { + data: { + relationships: { + user: { + data: { + type: 'users', + id: reservationDetails.userId + }}, + ...(reservationDetails.locationId && { + location: { + data: { + type: 'locations', + id: reservationDetails.locationId + } + } + } + ) + }, + attributes: { + 'start-time': reservationDetails.startTime, + ...(reservationDetails.endTime && { + 'end-time': reservationDetails.endTime + }), + 'booking-source': 'EXTERNAL_API', + 'booking-type': 'visitor' + } + } + } + const { data } = await this.axios({ + method: 'POST', + url: '/a/rms/reservations', + data: createReservationBody, + }); + return data.data; + } + + /** + * Requires `invites.write` scope. + */ + async updateInvite(inviteId: string, invite: InviteCreationModel): Promise { + const { data } = await this.axios({ + method: 'PUT', + url: `/api/v3/invites/${inviteId}`, + data: { data: { ...invite, id: inviteId } }, + }); + + return data.data; + } + + /** + * Requires `invites.write` scope. + */ + async partialUpdateInvite(inviteId: string, invite: InviteCreationModel): Promise { + const { data } = await this.axios({ + method: 'PATCH', + url: `/api/v3/invites/${inviteId}`, + data: { data: { ...invite, id: inviteId } }, + }); + + return data.data; + } + + /** + * Requires `invites.write` scope. + */ + async removeInvite(inviteId: string): Promise { + await this.axios({ + method: 'DELETE', + url: `/api/v3/invites/${inviteId}`, + }); + } + + /** + * Builds the authorize URL to redirect a user to initiate the auth code oauth2 flow. + * + * Upon completion, they will be redirected to `redirectURL`, with a `code` query param in the url. + * + * Use the {@link loginAsUserWithCode} method to exchange that code for an access token. + */ + static getAuthorizeURL(redirectURL: string, scope: Array, clientId = envoyClientId): string { + const url = new URL(envoyBaseURL); + url.pathname = '/a/auth/v0/authorize'; + url.searchParams.append('response_type', 'code'); + url.searchParams.append('client_id', clientId); + url.searchParams.append('redirect_uri', redirectURL); + return `${url.href}&scope=${scope.join('+')}`; + } + + /** + * Gets a user access token using `password` as the grant type (discouraged - use {@link loginAsUserWithCode} below). + */ + static async loginAsUserWithPassword( + username: string, + password: string, + scope: Array, + clientId = envoyClientId, + clientSecret = envoyClientSecret, + ): Promise { + try { + const { data } = await axios({ + auth: { + username: clientId, + password: clientSecret, + }, + method: 'POST', + data: { + grant_type: 'password', + scope, + username, + password, + }, + url: '/a/auth/v0/token', + baseURL: envoyBaseURL, + }); + return data; + } catch (error) { + throw sanitizeAxiosError(error); + } + } + + /** + * Gets a user access token using `code` as the grant type. + */ + static async loginAsUserWithCode( + code: string, + scope: Array, + clientId = envoyClientId, + clientSecret = envoyClientSecret, + ): Promise { + try { + const { data } = await axios({ + auth: { + username: clientId, + password: clientSecret, + }, + method: 'POST', + data: { + grant_type: 'authorization_code', + scope, + code, + }, + url: '/a/auth/v0/token', + baseURL: envoyBaseURL, + }); + return data; + } catch (error) { + throw sanitizeAxiosError(error); + } + } + + /** + * Gets a user access token using `plugin_install` as the grant type. + */ + static async loginAsPluginInstaller( + installId: string, + clientId = envoyClientId, + clientSecret = envoyClientSecret, + ): Promise { + try { + const { data } = await axios({ + auth: { + username: clientId, + password: clientSecret, + }, + method: 'POST', + data: { + grant_type: 'plugin_install', + install_id: installId, + }, + url: '/a/auth/v0/token', + baseURL: envoyBaseURL, + }); + return data; + } catch (error) { + throw sanitizeAxiosError(error); + } + } +} diff --git a/src/sdk/filters.ts b/src/sdk/filters.ts new file mode 100644 index 0000000..343b95c --- /dev/null +++ b/src/sdk/filters.ts @@ -0,0 +1,96 @@ +import { + Request, + Response, + NextFunction, + RequestHandler, +} from 'express'; +import EnvoyRequest, { EnvoyEntryEventRequest } from './EnvoyRequest'; +import EnvoyResponse from './EnvoyResponse'; + +/** + * Will only proceed if the install's `config` has a truthy value for the given `key`. + * + * @internal + */ +export function booleanFilterMiddleware(key: keyof Config, message: string): RequestHandler { + return (req: Request, res: Response, next: NextFunction): void => { + if ((req as EnvoyRequest).envoy.meta.config[key]) { + return next(); + } + (res as EnvoyResponse).sendIgnored(message); + }; +} + +/** + * Will only proceed if the install's `config` has a truthy value for the given `employeeSignInEnabledKey`. + * + * @category Filter + * @category Middleware + */ +export function employeeSignInEnabledFilterMiddleware( + employeeSignInEnabledKey: keyof Config, + message = 'Envoy Protect is disabled.', +): RequestHandler { + return booleanFilterMiddleware(employeeSignInEnabledKey, message); +} + +/** + * Will not proceed if the employee who's signing in is present in the excluded employees list. + * + * @category Filter + * @category Middleware + */ +export function excludedEmployeesFilterMiddleware( + excludeEmployeesKey: keyof Config, + message = 'Employee excluded from integration.', +): RequestHandler { + return (req: Request, res: Response, next: NextFunction): void => { + const { + envoy: { + meta: { + config, + }, + payload, + }, + } = req as EnvoyEntryEventRequest; + if (!payload.attributes['employee-screening-flow']) { + return next(); + } + const excludedEmployees = config[excludeEmployeesKey] as unknown as Array || []; + if (!Array.isArray(excludedEmployees)) { + return next(new Error(`${excludeEmployeesKey} is not an array.`)); + } + const employeeId = payload.relationships.employee?.data.id; + if (!employeeId || !excludedEmployees.includes(employeeId)) { + return next(); + } + (res as EnvoyResponse).sendIgnored(message); + }; +} + +/** + * Will only proceed if the entry has an invite + * and the install's `config` has a truthy value for the given `invitesOnlyKey`. + * + * @category Filter + * @category Middleware + */ +export function inviteOnlyEntryFilterMiddleware( + invitesOnlyKey: keyof Config, + message = 'Visitors must be invited.', +): RequestHandler { + return (req: Request, res: Response, next: NextFunction): void => { + const { + envoy: { + meta: { + config, + }, + payload, + }, + } = (req as EnvoyEntryEventRequest); + if (!payload.relationships.invite && config[invitesOnlyKey]) { + return (res as EnvoyResponse).sendIgnored(message); + } + next(); + }; +} diff --git a/src/sdk/handlers.ts b/src/sdk/handlers.ts new file mode 100644 index 0000000..5636e72 --- /dev/null +++ b/src/sdk/handlers.ts @@ -0,0 +1,234 @@ +import { + NextFunction, + RequestHandler, + Request, + Response, +} from 'express'; +import { + EnvoyEntryEventRequest, + EnvoyEventRequest, + EnvoyInviteEventRequest, + EnvoyLocationEventRequest, + EnvoyMigrationRouteRequest, + EnvoyNotificationEventRequest, + EnvoyOptionsRouteRequest, + EnvoyRemoteValueRouteRequest, + EnvoySelectedValuesRouteRequest, + EnvoyValidationRouteRequest, +} from './EnvoyRequest'; +import EnvoyResponse, { + EnvoyOptionsRouteResponse, + EnvoyRemoteValueRouteResponse, + EnvoySelectedValuesRouteResponse, +} from './EnvoyResponse'; + +type SomeObject = Record; + +type Result = Promise | void; + +/** + * Handle an entry event, such as `entry_sign_in`. + * @category Handler + */ +export type EntryEventHandler = + (req: EnvoyEntryEventRequest & Additions, res: EnvoyResponse) => Result; + +/** + * Handle an invite event, such as `invite_created`. + * @category Handler + */ +export type InviteEventHandler = + (req: EnvoyInviteEventRequest & Additions, res: EnvoyResponse) => Result; + +/** + * Handle an location event, such as `location_capacity_updated`. + * @category Handler + */ +export type LocationEventHandler = + (req: EnvoyLocationEventRequest & Additions, res: EnvoyResponse) => Result; + +/** + * Handle an notification event. + * @category Handler + */ +export type NotificationEventHandler = + (req: EnvoyNotificationEventRequest & Additions, res: EnvoyResponse) => Result; + +/** + * Handle a `plugin_uninstalled` event for cleaning up. + * @category Handler + */ +export type PluginUninstalledEventHandler = + (req: EnvoyEventRequest<'plugin_uninstalled', never, Config> & Additions, res: EnvoyResponse) => Result; + +/** + * Handle a "migration" route. + * @category Handler + */ +export type MigrationRouteHandler = + (req: EnvoyMigrationRouteRequest & Additions, res: EnvoyResponse) => Result; + +/** + * Handle an "options" route. + * @category Handler + */ +export type OptionsRouteHandler = + (req: EnvoyOptionsRouteRequest & Additions, res: EnvoyOptionsRouteResponse) => Result; + +/** + * Handle a "remote value" route. + * @category Handler + */ +export type RemoteValueRouteHandler = + (req: EnvoyRemoteValueRouteRequest & Additions, res: EnvoyRemoteValueRouteResponse) => Result; + +/** + * Handle a "selected values" route. + * @category Handler + */ +export type SelectedValuesRouteHandler = + (req: EnvoySelectedValuesRouteRequest & Additions, res: EnvoySelectedValuesRouteResponse) => Result; + +/** + * Handle a "validation" route. + * @category Handler + */ +export type ValidationRouteHandler = + (req: EnvoyValidationRouteRequest & Additions, res: EnvoyResponse>) => Result; + +/** + * Wraps any express.js-based handlers + * to catch Promise-based errors. + * + * @category Handler + */ +// eslint-disable-next-line max-len +export function asyncHandler(handler: (req: Req, res: Res) => Result): RequestHandler { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + return (req: Req, res: Res, next: NextFunction): void => { + void Promise.resolve().then(() => handler(req, res)).catch(next); + }; +} + +/** + * Handler for entry events. + * + * @category Handler + */ +export function entryEventHandler< + Config = SomeObject, + Additions = SomeObject, + >(handler: EntryEventHandler) { + return asyncHandler(handler); +} + +/** + * Handler for invite events. + * + * @category Handler + */ +export function inviteEventHandler< + Config = SomeObject, + Additions = SomeObject, + >(handler: InviteEventHandler) { + return asyncHandler(handler); +} + +/** + * Handler for location events. + * + * @category Handler + */ +export function locationEventHandler< + Config = SomeObject, + Additions = SomeObject, + >(handler: LocationEventHandler) { + return asyncHandler(handler); +} + +/** + * Handler for a migration route. + * + * @category Handler + */ +export function migrationRouteHandler< + OldConfig, + NewConfig, + Additions = SomeObject, + >(handler: MigrationRouteHandler) { + return asyncHandler(handler); +} + +/** + * Handler for notification events. + * + * @category Handler + */ +export function notificationEventHandler< + Config = SomeObject, + Additions = SomeObject, + >(handler: NotificationEventHandler) { + return asyncHandler(handler); +} + +/** + * Handler for options URL routes. + * + * @category Handler + */ +export function optionsRouteHandler< + Config = SomeObject, + Additions = SomeObject, + >(handler: OptionsRouteHandler) { + return asyncHandler(handler); +} + +/** + * Handler for `plugin_uninstalled` events. + * + * @category Handler + */ +export function pluginUninstalledEventHandler< + Config = SomeObject, + Additions = SomeObject, + >(handler: PluginUninstalledEventHandler) { + return asyncHandler(handler); +} + +/** + * Handler for remote value URL routes. + * + * @category Handler + */ +export function remoteValueRouteHandler< + Config = SomeObject, + Additions = SomeObject, + >(handler: RemoteValueRouteHandler) { + return asyncHandler(handler); +} + +/** + * Handler for selected values URL routes. + * + * @category Handler + */ +export function selectedValuesRouteHandler< + Config = SomeObject, + Additions = SomeObject, + >(handler: SelectedValuesRouteHandler) { + return asyncHandler(handler); +} + +/** + * Handler for validation URL routes. + * + * @category Handler + */ +export function validationRouteHandler< + Config = SomeObject, + Payload = SomeObject, + Additions = SomeObject, + >(handler: ValidationRouteHandler) { + return asyncHandler(handler); +} diff --git a/src/sdk/loggers.ts b/src/sdk/loggers.ts new file mode 100644 index 0000000..09193b3 --- /dev/null +++ b/src/sdk/loggers.ts @@ -0,0 +1,165 @@ +import { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'; +import chalk from 'chalk'; +import util from 'util'; + +function envoyAxiosRequestLogger(config: AxiosRequestConfig) { + const log = console.log; + log('---------------- Axios Request ----------------\n'); + if (config?.method) { + const boldMethodText = chalk.bold('Method:'); + const method = config.method.toUpperCase(); + switch (method) { + case 'GET': + log(`${boldMethodText} ${chalk.green(method)}\n`); + break; + case 'PUT': + log(`${boldMethodText} ${chalk.yellow(method)}\n`); + break; + case 'PATCH': + log(`${boldMethodText} ${chalk.yellow(method)}\n`); + break; + case 'POST': + log(`${boldMethodText} ${chalk.blue(method)}\n`); + break; + case 'DELETE': + log(`${boldMethodText} ${chalk.red(method)}\n`); + break; + default: + log(`${boldMethodText} ${method}\n`); + break; + }; + } + if (config?.baseURL && config?.url) { + log(`${chalk.bold('URL')}: ${config.baseURL}/${config.url}\n`); + } + + if (config?.headers) { + log(`${chalk.bold('Headers:')} ${util.inspect(config?.headers)}\n`); + } + + if (config?.auth) { + log(`${chalk.bold('Auth:')} ${util.inspect(config?.auth)}\n`); + } + + if (config?.params) { + log(`${chalk.bold('Params:')} ${util.inspect(config?.params)}\n`); + } + + if (config?.data) { + log(`${chalk.bold('Request Data:')} ${util.inspect(config?.data)}\n`); + } + + log('------------ End Of Axios Request ------------\n'); + + return config; +} + +function envoyAxiosResponseLogger(response: AxiosResponse) { + const log = console.log; + log('---------------- Axios Response ----------------\n'); + if (response?.request?.method) { + const boldMethodText = chalk.bold('Method:'); + const method = response.request.method; + switch (method) { + case 'GET': + log(`${boldMethodText} ${chalk.green(method)}\n`); + break; + case 'PUT': + log(`${boldMethodText} ${chalk.yellow(method)}\n`); + break; + case 'PATCH': + log(`${boldMethodText} ${chalk.yellow(method)}\n`); + break; + case 'POST': + log(`${boldMethodText} ${chalk.blue(method)}\n`); + break; + case 'DELETE': + log(`${boldMethodText} ${chalk.red(method)}\n`); + break; + default: + log(`${boldMethodText} ${method}\n`); + break; + }; + } + if (response?.request?.baseURL && response?.request?.url) { + log(`${chalk.bold('Request URL')}: ${response.request.baseURL}/${response.request.url}\n`); + } + + if (response?.status && response?.statusText) { + const boldStatusTitle = chalk.bold('Status:'); + const boldStatusTextTitle = chalk.bold('Status Text:'); + const status = response.status; + const statusText = response.statusText; + if (199 < status && status < 300) { + log(`${boldStatusTitle} ${chalk.green(status)}\n`); + log(`${boldStatusTextTitle} ${chalk.green(statusText)}\n`); + } else { + log(`${boldStatusTitle} ${chalk.red(status)}\n`); + log(`${boldStatusTextTitle} ${chalk.red(statusText)}\n`); + } + } + + if (response?.data) { + log(`${chalk.bold('Response Data:')} ${util.inspect(response?.data)}\n`); + } + + log('------------ End Of Axios Response ------------\n'); + + return response; +} + +function envoyAxiosErrorLogger(error: AxiosError) { + const log = console.log; + log('---------------- Axios Error ----------------\n'); + if (error?.request?.method) { + const boldMethodText = chalk.bold('Method:'); + const method = error.request.method; + switch (method) { + case 'GET': + log(`${boldMethodText} ${chalk.green(method)}\n`); + break; + case 'PUT': + log(`${boldMethodText} ${chalk.yellow(method)}\n`); + break; + case 'PATCH': + log(`${boldMethodText} ${chalk.yellow(method)}\n`); + break; + case 'POST': + log(`${boldMethodText} ${chalk.blue(method)}\n`); + break; + case 'DELETE': + log(`${boldMethodText} ${chalk.red(method)}\n`); + break; + default: + log(`${boldMethodText} ${method}\n`); + break; + }; + } + if (error?.request?.baseURL && error?.request?.url) { + log(`${chalk.bold('Request URL')}: ${error.request.baseURL}/${error.request.url}\n`); + } + + if (error?.response?.status && error?.response?.statusText) { + const boldStatusTitle = chalk.bold('Status:'); + const boldStatusTextTitle = chalk.bold('Status Text:'); + const status = error.response.status; + const statusText = error.response.statusText; + if (199 < status && status < 300) { + log(`${boldStatusTitle} ${chalk.green(status)}\n`); + log(`${boldStatusTextTitle} ${chalk.green(statusText)}\n`); + } else { + log(`${boldStatusTitle} ${chalk.red(status)}\n`); + log(`${boldStatusTextTitle} ${chalk.red(statusText)}\n`); + } + } + + if (error.response?.data) { + log(`${chalk.bold('Response Data:')} ${util.inspect(error.response.data)}\n`); + } + + log('------------ End Of Axios Error ------------\n'); + + throw error; +} + +export { envoyAxiosRequestLogger, envoyAxiosResponseLogger, envoyAxiosErrorLogger }; \ No newline at end of file diff --git a/src/sdk/middleware.ts b/src/sdk/middleware.ts new file mode 100644 index 0000000..bb3182e --- /dev/null +++ b/src/sdk/middleware.ts @@ -0,0 +1,101 @@ +import bodyParser from 'body-parser'; +import { + Request, + Response, + NextFunction, + ErrorRequestHandler, + RequestHandler, +} from 'express'; + +import HttpStatus from '../internal/HttpStatus'; +import EnvoySignatureVerifier, { EnvoySignatureVerifierOptions } from '../util/EnvoySignatureVerifier'; +import EnvoyRequest, { VERIFIED, VerifiedRequest } from './EnvoyRequest'; +import EnvoyResponse from './EnvoyResponse'; +import EnvoyPluginJobAttachment from './EnvoyPluginJobAttachment'; +import EnvoyPluginSDK from './EnvoyPluginSDK'; +import EnvoyPluginAPI from './EnvoyPluginAPI'; + +/** + * Sets up an {@link EnvoyPluginSDK} object in the path `req.envoy`. + * Modifies the `res` object to include Envoy's helpers, per {@link EnvoyResponse}. + * + * Also verifies that the request is coming from Envoy, + * as well as managing the plugin access token lifecycle. + * + * @category Middleware + */ +export function envoyMiddleware(options?: EnvoySignatureVerifierOptions): RequestHandler { + const signatureVerifier = new EnvoySignatureVerifier(options); + const verify = (req: VerifiedRequest, res: Response, rawBody: Buffer) => { + req[VERIFIED] = signatureVerifier.verify(req, rawBody); + }; + const json = bodyParser.json({ verify }); + let accessToken: string | null = null; + let threshold = 0; + + return (req: Request, res: Response, next: NextFunction) => { + json(req, res, async (err) => { + if (err) { + return next(err); + } + try { + const now = Date.now(); + if (now > threshold) { + const { access_token: rawAccessToken, expires_in: expiresIn } = await EnvoyPluginAPI.loginAsPlugin(); + accessToken = rawAccessToken; + threshold = now + (expiresIn * 1000) - (1000 * 60 * 10); + } + const envoyRequest = req as EnvoyRequest; + const envoyResponse = res as EnvoyResponse; + envoyRequest.envoy = new EnvoyPluginSDK(envoyRequest.body, envoyRequest[VERIFIED], accessToken); + + /** + * Respond with "ongoing" for long jobs. + */ + envoyResponse.sendOngoing = (message = '', debugInfo: unknown = {}) => { + envoyResponse.statusCode = HttpStatus.ONGOING; + envoyResponse.setHeader('Content-Type', 'application/json'); + envoyResponse.end(JSON.stringify({ message, debugInfo })); + }; + + /** + * Respond with "ignored" if no action will be performed. + */ + envoyResponse.sendIgnored = (message = '', debugInfo: unknown = {}, ...attachments: Array) => { + envoyResponse.statusCode = HttpStatus.IGNORED; + envoyResponse.setHeader('Content-Type', 'application/json'); + envoyResponse.end(JSON.stringify({ message, debugInfo, attachments })); + }; + + /** + * Respond with "failed" in case of errors. + */ + envoyResponse.sendFailed = (message = '', debugInfo: unknown = {}, ...attachments: Array) => { + envoyResponse.statusCode = HttpStatus.FAILED; + envoyResponse.setHeader('Content-Type', 'application/json'); + envoyResponse.end(JSON.stringify({ message, debugInfo, attachments })); + }; + next(); + } catch (error) { + next(error); + } + }); + }; +} + +/** + * Catches errors and sets the proper status code. + * + * @category Middleware + */ +export function errorMiddleware(onError: (err: Error) => void = () => {}): ErrorRequestHandler { + return (err: Error, req: Request, res: Response, next: NextFunction): void => { + onError(err); + if (res.headersSent) { + return next(err); + } + res.statusCode = HttpStatus.UNEXPECTED_FAILURE; + res.setHeader('Content-Type', 'application/json'); + res.end(JSON.stringify({ message: err.message })); + }; +} diff --git a/src/util/EnvoyJWT.ts b/src/util/EnvoyJWT.ts new file mode 100644 index 0000000..22eee55 --- /dev/null +++ b/src/util/EnvoyJWT.ts @@ -0,0 +1,51 @@ +import jwt, { SignOptions, Algorithm, VerifyOptions } from 'jsonwebtoken'; +import { jwtSecret } from '../constants'; + +export type EnvoyJWTAlgorithm = Algorithm; +export type EnvoyJWTDecodeOptions = VerifyOptions; +/** + * Helper to encode and decode JWTs. + * + * @category Helper + * @category Request Object + */ +export default class EnvoyJWT { + private secret: string; + + private algorithm: Algorithm; + + constructor(secret = jwtSecret, algorithm: EnvoyJWTAlgorithm = 'HS256') { + if (!secret) { + throw new Error('JWT secret missing. Have you set the `JWT_SECRET` environment variable?'); + } + this.secret = secret; + this.algorithm = algorithm; + } + + encode( + subject: string | number | null, + expiresIn: string | number | null, + payload: Record = {}, + ): string { + const { secret, algorithm } = this; + const options: SignOptions = { algorithm }; + if (subject) { + options.subject = `${subject}`; + } + if (expiresIn) { + options.expiresIn = expiresIn; + } + + return jwt.sign(payload, secret, options); + } + + decode(token: string, options: EnvoyJWTDecodeOptions = {}): Record { + const { secret, algorithm } = this; + return jwt.verify(token, secret, { + ignoreExpiration: false, + ignoreNotBefore: false, + ...options, + algorithms: [algorithm], // force the algorithm + }) as Record; + } +} diff --git a/src/util/EnvoySignatureVerifier.ts b/src/util/EnvoySignatureVerifier.ts new file mode 100644 index 0000000..a61c9ff --- /dev/null +++ b/src/util/EnvoySignatureVerifier.ts @@ -0,0 +1,61 @@ +import crypto, { BinaryToTextEncoding } from 'crypto'; +import { Request } from 'express'; +import { envoyClientSecret } from '../constants'; + +/** + * @category Helper + */ +export type EnvoySignatureVerifierOptions = { + algorithm: 'sha256' | string, + encoding: BinaryToTextEncoding, + secret: string, + header: 'x-envoy-signature' | string, +}; + +const defaultOptions: EnvoySignatureVerifierOptions = { + algorithm: 'sha256', + encoding: 'base64', + secret: envoyClientSecret, + header: 'x-envoy-signature', +}; + +/** + * Verifies that a request is coming from Envoy. + * + * @category Helper + */ +export default class EnvoySignatureVerifier { + private readonly options: EnvoySignatureVerifierOptions; + + constructor(options: EnvoySignatureVerifierOptions = defaultOptions) { + this.options = { ...defaultOptions, ...options }; + + if (!this.options.secret) { + throw new Error('No client secret found in the ENVOY_CLIENT_SECRET environment variable.'); + } + } + + /** + * Verifies that the signature provided matches the request body. + */ + verify(req: Request, rawBody: Buffer): boolean { + const { + algorithm, + encoding, + secret, + header, + } = this.options; + + if (!req.headers[header]) { + return false; + } + const receivedDigest = req.headers[header] as string; + const computedHmac = crypto.createHmac(algorithm, secret); + computedHmac.update(rawBody); + + return crypto.timingSafeEqual( + Buffer.from(receivedDigest), + Buffer.from(computedHmac.digest(encoding)), + ); + } +} diff --git a/src/util/axiosConstructor.ts b/src/util/axiosConstructor.ts new file mode 100644 index 0000000..c0ba3e1 --- /dev/null +++ b/src/util/axiosConstructor.ts @@ -0,0 +1,46 @@ +import axios, { AxiosError, AxiosHeaders, AxiosInstance, AxiosRequestConfig } from 'axios'; +import { ensureError } from './errorHandling'; + +export function sanitizeAxiosError(error: unknown): Error { + if (!axios.isAxiosError(error)) { + return ensureError(error); + } + + const safeError = new AxiosError( + error.message, + error.code, + { + url: error.config?.url, + method: error.config?.method, + baseURL: error.config?.baseURL, + headers: new AxiosHeaders(), + }, + { + url: error.request?.url, + method: error.request?.method, + baseURL: error.request?.baseURL, + data: error.request?.data, + }, + { + data: error.response?.data, + status: error.response?.status ?? 0, + statusText: error.response?.statusText ?? '', + headers: new AxiosHeaders(), + config: { + headers: new AxiosHeaders(), + }, + }, + ); + safeError.stack = error.stack; + return safeError; +} + +export function createAxiosClient(config?: AxiosRequestConfig | undefined): AxiosInstance { + const client = axios.create(config); + client.interceptors.response.use( + (response) => response, + (error) => Promise.reject(sanitizeAxiosError(error)), + ); + + return client; +} diff --git a/src/util/errorHandling.ts b/src/util/errorHandling.ts new file mode 100644 index 0000000..1f940fa --- /dev/null +++ b/src/util/errorHandling.ts @@ -0,0 +1,15 @@ +export function ensureError(value: unknown): Error { + if (value instanceof Error) { + return value; + } + + let stringified = '[Unable to stringify the thrown value]'; + try { + stringified = JSON.stringify(value); + } catch { + // ignore + } + + const error = new Error(`This value was thrown as is, not through an Error: ${stringified}`); + return error; +} diff --git a/src/util/json-api/JSONAPIData.ts b/src/util/json-api/JSONAPIData.ts new file mode 100644 index 0000000..3d8395a --- /dev/null +++ b/src/util/json-api/JSONAPIData.ts @@ -0,0 +1,4 @@ +export default interface JSONAPIData { + id: ID; + type: Type; +} diff --git a/src/util/json-api/JSONAPIFilterParams.ts b/src/util/json-api/JSONAPIFilterParams.ts new file mode 100644 index 0000000..754b1c7 --- /dev/null +++ b/src/util/json-api/JSONAPIFilterParams.ts @@ -0,0 +1,5 @@ +import JSONAPIParams from './JSONAPIParams'; + +export default interface JSONAPIFilterParams extends JSONAPIParams { + filter?: FilterFields; +} diff --git a/src/util/json-api/JSONAPIModel.ts b/src/util/json-api/JSONAPIModel.ts new file mode 100644 index 0000000..e172bf5 --- /dev/null +++ b/src/util/json-api/JSONAPIModel.ts @@ -0,0 +1,11 @@ +import JSONAPIData from './JSONAPIData'; + +export default interface JSONAPIModel + extends JSONAPIData { + attributes: Attributes; + relationships: { + [key in Relationships]: { + data: JSONAPIData | Array | null; + }; + }; +} diff --git a/src/util/json-api/JSONAPIPaginationParams.ts b/src/util/json-api/JSONAPIPaginationParams.ts new file mode 100644 index 0000000..1432eaf --- /dev/null +++ b/src/util/json-api/JSONAPIPaginationParams.ts @@ -0,0 +1,12 @@ +import JSONAPIFilterParams from './JSONAPIFilterParams'; + +export default interface JSONAPIPaginationParams + extends JSONAPIFilterParams { + + page?: { + offset?: number; + limit?: number; + } + + sort?: SortFields; +} diff --git a/src/util/json-api/JSONAPIParams.ts b/src/util/json-api/JSONAPIParams.ts new file mode 100644 index 0000000..16f42b6 --- /dev/null +++ b/src/util/json-api/JSONAPIParams.ts @@ -0,0 +1,3 @@ +export default interface JSONAPIParams { + include?: string; +} diff --git a/src/util/json-api/JSONAPIResponse.ts b/src/util/json-api/JSONAPIResponse.ts new file mode 100644 index 0000000..0b20c90 --- /dev/null +++ b/src/util/json-api/JSONAPIResponse.ts @@ -0,0 +1,5 @@ +export default interface JSONAPIResponse { + data: Model, + included?: Array, + meta?: Array +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..5118a0a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,78 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ + "declaration": true, /* Generates corresponding '.d.ts' file. */ + "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "dist", /* Redirect output structure to the directory. */ + "rootDir": "src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true, /* Skip type checking of declaration files. */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "node_modules", + "dist" + ] +} diff --git a/typedoc.json b/typedoc.json new file mode 100644 index 0000000..1dda9f4 --- /dev/null +++ b/typedoc.json @@ -0,0 +1,10 @@ +{ + "entryPoints": ["./src/index.ts"], + "out": "docs", + "excludePrivate": true, + "excludeProtected": true, + "excludeExternals": true, + "excludeInternal": true, + "categorizeByGroup": true, + "readme": "none" +}