diff --git a/.storybook/main.js b/.storybook/main.js
index 027e5f69..0b544d73 100644
--- a/.storybook/main.js
+++ b/.storybook/main.js
@@ -6,7 +6,6 @@ module.exports = {
stories: [],
addons: [
'@storybook/addon-essentials',
- // "storybook-addon-performance/register",
"@storybook/addon-a11y",
"@storybook/addon-toolbars",
],
diff --git a/apps/mibao-ui-docs/jest.config.js b/apps/mibao-ui-docs/jest.config.js
index 2adfb903..69b3b65b 100644
--- a/apps/mibao-ui-docs/jest.config.js
+++ b/apps/mibao-ui-docs/jest.config.js
@@ -5,6 +5,9 @@ module.exports = {
'^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': '@nrwl/react/plugins/jest',
'^.+\\.[tj]sx?$': 'babel-jest'
},
+ moduleNameMapper: {
+ '.+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2|svg)$': 'jest-transform-stub'
+ },
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
coverageDirectory: '../../coverage/apps/mibao-ui-docs'
}
diff --git a/apps/mibao-ui-docs/src/app/pages/image.stories.tsx b/apps/mibao-ui-docs/src/app/pages/image.stories.tsx
new file mode 100644
index 00000000..ef94faac
--- /dev/null
+++ b/apps/mibao-ui-docs/src/app/pages/image.stories.tsx
@@ -0,0 +1,53 @@
+import { Story, Meta } from '@storybook/react'
+import {
+ Image as MibaoImage,
+ MibaoProvider
+} from 'mibao-ui'
+import { Spinner, Stack } from '@chakra-ui/react'
+
+export default {
+ component: MibaoImage,
+ title: 'Components/Image',
+ argTypes: {
+ aspectRatio: {
+ defaultValue: true
+ },
+ objectFit: {
+ options: ['fill', 'contain', 'cover', 'none', 'scale-down'],
+ control: { type: 'select' }
+ },
+ loading: {
+ options: ['', 'eager', 'lazy'],
+ control: { type: 'select' }
+ },
+ crossOrigin: {
+ options: ['', 'anonymous', 'use-credentials'],
+ control: { type: 'select' }
+ }
+ },
+ parameters: {
+ fallback: 'ReactNode'
+ }
+} as Meta
+
+const Template: Story = (args) =>
+
+
+
+ } />
+ Failed} />
+
+
+
+export const Image = Template.bind({})
+Image.args = {
+ src: 'https://oss.jinse.cc/production/bd7c7508-026e-4fcd-abf8-1fa1061f4d6c.png',
+ alt: '',
+ aspectRatio: true,
+ width: '200px',
+ height: '',
+ objectFit: 'cover',
+ crossOrigin: '',
+ disableContextMenu: false,
+ resizeScale: 200
+}
diff --git a/jest.config.js b/jest.config.js
index 42c86fd0..3b9f89f7 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -2,4 +2,7 @@ const { getJestProjects } = require('@nrwl/jest');
module.exports = {
projects: getJestProjects(),
+ moduleNameMapper: {
+ ".+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2|svg)$": "jest-transform-stub"
+ }
};
diff --git a/libs/mibao-ui/.eslintrc.json b/libs/mibao-ui/.eslintrc.json
index 747324b9..07cdac06 100644
--- a/libs/mibao-ui/.eslintrc.json
+++ b/libs/mibao-ui/.eslintrc.json
@@ -22,7 +22,8 @@
"semi": ["error", "never"],
"import/extensions": 0,
"@typescript-eslint/consistent-type-assertions": 0,
- "@typescript-eslint/explicit-function-return-type": 0
+ "@typescript-eslint/explicit-function-return-type": 0,
+ "@typescript-eslint/strict-boolean-expressions": 0
}
},
{
diff --git a/libs/mibao-ui/assets/images/fallback.svg b/libs/mibao-ui/assets/images/fallback.svg
new file mode 100644
index 00000000..b1bed25d
--- /dev/null
+++ b/libs/mibao-ui/assets/images/fallback.svg
@@ -0,0 +1,13 @@
+
diff --git a/libs/mibao-ui/jest.config.js b/libs/mibao-ui/jest.config.js
index 2ba575f3..054e6ae7 100644
--- a/libs/mibao-ui/jest.config.js
+++ b/libs/mibao-ui/jest.config.js
@@ -4,6 +4,9 @@ module.exports = {
transform: {
'^.+\\.[tj]sx?$': 'babel-jest'
},
+ moduleNameMapper: {
+ '.+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2|svg)$': 'jest-transform-stub'
+ },
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
coverageDirectory: '../../coverage/libs/mibao-ui'
}
diff --git a/libs/mibao-ui/src/constants/env.ts b/libs/mibao-ui/src/constants/env.ts
new file mode 100644
index 00000000..b3d5faa5
--- /dev/null
+++ b/libs/mibao-ui/src/constants/env.ts
@@ -0,0 +1,9 @@
+export const OSS_IMG_PROCESS_QUERY_KEY = process.env.OSS_IMG_PROCESS_QUERY_KEY ?? 'x-oss-process'
+export const OSS_IMG_PROCESS_QUERY_KEY_SCALE = process.env.OSS_IMG_PROCESS_QUERY_KEY_SCALE ?? 'image/resize,s_'
+export const OSS_IMG_PROCESS_QUERY_KEY_FORMAT_WEBP = process.env.OSS_IMG_PROCESS_QUERY_KEY_FORMAT_WEBP ?? '/format,webp'
+export const OSS_IMG_HOSTS = process.env.OSS_IMG_HOSTS
+ ? process.env.OSS_IMG_HOSTS.split(',')
+ : [
+ 'https://oss.jinse.cc',
+ 'https://goldenlegend.oss-accelerate.aliyuncs.com'
+ ]
diff --git a/libs/mibao-ui/src/index.ts b/libs/mibao-ui/src/index.ts
index 57913b07..81449367 100644
--- a/libs/mibao-ui/src/index.ts
+++ b/libs/mibao-ui/src/index.ts
@@ -1,7 +1,7 @@
import './index.scss'
+export * from './lib/image/image'
export * from './lib/drawer/drawer'
-
export * from './lib/tooltip/tooltip'
export * from './lib/tab/tab'
export * from './theme'
diff --git a/libs/mibao-ui/src/lib/image/image.module.scss b/libs/mibao-ui/src/lib/image/image.module.scss
new file mode 100644
index 00000000..c2ef10a4
--- /dev/null
+++ b/libs/mibao-ui/src/lib/image/image.module.scss
@@ -0,0 +1,26 @@
+.image {
+}
+
+.image[hide="true"] {
+ opacity: 0;
+ pointer-events: none;
+}
+
+.image[data-aspect-ratio="true"] {
+ aspect-ratio: 1/1;
+}
+
+.loading {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: flex;
+}
+
+.container {
+ position: relative;
+ width: auto;
+ height: auto;
+}
diff --git a/libs/mibao-ui/src/lib/image/image.spec.tsx b/libs/mibao-ui/src/lib/image/image.spec.tsx
new file mode 100644
index 00000000..edb8dc67
--- /dev/null
+++ b/libs/mibao-ui/src/lib/image/image.spec.tsx
@@ -0,0 +1,10 @@
+import { render } from '@testing-library/react'
+
+import { Image } from './image'
+
+describe('Image', () => {
+ it('should render successfully', () => {
+ const { baseElement } = render()
+ expect(baseElement).toBeTruthy()
+ })
+})
diff --git a/libs/mibao-ui/src/lib/image/image.tsx b/libs/mibao-ui/src/lib/image/image.tsx
new file mode 100644
index 00000000..4bd7a31a
--- /dev/null
+++ b/libs/mibao-ui/src/lib/image/image.tsx
@@ -0,0 +1,88 @@
+import { Box, Image as ChakraImage, ImageProps as ChakraImageProps, Skeleton } from '@chakra-ui/react'
+import styles from './image.module.scss'
+import { useState, useMemo, useEffect, useCallback, ReactNode } from 'react'
+import FALLBACK_SRC from '../../../assets/images/fallback.svg'
+import { addParamsToUrl, disableImageContext, getImagePreviewUrl, omit } from '../../utils'
+
+export interface ImageProps extends ChakraImageProps {
+ aspectRatio?: boolean
+ loader?: ReactNode
+ srcQueryParams?: Record
+ disableContextMenu?: boolean
+ resizeScale?: number // Specifies the shortest edge of the target zoom graph.
+}
+
+export const Image = (props: ImageProps) => {
+ const { fallbackSrc = FALLBACK_SRC } = props
+ const [isLoading, setIsLoading] = useState(true)
+ const [isError, setIsError] = useState(false)
+ // loading element
+ const loaderEl = useMemo(() => {
+ if (props.loader) return props.loader
+ return
+ }, [props.loader, props.rounded])
+ // src
+ const imageSrc = useMemo(() => {
+ if (!props.src) return props.src
+ const srcQueryParams = props.srcQueryParams ?? {}
+ if (props.resizeScale) {
+ return addParamsToUrl(getImagePreviewUrl(props.src, props.resizeScale), srcQueryParams)
+ }
+ return addParamsToUrl(props.src, srcQueryParams)
+ }, [props])
+ // omit props
+ const imageProps = useMemo(() => omit(props, [
+ 'aspectRatio',
+ 'loader',
+ 'srcQueryParams',
+ 'resizeScale'
+ ]), [props])
+
+ useEffect(() => {
+ if (props.src) {
+ setIsLoading(true)
+ setIsError(false)
+ }
+ }, [props.src])
+
+ const onLoaded = useCallback((event) => {
+ setIsLoading(false)
+ if (props.onLoad) props.onLoad(event)
+ }, [props])
+
+ const onError = useCallback((event) => {
+ setIsLoading(false)
+ setIsError(true)
+ if (props.onError) props.onError(event)
+ }, [props])
+
+ return (
+
+ {
+ isLoading && (
+
+ {loaderEl}
+
+ )
+ }
+
+
+ )
+}
diff --git a/libs/mibao-ui/src/utils/index.ts b/libs/mibao-ui/src/utils/index.ts
new file mode 100644
index 00000000..5368c85e
--- /dev/null
+++ b/libs/mibao-ui/src/utils/index.ts
@@ -0,0 +1,53 @@
+import {
+ OSS_IMG_HOSTS,
+ OSS_IMG_PROCESS_QUERY_KEY,
+ OSS_IMG_PROCESS_QUERY_KEY_SCALE
+} from '../constants/env'
+
+export function addParamsToUrl (
+ url: string,
+ params: Record,
+ options?: {
+ ignoreDuplicates?: boolean
+ }
+): string {
+ if (!url) {
+ return url
+ }
+ const urlObj = new URL(url)
+ const urlSearchParams = urlObj.searchParams
+ Object.keys(params).forEach((key) => {
+ if (!urlSearchParams.has(key) || options?.ignoreDuplicates) {
+ urlSearchParams.set(key, String(params[key]))
+ }
+ })
+ return decodeURI(urlObj.toString())
+}
+
+export function getImagePreviewUrl (
+ url: U,
+ size = 300
+): U {
+ if (!url) {
+ return url
+ }
+ const urlObj = new URL(url)
+ const isOssHost = OSS_IMG_HOSTS.some((host) => url?.startsWith(host))
+ const isSvgOrWebp = /\.(svg|webp)$/i.test(urlObj.pathname)
+ if (!isOssHost || isSvgOrWebp) {
+ return url
+ }
+ const params: Record = {}
+ params[OSS_IMG_PROCESS_QUERY_KEY] = `${OSS_IMG_PROCESS_QUERY_KEY_SCALE}${size}`
+ return addParamsToUrl(url, params) as U
+}
+
+export function omit (obj: T, keys: K[]): Omit {
+ return keys.reduce((acc, key) => ({ ...acc, [key]: undefined }), obj)
+}
+
+export const disableImageContext = (e: any): boolean => {
+ e?.preventDefault?.()
+ e?.stopPropagation?.()
+ return false
+}
diff --git a/package-lock.json b/package-lock.json
index 4f3eb23b..8856ce20 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -3696,72 +3696,6 @@
}
}
},
- "@typescript-eslint/experimental-utils": {
- "version": "4.31.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz",
- "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.7",
- "@typescript-eslint/scope-manager": "4.31.2",
- "@typescript-eslint/types": "4.31.2",
- "@typescript-eslint/typescript-estree": "4.31.2",
- "eslint-scope": "^5.1.1",
- "eslint-utils": "^3.0.0"
- }
- },
- "@typescript-eslint/scope-manager": {
- "version": "4.31.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz",
- "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "4.31.2",
- "@typescript-eslint/visitor-keys": "4.31.2"
- }
- },
- "@typescript-eslint/types": {
- "version": "4.31.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz",
- "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==",
- "dev": true
- },
- "@typescript-eslint/typescript-estree": {
- "version": "4.31.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz",
- "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "4.31.2",
- "@typescript-eslint/visitor-keys": "4.31.2",
- "debug": "^4.3.1",
- "globby": "^11.0.3",
- "is-glob": "^4.0.1",
- "semver": "^7.3.5",
- "tsutils": "^3.21.0"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "@typescript-eslint/visitor-keys": {
- "version": "4.31.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz",
- "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "4.31.2",
- "eslint-visitor-keys": "^2.0.0"
- }
- },
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -5956,6 +5890,12 @@
"p-limit": "^3.0.2"
}
},
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
"pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -6117,41 +6057,6 @@
"is-number": "^3.0.0",
"repeat-string": "^1.6.1"
}
- },
- "url-loader": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
- "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
- "dev": true,
- "requires": {
- "loader-utils": "^2.0.0",
- "mime-types": "^2.1.27",
- "schema-utils": "^3.0.0"
- },
- "dependencies": {
- "loader-utils": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
- "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
- "dev": true,
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- }
- },
- "schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- }
- }
- }
}
}
},
@@ -7233,41 +7138,6 @@
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true
- },
- "url-loader": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
- "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
- "dev": true,
- "requires": {
- "loader-utils": "^2.0.0",
- "mime-types": "^2.1.27",
- "schema-utils": "^3.0.0"
- },
- "dependencies": {
- "loader-utils": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
- "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
- "dev": true,
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- }
- },
- "schema-utils": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
- "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- }
- }
- }
}
}
},
@@ -8695,9 +8565,9 @@
}
},
"@types/webpack-env": {
- "version": "1.16.2",
- "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.2.tgz",
- "integrity": "sha512-vKx7WNQNZDyJveYcHAm9ZxhqSGLYwoyLhrHjLBOkw3a7cT76sTdjgtwyijhk1MaHyRIuSztcVwrUOO/NEu68Dw==",
+ "version": "1.16.3",
+ "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.3.tgz",
+ "integrity": "sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw==",
"dev": true
},
"@types/webpack-sources": {
@@ -8760,6 +8630,67 @@
"tsutils": "^3.21.0"
},
"dependencies": {
+ "@typescript-eslint/experimental-utils": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.0.0.tgz",
+ "integrity": "sha512-Dnp4dFIsZcPawD6CT1p5NibNUQyGSEz80sULJZkyhyna8AEqArmfwMwJPbmKzWVo4PabqNVzHYlzmcdLQWk+pg==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.7",
+ "@typescript-eslint/scope-manager": "5.0.0",
+ "@typescript-eslint/types": "5.0.0",
+ "@typescript-eslint/typescript-estree": "5.0.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^3.0.0"
+ }
+ },
+ "@typescript-eslint/scope-manager": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.0.0.tgz",
+ "integrity": "sha512-5RFjdA/ain/MDUHYXdF173btOKncIrLuBmA9s6FJhzDrRAyVSA+70BHg0/MW6TE+UiKVyRtX91XpVS0gVNwVDQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.0.0",
+ "@typescript-eslint/visitor-keys": "5.0.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.0.0.tgz",
+ "integrity": "sha512-dU/pKBUpehdEqYuvkojmlv0FtHuZnLXFBn16zsDmlFF3LXkOpkAQ2vrKc3BidIIve9EMH2zfTlxqw9XM0fFN5w==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.0.0.tgz",
+ "integrity": "sha512-V/6w+PPQMhinWKSn+fCiX5jwvd1vRBm7AX7SJQXEGQtwtBvjMPjaU3YTQ1ik2UF1u96X7tsB96HMnulG3eLi9Q==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.0.0",
+ "@typescript-eslint/visitor-keys": "5.0.0",
+ "debug": "^4.3.1",
+ "globby": "^11.0.3",
+ "is-glob": "^4.0.1",
+ "semver": "^7.3.5",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.0.0.tgz",
+ "integrity": "sha512-yRyd2++o/IrJdyHuYMxyFyBhU762MRHQ/bAGQeTnN3pGikfh+nEmM61XTqaDH1XDp53afZ+waXrk0ZvenoZ6xw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.0.0",
+ "eslint-visitor-keys": "^3.0.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz",
+ "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==",
+ "dev": true
+ },
"semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
@@ -8772,15 +8703,15 @@
}
},
"@typescript-eslint/experimental-utils": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.0.0.tgz",
- "integrity": "sha512-Dnp4dFIsZcPawD6CT1p5NibNUQyGSEz80sULJZkyhyna8AEqArmfwMwJPbmKzWVo4PabqNVzHYlzmcdLQWk+pg==",
+ "version": "4.31.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz",
+ "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==",
"dev": true,
"requires": {
"@types/json-schema": "^7.0.7",
- "@typescript-eslint/scope-manager": "5.0.0",
- "@typescript-eslint/types": "5.0.0",
- "@typescript-eslint/typescript-estree": "5.0.0",
+ "@typescript-eslint/scope-manager": "4.31.2",
+ "@typescript-eslint/types": "4.31.2",
+ "@typescript-eslint/typescript-estree": "4.31.2",
"eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0"
}
@@ -8795,32 +8726,90 @@
"@typescript-eslint/types": "5.0.0",
"@typescript-eslint/typescript-estree": "5.0.0",
"debug": "^4.3.1"
+ },
+ "dependencies": {
+ "@typescript-eslint/scope-manager": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.0.0.tgz",
+ "integrity": "sha512-5RFjdA/ain/MDUHYXdF173btOKncIrLuBmA9s6FJhzDrRAyVSA+70BHg0/MW6TE+UiKVyRtX91XpVS0gVNwVDQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.0.0",
+ "@typescript-eslint/visitor-keys": "5.0.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.0.0.tgz",
+ "integrity": "sha512-dU/pKBUpehdEqYuvkojmlv0FtHuZnLXFBn16zsDmlFF3LXkOpkAQ2vrKc3BidIIve9EMH2zfTlxqw9XM0fFN5w==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.0.0.tgz",
+ "integrity": "sha512-V/6w+PPQMhinWKSn+fCiX5jwvd1vRBm7AX7SJQXEGQtwtBvjMPjaU3YTQ1ik2UF1u96X7tsB96HMnulG3eLi9Q==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.0.0",
+ "@typescript-eslint/visitor-keys": "5.0.0",
+ "debug": "^4.3.1",
+ "globby": "^11.0.3",
+ "is-glob": "^4.0.1",
+ "semver": "^7.3.5",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.0.0.tgz",
+ "integrity": "sha512-yRyd2++o/IrJdyHuYMxyFyBhU762MRHQ/bAGQeTnN3pGikfh+nEmM61XTqaDH1XDp53afZ+waXrk0ZvenoZ6xw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.0.0",
+ "eslint-visitor-keys": "^3.0.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz",
+ "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
}
},
"@typescript-eslint/scope-manager": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.0.0.tgz",
- "integrity": "sha512-5RFjdA/ain/MDUHYXdF173btOKncIrLuBmA9s6FJhzDrRAyVSA+70BHg0/MW6TE+UiKVyRtX91XpVS0gVNwVDQ==",
+ "version": "4.31.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz",
+ "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "5.0.0",
- "@typescript-eslint/visitor-keys": "5.0.0"
+ "@typescript-eslint/types": "4.31.2",
+ "@typescript-eslint/visitor-keys": "4.31.2"
}
},
"@typescript-eslint/types": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.0.0.tgz",
- "integrity": "sha512-dU/pKBUpehdEqYuvkojmlv0FtHuZnLXFBn16zsDmlFF3LXkOpkAQ2vrKc3BidIIve9EMH2zfTlxqw9XM0fFN5w==",
+ "version": "4.31.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz",
+ "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==",
"dev": true
},
"@typescript-eslint/typescript-estree": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.0.0.tgz",
- "integrity": "sha512-V/6w+PPQMhinWKSn+fCiX5jwvd1vRBm7AX7SJQXEGQtwtBvjMPjaU3YTQ1ik2UF1u96X7tsB96HMnulG3eLi9Q==",
+ "version": "4.31.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz",
+ "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "5.0.0",
- "@typescript-eslint/visitor-keys": "5.0.0",
+ "@typescript-eslint/types": "4.31.2",
+ "@typescript-eslint/visitor-keys": "4.31.2",
"debug": "^4.3.1",
"globby": "^11.0.3",
"is-glob": "^4.0.1",
@@ -8840,21 +8829,13 @@
}
},
"@typescript-eslint/visitor-keys": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.0.0.tgz",
- "integrity": "sha512-yRyd2++o/IrJdyHuYMxyFyBhU762MRHQ/bAGQeTnN3pGikfh+nEmM61XTqaDH1XDp53afZ+waXrk0ZvenoZ6xw==",
+ "version": "4.31.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz",
+ "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "5.0.0",
- "eslint-visitor-keys": "^3.0.0"
- },
- "dependencies": {
- "eslint-visitor-keys": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz",
- "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==",
- "dev": true
- }
+ "@typescript-eslint/types": "4.31.2",
+ "eslint-visitor-keys": "^2.0.0"
}
},
"@webassemblyjs/ast": {
@@ -9563,6 +9544,14 @@
"normalize-range": "^0.1.2",
"picocolors": "^0.2.1",
"postcss-value-parser": "^4.1.0"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ }
}
},
"aws-sign2": {
@@ -10367,16 +10356,16 @@
}
},
"browserslist": {
- "version": "4.17.3",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz",
- "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==",
+ "version": "4.17.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz",
+ "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001264",
- "electron-to-chromium": "^1.3.857",
+ "caniuse-lite": "^1.0.30001265",
+ "electron-to-chromium": "^1.3.867",
"escalade": "^3.1.1",
- "node-releases": "^1.1.77",
- "picocolors": "^0.2.1"
+ "node-releases": "^2.0.0",
+ "picocolors": "^1.0.0"
}
},
"bs-logger": {
@@ -10701,9 +10690,9 @@
}
},
"caniuse-lite": {
- "version": "1.0.30001265",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz",
- "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==",
+ "version": "1.0.30001267",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001267.tgz",
+ "integrity": "sha512-r1mjTzAuJ9W8cPBGbbus8E0SKcUP7gn03R14Wk8FlAlqhH9hroy9nLqmpuXlfKEw/oILW+FGz47ipXV2O7x8lg==",
"dev": true
},
"capture-exit": {
@@ -11351,9 +11340,9 @@
"integrity": "sha512-zNhPOUoSgoizoSQFdX1MeZO16ORRb9FFQLts8gSYbZU5FcgXhp24iMWMxnOQo5uIaIG7/6FA/IqJPwev1o9ZXQ=="
},
"core-js-compat": {
- "version": "3.18.2",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.2.tgz",
- "integrity": "sha512-25VJYCJtGjZwLguj7d66oiHfmnVw3TMOZ0zV8DyMJp/aeQ3OjR519iOOeck08HMyVVRAqXxafc2Hl+5QstJrsQ==",
+ "version": "3.18.3",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.3.tgz",
+ "integrity": "sha512-4zP6/y0a2RTHN5bRGT7PTq9lVt3WzvffTNjqnTKsXhkAYNDTkdCLOIfAdOLcQ/7TDdyRj3c+NeHe1NmF1eDScw==",
"dev": true,
"requires": {
"browserslist": "^4.17.3",
@@ -11369,9 +11358,9 @@
}
},
"core-js-pure": {
- "version": "3.18.2",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.2.tgz",
- "integrity": "sha512-4hMMLUlZhKJKOWbbGD1/VDUxGPEhEoN/T01k7bx271WiBKCvCfkgPzy0IeRS4PB50p6/N1q/SZL4B/TRsTE5bA==",
+ "version": "3.18.3",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.3.tgz",
+ "integrity": "sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw==",
"dev": true
},
"core-util-is": {
@@ -11797,6 +11786,12 @@
"semver": "^6.3.0"
},
"dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
"postcss": {
"version": "7.0.39",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
@@ -12813,9 +12808,9 @@
}
},
"electron-to-chromium": {
- "version": "1.3.865",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.865.tgz",
- "integrity": "sha512-okGcCKfihgGlaROMFNPQ6eaU3bk9Xa68rLYSnVD2PyIqM5B/vyQoXCpB3p1HI3AXio097ROVBlSO4JZVilUWuA==",
+ "version": "1.3.867",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.867.tgz",
+ "integrity": "sha512-WbTXOv7hsLhjJyl7jBfDkioaY++iVVZomZ4dU6TMe/SzucV6mUAs2VZn/AehBwuZMiNEQDaPuTGn22YK5o+aDw==",
"dev": true
},
"element-resize-detector": {
@@ -13428,9 +13423,9 @@
}
},
"eslint-module-utils": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.0.tgz",
- "integrity": "sha512-hqSE88MmHl3ru9SYvDyGrlo0JwROlf9fiEMplEV7j/EAuq9iSlIlyCFbBT6pdULQBSnBYtYKiMLps+hKkyP7Gg==",
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz",
+ "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==",
"dev": true,
"requires": {
"debug": "^3.2.7",
@@ -15807,6 +15802,12 @@
"postcss": "^7.0.14"
},
"dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
"postcss": {
"version": "7.0.39",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
@@ -16576,9 +16577,9 @@
}
},
"istanbul-lib-source-maps": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
- "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
"dev": true,
"requires": {
"debug": "^4.1.1",
@@ -16595,9 +16596,9 @@
}
},
"istanbul-reports": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.3.tgz",
- "integrity": "sha512-0i77ZFLsb9U3DHi22WzmIngVzfoyxxbQcZRqlF3KoKmCJGq9nhFHoGi8FqBztN2rE8w6hURnZghetn0xpkVb6A==",
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz",
+ "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==",
"dev": true,
"requires": {
"html-escaper": "^2.0.0",
@@ -18265,6 +18266,12 @@
}
}
},
+ "jest-transform-stub": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/jest-transform-stub/-/jest-transform-stub-2.0.0.tgz",
+ "integrity": "sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==",
+ "dev": true
+ },
"jest-util": {
"version": "27.0.6",
"resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.6.tgz",
@@ -19723,9 +19730,9 @@
"dev": true
},
"nanoid": {
- "version": "3.1.29",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.29.tgz",
- "integrity": "sha512-dW2pUSGZ8ZnCFIlBIA31SV8huOGCHb6OwzVCc7A69rb/a+SgPBwfmLvK5TKQ3INPbRkcI8a/Owo0XbiTNH19wg==",
+ "version": "3.1.30",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
+ "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==",
"dev": true
},
"nanomatch": {
@@ -19944,9 +19951,9 @@
"dev": true
},
"node-releases": {
- "version": "1.1.77",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz",
- "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz",
+ "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA==",
"dev": true
},
"nopt": {
@@ -20819,9 +20826,9 @@
"dev": true
},
"picocolors": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
- "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
},
"picomatch": {
@@ -21097,6 +21104,12 @@
"postcss": "^7.0.26"
},
"dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
"postcss": {
"version": "7.0.39",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
@@ -21331,6 +21344,12 @@
"postcss": "^7.0.5"
},
"dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
"postcss": {
"version": "7.0.39",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
@@ -21361,6 +21380,12 @@
"postcss-value-parser": "^4.1.0"
},
"dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
"postcss": {
"version": "7.0.39",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
@@ -21389,6 +21414,12 @@
"postcss-selector-parser": "^6.0.0"
},
"dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
"postcss": {
"version": "7.0.39",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
@@ -21417,6 +21448,12 @@
"postcss": "^7.0.6"
},
"dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
"postcss": {
"version": "7.0.39",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
@@ -22190,6 +22227,12 @@
"to-regex": "^3.0.2"
}
},
+ "node-releases": {
+ "version": "1.1.77",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz",
+ "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==",
+ "dev": true
+ },
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
@@ -23742,9 +23785,9 @@
}
},
"sass": {
- "version": "1.42.1",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.42.1.tgz",
- "integrity": "sha512-/zvGoN8B7dspKc5mC6HlaygyCBRvnyzzgD5khiaCfglWztY99cYoiTUksVx11NlnemrcfH5CEaCpsUKoW0cQqg==",
+ "version": "1.43.2",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.2.tgz",
+ "integrity": "sha512-DncYhjl3wBaPMMJR0kIUaH3sF536rVrOcqqVGmTZHQRRzj7LQlyGV7Mb8aCKFyILMr5VsPHwRYtyKpnKYlmQSQ==",
"dev": true,
"requires": {
"chokidar": ">=3.0.0 <4.0.0"
diff --git a/package.json b/package.json
index 4c503f04..e0ae397e 100644
--- a/package.json
+++ b/package.json
@@ -63,6 +63,7 @@
"eslint-plugin-react": "7.23.1",
"eslint-plugin-react-hooks": "4.2.0",
"jest": "27.0.3",
+ "jest-transform-stub": "^2.0.0",
"prettier": "2.4.1",
"ts-jest": "27.0.5",
"typescript": "4.3.5",