Improve First Contentful Paint (FCP) Time (#399)

Co-authored-by: KaiyiWing <Zhang.kaiyi42@gmail.com>
This commit is contained in:
Luyu Cheng
2023-04-17 17:35:20 +08:00
committed by GitHub
parent 78bb1b31e7
commit 914b6d895b
33 changed files with 213 additions and 205 deletions

3
.gitignore vendored
View File

@@ -25,4 +25,5 @@ yarn-error.log*
.eslintcache .eslintcache
package-lock.json package-lock.json
.env .env
stats.html

View File

@@ -1,3 +1,4 @@
build build
node_modules node_modules
public/dicts public/dicts
stats.html

View File

@@ -22,7 +22,6 @@
"howler": "^2.2.3", "howler": "^2.2.3",
"html-to-image": "^1.11.11", "html-to-image": "^1.11.11",
"jotai": "^2.0.3", "jotai": "^2.0.3",
"lodash": "^4.17.20",
"mixpanel-browser": "^2.45.0", "mixpanel-browser": "^2.45.0",
"postcss": "^8.4.21", "postcss": "^8.4.21",
"react": "^18.2.0", "react": "^18.2.0",
@@ -43,7 +42,6 @@
"build": "cross-env CI=false vite build --base=./", "build": "cross-env CI=false vite build --base=./",
"test": "echo \"No tests\"", "test": "echo \"No tests\"",
"lint": "eslint .", "lint": "eslint .",
"analyze": "source-map-explorer 'build/static/js/*.js'",
"prettier": "prettier --write .", "prettier": "prettier --write .",
"prepare": "husky install" "prepare": "husky install"
}, },
@@ -85,9 +83,9 @@
"lint-staged": "^13.1.2", "lint-staged": "^13.1.2",
"prettier": "^2.8.4", "prettier": "^2.8.4",
"prettier-plugin-tailwindcss": "^0.2.7", "prettier-plugin-tailwindcss": "^0.2.7",
"rollup-plugin-visualizer": "^5.9.0",
"tailwindcss": "^3.3.1", "tailwindcss": "^3.3.1",
"typescript-plugin-css-modules": "^5.0.1", "typescript-plugin-css-modules": "^5.0.1",
"vite": "^4.1.1", "vite": "^4.1.1"
"vite-plugin-svgr": "^2.4.0"
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 519 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 410 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 370 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

