From 7400ed8896fdceda6165a0540413efb4e3a47438 Mon Sep 17 00:00:00 2001 From: Gao Sun Date: Fri, 27 May 2022 15:43:42 +0800 Subject: [PATCH] feat(connector): apple (#966) * feat(connector): apple * feat(connector): apple * fix(connector): test * refactor(connector): per review * refactor(connector): update issue number Co-authored-by: Xiao Yijun --- packages/connector-apple/README.md | 2 + .../connector-apple/docs/config-template.md | 6 + packages/connector-apple/jest.config.ts | 8 + packages/connector-apple/logo.svg | 3 + packages/connector-apple/package.json | 59 ++++ packages/connector-apple/src/constant.ts | 40 +++ packages/connector-apple/src/index.test.ts | 61 ++++ packages/connector-apple/src/index.ts | 86 +++++ packages/connector-apple/src/mock.ts | 4 + packages/connector-apple/src/types.ts | 26 ++ packages/connector-apple/tsconfig.base.json | 10 + packages/connector-apple/tsconfig.build.json | 5 + packages/connector-apple/tsconfig.json | 7 + packages/connector-apple/tsconfig.test.json | 7 + packages/connector-types/src/index.ts | 16 +- packages/console/package.json | 8 +- .../src/pages/ConnectorDetails/index.tsx | 3 +- packages/core/package.json | 1 + packages/core/src/connectors/consts.ts | 1 + packages/core/src/connectors/index.test.ts | 24 +- packages/ui/package.json | 9 +- packages/ui/src/App.tsx | 8 +- .../SocialSignInDropdown/index.tsx | 4 +- .../SocialSignInIconList/index.tsx | 2 +- .../SocialSignIn/SocialSignInList/index.tsx | 2 +- packages/ui/src/hooks/use-apple-auth.ts | 92 +++++ packages/ui/src/hooks/use-social.ts | 11 +- packages/ui/src/utils/index.ts | 8 +- packages/ui/src/utils/sign-in-experience.ts | 9 + pnpm-lock.yaml | 334 +++++++++++++++++- 30 files changed, 813 insertions(+), 43 deletions(-) create mode 100644 packages/connector-apple/README.md create mode 100644 packages/connector-apple/docs/config-template.md create mode 100644 packages/connector-apple/jest.config.ts create mode 100644 packages/connector-apple/logo.svg create mode 100644 packages/connector-apple/package.json create mode 100644 packages/connector-apple/src/constant.ts create mode 100644 packages/connector-apple/src/index.test.ts create mode 100644 packages/connector-apple/src/index.ts create mode 100644 packages/connector-apple/src/mock.ts create mode 100644 packages/connector-apple/src/types.ts create mode 100644 packages/connector-apple/tsconfig.base.json create mode 100644 packages/connector-apple/tsconfig.build.json create mode 100644 packages/connector-apple/tsconfig.json create mode 100644 packages/connector-apple/tsconfig.test.json create mode 100644 packages/ui/src/hooks/use-apple-auth.ts diff --git a/packages/connector-apple/README.md b/packages/connector-apple/README.md new file mode 100644 index 000000000..affc4d329 --- /dev/null +++ b/packages/connector-apple/README.md @@ -0,0 +1,2 @@ +### Apple Social Connector README +placeholder diff --git a/packages/connector-apple/docs/config-template.md b/packages/connector-apple/docs/config-template.md new file mode 100644 index 000000000..6e9deec3a --- /dev/null +++ b/packages/connector-apple/docs/config-template.md @@ -0,0 +1,6 @@ +```json +{ + "clientId": "", + "clientSecret": "" +} +``` diff --git a/packages/connector-apple/jest.config.ts b/packages/connector-apple/jest.config.ts new file mode 100644 index 000000000..431024545 --- /dev/null +++ b/packages/connector-apple/jest.config.ts @@ -0,0 +1,8 @@ +import { Config, merge } from '@silverhand/jest-config'; + +const config: Config.InitialOptions = merge({ + testEnvironment: 'node', + setupFilesAfterEnv: ['jest-matcher-specific-error'], +}); + +export default config; diff --git a/packages/connector-apple/logo.svg b/packages/connector-apple/logo.svg new file mode 100644 index 000000000..af829b32d --- /dev/null +++ b/packages/connector-apple/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/connector-apple/package.json b/packages/connector-apple/package.json new file mode 100644 index 000000000..08b166697 --- /dev/null +++ b/packages/connector-apple/package.json @@ -0,0 +1,59 @@ +{ + "name": "@logto/connector-apple", + "version": "0.1.0", + "description": "Apple web connector implementation.", + "main": "./lib/index.js", + "exports": "./lib/index.js", + "author": "Silverhand Inc. ", + "license": "MPL-2.0", + "files": [ + "lib", + "docs", + "logo.svg" + ], + "private": false, + "scripts": { + "preinstall": "npx only-allow pnpm", + "precommit": "lint-staged", + "build": "rm -rf lib/ && tsc -p tsconfig.build.json", + "lint": "eslint --ext .ts src", + "lint:report": "pnpm lint --format json --output-file report.json", + "dev": "rm -rf lib/ && tsc-watch -p tsconfig.build.json --preserveWatchOutput --onSuccess \"node ./lib/index.js\"", + "test": "jest", + "test:coverage": "jest --coverage --silent", + "prepack": "pnpm build" + }, + "dependencies": { + "@logto/connector-types": "^0.1.0", + "@silverhand/jest-config": "^0.14.0", + "@logto/shared": "^0.1.0", + "@logto/schemas": "^0.1.0", + "@silverhand/essentials": "^1.1.0", + "got": "^11.8.2", + "jose": "^4.3.8", + "zod": "^3.14.3" + }, + "devDependencies": { + "@jest/types": "^27.5.1", + "@silverhand/eslint-config": "^0.14.0", + "@silverhand/ts-config": "^0.14.0", + "@types/jest": "^27.4.1", + "@types/node": "^16.3.1", + "eslint": "^8.10.0", + "jest": "^27.5.1", + "jest-matcher-specific-error": "^1.0.0", + "lint-staged": "^12.0.0", + "nock": "^13.2.2", + "prettier": "^2.3.2", + "ts-jest": "^27.1.1", + "tsc-watch": "^5.0.0", + "typescript": "^4.6.2" + }, + "engines": { + "node": "^16.0.0" + }, + "eslintConfig": { + "extends": "@silverhand" + }, + "prettier": "@silverhand/eslint-config/.prettierrc" +} diff --git a/packages/connector-apple/src/constant.ts b/packages/connector-apple/src/constant.ts new file mode 100644 index 000000000..936beb1f6 --- /dev/null +++ b/packages/connector-apple/src/constant.ts @@ -0,0 +1,40 @@ +import path from 'path'; + +import { ConnectorMetadata, ConnectorType, ConnectorPlatform } from '@logto/connector-types'; +import { getFileContents } from '@logto/shared'; + +// https://appleid.apple.com/.well-known/openid-configuration +export const issuer = 'https://appleid.apple.com'; +export const authorizationEndpoint = `${issuer}/auth/authorize`; +export const accessTokenEndpoint = `${issuer}/auth/token`; +export const jwksUri = `${issuer}/auth/keys`; + +// Note: only support fixed scope for v1. +export const scope = ''; // Note: `openid` is required when adding more scope(s) + +// eslint-disable-next-line unicorn/prefer-module +const currentPath = __dirname; +const pathToReadmeFile = path.join(currentPath, '..', 'README.md'); +const pathToConfigTemplate = path.join(currentPath, '..', 'docs', 'config-template.md'); +const readmeContentFallback = 'Please check README.md file directory.'; +const configTemplateFallback = 'Please check config-template.md file directory.'; + +export const defaultMetadata: ConnectorMetadata = { + id: 'apple-universal', + target: 'apple', + type: ConnectorType.Social, + platform: ConnectorPlatform.Universal, + name: { + en: 'Apple', + 'zh-CN': 'Apple', + }, + logo: './logo.svg', + description: { + en: 'Sign In with Apple', + 'zh-CN': 'Apple 登录', + }, + readme: getFileContents(pathToReadmeFile, readmeContentFallback), + configTemplate: getFileContents(pathToConfigTemplate, configTemplateFallback), +}; + +export const defaultTimeout = 5000; diff --git a/packages/connector-apple/src/index.test.ts b/packages/connector-apple/src/index.test.ts new file mode 100644 index 000000000..07958d618 --- /dev/null +++ b/packages/connector-apple/src/index.test.ts @@ -0,0 +1,61 @@ +import { GetConnectorConfig } from '@logto/connector-types'; +import nock from 'nock'; + +import AppleConnector from '.'; +import { defaultMetadata } from './constant'; +import { mockedConfig } from './mock'; +import { AppleConfig } from './types'; + +const getConnectorConfig = jest.fn() as GetConnectorConfig; + +const appleMethods = new AppleConnector(getConnectorConfig); + +beforeAll(() => { + jest.spyOn(appleMethods, 'getConfig').mockResolvedValue(mockedConfig); +}); + +describe('getAuthorizationUri', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should get a valid uri by redirectUri and state', async () => { + const authorizationUri = await appleMethods.getAuthorizationUri( + 'some_state', + 'http://localhost:3000/callback' + ); + expect(authorizationUri).toEqual( + `${defaultMetadata.target}://?client_id=%3Cclient-id%3E&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcallback&scope=&state=some_state` + ); + }); +}); + +describe('getAccessToken', () => { + afterEach(() => { + nock.cleanAll(); + jest.clearAllMocks(); + }); + + it('should return code directly', async () => { + const accessToken = await appleMethods.getAccessToken('code'); + expect(accessToken).toEqual('code'); + }); +}); + +describe('validateConfig', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should pass on valid config', async () => { + await expect(appleMethods.validateConfig({ clientId: 'clientId' })).resolves.not.toThrow(); + }); + + it('should throw on empty config', async () => { + await expect(appleMethods.validateConfig({})).rejects.toThrowError(); + }); +}); + +describe('getUserInfo', () => { + // LOG-2726 +}); diff --git a/packages/connector-apple/src/index.ts b/packages/connector-apple/src/index.ts new file mode 100644 index 000000000..07569dfbf --- /dev/null +++ b/packages/connector-apple/src/index.ts @@ -0,0 +1,86 @@ +import { + ConnectorMetadata, + GetAccessToken, + GetAuthorizationUri, + ValidateConfig, + GetUserInfo, + ConnectorError, + ConnectorErrorCodes, + SocialConnector, + GetConnectorConfig, +} from '@logto/connector-types'; +import { conditional } from '@silverhand/essentials'; +import { createRemoteJWKSet, jwtVerify } from 'jose'; + +import { scope, defaultMetadata, jwksUri, issuer } from './constant'; +import { appleConfigGuard, AppleConfig, appleDataGuard } from './types'; + +// TO-DO: support nonce validation +export default class AppleConnector implements SocialConnector { + public metadata: ConnectorMetadata = defaultMetadata; + + constructor(public readonly getConfig: GetConnectorConfig) {} + + public validateConfig: ValidateConfig = async (config: unknown) => { + const result = appleConfigGuard.safeParse(config); + + if (!result.success) { + throw new ConnectorError(ConnectorErrorCodes.InvalidConfig, result.error.message); + } + }; + + public getAuthorizationUri: GetAuthorizationUri = async (state, redirectUri) => { + const config = await this.getConfig(this.metadata.id); + + const queryParameters = new URLSearchParams({ + client_id: config.clientId, + redirect_uri: redirectUri, + scope, + state, + }); + + return `${this.metadata.target}://?${queryParameters.toString()}`; + }; + + // Directly return now. Refactor with connector interface redesign. + getAccessToken: GetAccessToken = async (code) => { + return code; + }; + + // Extract data from JSON string. + // Refactor with connector interface redesign. + public getUserInfo: GetUserInfo = async (data) => { + const { + authorization: { id_token: idToken }, + user, + } = appleDataGuard.parse(JSON.parse(data)); + + if (!idToken) { + throw new ConnectorError(ConnectorErrorCodes.SocialIdTokenInvalid); + } + + const { clientId } = await this.getConfig(this.metadata.id); + + try { + const { payload } = await jwtVerify(idToken, createRemoteJWKSet(new URL(jwksUri)), { + issuer, + audience: clientId, + }); + + if (!payload.sub) { + throw new ConnectorError(ConnectorErrorCodes.SocialIdTokenInvalid); + } + + const name = [user?.name?.firstName, user?.name?.lastName] + .filter((value) => Boolean(value)) + .join(' '); + + return { + id: payload.sub, + name: conditional(name), + }; + } catch { + throw new ConnectorError(ConnectorErrorCodes.SocialIdTokenInvalid); + } + }; +} diff --git a/packages/connector-apple/src/mock.ts b/packages/connector-apple/src/mock.ts new file mode 100644 index 000000000..a52d77ccc --- /dev/null +++ b/packages/connector-apple/src/mock.ts @@ -0,0 +1,4 @@ +export const mockedConfig = { + clientId: '', + clientSecret: '', +}; diff --git a/packages/connector-apple/src/types.ts b/packages/connector-apple/src/types.ts new file mode 100644 index 000000000..b45d56480 --- /dev/null +++ b/packages/connector-apple/src/types.ts @@ -0,0 +1,26 @@ +import { z } from 'zod'; + +export const appleConfigGuard = z.object({ + clientId: z.string(), +}); + +export type AppleConfig = z.infer; + +// https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js/configuring_your_webpage_for_sign_in_with_apple#3331292 +export const appleDataGuard = z.object({ + authorization: z.object({ + id_token: z.string(), + }), + user: z + .object({ + name: z + .object({ + firstName: z.string().optional(), + lastName: z.string().optional(), + }) + .optional(), + }) + .optional(), +}); + +export type AppleData = z.infer; diff --git a/packages/connector-apple/tsconfig.base.json b/packages/connector-apple/tsconfig.base.json new file mode 100644 index 000000000..848a915f7 --- /dev/null +++ b/packages/connector-apple/tsconfig.base.json @@ -0,0 +1,10 @@ +{ + "extends": "@silverhand/ts-config/tsconfig.base", + "compilerOptions": { + "outDir": "lib", + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + } +} diff --git a/packages/connector-apple/tsconfig.build.json b/packages/connector-apple/tsconfig.build.json new file mode 100644 index 000000000..d42923dd3 --- /dev/null +++ b/packages/connector-apple/tsconfig.build.json @@ -0,0 +1,5 @@ +{ + "extends": "./tsconfig.base", + "include": ["src"], + "exclude": ["src/**/*.test.ts"] +} diff --git a/packages/connector-apple/tsconfig.json b/packages/connector-apple/tsconfig.json new file mode 100644 index 000000000..20354364a --- /dev/null +++ b/packages/connector-apple/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.base", + "compilerOptions": { + "types": ["node", "jest", "jest-matcher-specific-error"] + }, + "include": ["src", "jest.config.ts"] +} diff --git a/packages/connector-apple/tsconfig.test.json b/packages/connector-apple/tsconfig.test.json new file mode 100644 index 000000000..1424a1555 --- /dev/null +++ b/packages/connector-apple/tsconfig.test.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig", + "compilerOptions": { + "isolatedModules": false, + "allowJs": true, + } +} diff --git a/packages/connector-types/src/index.ts b/packages/connector-types/src/index.ts index fbd3f46b8..ad877e451 100644 --- a/packages/connector-types/src/index.ts +++ b/packages/connector-types/src/index.ts @@ -33,6 +33,7 @@ export enum ConnectorErrorCodes { TemplateNotFound, SocialAuthCodeInvalid, SocialAccessTokenInvalid, + SocialIdTokenInvalid, } export class ConnectorError extends Error { @@ -85,10 +86,10 @@ export interface EmailConnector extends BaseConnector { sendMessage: EmailSendMessageFunction; } -export interface SocialConnector extends BaseConnector { +export interface SocialConnector extends BaseConnector { getAuthorizationUri: GetAuthorizationUri; - getAccessToken: GetAccessToken; - getUserInfo: GetUserInfo; + getAccessToken: GetAccessToken; + getUserInfo: GetUserInfo; } export type ValidateConfig> = (config: T) => Promise; @@ -97,10 +98,13 @@ export type GetAuthorizationUri = (state: string, redirectUri: string) => Promis export type AccessTokenObject = { accessToken: string } & Record; -export type GetAccessToken = (code: string, redirectUri?: string) => Promise; +export type GetAccessToken = ( + code: string, + redirectUri?: string +) => Promise; -export type GetUserInfo = ( - accessTokenObject: AccessTokenObject +export type GetUserInfo = ( + accessTokenObject: TokenObject ) => Promise<{ id: string } & Record>; export type GetConnectorConfig> = (id: string) => Promise; diff --git a/packages/console/package.json b/packages/console/package.json index dabda0a59..70c14daaf 100644 --- a/packages/console/package.json +++ b/packages/console/package.json @@ -23,9 +23,9 @@ "@logto/shared": "^0.1.0", "@logto/schemas": "^0.1.0", "@mdx-js/react": "^1.6.22", - "@parcel/core": "^2.5.0", - "@parcel/transformer-mdx": "^2.5.0", - "@parcel/transformer-sass": "^2.5.0", + "@parcel/core": "2.5.0", + "@parcel/transformer-mdx": "2.5.0", + "@parcel/transformer-sass": "2.5.0", "@silverhand/eslint-config": "^0.14.0", "@silverhand/eslint-config-react": "^0.14.0", "@silverhand/essentials": "^1.1.6", @@ -51,7 +51,7 @@ "lint-staged": "^12.0.0", "lodash.kebabcase": "^4.1.1", "nanoid": "^3.1.23", - "parcel": "^2.5.0", + "parcel": "2.5.0", "postcss": "^8.4.6", "postcss-modules": "^4.3.0", "prettier": "^2.3.2", diff --git a/packages/console/src/pages/ConnectorDetails/index.tsx b/packages/console/src/pages/ConnectorDetails/index.tsx index c476f5634..5ccce6efe 100644 --- a/packages/console/src/pages/ConnectorDetails/index.tsx +++ b/packages/console/src/pages/ConnectorDetails/index.tsx @@ -47,7 +47,8 @@ const ConnectorDetails = () => { useEffect(() => { if (data) { - setConfig(JSON.stringify(data.config, null, 2)); + const hasData = Object.keys(data.config).length > 0; + setConfig(hasData ? JSON.stringify(data.config, null, 2) : data.configTemplate); } }, [data]); diff --git a/packages/core/package.json b/packages/core/package.json index be7ae907d..1af4cb22d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -24,6 +24,7 @@ "@logto/connector-alipay-native": "^0.1.0", "@logto/connector-aliyun-dm": "^0.1.0", "@logto/connector-aliyun-sms": "^0.1.0", + "@logto/connector-apple": "^0.1.0", "@logto/connector-facebook": "^0.1.0", "@logto/connector-github": "^0.1.0", "@logto/connector-google": "^0.1.0", diff --git a/packages/core/src/connectors/consts.ts b/packages/core/src/connectors/consts.ts index bacefe2db..690530d7e 100644 --- a/packages/core/src/connectors/consts.ts +++ b/packages/core/src/connectors/consts.ts @@ -4,6 +4,7 @@ export const connectorPackages = [ '@logto/connector-alipay-native', '@logto/connector-aliyun-dm', '@logto/connector-aliyun-sms', + '@logto/connector-apple', '@logto/connector-facebook', '@logto/connector-github', '@logto/connector-google', diff --git a/packages/core/src/connectors/index.test.ts b/packages/core/src/connectors/index.test.ts index 8d7601506..1436bf4c2 100644 --- a/packages/core/src/connectors/index.test.ts +++ b/packages/core/src/connectors/index.test.ts @@ -34,6 +34,12 @@ const aliyunSmsConnector = { config: {}, createdAt: 1_646_382_233_666, }; +const appleConnector = { + id: 'apple-universal', + enabled: false, + config: {}, + createdAt: 1_646_382_233_666, +}; const facebookConnector = { id: 'facebook-universal', enabled: true, @@ -82,6 +88,7 @@ const connectors = [ alipayNativeConnector, aliyunDmConnector, aliyunSmsConnector, + appleConnector, facebookConnector, githubConnector, googleConnector, @@ -103,18 +110,11 @@ jest.mock('@/queries/connector', () => ({ describe('getConnectorInstances', () => { test('should return the connectors existing in DB', async () => { const connectorInstances = await getConnectorInstances(); - expect(connectorInstances).toHaveLength(connectorInstances.length); - expect(connectorInstances[0]).toHaveProperty('connector', alipayConnector); - expect(connectorInstances[1]).toHaveProperty('connector', alipayNativeConnector); - expect(connectorInstances[2]).toHaveProperty('connector', aliyunDmConnector); - expect(connectorInstances[3]).toHaveProperty('connector', aliyunSmsConnector); - expect(connectorInstances[4]).toHaveProperty('connector', facebookConnector); - expect(connectorInstances[5]).toHaveProperty('connector', githubConnector); - expect(connectorInstances[6]).toHaveProperty('connector', googleConnector); - expect(connectorInstances[7]).toHaveProperty('connector', sendGridMailConnector); - expect(connectorInstances[8]).toHaveProperty('connector', twilioSmsConnector); - expect(connectorInstances[9]).toHaveProperty('connector', wechatConnector); - expect(connectorInstances[10]).toHaveProperty('connector', wechatNativeConnector); + expect(connectorInstances).toHaveLength(connectors.length); + + for (const [index, connector] of connectors.entries()) { + expect(connectorInstances[index]).toHaveProperty('connector', connector); + } }); test('should throw if any required connector does not exist in DB', async () => { diff --git a/packages/ui/package.json b/packages/ui/package.json index 6ba508108..42a9febca 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -18,9 +18,9 @@ "devDependencies": { "@logto/phrases": "^0.1.0", "@logto/schemas": "^0.1.0", - "@parcel/core": "^2.5.0", - "@parcel/transformer-sass": "^2.5.0", - "@parcel/transformer-svg-react": "^2.5.0", + "@parcel/core": "2.5.0", + "@parcel/transformer-sass": "2.5.0", + "@parcel/transformer-svg-react": "2.5.0", "@peculiar/webcrypto": "^1.3.3", "@silverhand/eslint-config": "^0.14.0", "@silverhand/eslint-config-react": "^0.14.0", @@ -35,6 +35,7 @@ "@types/react-dom": "^17.0.9", "@types/react-modal": "^3.13.1", "@types/react-router-dom": "^5.3.2", + "camelcase-keys": "^7.0.2", "classnames": "^2.3.1", "color": "^4.2.3", "cross-env": "^7.0.3", @@ -47,7 +48,7 @@ "ky": "^0.30.0", "libphonenumber-js": "^1.9.49", "lint-staged": "^12.0.0", - "parcel": "^2.5.0", + "parcel": "2.5.0", "postcss": "^8.4.6", "postcss-modules": "^4.3.0", "prettier": "^2.3.2", diff --git a/packages/ui/src/App.tsx b/packages/ui/src/App.tsx index 60a846e40..8953e6901 100644 --- a/packages/ui/src/App.tsx +++ b/packages/ui/src/App.tsx @@ -4,6 +4,7 @@ import { Route, Routes, BrowserRouter, Navigate } from 'react-router-dom'; import * as styles from './App.module.scss'; import AppContent from './components/AppContent'; +import { loadAppleSdk } from './hooks/use-apple-auth'; import usePageContext from './hooks/use-page-context'; import usePreview from './hooks/use-preview'; import initI18n from './i18n/init'; @@ -16,7 +17,7 @@ import SecondarySignIn from './pages/SecondarySignIn'; import SignIn from './pages/SignIn'; import SocialRegister from './pages/SocialRegister'; import SocialSignInCallback from './pages/SocialSignInCallback'; -import getSignInExperienceSettings from './utils/sign-in-experience'; +import getSignInExperienceSettings, { isAppleConnectorEnabled } from './utils/sign-in-experience'; import './scss/normalized.scss'; @@ -35,6 +36,11 @@ const App = () => { (async () => { const settings = await getSignInExperienceSettings(); + // Load Apple official SDK if Apple connector is enabled + if (isAppleConnectorEnabled(settings)) { + await loadAppleSdk(); + } + // Note: i18n must be initialized ahead of global experience settings await initI18n(settings.languageInfo); diff --git a/packages/ui/src/containers/SocialSignIn/SocialSignInDropdown/index.tsx b/packages/ui/src/containers/SocialSignIn/SocialSignInDropdown/index.tsx index bd967a072..352f5c205 100644 --- a/packages/ui/src/containers/SocialSignIn/SocialSignInDropdown/index.tsx +++ b/packages/ui/src/containers/SocialSignIn/SocialSignInDropdown/index.tsx @@ -45,7 +45,7 @@ const SocialSignInDropdown = ({ isOpen, onClose, connectors, anchorRef }: Props) setContentStyle(undefined); }} > - {connectors.map(({ id, name, logo }) => { + {connectors.map(({ id, name, logo, target }) => { const languageKey = Object.keys(name).find((key) => key === language) ?? 'en'; const localName = name[languageKey as Language]; @@ -53,7 +53,7 @@ const SocialSignInDropdown = ({ isOpen, onClose, connectors, anchorRef }: Props) { - void invokeSocialSignIn(id, onClose); + void invokeSocialSignIn(id, target, onClose); }} > {id} diff --git a/packages/ui/src/containers/SocialSignIn/SocialSignInIconList/index.tsx b/packages/ui/src/containers/SocialSignIn/SocialSignInIconList/index.tsx index 51adb079c..c596c5699 100644 --- a/packages/ui/src/containers/SocialSignIn/SocialSignInIconList/index.tsx +++ b/packages/ui/src/containers/SocialSignIn/SocialSignInIconList/index.tsx @@ -34,7 +34,7 @@ const SocialSignInIconList = ({ className={styles.socialButton} connector={connector} onClick={() => { - void invokeSocialSignIn(connector.id); + void invokeSocialSignIn(connector.id, connector.target); }} /> ))} diff --git a/packages/ui/src/containers/SocialSignIn/SocialSignInList/index.tsx b/packages/ui/src/containers/SocialSignIn/SocialSignInList/index.tsx index 9098deb8c..4f18b83f1 100644 --- a/packages/ui/src/containers/SocialSignIn/SocialSignInList/index.tsx +++ b/packages/ui/src/containers/SocialSignIn/SocialSignInList/index.tsx @@ -42,7 +42,7 @@ const SocialSignInList = ({ className={styles.socialLinkButton} connector={connector} onClick={() => { - void invokeSocialSignIn(connector.id, onSocialSignInCallback); + void invokeSocialSignIn(connector.id, connector.target, onSocialSignInCallback); }} /> ))} diff --git a/packages/ui/src/hooks/use-apple-auth.ts b/packages/ui/src/hooks/use-apple-auth.ts new file mode 100644 index 000000000..0c6ec9561 --- /dev/null +++ b/packages/ui/src/hooks/use-apple-auth.ts @@ -0,0 +1,92 @@ +import camelcaseKeys from 'camelcase-keys'; +import { useNavigate } from 'react-router-dom'; + +import { inOperator, parseQueryParameters } from '@/utils'; + +export const loadAppleSdk = async () => + new Promise((resolve, reject) => { + const script = document.createElement('script'); + + script.addEventListener('load', resolve); + script.addEventListener('error', reject); + // eslint-disable-next-line @silverhand/fp/no-mutation + script.src = + 'https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js'; + + document.head.append(script); + }); + +export const isAppleConnector = ({ target }: { target: string }) => target === 'apple'; + +// Derived from https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js/configuring_your_webpage_for_sign_in_with_apple + +type AppleIdAuth = { + auth: { + init( + config: { + clientId?: string; + scope?: string; + redirectURI?: string; + state?: string; + nonce?: string; + usePopup: boolean; + } & Record + ): void; + signIn(): Promise>; + }; +}; + +declare const AppleID: AppleIdAuth | undefined; + +export const getAppleSdk = () => { + if (AppleID === undefined) { + throw new Error('AppleID auth SDK not found.'); + } + + return AppleID; +}; + +const useAppleAuth = () => { + const navigate = useNavigate(); + + const auth = async (connectorId: string, redirectUri: string) => { + const url = new URL(redirectUri); + const { redirect_uri: redirectURI, ...rest } = parseQueryParameters(url.searchParams); + + const config = { + redirectURI: redirectURI ?? '', + ...camelcaseKeys(rest), + }; + const { auth } = getAppleSdk(); + + auth.init({ usePopup: true, ...config }); + + try { + // https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js/configuring_your_webpage_for_sign_in_with_apple#3331292 + const data = await auth.signIn(); + const { authorization } = data; + + if (!authorization || typeof authorization !== 'object') { + throw new TypeError('Missing authorization object.'); + } + + const state = inOperator('state', authorization) ? String(authorization.state) : ''; + const parameters = new URLSearchParams({ + state, + // Due to the design limit of connectors, we have to use key `code`. + // TO-DO: @Darcy @Simeng update key after refactoring + code: JSON.stringify(data), + }); + + navigate(`/sign-in/callback/${connectorId}?${parameters.toString()}`); + } catch (error: unknown) { + // TO-DO: @Simeng handle error properly + // https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js/configuring_your_webpage_for_sign_in_with_apple#3523993 + console.log('error!', error); + } + }; + + return auth; +}; + +export default useAppleAuth; diff --git a/packages/ui/src/hooks/use-social.ts b/packages/ui/src/hooks/use-social.ts index 907d1bfec..910378ed7 100644 --- a/packages/ui/src/hooks/use-social.ts +++ b/packages/ui/src/hooks/use-social.ts @@ -3,6 +3,7 @@ import { useCallback, useContext } from 'react'; import { invokeSocialSignIn } from '@/apis/social'; import useApi from './use-api'; +import useAppleAuth, { isAppleConnector } from './use-apple-auth'; import { PageContext } from './use-page-context'; import useTerms from './use-terms'; import { getLogtoNativeSdk, isNativeWebview, generateState, storeState } from './utils'; @@ -10,11 +11,12 @@ import { getLogtoNativeSdk, isNativeWebview, generateState, storeState } from '. const useSocial = () => { const { experienceSettings } = useContext(PageContext); const { termsValidation } = useTerms(); + const appleAuth = useAppleAuth(); const { run: asyncInvokeSocialSignIn } = useApi(invokeSocialSignIn); const invokeSocialSignInHandler = useCallback( - async (connectorId: string, callback?: () => void) => { + async (connectorId: string, target: string, callback?: () => void) => { if (!(await termsValidation())) { return; } @@ -37,6 +39,13 @@ const useSocial = () => { // Callback hook to close the social sign in modal callback?.(); + // For Sign In with Apple, use the official SDK directly + if (isAppleConnector({ target })) { + await appleAuth(connectorId, result.redirectTo); + + return; + } + // Invoke Native Social Sign In flow if (isNativeWebview()) { getLogtoNativeSdk()?.getPostMessage()({ diff --git a/packages/ui/src/utils/index.ts b/packages/ui/src/utils/index.ts index 414862bf7..dcbf7555e 100644 --- a/packages/ui/src/utils/index.ts +++ b/packages/ui/src/utils/index.ts @@ -7,7 +7,7 @@ export const parseQueryParameters = (parameters: string | URLSearchParams) => { const searchParameters = parameters instanceof URLSearchParams ? parameters : new URLSearchParams(parameters); - return Object.fromEntries(searchParameters.entries()); + return Object.fromEntries(searchParameters); }; export const queryStringify = (parameters: URLSearchParams | Record) => { @@ -31,3 +31,9 @@ type Entries = Array< >; export const entries = (object: T): Entries => Object.entries(object) as Entries; + +// eslint-disable-next-line @typescript-eslint/ban-types +export const inOperator = ( + key: K, + object: T +): object is T & Record => key in object; diff --git a/packages/ui/src/utils/sign-in-experience.ts b/packages/ui/src/utils/sign-in-experience.ts index 2c866193e..a978ed50a 100644 --- a/packages/ui/src/utils/sign-in-experience.ts +++ b/packages/ui/src/utils/sign-in-experience.ts @@ -6,6 +6,7 @@ import { SignInMethods } from '@logto/schemas'; import { getSignInExperience } from '@/apis/settings'; +import { isAppleConnector } from '@/hooks/use-apple-auth'; import { filterSocialConnectors } from '@/hooks/utils'; import { SignInMethod, SignInExperienceSettingsResponse, SignInExperienceSettings } from '@/types'; @@ -28,6 +29,14 @@ export const getSecondarySignInMethods = (signInMethods: SignInMethods) => return methods; }, []); +export const isAppleConnectorEnabled = ({ + primarySignInMethod, + secondarySignInMethods, + socialConnectors, +}: SignInExperienceSettings) => + (primarySignInMethod === 'social' || secondarySignInMethods.includes('social')) && + socialConnectors.some((connector) => isAppleConnector(connector)); + const getSignInExperienceSettings = async (): Promise => { const { signInMethods, socialConnectors, ...rest } = await getSignInExperience(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0f6bb68b..b9eb34a10 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -224,6 +224,55 @@ importers: tsc-watch: 5.0.3_typescript@4.6.3 typescript: 4.6.3 + packages/connector-apple: + specifiers: + '@jest/types': ^27.5.1 + '@logto/connector-types': ^0.1.0 + '@logto/schemas': ^0.1.0 + '@logto/shared': ^0.1.0 + '@silverhand/eslint-config': ^0.14.0 + '@silverhand/essentials': ^1.1.0 + '@silverhand/jest-config': ^0.14.0 + '@silverhand/ts-config': ^0.14.0 + '@types/jest': ^27.4.1 + '@types/node': ^16.3.1 + eslint: ^8.10.0 + got: ^11.8.2 + jest: ^27.5.1 + jest-matcher-specific-error: ^1.0.0 + jose: ^4.3.8 + lint-staged: ^12.0.0 + nock: ^13.2.2 + prettier: ^2.3.2 + ts-jest: ^27.1.1 + tsc-watch: ^5.0.0 + typescript: ^4.6.2 + zod: ^3.14.3 + dependencies: + '@logto/connector-types': link:../connector-types + '@logto/schemas': link:../schemas + '@logto/shared': link:../shared + '@silverhand/essentials': 1.1.7 + '@silverhand/jest-config': 0.14.0_53ggqi2i4rbcfjtktmjua6zili + got: 11.8.3 + jose: 4.6.0 + zod: 3.14.3 + devDependencies: + '@jest/types': 27.5.1 + '@silverhand/eslint-config': 0.14.0_rqoong6vegs374egqglqjbgiwm + '@silverhand/ts-config': 0.14.0_typescript@4.6.4 + '@types/jest': 27.4.1 + '@types/node': 16.11.12 + eslint: 8.10.0 + jest: 27.5.1 + jest-matcher-specific-error: 1.0.0 + lint-staged: 12.4.0 + nock: 13.2.2 + prettier: 2.5.1 + ts-jest: 27.1.1_53ggqi2i4rbcfjtktmjua6zili + tsc-watch: 5.0.3_typescript@4.6.4 + typescript: 4.6.4 + packages/connector-facebook: specifiers: '@jest/types': ^27.5.1 @@ -586,9 +635,9 @@ importers: '@logto/schemas': ^0.1.0 '@logto/shared': ^0.1.0 '@mdx-js/react': ^1.6.22 - '@parcel/core': ^2.5.0 - '@parcel/transformer-mdx': ^2.5.0 - '@parcel/transformer-sass': ^2.5.0 + '@parcel/core': 2.5.0 + '@parcel/transformer-mdx': 2.5.0 + '@parcel/transformer-sass': 2.5.0 '@silverhand/eslint-config': ^0.14.0 '@silverhand/eslint-config-react': ^0.14.0 '@silverhand/essentials': ^1.1.6 @@ -614,7 +663,7 @@ importers: lint-staged: ^12.0.0 lodash.kebabcase: ^4.1.1 nanoid: ^3.1.23 - parcel: ^2.5.0 + parcel: 2.5.0 postcss: ^8.4.6 postcss-modules: ^4.3.0 prettier: ^2.3.2 @@ -698,6 +747,7 @@ importers: '@logto/connector-alipay-native': ^0.1.0 '@logto/connector-aliyun-dm': ^0.1.0 '@logto/connector-aliyun-sms': ^0.1.0 + '@logto/connector-apple': ^0.1.0 '@logto/connector-facebook': ^0.1.0 '@logto/connector-github': ^0.1.0 '@logto/connector-google': ^0.1.0 @@ -773,6 +823,7 @@ importers: '@logto/connector-alipay-native': link:../connector-alipay-native '@logto/connector-aliyun-dm': link:../connector-aliyun-dm '@logto/connector-aliyun-sms': link:../connector-aliyun-sms + '@logto/connector-apple': link:../connector-apple '@logto/connector-facebook': link:../connector-facebook '@logto/connector-github': link:../connector-github '@logto/connector-google': link:../connector-google @@ -991,9 +1042,9 @@ importers: specifiers: '@logto/phrases': ^0.1.0 '@logto/schemas': ^0.1.0 - '@parcel/core': ^2.5.0 - '@parcel/transformer-sass': ^2.5.0 - '@parcel/transformer-svg-react': ^2.5.0 + '@parcel/core': 2.5.0 + '@parcel/transformer-sass': 2.5.0 + '@parcel/transformer-svg-react': 2.5.0 '@peculiar/webcrypto': ^1.3.3 '@silverhand/eslint-config': ^0.14.0 '@silverhand/eslint-config-react': ^0.14.0 @@ -1008,6 +1059,7 @@ importers: '@types/react-dom': ^17.0.9 '@types/react-modal': ^3.13.1 '@types/react-router-dom': ^5.3.2 + camelcase-keys: ^7.0.2 classnames: ^2.3.1 color: ^4.2.3 cross-env: ^7.0.3 @@ -1020,7 +1072,7 @@ importers: ky: ^0.30.0 libphonenumber-js: ^1.9.49 lint-staged: ^12.0.0 - parcel: ^2.5.0 + parcel: 2.5.0 postcss: ^8.4.6 postcss-modules: ^4.3.0 prettier: ^2.3.2 @@ -1057,6 +1109,7 @@ importers: '@types/react-dom': 17.0.11 '@types/react-modal': 3.13.1 '@types/react-router-dom': 5.3.2 + camelcase-keys: 7.0.2 classnames: 2.3.1 color: 4.2.3 cross-env: 7.0.3 @@ -1209,6 +1262,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/trace-mapping': 0.3.4 + dev: true /@babel/code-frame/7.16.7: resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} @@ -1224,6 +1278,7 @@ packages: /@babel/compat-data/7.17.7: resolution: {integrity: sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/core/7.12.9: resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} @@ -1270,6 +1325,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: true /@babel/eslint-parser/7.17.0_p3kzb6vyyjdcyxejdy27tex2pm: resolution: {integrity: sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==} @@ -1301,6 +1357,7 @@ packages: '@babel/types': 7.17.0 jsesc: 2.5.2 source-map: 0.5.7 + dev: true /@babel/helper-annotate-as-pure/7.16.7: resolution: {integrity: sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==} @@ -1341,6 +1398,7 @@ packages: '@babel/helper-validator-option': 7.16.7 browserslist: 4.20.2 semver: 6.3.0 + dev: true /@babel/helper-create-class-features-plugin/7.17.9_@babel+core@7.17.9: resolution: {integrity: sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==} @@ -1394,6 +1452,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.17.0 + dev: true /@babel/helper-explode-assignable-expression/7.16.7: resolution: {integrity: sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==} @@ -1417,6 +1476,7 @@ packages: dependencies: '@babel/template': 7.16.7 '@babel/types': 7.17.0 + dev: true /@babel/helper-get-function-arity/7.16.7: resolution: {integrity: sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==} @@ -1430,6 +1490,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.17.0 + dev: true /@babel/helper-member-expression-to-functions/7.17.7: resolution: {integrity: sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==} @@ -1443,6 +1504,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.17.0 + dev: true /@babel/helper-module-transforms/7.17.7: resolution: {integrity: sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==} @@ -1458,6 +1520,7 @@ packages: '@babel/types': 7.17.0 transitivePeerDependencies: - supports-color + dev: true /@babel/helper-optimise-call-expression/7.16.7: resolution: {integrity: sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==} @@ -1473,6 +1536,7 @@ packages: /@babel/helper-plugin-utils/7.16.7: resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-remap-async-to-generator/7.16.8: resolution: {integrity: sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==} @@ -1503,6 +1567,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.17.0 + dev: true /@babel/helper-skip-transparent-expression-wrappers/7.16.0: resolution: {integrity: sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==} @@ -1516,6 +1581,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.17.0 + dev: true /@babel/helper-validator-identifier/7.16.7: resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} @@ -1524,6 +1590,7 @@ packages: /@babel/helper-validator-option/7.16.7: resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-wrap-function/7.16.8: resolution: {integrity: sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==} @@ -1546,6 +1613,7 @@ packages: '@babel/types': 7.17.0 transitivePeerDependencies: - supports-color + dev: true /@babel/highlight/7.16.10: resolution: {integrity: sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==} @@ -1561,6 +1629,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.17.0 + dev: true /@babel/parser/7.17.9: resolution: {integrity: sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==} @@ -1568,6 +1637,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.17.0 + dev: true /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.17.9: resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} @@ -1792,6 +1862,7 @@ packages: dependencies: '@babel/core': 7.17.9 '@babel/helper-plugin-utils': 7.16.7 + dev: true /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.17.9: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} @@ -1800,6 +1871,7 @@ packages: dependencies: '@babel/core': 7.17.9 '@babel/helper-plugin-utils': 7.16.7 + dev: true /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.17.9: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} @@ -1808,6 +1880,7 @@ packages: dependencies: '@babel/core': 7.17.9 '@babel/helper-plugin-utils': 7.16.7 + dev: true /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.17.9: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -1844,6 +1917,7 @@ packages: dependencies: '@babel/core': 7.17.9 '@babel/helper-plugin-utils': 7.16.7 + dev: true /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.17.9: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} @@ -1852,6 +1926,7 @@ packages: dependencies: '@babel/core': 7.17.9 '@babel/helper-plugin-utils': 7.16.7 + dev: true /@babel/plugin-syntax-jsx/7.12.1_@babel+core@7.12.9: resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} @@ -1879,6 +1954,7 @@ packages: dependencies: '@babel/core': 7.17.9 '@babel/helper-plugin-utils': 7.16.7 + dev: true /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.17.9: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -1887,6 +1963,7 @@ packages: dependencies: '@babel/core': 7.17.9 '@babel/helper-plugin-utils': 7.16.7 + dev: true /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.17.9: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -1895,6 +1972,7 @@ packages: dependencies: '@babel/core': 7.17.9 '@babel/helper-plugin-utils': 7.16.7 + dev: true /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -1912,6 +1990,7 @@ packages: dependencies: '@babel/core': 7.17.9 '@babel/helper-plugin-utils': 7.16.7 + dev: true /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.17.9: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -1920,6 +1999,7 @@ packages: dependencies: '@babel/core': 7.17.9 '@babel/helper-plugin-utils': 7.16.7 + dev: true /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.17.9: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} @@ -1928,6 +2008,7 @@ packages: dependencies: '@babel/core': 7.17.9 '@babel/helper-plugin-utils': 7.16.7 + dev: true /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.17.9: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} @@ -1947,6 +2028,7 @@ packages: dependencies: '@babel/core': 7.17.9 '@babel/helper-plugin-utils': 7.16.7 + dev: true /@babel/plugin-syntax-typescript/7.16.7_@babel+core@7.17.9: resolution: {integrity: sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==} @@ -1956,6 +2038,7 @@ packages: dependencies: '@babel/core': 7.17.9 '@babel/helper-plugin-utils': 7.16.7 + dev: true /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.17.9: resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} @@ -2568,6 +2651,7 @@ packages: '@babel/code-frame': 7.16.7 '@babel/parser': 7.17.3 '@babel/types': 7.17.0 + dev: true /@babel/traverse/7.17.3: resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} @@ -2603,6 +2687,7 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: true /@babel/types/7.17.0: resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} @@ -2613,6 +2698,7 @@ packages: /@bcoe/v8-coverage/0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true /@commitlint/cli/17.0.0: resolution: {integrity: sha512-Np6slCdVVG1XwMvwbZrXIzS1INPAD5QmN4L6al04AmCd4nAPU63gxgxC5Mz0Fmx7va23Uvb0S7yEFV1JPhvPUQ==} @@ -2776,12 +2862,14 @@ packages: /@cspotcode/source-map-consumer/0.8.0: resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} engines: {node: '>= 12'} + dev: true /@cspotcode/source-map-support/0.7.0: resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} engines: {node: '>=12'} dependencies: '@cspotcode/source-map-consumer': 0.8.0 + dev: true /@docsearch/css/3.0.0: resolution: {integrity: sha512-1kkV7tkAsiuEd0shunYRByKJe3xQDG2q7wYg24SOw1nV9/2lwEd4WrUYRJC/ukGTl2/kHeFxsaUvtiOy0y6fFA==} @@ -3517,10 +3605,12 @@ packages: get-package-type: 0.1.0 js-yaml: 3.14.1 resolve-from: 5.0.0 + dev: true /@istanbuljs/schema/0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} + dev: true /@jest/console/27.5.1: resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} @@ -3532,6 +3622,7 @@ packages: jest-message-util: 27.5.1 jest-util: 27.5.1 slash: 3.0.0 + dev: true /@jest/core/27.5.1: resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} @@ -3576,6 +3667,7 @@ packages: - supports-color - ts-node - utf-8-validate + dev: true /@jest/core/27.5.1_ts-node@10.7.0: resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} @@ -3620,6 +3712,7 @@ packages: - supports-color - ts-node - utf-8-validate + dev: true /@jest/environment/27.5.1: resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} @@ -3629,6 +3722,7 @@ packages: '@jest/types': 27.5.1 '@types/node': 17.0.23 jest-mock: 27.5.1 + dev: true /@jest/fake-timers/27.5.1: resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} @@ -3640,6 +3734,7 @@ packages: jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 + dev: true /@jest/globals/27.5.1: resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} @@ -3648,6 +3743,7 @@ packages: '@jest/environment': 27.5.1 '@jest/types': 27.5.1 expect: 27.5.1 + dev: true /@jest/reporters/27.5.1: resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} @@ -3685,6 +3781,7 @@ packages: v8-to-istanbul: 8.1.0 transitivePeerDependencies: - supports-color + dev: true /@jest/source-map/27.5.1: resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} @@ -3693,6 +3790,7 @@ packages: callsites: 3.1.0 graceful-fs: 4.2.9 source-map: 0.6.1 + dev: true /@jest/test-result/27.5.1: resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} @@ -3702,6 +3800,7 @@ packages: '@jest/types': 27.5.1 '@types/istanbul-lib-coverage': 2.0.3 collect-v8-coverage: 1.0.1 + dev: true /@jest/test-sequencer/27.5.1: resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} @@ -3713,6 +3812,7 @@ packages: jest-runtime: 27.5.1 transitivePeerDependencies: - supports-color + dev: true /@jest/transform/27.5.1: resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} @@ -3735,6 +3835,7 @@ packages: write-file-atomic: 3.0.3 transitivePeerDependencies: - supports-color + dev: true /@jest/types/27.5.1: resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} @@ -3749,15 +3850,18 @@ packages: /@jridgewell/resolve-uri/3.0.5: resolution: {integrity: sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==} engines: {node: '>=6.0.0'} + dev: true /@jridgewell/sourcemap-codec/1.4.11: resolution: {integrity: sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==} + dev: true /@jridgewell/trace-mapping/0.3.4: resolution: {integrity: sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==} dependencies: '@jridgewell/resolve-uri': 3.0.5 '@jridgewell/sourcemap-codec': 1.4.11 + dev: true /@koa/cors/3.1.0: resolution: {integrity: sha512-7ulRC1da/rBa6kj6P4g2aJfnET3z8Uf3SWu60cjbtxTA5g8lxRdX/Bd2P92EagGwwAhANeNw8T8if99rJliR6Q==} @@ -6016,11 +6120,13 @@ packages: resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} dependencies: type-detect: 4.0.8 + dev: true /@sinonjs/fake-timers/8.1.0: resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} dependencies: '@sinonjs/commons': 1.8.3 + dev: true /@slorber/static-site-generator-webpack-plugin/4.0.4: resolution: {integrity: sha512-FvMavoWEIePps6/JwGCOLYKCRhuwIHhMtmbKpBFgzNkxwpa/569LfTkrbRk1m1I3n+ezJK4on9E1A6cjuZmD9g==} @@ -6230,6 +6336,7 @@ packages: /@tootallnate/once/1.1.2: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} + dev: true /@tootallnate/once/2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} @@ -6247,15 +6354,19 @@ packages: /@tsconfig/node10/1.0.8: resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} + dev: true /@tsconfig/node12/1.0.9: resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==} + dev: true /@tsconfig/node14/1.0.1: resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==} + dev: true /@tsconfig/node16/1.0.2: resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} + dev: true /@types/accepts/1.3.5: resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} @@ -6279,22 +6390,26 @@ packages: '@types/babel__generator': 7.6.3 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.14.2 + dev: true /@types/babel__generator/7.6.3: resolution: {integrity: sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==} dependencies: '@babel/types': 7.17.0 + dev: true /@types/babel__template/7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.17.9 '@babel/types': 7.17.0 + dev: true /@types/babel__traverse/7.14.2: resolution: {integrity: sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==} dependencies: '@babel/types': 7.17.0 + dev: true /@types/body-parser/1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} @@ -6414,6 +6529,7 @@ packages: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: '@types/node': 17.0.23 + dev: true /@types/hast/2.3.4: resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} @@ -6475,6 +6591,7 @@ packages: dependencies: jest-matcher-utils: 27.5.1 pretty-format: 27.5.1 + dev: true /@types/json-schema/7.0.9: resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==} @@ -6597,6 +6714,7 @@ packages: /@types/node/16.11.12: resolution: {integrity: sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==} + dev: true /@types/node/17.0.23: resolution: {integrity: sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==} @@ -6624,6 +6742,7 @@ packages: /@types/prettier/2.4.2: resolution: {integrity: sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==} + dev: true /@types/prop-types/15.7.4: resolution: {integrity: sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==} @@ -6725,6 +6844,7 @@ packages: /@types/stack-utils/2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true /@types/superagent/4.1.15: resolution: {integrity: sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==} @@ -7223,6 +7343,7 @@ packages: /abab/2.0.5: resolution: {integrity: sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==} + dev: true /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -7251,6 +7372,7 @@ packages: dependencies: acorn: 7.4.1 acorn-walk: 7.2.0 + dev: true /acorn-import-assertions/1.8.0_acorn@8.7.0: resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} @@ -7271,15 +7393,18 @@ packages: /acorn-walk/7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} + dev: true /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} + dev: true /acorn/7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true + dev: true /acorn/8.6.0: resolution: {integrity: sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==} @@ -7291,6 +7416,7 @@ packages: resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==} engines: {node: '>=0.4.0'} hasBin: true + dev: true /add-stream/1.0.0: resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} @@ -7451,6 +7577,7 @@ packages: /ansi-styles/5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + dev: true /ansi-styles/6.1.0: resolution: {integrity: sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==} @@ -7463,6 +7590,7 @@ packages: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 + dev: true /aproba/1.2.0: resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} @@ -7496,6 +7624,7 @@ packages: /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true /arg/5.0.1: resolution: {integrity: sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==} @@ -7518,6 +7647,7 @@ packages: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 + dev: true /argparse/2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -7631,6 +7761,7 @@ packages: /asynckit/0.4.0: resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} + dev: true /at-least-node/1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} @@ -7678,6 +7809,7 @@ packages: slash: 3.0.0 transitivePeerDependencies: - supports-color + dev: true /babel-loader/8.2.4_p3ro434mxxa6mxpqpcftcb54nu: resolution: {integrity: sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==} @@ -7733,6 +7865,7 @@ packages: test-exclude: 6.0.0 transitivePeerDependencies: - supports-color + dev: true /babel-plugin-jest-hoist/27.5.1: resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} @@ -7742,6 +7875,7 @@ packages: '@babel/types': 7.17.0 '@types/babel__core': 7.1.17 '@types/babel__traverse': 7.14.2 + dev: true /babel-plugin-macros/2.8.0: resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} @@ -7805,6 +7939,7 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.9 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.9 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.17.9 + dev: true /babel-preset-jest/27.5.1_@babel+core@7.17.9: resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} @@ -7815,6 +7950,7 @@ packages: '@babel/core': 7.17.9 babel-plugin-jest-hoist: 27.5.1 babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.9 + dev: true /bail/1.0.5: resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} @@ -7965,9 +8101,11 @@ packages: engines: {node: '>=8'} dependencies: fill-range: 7.0.1 + dev: true /browser-process-hrtime/1.0.0: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true /browserslist/4.20.0: resolution: {integrity: sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==} @@ -7991,6 +8129,7 @@ packages: escalade: 3.1.1 node-releases: 2.0.2 picocolors: 1.0.0 + dev: true /bs-logger/0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -8002,6 +8141,7 @@ packages: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 + dev: true /buffer-from/1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -8194,6 +8334,7 @@ packages: /camelcase/5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} + dev: true /camelcase/6.2.1: resolution: {integrity: sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==} @@ -8219,6 +8360,7 @@ packages: /caniuse-lite/1.0.30001325: resolution: {integrity: sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==} + dev: true /ccount/1.1.0: resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} @@ -8246,6 +8388,7 @@ packages: /char-regex/1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} + dev: true /character-entities-legacy/1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} @@ -8344,6 +8487,7 @@ packages: /cjs-module-lexer/1.2.2: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + dev: true /classnames/2.3.1: resolution: {integrity: sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==} @@ -8451,7 +8595,7 @@ packages: engines: {node: '>=0.8'} /clone/2.1.2: - resolution: {integrity: sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=} + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} dev: true @@ -8498,6 +8642,7 @@ packages: /collect-v8-coverage/1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} + dev: true /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -8568,6 +8713,7 @@ packages: engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 + dev: true /comma-separated-tokens/1.0.8: resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} @@ -8797,6 +8943,7 @@ packages: resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} dependencies: safe-buffer: 5.1.2 + dev: true /cookie-signature/1.0.6: resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} @@ -8926,6 +9073,7 @@ packages: /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true /cross-env/7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} @@ -8950,6 +9098,7 @@ packages: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + dev: true /crypto-random-string/2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} @@ -9156,15 +9305,18 @@ packages: /cssom/0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true /cssom/0.4.4: resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: true /cssstyle/2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} dependencies: cssom: 0.3.8 + dev: true /csstype/3.0.11: resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} @@ -9182,6 +9334,7 @@ packages: abab: 2.0.5 whatwg-mimetype: 2.3.0 whatwg-url: 8.7.0 + dev: true /dateformat/3.0.3: resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} @@ -9270,6 +9423,7 @@ packages: /decimal.js/10.3.1: resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==} + dev: true /decode-named-character-reference/1.0.1: resolution: {integrity: sha512-YV/0HQHreRwKb7uBopyIkLG17jG6Sv2qUchk9qSoVJ2f+flwRsPNBO0hAnjt6mTNYUT+vw9Gy2ihXg4sUWPi2w==} @@ -9296,6 +9450,7 @@ packages: /dedent/0.7.0: resolution: {integrity: sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=} + dev: true /deep-equal/1.0.1: resolution: {integrity: sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=} @@ -9307,6 +9462,7 @@ packages: /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true /deepmerge/4.2.2: resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} @@ -9365,6 +9521,7 @@ packages: /delayed-stream/1.0.0: resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} engines: {node: '>=0.4.0'} + dev: true /delegates/1.0.0: resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} @@ -9419,6 +9576,7 @@ packages: /detect-newline/3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + dev: true /detect-node/2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} @@ -9454,10 +9612,12 @@ packages: /diff-sequences/27.5.1: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + dev: true /diff/5.0.0: resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} @@ -9549,6 +9709,7 @@ packages: engines: {node: '>=8'} dependencies: webidl-conversions: 5.0.0 + dev: true /domhandler/2.4.2: resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} @@ -9651,6 +9812,7 @@ packages: /electron-to-chromium/1.4.105: resolution: {integrity: sha512-6w2bmoQBSUgCQjbSjiVv9IS1lXwW2aQABlUJ1vlE8Vci/sVXxUNQrHLQa5N1ioc82Py+a36DlUA5KvrAlHMMeA==} + dev: true /electron-to-chromium/1.4.77: resolution: {integrity: sha512-fiDxw8mO9Ph1Z0bjX2sFTPpi0J0QkOiwOJF+5Q0J0baNc/F9lLePAvDPlnoxvbUYYMizqrKPeotRRkJ9LtxAew==} @@ -9659,6 +9821,7 @@ packages: /emittery/0.8.1: resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} engines: {node: '>=10'} + dev: true /emoji-regex/7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} @@ -9800,6 +9963,7 @@ packages: /escape-string-regexp/2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} + dev: true /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} @@ -9822,6 +9986,7 @@ packages: optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 + dev: true /eslint-ast-utils/1.1.0: resolution: {integrity: sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==} @@ -10264,6 +10429,7 @@ packages: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + dev: true /esquery/1.4.0: resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} @@ -10287,10 +10453,12 @@ packages: /estraverse/5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + dev: true /esutils/2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + dev: true /eta/1.12.3: resolution: {integrity: sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==} @@ -10343,6 +10511,7 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 + dev: true /execall/2.0.0: resolution: {integrity: sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==} @@ -10358,6 +10527,7 @@ packages: /exit/0.1.2: resolution: {integrity: sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=} engines: {node: '>= 0.8.0'} + dev: true /expect/27.5.1: resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} @@ -10367,6 +10537,7 @@ packages: jest-get-type: 27.5.1 jest-matcher-utils: 27.5.1 jest-message-util: 27.5.1 + dev: true /express/4.17.3: resolution: {integrity: sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==} @@ -10458,6 +10629,7 @@ packages: /fast-levenshtein/2.0.6: resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} + dev: true /fast-printf/1.6.9: resolution: {integrity: sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==} @@ -10502,6 +10674,7 @@ packages: resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} dependencies: bser: 2.1.1 + dev: true /fbemitter/3.0.0: resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} @@ -10576,6 +10749,7 @@ packages: engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 + dev: true /filter-obj/1.1.0: resolution: {integrity: sha1-mzERErxsYSehbgFsbF1/GeCAXFs=} @@ -10625,6 +10799,7 @@ packages: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 + dev: true /find-up/5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} @@ -10715,6 +10890,7 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 + dev: true /form-data/4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} @@ -10792,6 +10968,7 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true + dev: true optional: true /function-bind/1.1.1: @@ -10852,6 +11029,7 @@ packages: /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + dev: true /get-caller-file/2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} @@ -10871,6 +11049,7 @@ packages: /get-package-type/0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} + dev: true /get-pkg-repo/4.2.1: resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} @@ -10927,6 +11106,7 @@ packages: /get-stream/6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + dev: true /get-symbol-description/1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} @@ -11060,6 +11240,7 @@ packages: /globals/11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + dev: true /globals/13.12.1: resolution: {integrity: sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==} @@ -11380,6 +11561,7 @@ packages: engines: {node: '>=10'} dependencies: whatwg-encoding: 1.0.5 + dev: true /html-entities/2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} @@ -11387,6 +11569,7 @@ packages: /html-escaper/2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true /html-minifier-terser/6.1.0: resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} @@ -11555,6 +11738,7 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color + dev: true /http-proxy-agent/5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} @@ -11615,6 +11799,7 @@ packages: /human-signals/2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + dev: true /humanize-ms/1.2.1: resolution: {integrity: sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=} @@ -11757,6 +11942,7 @@ packages: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 + dev: true /import-modules/2.1.0: resolution: {integrity: sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==} @@ -11766,6 +11952,7 @@ packages: /imurmurhash/0.1.4: resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} engines: {node: '>=0.8.19'} + dev: true /indent-string/4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} @@ -12038,6 +12225,7 @@ packages: /is-generator-fn/2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} + dev: true /is-generator-function/1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} @@ -12110,6 +12298,7 @@ packages: /is-number/7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + dev: true /is-obj-prop/1.0.0: resolution: {integrity: sha1-s03nnEULjXxzqyzfZ9yHWtuF+A4=} @@ -12171,6 +12360,7 @@ packages: /is-potential-custom-element-name/1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true /is-proto-prop/2.0.0: resolution: {integrity: sha512-jl3NbQ/fGLv5Jhan4uX+Ge9ohnemqyblWVVCpAvtTQzNFvV2xhJq+esnkIbYQ9F1nITXoLfDDQLp7LBw/zzncg==} @@ -12215,6 +12405,7 @@ packages: /is-stream/2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + dev: true /is-string/1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} @@ -12239,6 +12430,7 @@ packages: /is-typedarray/1.0.0: resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} + dev: true /is-unicode-supported/0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} @@ -12279,6 +12471,7 @@ packages: /isexe/2.0.0: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} + dev: true /iso8601-duration/1.3.0: resolution: {integrity: sha512-K4CiUBzo3YeWk76FuET/dQPH03WE04R94feo5TSKQCXpoXQt9E4yx2CnY737QZnSAI3PI4WlKo/zfqizGx52QQ==} @@ -12292,6 +12485,7 @@ packages: /istanbul-lib-coverage/3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} + dev: true /istanbul-lib-instrument/5.1.0: resolution: {integrity: sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==} @@ -12304,6 +12498,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: true /istanbul-lib-report/3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} @@ -12312,6 +12507,7 @@ packages: istanbul-lib-coverage: 3.2.0 make-dir: 3.1.0 supports-color: 7.2.0 + dev: true /istanbul-lib-source-maps/4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} @@ -12322,6 +12518,7 @@ packages: source-map: 0.6.1 transitivePeerDependencies: - supports-color + dev: true /istanbul-reports/3.1.4: resolution: {integrity: sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==} @@ -12329,6 +12526,7 @@ packages: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.0 + dev: true /jake/10.8.2: resolution: {integrity: sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==} @@ -12347,6 +12545,7 @@ packages: '@jest/types': 27.5.1 execa: 5.1.1 throat: 6.0.1 + dev: true /jest-circus/27.5.1: resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} @@ -12373,6 +12572,7 @@ packages: throat: 6.0.1 transitivePeerDependencies: - supports-color + dev: true /jest-cli/27.5.1: resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} @@ -12402,6 +12602,7 @@ packages: - supports-color - ts-node - utf-8-validate + dev: true /jest-cli/27.5.1_ts-node@10.7.0: resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} @@ -12431,6 +12632,7 @@ packages: - supports-color - ts-node - utf-8-validate + dev: true /jest-config/27.5.1: resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} @@ -12470,6 +12672,7 @@ packages: - canvas - supports-color - utf-8-validate + dev: true /jest-config/27.5.1_ts-node@10.7.0: resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} @@ -12510,6 +12713,7 @@ packages: - canvas - supports-color - utf-8-validate + dev: true /jest-diff/27.5.1: resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} @@ -12519,12 +12723,14 @@ packages: diff-sequences: 27.5.1 jest-get-type: 27.5.1 pretty-format: 27.5.1 + dev: true /jest-docblock/27.5.1: resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: detect-newline: 3.1.0 + dev: true /jest-each/27.5.1: resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} @@ -12535,6 +12741,7 @@ packages: jest-get-type: 27.5.1 jest-util: 27.5.1 pretty-format: 27.5.1 + dev: true /jest-environment-jsdom/27.5.1: resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} @@ -12552,6 +12759,7 @@ packages: - canvas - supports-color - utf-8-validate + dev: true /jest-environment-node/27.5.1: resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} @@ -12563,10 +12771,12 @@ packages: '@types/node': 17.0.23 jest-mock: 27.5.1 jest-util: 27.5.1 + dev: true /jest-get-type/27.5.1: resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true /jest-haste-map/27.5.1: resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} @@ -12586,6 +12796,7 @@ packages: walker: 1.0.8 optionalDependencies: fsevents: 2.3.2 + dev: true /jest-jasmine2/27.5.1: resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} @@ -12610,6 +12821,7 @@ packages: throat: 6.0.1 transitivePeerDependencies: - supports-color + dev: true /jest-leak-detector/27.5.1: resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} @@ -12617,6 +12829,7 @@ packages: dependencies: jest-get-type: 27.5.1 pretty-format: 27.5.1 + dev: true /jest-matcher-specific-error/1.0.0: resolution: {integrity: sha512-thJdy9ibhDo8k+0arFalNCQBJ0u7eqTfpTzS2MzL3iCLmbRCkI+yhhKSiAxEi55e5ZUyf01ySa0fMqzF+sblAw==} @@ -12629,6 +12842,7 @@ packages: jest-diff: 27.5.1 jest-get-type: 27.5.1 pretty-format: 27.5.1 + dev: true /jest-message-util/27.5.1: resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} @@ -12643,6 +12857,7 @@ packages: pretty-format: 27.5.1 slash: 3.0.0 stack-utils: 2.0.5 + dev: true /jest-mock/27.5.1: resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} @@ -12650,6 +12865,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@types/node': 17.0.23 + dev: true /jest-pnp-resolver/1.2.2_jest-resolve@27.5.1: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} @@ -12661,10 +12877,12 @@ packages: optional: true dependencies: jest-resolve: 27.5.1 + dev: true /jest-regex-util/27.5.1: resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true /jest-resolve-dependencies/27.5.1: resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} @@ -12675,6 +12893,7 @@ packages: jest-snapshot: 27.5.1 transitivePeerDependencies: - supports-color + dev: true /jest-resolve/27.5.1: resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} @@ -12690,6 +12909,7 @@ packages: resolve: 1.22.0 resolve.exports: 1.1.0 slash: 3.0.0 + dev: true /jest-runner/27.5.1: resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} @@ -12721,6 +12941,7 @@ packages: - canvas - supports-color - utf-8-validate + dev: true /jest-runtime/27.5.1: resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} @@ -12750,6 +12971,7 @@ packages: strip-bom: 4.0.0 transitivePeerDependencies: - supports-color + dev: true /jest-serializer/27.5.1: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} @@ -12757,6 +12979,7 @@ packages: dependencies: '@types/node': 17.0.23 graceful-fs: 4.2.9 + dev: true /jest-snapshot/27.5.1: resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} @@ -12786,6 +13009,7 @@ packages: semver: 7.3.5 transitivePeerDependencies: - supports-color + dev: true /jest-transform-stub/2.0.0: resolution: {integrity: sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==} @@ -12821,6 +13045,7 @@ packages: jest-get-type: 27.5.1 leven: 3.1.0 pretty-format: 27.5.1 + dev: true /jest-watcher/27.5.1: resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} @@ -12833,6 +13058,7 @@ packages: chalk: 4.1.2 jest-util: 27.5.1 string-length: 4.0.2 + dev: true /jest-worker/27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} @@ -12841,6 +13067,7 @@ packages: '@types/node': 17.0.23 merge-stream: 2.0.0 supports-color: 8.1.1 + dev: true /jest/27.5.1: resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} @@ -12861,6 +13088,7 @@ packages: - supports-color - ts-node - utf-8-validate + dev: true /jest/27.5.1_ts-node@10.7.0: resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} @@ -12881,6 +13109,7 @@ packages: - supports-color - ts-node - utf-8-validate + dev: true /joi/17.6.0: resolution: {integrity: sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==} @@ -12913,6 +13142,7 @@ packages: dependencies: argparse: 1.0.10 esprima: 4.0.1 + dev: true /js-yaml/4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} @@ -12961,6 +13191,7 @@ packages: - bufferutil - supports-color - utf-8-validate + dev: true /jsesc/0.5.0: resolution: {integrity: sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=} @@ -12971,6 +13202,7 @@ packages: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true + dev: true /jsesc/3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} @@ -13076,6 +13308,7 @@ packages: /kleur/3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + dev: true /kleur/4.1.4: resolution: {integrity: sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==} @@ -13249,6 +13482,7 @@ packages: /leven/3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + dev: true /levn/0.3.0: resolution: {integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=} @@ -13256,6 +13490,7 @@ packages: dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 + dev: true /levn/0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -13417,6 +13652,7 @@ packages: engines: {node: '>=8'} dependencies: p-locate: 4.1.0 + dev: true /locate-path/6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} @@ -13719,6 +13955,7 @@ packages: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 + dev: true /map-obj/1.0.1: resolution: {integrity: sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=} @@ -13948,6 +14185,7 @@ packages: /merge-stream/2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true /merge2/1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -14212,6 +14450,7 @@ packages: dependencies: braces: 3.0.2 picomatch: 2.3.1 + dev: true /mime-db/1.33.0: resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} @@ -14225,6 +14464,7 @@ packages: /mime-db/1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + dev: true /mime-types/2.1.18: resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} @@ -14244,6 +14484,7 @@ packages: engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 + dev: true /mime/1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} @@ -14519,6 +14760,7 @@ packages: /natural-compare/1.4.0: resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} + dev: true /negotiator/0.6.2: resolution: {integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==} @@ -14612,6 +14854,7 @@ packages: /node-int64/0.4.0: resolution: {integrity: sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=} + dev: true /node-mocks-http/1.11.0: resolution: {integrity: sha512-jS/WzSOcKbOeGrcgKbenZeNhxUNnP36Yw11+hL4TTxQXErGfqYZ+MaYNNvhaTiGIJlzNSqgQkk9j8dSu1YWSuw==} @@ -14631,6 +14874,7 @@ packages: /node-releases/2.0.2: resolution: {integrity: sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==} + dev: true /noms/0.0.0: resolution: {integrity: sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=} @@ -14678,6 +14922,7 @@ packages: /normalize-path/3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + dev: true /normalize-range/0.1.2: resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=} @@ -14817,6 +15062,7 @@ packages: engines: {node: '>=8'} dependencies: path-key: 3.1.1 + dev: true /npmlog/4.1.2: resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} @@ -14873,6 +15119,7 @@ packages: /nwsapi/2.2.0: resolution: {integrity: sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==} + dev: true /obj-props/1.3.0: resolution: {integrity: sha512-k2Xkjx5wn6eC3537SWAXHzB6lkI81kS+icMKMkh4nG3w7shWG6MaWOBrNvhWVOszrtL5uxdfymQQfPUxwY+2eg==} @@ -15025,6 +15272,7 @@ packages: prelude-ls: 1.1.2 type-check: 0.3.2 word-wrap: 1.2.3 + dev: true /optionator/0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} @@ -15092,6 +15340,7 @@ packages: engines: {node: '>=6'} dependencies: p-try: 2.2.0 + dev: true /p-limit/3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} @@ -15119,6 +15368,7 @@ packages: engines: {node: '>=8'} dependencies: p-limit: 2.3.0 + dev: true /p-locate/5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} @@ -15179,6 +15429,7 @@ packages: /p-try/2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + dev: true /p-waterfall/2.1.1: resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} @@ -15353,6 +15604,7 @@ packages: /parse5/6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: true /parseurl/1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} @@ -15389,6 +15641,7 @@ packages: /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + dev: true /path-is-absolute/1.0.1: resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} @@ -15401,6 +15654,7 @@ packages: /path-key/3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + dev: true /path-match/1.2.4: resolution: {integrity: sha1-pidH88fgwlFHYml/JEQ1hbCRAOo=} @@ -15572,6 +15826,7 @@ packages: /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true /picomatch/2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -15606,12 +15861,14 @@ packages: /pirates/4.0.4: resolution: {integrity: sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==} engines: {node: '>= 6'} + dev: true /pkg-dir/4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} dependencies: find-up: 4.1.0 + dev: true /pkg-up/3.1.0: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} @@ -16236,6 +16493,7 @@ packages: /prelude-ls/1.1.2: resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=} engines: {node: '>= 0.8.0'} + dev: true /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -16274,6 +16532,7 @@ packages: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 + dev: true /pretty-ms/6.0.1: resolution: {integrity: sha512-ke4njoVmlotekHlHyCZ3wI/c5AMT8peuHs8rKJqekj/oR5G8lND2dVpicFlUz5cbZgE290vvkMuDwfj/OcW1kw==} @@ -16358,6 +16617,7 @@ packages: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 + dev: true /promzard/0.3.0: resolution: {integrity: sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=} @@ -16419,6 +16679,7 @@ packages: /psl/1.8.0: resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} + dev: true /pump/3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} @@ -16737,6 +16998,7 @@ packages: /react-is/17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true /react-json-view/1.21.3_ku44vyaqhfvsakybl42wrekosu: resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} @@ -17358,6 +17620,7 @@ packages: engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 + dev: true /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} @@ -17366,6 +17629,7 @@ packages: /resolve-from/5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + dev: true /resolve-global/1.0.0: resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} @@ -17396,6 +17660,7 @@ packages: /resolve.exports/1.1.0: resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} engines: {node: '>=10'} + dev: true /resolve/1.22.0: resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} @@ -17522,6 +17787,7 @@ packages: /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -17554,6 +17820,7 @@ packages: engines: {node: '>=10'} dependencies: xmlchars: 2.2.0 + dev: true /scheduler/0.20.2: resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} @@ -17768,10 +18035,12 @@ packages: engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 + dev: true /shebang-regex/3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + dev: true /shell-quote/1.7.3: resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} @@ -17813,6 +18082,7 @@ packages: /sisteransi/1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true /sitemap/7.1.1: resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} @@ -17828,6 +18098,7 @@ packages: /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + dev: true /slash/4.0.0: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} @@ -18086,18 +18357,22 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 + dev: true /source-map/0.5.7: resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} engines: {node: '>=0.10.0'} + dev: true /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + dev: true /source-map/0.7.3: resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} engines: {node: '>= 8'} + dev: true /source-map/0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} @@ -18190,6 +18465,7 @@ packages: /sprintf-js/1.0.3: resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} + dev: true /sprintf-js/1.1.2: resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} @@ -18223,6 +18499,7 @@ packages: engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 + dev: true /state-toggle/1.0.3: resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} @@ -18266,6 +18543,7 @@ packages: dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 + dev: true /string-similarity/4.0.4: resolution: {integrity: sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==} @@ -18397,10 +18675,12 @@ packages: /strip-bom/4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} + dev: true /strip-final-newline/2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + dev: true /strip-indent/3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} @@ -18417,6 +18697,7 @@ packages: /strip-json-comments/3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + dev: true /strong-log-transformer/2.1.0: resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} @@ -18606,6 +18887,7 @@ packages: engines: {node: '>=10'} dependencies: has-flag: 4.0.0 + dev: true /supports-color/9.2.2: resolution: {integrity: sha512-XC6g/Kgux+rJXmwokjm9ECpD6k/smUoS5LKlUCcsYr4IY3rW0XyAympon2RmxGrlnZURMpg5T18gWDP9CsHXFA==} @@ -18618,6 +18900,7 @@ packages: dependencies: has-flag: 4.0.0 supports-color: 7.2.0 + dev: true /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} @@ -18655,6 +18938,7 @@ packages: /symbol-tree/3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true /table/5.4.6: resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} @@ -18714,6 +18998,7 @@ packages: dependencies: ansi-escapes: 4.3.2 supports-hyperlinks: 2.2.0 + dev: true /terser-webpack-plugin/5.3.1_webpack@5.71.0: resolution: {integrity: sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==} @@ -18757,6 +19042,7 @@ packages: '@istanbuljs/schema': 0.1.3 glob: 7.2.0 minimatch: 3.1.2 + dev: true /text-extensions/1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} @@ -18769,6 +19055,7 @@ packages: /throat/6.0.1: resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} + dev: true /through/2.3.8: resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} @@ -18816,6 +19103,7 @@ packages: /tmpl/1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true /to-fast-properties/2.0.0: resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} @@ -18831,6 +19119,7 @@ packages: engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 + dev: true /toidentifier/1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} @@ -18848,6 +19137,7 @@ packages: psl: 1.8.0 punycode: 2.1.1 universalify: 0.1.2 + dev: true /tr46/0.0.3: resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} @@ -18863,6 +19153,7 @@ packages: engines: {node: '>=8'} dependencies: punycode: 2.1.1 + dev: true /treeverse/2.0.0: resolution: {integrity: sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A==} @@ -19080,6 +19371,7 @@ packages: typescript: 4.6.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + dev: true /tsc-watch/5.0.3_typescript@4.6.2: resolution: {integrity: sha512-Hz2UawwELMSLOf0xHvAFc7anLeMw62cMVXr1flYmhRuOhOyOljwmb1l/O60ZwRyy1k7N1iC1mrn1QYM2zITfuw==} @@ -19181,6 +19473,7 @@ packages: engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 + dev: true /type-check/0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -19192,6 +19485,7 @@ packages: /type-detect/4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} + dev: true /type-fest/0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} @@ -19246,6 +19540,7 @@ packages: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: is-typedarray: 1.0.0 + dev: true /typedarray/0.0.6: resolution: {integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=} @@ -19260,11 +19555,13 @@ packages: resolution: {integrity: sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==} engines: {node: '>=4.2.0'} hasBin: true + dev: true /typescript/4.6.4: resolution: {integrity: sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==} engines: {node: '>=4.2.0'} hasBin: true + dev: true /ua-parser-js/0.7.31: resolution: {integrity: sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==} @@ -19488,6 +19785,7 @@ packages: /universalify/0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + dev: true /universalify/2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} @@ -19639,6 +19937,7 @@ packages: /v8-compile-cache-lib/3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true /v8-compile-cache/2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} @@ -19651,6 +19950,7 @@ packages: '@types/istanbul-lib-coverage': 2.0.3 convert-source-map: 1.8.0 source-map: 0.7.3 + dev: true /validate-npm-package-license/3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -19725,12 +20025,14 @@ packages: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} dependencies: browser-process-hrtime: 1.0.0 + dev: true /w3c-xmlserializer/2.0.0: resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} engines: {node: '>=10'} dependencies: xml-name-validator: 3.0.0 + dev: true /wait-on/6.0.1: resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==} @@ -19754,6 +20056,7 @@ packages: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 + dev: true /warning/4.0.3: resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} @@ -19808,10 +20111,12 @@ packages: /webidl-conversions/5.0.0: resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} engines: {node: '>=8'} + dev: true /webidl-conversions/6.1.0: resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} engines: {node: '>=10.4'} + dev: true /webpack-bundle-analyzer/4.5.0: resolution: {integrity: sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==} @@ -19985,9 +20290,11 @@ packages: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} dependencies: iconv-lite: 0.4.24 + dev: true /whatwg-mimetype/2.3.0: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: true /whatwg-url/5.0.0: resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} @@ -20010,6 +20317,7 @@ packages: lodash: 4.17.21 tr46: 2.1.0 webidl-conversions: 6.1.0 + dev: true /which-boxed-primitive/1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -20034,6 +20342,7 @@ packages: hasBin: true dependencies: isexe: 2.0.0 + dev: true /wide-align/1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} @@ -20061,6 +20370,7 @@ packages: /word-wrap/1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} + dev: true /wordwrap/1.0.0: resolution: {integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=} @@ -20109,6 +20419,7 @@ packages: is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 + dev: true /write-file-atomic/4.0.1: resolution: {integrity: sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==} @@ -20162,6 +20473,7 @@ packages: optional: true utf-8-validate: optional: true + dev: true /ws/8.5.0: resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} @@ -20190,9 +20502,11 @@ packages: /xml-name-validator/3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: true /xmlchars/2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true /xtend/4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} @@ -20237,6 +20551,7 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 + dev: true /yargs/17.4.1: resolution: {integrity: sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==} @@ -20257,6 +20572,7 @@ packages: /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} + dev: true /yocto-queue/0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}