@@ -1,6 +1,6 @@
import React, { PropsWithChildren } from 'react' import React, { PropsWithChildren } from 'react'
import { NavLink } from 'react-router-dom' import { NavLink } from 'react-router-dom'
import { ReactComponent as Logo } from '@/assets/logo.svg' import logo from '@/assets/logo.svg'
const Header: React.FC<PropsWithChildren> = ({ children }) => { const Header: React.FC<PropsWithChildren> = ({ children }) => {
return ( return (
@@ -10,7 +10,7 @@ const Header: React.FC<PropsWithChildren> = ({ children }) => {
className="flex items-center text-2xl font-bold text-indigo-400 no-underline hover:no-underline lg:text-4xl" className="flex items-center text-2xl font-bold text-indigo-400 no-underline hover:no-underline lg:text-4xl"
to="https://qwerty.kaiyi.cool/" to="https://qwerty.kaiyi.cool/"
> >
<Logo className="mr-3 h-16 w-16" /> <img src={logo} className="mr-3 h-16 w-16" />
<h1>Qwerty Learner</h1> <h1>Qwerty Learner</h1>
</NavLink> </NavLink>
<nav className="card on element flex w-auto content-center items-center justify-end space-x-3 rounded-large bg-white p-4 transition-colors duration-300 dark:bg-gray-800"> <nav className="card on element flex w-auto content-center items-center justify-end space-x-3 rounded-large bg-white p-4 transition-colors duration-300 dark:bg-gray-800">

View File

@@ -1,7 +1,7 @@
import { useAtomValue } from 'jotai' import { useAtomValue } from 'jotai'
import useSound from 'use-sound' import useSound from 'use-sound'
import { SOUND_URL_PREFIX } from '@/resources/soundResource' import { SOUND_URL_PREFIX } from '@/resources/soundResource'
import { noop } from 'lodash' import noop from '@/utils/noop'
import { keySoundsConfigAtom, hintSoundsConfigAtom } from '@/store' import { keySoundsConfigAtom, hintSoundsConfigAtom } from '@/store'
export type PlayFunction = ReturnType<typeof useSound>[0] export type PlayFunction = ReturnType<typeof useSound>[0]

View File

@@ -4,7 +4,7 @@ import { useEffect, useMemo, useState } from 'react'
import useSound from 'use-sound' import useSound from 'use-sound'
import { HookOptions } from 'use-sound/dist/types' import { HookOptions } from 'use-sound/dist/types'
import { addHowlListener } from '@/utils' import { addHowlListener } from '@/utils'
import { noop } from 'lodash' import noop from '@/utils/noop'
import { pronunciationConfigAtom } from '@/store' import { pronunciationConfigAtom } from '@/store'
import { PronunciationType } from '@/typings' import { PronunciationType } from '@/typings'

View File

@@ -1,10 +1,10 @@
import { CHAPTER_LENGTH } from '@/constants'
import { currentChapterAtom, currentDictInfoAtom } from '@/store'
import { useAtom, useAtomValue } from 'jotai'
import { range } from 'lodash'
import React from 'react' import React from 'react'
import { useUpdateEffect } from 'react-use' import range from '@/utils/range'
import ChapterButton from './ChapterButton' import ChapterButton from './ChapterButton'
import { useAtom, useAtomValue } from 'jotai'
import { currentChapterAtom, currentDictInfoAtom } from '@/store'
import { CHAPTER_LENGTH } from '@/constants'
import { useUpdateEffect } from 'react-use'
const ChapterGroup: React.FC<ChapterGroupProps> = ({ totalWords }) => { const ChapterGroup: React.FC<ChapterGroupProps> = ({ totalWords }) => {
const [currentChapter, setCurrentChapter] = useAtom(currentChapterAtom) const [currentChapter, setCurrentChapter] = useAtom(currentChapterAtom)
@@ -16,7 +16,7 @@ const ChapterGroup: React.FC<ChapterGroupProps> = ({ totalWords }) => {
return ( return (
<main className="mr-4 grid gap-4 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4"> <main className="mr-4 grid gap-4 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
{range(currentDictInfo.chapterCount).map((index) => {range(0, currentDictInfo.chapterCount, 1).map((index) =>
index + 1 === currentDictInfo.chapterCount ? ( index + 1 === currentDictInfo.chapterCount ? (
<ChapterButton <ChapterButton
wordCount={totalWords % CHAPTER_LENGTH || CHAPTER_LENGTH} wordCount={totalWords % CHAPTER_LENGTH || CHAPTER_LENGTH}

View File

@@ -3,7 +3,7 @@ import Layout from '@/components/Layout'
import DictionaryGroup from './DictionaryGroup' import DictionaryGroup from './DictionaryGroup'
import Header from '@/components/Header' import Header from '@/components/Header'
import { NavLink, useNavigate } from 'react-router-dom' import { NavLink, useNavigate } from 'react-router-dom'
import { groupBy } from 'lodash' import groupBy from '@/utils/groupBy'
import { useHotkeys } from 'react-hotkeys-hook' import { useHotkeys } from 'react-hotkeys-hook'
import ChapterGroup from './ChapterGroup' import ChapterGroup from './ChapterGroup'
import Tooltip from '@/components/Tooltip' import Tooltip from '@/components/Tooltip'

View File

@@ -1,4 +1,4 @@
import { clamp } from 'lodash' import clamp from '@/utils/clamp'
import { useMemo } from 'react' import { useMemo } from 'react'
import classNames from 'classnames' import classNames from 'classnames'

View File

@@ -2,10 +2,16 @@ import { Dialog, Transition } from '@headlessui/react'
import { toPng } from 'html-to-image' import { toPng } from 'html-to-image'
import { Fragment, useContext, useEffect, useMemo, useRef, useState } from 'react' import { Fragment, useContext, useEffect, useMemo, useRef, useState } from 'react'
import { saveAs } from 'file-saver' import { saveAs } from 'file-saver'
import { ReactComponent as KeyboardSvg } from '@/assets/sharePic/keyBackground.svg' import keyboardSvg from '@/assets/sharePic/keyBackground.svg'
import { ReactComponent as Image1 } from '@/assets/sharePic/image-1.svg' import shareImage1 from '@/assets/sharePic/image-1.png'
import { ReactComponent as Image2 } from '@/assets/sharePic/image-2.svg' import shareImage2 from '@/assets/sharePic/image-2.png'
import { ReactComponent as Image3 } from '@/assets/sharePic/image-3.svg' import shareImage3 from '@/assets/sharePic/image-3.png'
import shareImage4 from '@/assets/sharePic/image-4.png'
import shareImage5 from '@/assets/sharePic/image-5.png'
import shareImage6 from '@/assets/sharePic/image-6.png'
import shareImage7 from '@/assets/sharePic/image-7.png'
import shareImage8 from '@/assets/sharePic/image-8.png'
import shareImage9 from '@/assets/sharePic/image-9.png'
import { TypingContext } from '../../store' import { TypingContext } from '../../store'
import { useAtomValue } from 'jotai' import { useAtomValue } from 'jotai'
import { currentChapterAtom, currentDictInfoAtom } from '@/store' import { currentChapterAtom, currentDictInfoAtom } from '@/store'
@@ -13,7 +19,7 @@ import { recordShareAction } from '@/utils'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
const PIC_RATIO = 3 const PIC_RATIO = 3
const PIC_LIST = [Image1, Image2, Image3] const PIC_LIST = [shareImage1, shareImage2, shareImage3, shareImage4, shareImage5, shareImage6, shareImage7, shareImage8, shareImage9]
// 我知道有些有点怪,但怪的有趣(狗头)powered by chatGPT // 我知道有些有点怪,但怪的有趣(狗头)powered by chatGPT
const PROMOTE_LIST = [ const PROMOTE_LIST = [
{ word: '快人一手', sentence: '速度快得就像比别人多长了一只手' }, { word: '快人一手', sentence: '速度快得就像比别人多长了一只手' },
@@ -54,7 +60,7 @@ export default function SharePicDialog({ showState, setShowState, randomChoose }
const dialogFocusRef = useRef<HTMLButtonElement>(null) const dialogFocusRef = useRef<HTMLButtonElement>(null)
const Pic = useMemo(() => PIC_LIST[Math.floor(randomChoose.picRandom * PIC_LIST.length)], [randomChoose.picRandom]) const shareImage = useMemo(() => PIC_LIST[Math.floor(randomChoose.picRandom * PIC_LIST.length)], [randomChoose.picRandom])
const promote = useMemo(() => PROMOTE_LIST[Math.floor(randomChoose.promoteRandom * PROMOTE_LIST.length)], [randomChoose.promoteRandom]) const promote = useMemo(() => PROMOTE_LIST[Math.floor(randomChoose.promoteRandom * PROMOTE_LIST.length)], [randomChoose.promoteRandom])
useEffect(() => { useEffect(() => {
@@ -164,7 +170,7 @@ export default function SharePicDialog({ showState, setShowState, randomChoose }
<div className="mt-1 text-xs font-normal text-gray-400"></div> <div className="mt-1 text-xs font-normal text-gray-400"></div>
</div> </div>
<div className="absolute -right-9 bottom-10 "> <div className="absolute -right-9 bottom-10 ">
<Pic className="w-48" /> <img src={shareImage} className="w-48" width={186} height={122} />
</div> </div>
</div> </div>
</div> </div>
@@ -196,7 +202,7 @@ function KeyboardKey({ char }: { char: string }) {
return ( return (
<div className="relative -mx-1 h-18 w-18"> <div className="relative -mx-1 h-18 w-18">
<div className="absolute bottom-0 left-0 right-0 top-0"> <div className="absolute bottom-0 left-0 right-0 top-0">
<KeyboardSvg className="h-full w-full" /> <img src={keyboardSvg} className="h-full w-full" />
</div> </div>
<div className="absolute left-0 right-0 top-2.5 flex items-center justify-center"> <div className="absolute left-0 right-0 top-2.5 flex items-center justify-center">
<span className="text-base font-normal text-white" style={{ fontSize: '20px', transform: 'rotateX(30deg) ' }}> <span className="text-base font-normal text-white" style={{ fontSize: '20px', transform: 'rotateX(30deg) ' }}>

View File

@@ -1,6 +1,5 @@
import { useAtom, useAtomValue } from 'jotai' import { useAtom, useAtomValue } from 'jotai'
import cet4 from '@/assets/CET4_T.json' import shuffle from '@/utils/shuffle'
import { shuffle } from 'lodash'
import { useMemo } from 'react' import { useMemo } from 'react'
import useSWR from 'swr' import useSWR from 'swr'
import { Word } from '@/typings/index' import { Word } from '@/typings/index'
@@ -21,30 +20,61 @@ export function useWordList(): UseWordListResult {
const [currentChapter, setCurrentChapter] = useAtom(currentChapterAtom) const [currentChapter, setCurrentChapter] = useAtom(currentChapterAtom)
const randomConfig = useAtomValue(randomConfigAtom) const randomConfig = useAtomValue(randomConfigAtom)
const isFirstChapter = currentDictInfo.id === 'cet4' && currentChapter === 0
// Reset current chapter to 0, when currentChapter is greater than chapterCount. // Reset current chapter to 0, when currentChapter is greater than chapterCount.
if (currentChapter >= currentDictInfo.chapterCount) { if (currentChapter >= currentDictInfo.chapterCount) {
setCurrentChapter(0) setCurrentChapter(0)
} }
const { data: wordList, error, isLoading } = useSWR([currentDictInfo.url, currentDictInfo.id], ([url, id]) => wordListFetcher(url, id)) const { data: wordList, error, isLoading } = useSWR(currentDictInfo.url, wordListFetcher)
const words = useMemo( const words = useMemo(
() => (wordList ? wordList.slice(currentChapter * CHAPTER_LENGTH, (currentChapter + 1) * CHAPTER_LENGTH) : []), () =>
[wordList, currentChapter], isFirstChapter
? firstChapter
: wordList
? wordList.slice(currentChapter * CHAPTER_LENGTH, (currentChapter + 1) * CHAPTER_LENGTH)
: [],
[isFirstChapter, wordList, currentChapter],
) )
const shuffleWords = useMemo(() => (randomConfig.isOpen ? shuffle(words) : words), [randomConfig.isOpen, words]) const shuffleWords = useMemo(() => (randomConfig.isOpen ? shuffle(words) : words), [randomConfig.isOpen, words])
return { words: wordList === undefined ? undefined : shuffleWords, isLoading, error } return { words: wordList === undefined ? undefined : shuffleWords, isLoading, error }
} }
async function wordListFetcher(url: string, id: string): Promise<Word[]> { async function wordListFetcher(url: string): Promise<Word[]> {
const URL_PREFIX: string = REACT_APP_DEPLOY_ENV === 'pages' ? '/qwerty-learner' : '' const URL_PREFIX: string = REACT_APP_DEPLOY_ENV === 'pages' ? '/qwerty-learner' : ''
if (id === 'cet4') { const response = await fetch(URL_PREFIX + url)
return cet4 const words: Word[] = await response.json()
} else { return words
const response = await fetch(URL_PREFIX + url)
const words: Word[] = await response.json()
return words
}
} }
const firstChapter = [
{ name: 'cancel', trans: ['取消, 撤销; 删去'], usphone: "'kænsl", ukphone: "'kænsl" },
{ name: 'explosive', trans: ['爆炸的; 极易引起争论的', '炸药'], usphone: "ɪk'splosɪv; ɪk'splozɪv", ukphone: "ɪk'spləusɪv" },
{ name: 'numerous', trans: ['众多的'], usphone: "'numərəs", ukphone: "'njuːmərəs" },
{ name: 'govern', trans: ['居支配地位, 占优势', '统治,治理,支配'], usphone: "'ɡʌvɚn", ukphone: "'gʌvn" },
{ name: 'analyse', trans: ['分析; 分解; 解析'], usphone: "'æn(ə)laɪz", ukphone: "'ænəlaɪz" },
{ name: 'discourage', trans: ['使泄气, 使灰心; 阻止, 劝阻'], usphone: "dɪs'kɝɪdʒ", ukphone: "dɪs'kʌrɪdʒ" },
{ name: 'resemble', trans: ['像, 类似于'], usphone: "rɪ'zɛmbl", ukphone: "rɪ'zembl" },
{
name: 'remote',
trans: ['遥远的; 偏僻的; 关系疏远的; 脱离的; 微乎其微的; 孤高的, 冷淡的; 遥控的'],
usphone: "rɪ'mot",
ukphone: "rɪ'məut",
},
{ name: 'salary', trans: ['薪金, 薪水'], usphone: "'sæləri", ukphone: "'sæləri" },
{ name: 'pollution', trans: ['污染, 污染物'], usphone: "pə'luʃən", ukphone: "pə'luːʃn" },
{ name: 'pretend', trans: ['装作, 假装'], usphone: "prɪ'tɛnd", ukphone: "prɪ'tend" },
{ name: 'kettle', trans: ['水壶'], usphone: "'kɛtl", ukphone: "'ketl" },
{ name: 'wreck', trans: ['失事;残骸;精神或身体已垮的人', '破坏'], usphone: 'rɛk', ukphone: 'rek' },
{ name: 'drunk', trans: ['醉的; 陶醉的'], usphone: 'drʌŋk', ukphone: 'drʌŋk' },
{ name: 'calculate', trans: ['计算; 估计; 计划'], usphone: "'kælkjulet", ukphone: "'kælkjuleɪt" },
{ name: 'persistent', trans: ['坚持的, 不屈不挠的; 持续不断的; 反复出现的'], usphone: "pə'zɪstənt", ukphone: "pə'sɪstənt" },
{ name: 'sake', trans: ['缘故, 理由'], usphone: 'sek', ukphone: 'seɪk' },
{ name: 'conceal', trans: ['把…隐藏起来, 掩盖, 隐瞒'], usphone: "kən'sil", ukphone: "kən'siːl" },
{ name: 'audience', trans: ['听众, 观众, 读者'], usphone: "'ɔdɪəns", ukphone: "'ɔːdiəns" },
{ name: 'meanwhile', trans: ['与此同时'], usphone: "'minwaɪl", ukphone: "'miːnwaɪl" },
]

View File

@@ -10,7 +10,7 @@ export const dictionaries: DictionaryResource[] = [
name: 'CET-4', name: 'CET-4',
description: '大学英语四级词库', description: '大学英语四级词库',
category: '英语学习', category: '英语学习',
url: '', url: '/dicts/CET4_T.json',
length: 2607, length: 2607,
language: 'en', language: 'en',
}, },

12
src/utils/clamp.ts Normal file
View File

@@ -0,0 +1,12 @@
export default function clamp(number: number, lower: number, upper: number): number {
number = +number
lower = +lower
upper = +upper
lower = lower === lower ? lower : 0
upper = upper === upper ? upper : 0
if (number === number) {
number = number <= upper ? number : upper
number = number >= lower ? number : lower
}
return number
}

11
src/utils/groupBy.ts Normal file
View File

@@ -0,0 +1,11 @@
export default function groupBy<T>(elements: T[], iteratee: (value: T) => string) {
return elements.reduce<Record<string, T[]>>((result, value) => {
const key = iteratee(value)
if (Object.prototype.hasOwnProperty.call(result, key)) {
result[key].push(value)
} else {
result[key] = [value]
}
return result
}, {})
}

2
src/utils/noop.ts Normal file
View File

@@ -0,0 +1,2 @@
// eslint-disable-next-line @typescript-eslint/no-empty-function
export default function noop(): void {}

35
src/utils/range.ts Normal file
View File

@@ -0,0 +1,35 @@
const INFINITY = 1 / 0
const MAX_INTEGER = 1.7976931348623157e308
function toFinite(value: number): number {
if (value === INFINITY || value === -INFINITY) {
const sign = value < 0 ? -1 : 1
return sign * MAX_INTEGER
}
return value === value ? value : 0
}
function baseRange(start: number, end: number, step: number): number[] {
let index = -1
let length = Math.max(Math.ceil((end - start) / (step || 1)), 0)
const result = new Array<number>(length)
while (length--) {
result[++index] = start
start += step
}
return result
}
export default function range(start: number, end: number, step: number): number[] {
// Ensure the sign of `-0` is preserved.
start = toFinite(start)
if (end === undefined) {
end = start
start = 0
} else {
end = toFinite(end)
}
step = step === undefined ? (start < end ? 1 : -1) : toFinite(step)
return baseRange(start, end, step)
}

16
src/utils/shuffle.ts Normal file
View File

@@ -0,0 +1,16 @@
export default function shuffle<T>(array: T[]): T[] {
const length = array == null ? 0 : array.length
if (!length) {
return []
}
let index = -1
const lastIndex = length - 1
const result = Array.from(array)
while (++index < length) {
const rand = index + Math.floor(Math.random() * (lastIndex - index + 1))
const value = result[rand]
result[rand] = result[index]
result[index] = value
}
return result
}

View File

@@ -15,7 +15,7 @@
"isolatedModules": true, "isolatedModules": true,
"noEmit": true, "noEmit": true,
"jsx": "react-jsx", "jsx": "react-jsx",
"types": ["vite-plugin-svgr/client", "node"], "types": ["node"],
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"@/*": ["src/*"] "@/*": ["src/*"]

View File

@@ -1,9 +1,9 @@
import { defineConfig } from 'vite' import { visualizer } from 'rollup-plugin-visualizer'
import { defineConfig, type PluginOption } from 'vite'
import react from '@vitejs/plugin-react' import react from '@vitejs/plugin-react'
import jotaiDebugLabel from 'jotai/babel/plugin-debug-label' import jotaiDebugLabel from 'jotai/babel/plugin-debug-label'
import jotaiReactRefresh from 'jotai/babel/plugin-react-refresh' import jotaiReactRefresh from 'jotai/babel/plugin-react-refresh'
import path from 'node:path' import path from 'node:path'
import svgr from 'vite-plugin-svgr'
import { getLastCommit } from 'git-last-commit' import { getLastCommit } from 'git-last-commit'
// https://vitejs.dev/config/ // https://vitejs.dev/config/
@@ -12,9 +12,11 @@ export default defineConfig(async () => {
return getLastCommit((err, commit) => (err ? 'unknown' : resolve(commit.shortHash))) return getLastCommit((err, commit) => (err ? 'unknown' : resolve(commit.shortHash)))
}) })
return { return {
plugins: [react({ babel: { plugins: [jotaiDebugLabel, jotaiReactRefresh] } }), svgr()], plugins: [react({ babel: { plugins: [jotaiDebugLabel, jotaiReactRefresh] } }), visualizer() as PluginOption],
build: { build: {
minify: true,
outDir: 'build', outDir: 'build',
sourcemap: true,
}, },
define: { define: {
REACT_APP_DEPLOY_ENV: JSON.stringify(process.env.REACT_APP_DEPLOY_ENV), REACT_APP_DEPLOY_ENV: JSON.stringify(process.env.REACT_APP_DEPLOY_ENV),

184
yarn.lock
View File

@@ -27,7 +27,7 @@
resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298"
integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==
"@babel/core@^7.16.0", "@babel/core@^7.19.6", "@babel/core@^7.20.12": "@babel/core@^7.16.0", "@babel/core@^7.20.12":
version "7.21.0" version "7.21.0"
resolved "https://registry.npmmirror.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" resolved "https://registry.npmmirror.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13"
integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==
@@ -1479,103 +1479,11 @@
resolved "https://registry.npmmirror.com/@remix-run/router/-/router-1.3.3.tgz#d6d531d69c0fa3a44fda7dc00b20d49b44549164" resolved "https://registry.npmmirror.com/@remix-run/router/-/router-1.3.3.tgz#d6d531d69c0fa3a44fda7dc00b20d49b44549164"
integrity sha512-YRHie1yQEj0kqqCTCJEfHqYSSNlZQ696QJG+MMiW4mxSl9I0ojz/eRhJS4fs88Z5i6D1SmoF9d3K99/QOhI8/w== integrity sha512-YRHie1yQEj0kqqCTCJEfHqYSSNlZQ696QJG+MMiW4mxSl9I0ojz/eRhJS4fs88Z5i6D1SmoF9d3K99/QOhI8/w==
"@rollup/pluginutils@^5.0.2":
version "5.0.2"
resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33"
integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==
dependencies:
"@types/estree" "^1.0.0"
estree-walker "^2.0.2"
picomatch "^2.3.1"
"@rushstack/eslint-patch@^1.1.0": "@rushstack/eslint-patch@^1.1.0":
version "1.2.0" version "1.2.0"
resolved "https://registry.npmmirror.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" resolved "https://registry.npmmirror.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728"
integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==
"@svgr/babel-plugin-add-jsx-attribute@^6.5.1":
version "6.5.1"
resolved "https://registry.npmmirror.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba"
integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==
"@svgr/babel-plugin-remove-jsx-attribute@*":
version "6.5.0"
resolved "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz#652bfd4ed0a0699843585cda96faeb09d6e1306e"
integrity sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==
"@svgr/babel-plugin-remove-jsx-empty-expression@*":
version "6.5.0"
resolved "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz#4b78994ab7d39032c729903fc2dd5c0fa4565cb8"
integrity sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==
"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1":
version "6.5.1"
resolved "https://registry.npmmirror.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60"
integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==
"@svgr/babel-plugin-svg-dynamic-title@^6.5.1":
version "6.5.1"
resolved "https://registry.npmmirror.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4"
integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==
"@svgr/babel-plugin-svg-em-dimensions@^6.5.1":
version "6.5.1"
resolved "https://registry.npmmirror.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217"
integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==
"@svgr/babel-plugin-transform-react-native-svg@^6.5.1":
version "6.5.1"
resolved "https://registry.npmmirror.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305"
integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==
"@svgr/babel-plugin-transform-svg-component@^6.5.1":
version "6.5.1"
resolved "https://registry.npmmirror.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250"
integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==
"@svgr/babel-preset@^6.5.1":
version "6.5.1"
resolved "https://registry.npmmirror.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828"
integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==
dependencies:
"@svgr/babel-plugin-add-jsx-attribute" "^6.5.1"
"@svgr/babel-plugin-remove-jsx-attribute" "*"
"@svgr/babel-plugin-remove-jsx-empty-expression" "*"
"@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1"
"@svgr/babel-plugin-svg-dynamic-title" "^6.5.1"
"@svgr/babel-plugin-svg-em-dimensions" "^6.5.1"
"@svgr/babel-plugin-transform-react-native-svg" "^6.5.1"
"@svgr/babel-plugin-transform-svg-component" "^6.5.1"
"@svgr/core@^6.5.1":
version "6.5.1"
resolved "https://registry.npmmirror.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a"
integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==
dependencies:
"@babel/core" "^7.19.6"
"@svgr/babel-preset" "^6.5.1"
"@svgr/plugin-jsx" "^6.5.1"
camelcase "^6.2.0"
cosmiconfig "^7.0.1"
"@svgr/hast-util-to-babel-ast@^6.5.1":
version "6.5.1"
resolved "https://registry.npmmirror.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2"
integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==
dependencies:
"@babel/types" "^7.20.0"
entities "^4.4.0"
"@svgr/plugin-jsx@^6.5.1":
version "6.5.1"
resolved "https://registry.npmmirror.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072"
integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==
dependencies:
"@babel/core" "^7.19.6"
"@svgr/babel-preset" "^6.5.1"
"@svgr/hast-util-to-babel-ast" "^6.5.1"
svg-parser "^2.0.4"
"@tailwindcss/postcss7-compat@^2.2.17": "@tailwindcss/postcss7-compat@^2.2.17":
version "2.2.17" version "2.2.17"
resolved "https://registry.npmmirror.com/@tailwindcss/postcss7-compat/-/postcss7-compat-2.2.17.tgz#dc78f3880a2af84163150ff426a39e42b9ae8922" resolved "https://registry.npmmirror.com/@tailwindcss/postcss7-compat/-/postcss7-compat-2.2.17.tgz#dc78f3880a2af84163150ff426a39e42b9ae8922"
@@ -1617,11 +1525,6 @@
resolve "^1.20.0" resolve "^1.20.0"
tmp "^0.2.1" tmp "^0.2.1"
"@types/estree@^1.0.0":
version "1.0.0"
resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2"
integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==
"@types/file-saver@^2.0.5": "@types/file-saver@^2.0.5":
version "2.0.5" version "2.0.5"
resolved "https://registry.npmmirror.com/@types/file-saver/-/file-saver-2.0.5.tgz#9ee342a5d1314bb0928375424a2f162f97c310c7" resolved "https://registry.npmmirror.com/@types/file-saver/-/file-saver-2.0.5.tgz#9ee342a5d1314bb0928375424a2f162f97c310c7"
@@ -2200,11 +2103,6 @@ camelcase-css@^2.0.1:
resolved "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" resolved "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
camelcase@^6.2.0:
version "6.3.0"
resolved "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449: caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449:
version "1.0.30001460" version "1.0.30001460"
resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001460.tgz#31d2e26f0a2309860ed3eff154e03890d9d851a7" resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001460.tgz#31d2e26f0a2309860ed3eff154e03890d9d851a7"
@@ -2289,6 +2187,15 @@ cliui@^7.0.2:
strip-ansi "^6.0.0" strip-ansi "^6.0.0"
wrap-ansi "^7.0.0" wrap-ansi "^7.0.0"
cliui@^8.0.1:
version "8.0.1"
resolved "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
dependencies:
string-width "^4.2.0"
strip-ansi "^6.0.1"
wrap-ansi "^7.0.0"
color-convert@^1.9.0: color-convert@^1.9.0:
version "1.9.3" version "1.9.3"
resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
@@ -2504,6 +2411,11 @@ deep-is@^0.1.3:
resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
define-lazy-prop@^2.0.0:
version "2.0.0"
resolved "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
define-properties@^1.1.3, define-properties@^1.1.4: define-properties@^1.1.3, define-properties@^1.1.4:
version "1.2.0" version "1.2.0"
resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5"
@@ -2594,11 +2506,6 @@ emoji-regex@^9.2.2:
resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
entities@^4.4.0:
version "4.4.0"
resolved "https://registry.npmmirror.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174"
integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==
errno@^0.1.1: errno@^0.1.1:
version "0.1.8" version "0.1.8"
resolved "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" resolved "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
@@ -2998,11 +2905,6 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0:
resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
estree-walker@^2.0.2:
version "2.0.2"
resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
esutils@^2.0.2: esutils@^2.0.2:
version "2.0.3" version "2.0.3"
resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
@@ -3555,7 +3457,7 @@ is-date-object@^1.0.1, is-date-object@^1.0.5:
dependencies: dependencies:
has-tostringtag "^1.0.0" has-tostringtag "^1.0.0"
is-docker@^2.0.0: is-docker@^2.0.0, is-docker@^2.1.1:
version "2.2.1" version "2.2.1"
resolved "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" resolved "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
@@ -3684,7 +3586,7 @@ is-what@^3.14.1:
resolved "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" resolved "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1"
integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==
is-wsl@^2.1.1: is-wsl@^2.1.1, is-wsl@^2.2.0:
version "2.2.0" version "2.2.0"
resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
@@ -4232,6 +4134,15 @@ open@^7.3.1:
is-docker "^2.0.0" is-docker "^2.0.0"
is-wsl "^2.1.1" is-wsl "^2.1.1"
open@^8.4.0:
version "8.4.2"
resolved "https://registry.npmmirror.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9"
integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==
dependencies:
define-lazy-prop "^2.0.0"
is-docker "^2.1.1"
is-wsl "^2.2.0"
optionator@^0.9.1: optionator@^0.9.1:
version "0.9.1" version "0.9.1"
resolved "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" resolved "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
@@ -4805,6 +4716,16 @@ rimraf@~2.6.2:
dependencies: dependencies:
glob "^7.1.3" glob "^7.1.3"
rollup-plugin-visualizer@^5.9.0:
version "5.9.0"
resolved "https://registry.npmmirror.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.0.tgz#013ac54fb6a9d7c9019e7eb77eced673399e5a0b"
integrity sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==
dependencies:
open "^8.4.0"
picomatch "^2.3.1"
source-map "^0.7.4"
yargs "^17.5.1"
rollup@^3.10.0: rollup@^3.10.0:
version "3.18.0" version "3.18.0"
resolved "https://registry.npmmirror.com/rollup/-/rollup-3.18.0.tgz#2354ba63ba66d6a09c652c3ea0dbcd9dad72bbde" resolved "https://registry.npmmirror.com/rollup/-/rollup-3.18.0.tgz#2354ba63ba66d6a09c652c3ea0dbcd9dad72bbde"
@@ -5048,7 +4969,7 @@ string-natural-compare@^3.0.1:
resolved "https://registry.npmmirror.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" resolved "https://registry.npmmirror.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4"
integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==
string-width@^4.1.0, string-width@^4.2.0: string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3" version "4.2.3"
resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -5174,11 +5095,6 @@ supports-preserve-symlinks-flag@^1.0.0:
resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
svg-parser@^2.0.4:
version "2.0.4"
resolved "https://registry.npmmirror.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5"
integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==
swr@^2.0.4: swr@^2.0.4:
version "2.0.4" version "2.0.4"
resolved "https://registry.npmmirror.com/swr/-/swr-2.0.4.tgz#e68a5cc2e87b2a7f5f7ebf8a472cea24fc1c5fce" resolved "https://registry.npmmirror.com/swr/-/swr-2.0.4.tgz#e68a5cc2e87b2a7f5f7ebf8a472cea24fc1c5fce"
@@ -5451,14 +5367,6 @@ util-deprecate@^1.0.2:
resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
vite-plugin-svgr@^2.4.0:
version "2.4.0"
resolved "https://registry.npmmirror.com/vite-plugin-svgr/-/vite-plugin-svgr-2.4.0.tgz#9b14953955e79893ea7718089b9777a494e38fc6"
integrity sha512-q+mJJol6ThvqkkJvvVFEndI4EaKIjSI0I3jNFgSoC9fXAz1M7kYTVUin8fhUsFojFDKZ9VHKtX6NXNaOLpbsHA==
dependencies:
"@rollup/pluginutils" "^5.0.2"
"@svgr/core" "^6.5.1"
vite@^4.1.1: vite@^4.1.1:
version "4.1.4" version "4.1.4"
resolved "https://registry.npmmirror.com/vite/-/vite-4.1.4.tgz#170d93bcff97e0ebc09764c053eebe130bfe6ca0" resolved "https://registry.npmmirror.com/vite/-/vite-4.1.4.tgz#170d93bcff97e0ebc09764c053eebe130bfe6ca0"
@@ -5579,6 +5487,11 @@ yargs-parser@^20.2.2:
resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
yargs-parser@^21.1.1:
version "21.1.1"
resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
yargs@^16.2.0: yargs@^16.2.0:
version "16.2.0" version "16.2.0"
resolved "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" resolved "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
@@ -5592,6 +5505,19 @@ yargs@^16.2.0:
y18n "^5.0.5" y18n "^5.0.5"
yargs-parser "^20.2.2" yargs-parser "^20.2.2"
yargs@^17.5.1:
version "17.7.1"
resolved "https://registry.npmmirror.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967"
integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==
dependencies:
cliui "^8.0.1"
escalade "^3.1.1"
get-caller-file "^2.0.5"
require-directory "^2.1.1"
string-width "^4.2.3"
y18n "^5.0.5"
yargs-parser "^21.1.1"
yocto-queue@^0.1.0: yocto-queue@^0.1.0:
version "0.1.0" version "0.1.0"
resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"