diff --git a/.eslintrc.json b/.eslintrc.json index ff3e56b89..38021e5df 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -12,8 +12,7 @@ "extends": [ "eslint:recommended", "plugin:@typescript-eslint/recommended", - "next/core-web-vitals", - "plugin:storybook/recommended" + "next/core-web-vitals" ], "rules": { "@typescript-eslint/no-unused-vars": [ diff --git a/.github/ISSUE_TEMPLATE/issue-template.md b/.github/ISSUE_TEMPLATE/issue-template.md index c7c82b209..3235d64a6 100644 --- a/.github/ISSUE_TEMPLATE/issue-template.md +++ b/.github/ISSUE_TEMPLATE/issue-template.md @@ -2,7 +2,7 @@ name: Issue template about: 프로덕트 백로그를 등록합니다. title: '' -labels: [🐥 프론트, ✨ feature, 🔥 v.1.0] +labels: [🐥 프론트, ✨ feature] assignees: '' --- diff --git a/.github/actions/get-score-comments/action.js b/.github/actions/get-score-comments/action.js deleted file mode 100644 index 36e102038..000000000 --- a/.github/actions/get-score-comments/action.js +++ /dev/null @@ -1,101 +0,0 @@ -const core = require('@actions/core'); - -try { - // 점수 지표 파일 정보 - const fs = require('fs'); - const results = JSON.parse(fs.readFileSync('./lhci_reports/manifest.json')); - const totalReports = results.length; - - // LightHouse 점수 지표 - const averageScores = { - performance: 0, - accessibility: 0, - 'best-practices': 0, - seo: 0, - pwa: 0, - }; - const auditSummaries = { - 'first-contentful-paint': 0, - 'largest-contentful-paint': 0, - interactive: 0, - 'total-blocking-time': 0, - 'cumulative-layout-shift': 0, - }; - - // 점수 평균 - results.forEach(result => { - const { summary } = result; - - for (const key in averageScores) { - averageScores[key] += summary[key]; - } - - const details = JSON.parse(fs.readFileSync(result.jsonPath)); - [ - 'first-contentful-paint', - 'largest-contentful-paint', - 'interactive', - 'total-blocking-time', - 'cumulative-layout-shift', - ].forEach(auditName => { - if (details.audits[auditName]) { - const auditDetails = details.audits[auditName]; - auditSummaries[auditName] += parseFloat(auditDetails.displayValue) || 0; - } - }); - }); - - // 점수 색상 표시 - const formatScore = res => (res >= 90 ? '🟢' : res >= 70 ? '🟠' : '🔴'); - - // 상세 지표 점수 색상 표시 - const detailScore = (value, metric) => { - switch (metric) { - case 'first-contentful-paint': - return value <= 1.8 ? '🟢' : value <= 3 ? '🟠' : '🔴'; - case 'largest-contentful-paint': - return value <= 2.5 ? '🟢' : value <= 4 ? '🟠' : '🔴'; - case 'interactive': - return value <= 3.8 ? '🟢' : value <= 7.3 ? '🟠' : '🔴'; - case 'total-blocking-time': - return value <= 300 ? '🟢' : value <= 600 ? '🟠' : '🔴'; - case 'cumulative-layout-shift': - return value <= 0.1 ? '🟢' : value <= 0.25 ? '🟠' : '🔴'; - default: - return '🔴'; // Default to red if metric is unknown - } - }; - - // comments 파싱 - let comments = - '⚡️ Lighthouse Average Scores Across Reports:\n| Category | Score |\n| --- | --- |\n'; - Object.keys(averageScores).forEach(key => { - const avgScore = Math.round((averageScores[key] / totalReports) * 100); - comments += `| ${formatScore(avgScore)} ${key.replace( - /-/g, - ' ' - )} | ${avgScore} |\n`; - }); - - comments += - '\n⚡️ Average Details Across All Reports:\n| Category | Score |\n| --- | --- |\n'; - Object.keys(auditSummaries).forEach(auditName => { - const average = auditSummaries[auditName] / totalReports; - const formattedName = auditName.replace(/-/g, ' '); - const colorCode = detailScore(average, auditName); - const unit = - auditName === 'total-blocking-time' - ? 'ms' - : auditName === 'cumulative-layout-shift' - ? '' - : 's'; - comments += `| ${colorCode} ${formattedName} | ${average.toFixed( - 1 - )}${unit} |\n`; - }); - - // comments 내보내기 - core.setOutput('comments', comments); -} catch (error) { - console.error(error); -} diff --git a/.github/actions/get-score-comments/action.yml b/.github/actions/get-score-comments/action.yml deleted file mode 100644 index ca1bb5e77..000000000 --- a/.github/actions/get-score-comments/action.yml +++ /dev/null @@ -1,10 +0,0 @@ -name: 'get-score-comments' -description: 'Get Score Comments' - -outputs: - comments: - description: 'Comments that Parsed Scores' - -runs: - using: 'node16' - main: 'action.js' diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml deleted file mode 100644 index ffc44a588..000000000 --- a/.github/workflows/chromatic.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Storybook Deployment - -on: - pull_request: - branches: - - main - -jobs: - chromatic-deploy: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - uses: actions/setup-node@v3 - with: - node-version: 18 - cache: 'yarn' - - - name: Install Dependency - run: yarn install --immutable - - - name: Set .env - run: echo "${{ vars.DEVELOPMENT_ENV }}" > .env.local - - - name: Publish Chromatic - id: chromatic - uses: chromaui/action@v1 - with: - projectToken: ${{ secrets.CHROMATIC_TOKEN }} - - - name: Find Comment - if: github.event_name == 'pull_request' - uses: peter-evans/find-comment@v2 - id: find_comment - with: - issue-number: ${{ github.event.pull_request.number }} - comment-author: 'github-actions[bot]' - body-includes: 🚀 Storybook - - - name: Create or update comment - if: github.event_name == 'pull_request' - uses: peter-evans/create-or-update-comment@v2 - with: - comment-id: ${{ steps.find_comment.outputs.comment-id }} - issue-number: ${{ github.event.pull_request.number }} - body: '🚀 Storybook: ${{ steps.chromatic.outputs.storybookUrl }}' - edit-mode: replace diff --git a/.github/workflows/lighthouse.yml b/.github/workflows/lighthouse.yml deleted file mode 100644 index 2bbe185aa..000000000 --- a/.github/workflows/lighthouse.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: LightHouse CI - -on: - pull_request: - branches: - - main - -jobs: - lhci: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Use Node.js 18 - uses: actions/setup-node@v3 - with: - node-version: 18 - cache: 'yarn' - - - name: Install packages - run: yarn install && yarn global add @lhci/cli@0.13.x && yarn add @actions/core - - - name: Set .env - run: echo "${{ vars.DEVELOPMENT_ENV }}" > .env.local - - - name: Build - run: yarn build - - - name: Run Lighthouse CI - run: lhci autorun - env: - LHCI_GITHUB_APP_TOKEN: ${{ secrets.LHCI_GITHUB_APP_TOKEN }} - - - name: Get Score Comments - id: get-score-comments - uses: ./.github/actions/get-score-comments - - - name: Find Comment - if: github.event_name == 'pull_request' - uses: peter-evans/find-comment@v2 - id: find_comment - with: - issue-number: ${{ github.event.pull_request.number }} - comment-author: 'github-actions[bot]' - body-includes: ⚡️ Lighthouse Average Scores Across Reports - - - name: Create or update comment - if: github.event_name == 'pull_request' - uses: peter-evans/create-or-update-comment@v2 - with: - comment-id: ${{ steps.find_comment.outputs.comment-id }} - issue-number: ${{ github.event.pull_request.number }} - body: ${{ steps.get-score-comments.outputs.comments }} - edit-mode: replace diff --git a/.gitignore b/.gitignore index 4b2671656..c87c9b392 100644 --- a/.gitignore +++ b/.gitignore @@ -34,12 +34,3 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts - -# auto generated pwa files -# Auto Generated PWA files -**/public/sw.js -**/public/workbox-*.js -**/public/worker-*.js -**/public/sw.js.map -**/public/workbox-*.js.map -**/public/worker-*.js.map diff --git a/.prettierrc.json b/.prettierrc similarity index 100% rename from .prettierrc.json rename to .prettierrc diff --git a/.storybook/main.ts b/.storybook/main.ts deleted file mode 100644 index 61fd3aa20..000000000 --- a/.storybook/main.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { StorybookConfig } from '@storybook/nextjs'; -const config: StorybookConfig = { - stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], - staticDirs: ['../public'], - addons: [ - '@storybook/addon-links', - '@storybook/addon-essentials', - '@storybook/addon-interactions', - '@storybook/addon-styling', - ], - framework: { - name: '@storybook/nextjs', - options: {}, - }, - docs: { - autodocs: 'tag', - }, - webpackFinal: async config => { - const imageRule = config.module?.rules?.find(rule => { - const test = (rule as { test: RegExp }).test; - - if (!test) { - return false; - } - - return test.test('.svg'); - }) as { [key: string]: any }; - - imageRule.exclude = /\.svg$/; - - config.module?.rules?.push({ - test: /\.svg$/, - use: ['@svgr/webpack'], - }); - - return config; - }, -}; -export default config; diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx deleted file mode 100644 index 7da5b8625..000000000 --- a/.storybook/preview.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import React from 'react'; -import { rest } from 'msw'; -import { initialize, mswLoader } from 'msw-storybook-addon'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import type { Preview } from '@storybook/react'; - -import ToastProvider from '../src/components/common/Toast/ToastProvider'; - -import '@/styles/global.css'; - -const nextApi = (path: string) => - new URL(path, process.env.NEXT_HOST).toString(); - -const serviceApi = (path: string) => - new URL(path, process.env.NEXT_PUBLIC_API_URL).toString(); - -initialize({}, [ - rest.get(nextApi('/service-api/*'), async (req, res, ctx) => { - const { pathname, search } = req.url; - const match = /\/service-api(?.*)/g.exec(pathname); - - if (!match || !match.groups || !match.groups.path) { - return res(ctx.status(404, 'Invalid Request URL')); - } - - const { path } = match.groups; - const originResponse = await ctx.fetch(serviceApi(`/api${path}${search}`)); - const originResponseData = await originResponse.json(); - - return res(ctx.json({ ...originResponseData })); - }), - rest.post(nextApi('/service-api/*'), async (req, res, ctx) => { - const { pathname, search } = req.url; - const match = /\/service-api(?.*)/g.exec(pathname); - - if (!match || !match.groups || !match.groups.path) { - return res(ctx.status(404, 'Invalid Request URL')); - } - - const { path } = match.groups; - - const { headers, mode } = req; - const data = await req.json(); - const body = JSON.stringify(data); - const originRequest = { - method: 'POST', - body, - headers, - mode, - }; - - const originResponse = await ctx.fetch( - serviceApi(`/api${path}${search}`), - originRequest - ); - const originResponseData = await originResponse.json(); - - return res(ctx.json({ ...originResponseData })); - }), - rest.get( - nextApi('/aladin-api?QueryType=Bestseller&Cover=Big'), - async (req, res, ctx) => { - return res( - ctx.json({ - item: [ - { - isbn: '9791162242742', - title: '리팩터링', - author: '마틴 파울러', - cover: - 'https://search1.kakaocdn.net/thumb/R120x174.q85/?fname=http%3A%2F%2Ft1.daumcdn.net%2Flbook%2Fimage%2F5326912%3Ftimestamp%3D20231207165435', - bestRank: 1, - link: 'https://search.daum.net/search?w=bookpage&bookId=5326912&q=%EB%A6%AC%ED%8C%A9%ED%84%B0%EB%A7%81', - }, - ], - }) - ); - } - ), -]); - -const queryClient = new QueryClient({ - defaultOptions: { - queries: { - refetchOnWindowFocus: false, - retry: false, - }, - }, -}); - -const preview: Preview = { - parameters: { - actions: { argTypesRegex: '^on[A-Z].*' }, - controls: { - matchers: { - color: /(background|color)$/i, - date: /Date$/, - }, - }, - nextjs: { - appDirectory: true, - }, - }, - loaders: [mswLoader], - decorators: [ - Story => ( - - - - - - ), - ], -}; - -export default preview; diff --git a/.vscode/react.code-snippets b/.vscode/react.code-snippets deleted file mode 100644 index d1684713b..000000000 --- a/.vscode/react.code-snippets +++ /dev/null @@ -1,19 +0,0 @@ -{ - "create a default export react component": { - "scope": "javascriptreact,typescriptreact", - "prefix": ["!tsx", "!jsx"], - "body": [ - "type ${1:${TM_FILENAME_BASE/(.*)\\..+$/$1/}}Props = {", - " ${2:// remove this comment}", - "};", - "", - "const ${1} = (_props: ${1}Props) => {", - " ${0}", - " return ${3:<>};", - "};", - "", - "export default ${1};", - "" - ] - } -} diff --git a/.vscode/storybook.code-snippets b/.vscode/storybook.code-snippets deleted file mode 100644 index 2566f51ab..000000000 --- a/.vscode/storybook.code-snippets +++ /dev/null @@ -1,24 +0,0 @@ -{ - "create a story for react component": { - "scope": "typescript,typescriptreact", - "prefix": "!story", - "body": [ - "import { Meta, StoryObj } from '@storybook/react';", - "", - "const meta: Meta = {", - " title: 'Base/${1}',", - " component: ${1},", - " tags: ['autodocs'],", - "};", - "", - "export default meta;", - "", - "type Story = StoryObj;", - "", - "export const Default: Story = {", - " args: {$2},", - "};", - "" - ] - } -} diff --git a/lighthouserc.js b/lighthouserc.js deleted file mode 100644 index d4ff08990..000000000 --- a/lighthouserc.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - ci: { - collect: { - startServerCommand: 'yarn next start', - startServerReadyPattern: 'ready on', - url: [ - 'http://localhost:3000/bookarchive', - 'http://localhost:3000/book/search', - 'http://localhost:3000/group', - 'http://localhost:3000/profile/me', - ], - numberOfRuns: 2, - }, - upload: { - target: 'filesystem', - outputDir: './lhci_reports', - reportFilenamePattern: '%%PATHNAME%%-%%DATETIME%%-report.%%EXTENSION%%', - }, - }, -}; diff --git a/next.config.js b/next.config.js index 76f6c8899..5bbcb6c89 100644 --- a/next.config.js +++ b/next.config.js @@ -1,31 +1,11 @@ const baseURL = process.env.NEXT_PUBLIC_API_URL; -const aladinURL = process.env.ALADIN_OPEN_API_URI; -const ALADIN_API_KEY = process.env.ALADIN_OPEN_API_TTBKEY; /** @type {import('next').NextConfig} */ const nextConfig = { webpack: config => { config.module.rules.push({ test: /\.svg$/, - use: [ - { - loader: '@svgr/webpack', - options: { - svgoConfig: { - plugins: [ - { - name: 'preset-default', - params: { - overrides: { - removeViewBox: false, - }, - }, - }, - ], - }, - }, - }, - ], + use: ['@svgr/webpack'], }); return config; }, @@ -35,11 +15,6 @@ const nextConfig = { source: '/service-api/:url*', destination: `${baseURL}/api/:url*`, }, - { - source: '/aladin-api', - has: [{ type: 'query', key: 'QueryType', value: '(?.*)' }], - destination: `${aladinURL}/api/ItemList.aspx?ttbkey=${ALADIN_API_KEY}&QueryType=:QueryType&MaxResults=10&start=1&SearchTarget=Book&output=JS&Version=20131101`, - }, ]; }, async redirects() { @@ -59,24 +34,6 @@ const nextConfig = { port: '', pathname: '/**', }, - { - protocol: 'http', - hostname: '*.kakaocdn.net', - port: '', - pathname: '/**', - }, - { - protocol: 'https', - hostname: 'blog.kakaocdn.net', - port: '', - pathname: '/**', - }, - { - protocol: 'https', - hostname: 'image.aladin.co.kr', - port: '', - pathname: '/**', - }, ], }, }; diff --git a/package.json b/package.json index afe1915eb..0beb1a9ee 100644 --- a/package.json +++ b/package.json @@ -1,24 +1,19 @@ { - "name": "dadok", + "name": "team08-boilerplate", "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev -H local.dev.dadok.app", + "dev": "next dev -H local.dev.dadok.site", "build": "next build", - "start": "next start -H local.dev.dadok.app", - "dev-ssl": "node scripts/server.js local.dev.dadok.app", - "start-ssl": "NODE_ENV=production node scripts/server.js local.dev.dadok.app", + "start": "next start -H local.dev.dadok.site", "lint": "next lint", - "prepare": "husky install", - "storybook": "storybook dev -p 6006", - "build-storybook": "storybook build", - "update-host": "node scripts/updateDevHost.js local.dev.dadok.app", - "init-https": "sh scripts/init-mkcert.sh local.dev.dadok.app", - "postinstall": "patch-package" + "prepare": "husky install" }, "dependencies": { - "@actions/core": "^1.10.1", - "@headlessui/react": "^1.7.15", + "@chakra-ui/icons": "^2.0.17", + "@chakra-ui/react": "^2.4.9", + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", "@tanstack/react-query": "^4.24.4", "@tanstack/react-query-devtools": "^4.24.12", "@types/node": "18.13.0", @@ -26,56 +21,29 @@ "@types/react-dom": "18.0.10", "axios": "^1.3.4", "colorthief": "^2.4.0", + "framer-motion": "^9.0.2", "next": "13.4.7", "react": "18.2.0", "react-dom": "18.2.0", "react-error-boundary": "^3.1.4", "react-hook-form": "^7.43.2", - "react-intersection-observer": "^9.4.3" + "react-intersection-observer": "^9.4.3", + "recoil": "^0.7.7" }, "devDependencies": { - "@babel/core": "^7.22.8", - "@storybook/addon-essentials": "^7.0.26", - "@storybook/addon-interactions": "^7.0.26", - "@storybook/addon-links": "^7.0.26", - "@storybook/addon-styling": "^1.3.2", - "@storybook/blocks": "^7.0.26", - "@storybook/nextjs": "^7.0.26", - "@storybook/react": "^7.0.26", - "@storybook/testing-library": "^0.0.14-next.2", "@svgr/webpack": "^6.5.1", "@typescript-eslint/eslint-plugin": "^5.52.0", - "@typescript-eslint/parser": "^5.61.0", - "autoprefixer": "^10.4.14", - "chromatic": "^6.19.9", "eslint": "^8.34.0", "eslint-config-next": "^13.1.6", - "eslint-plugin-storybook": "^0.6.12", "husky": "^8.0.3", - "less": "^4.1.3", - "less-loader": "^11.1.3", "lint-staged": "^13.1.1", - "msw": "1.3.2", - "msw-storybook-addon": "^1.10.0", - "patch-package": "^8.0.0", - "postcss": "^8.4.25", - "postinstall-postinstall": "^2.1.0", "prettier": "^2.8.4", - "prettier-plugin-tailwindcss": "^0.3.0", - "storybook": "^7.0.26", - "tailwindcss": "^3.3.2", - "typescript": "^4.9.5", - "webpack": "^5.88.1" + "typescript": "^4.9.5" }, "lint-staged": { "src/**/*.{ts,tsx}": [ "eslint --fix --max-warnings 0", "prettier --write" ] - }, - "readme": "ERROR: No README data found!", - "_id": "team08-boilerplate@0.1.0", - "msw": { - "workerDirectory": "public" } } diff --git a/patches/next+13.4.7.dev.patch b/patches/next+13.4.7.dev.patch deleted file mode 100644 index 8eb6983e8..000000000 --- a/patches/next+13.4.7.dev.patch +++ /dev/null @@ -1,43 +0,0 @@ -diff --git a/node_modules/next/dist/server/lib/render-server-standalone.js b/node_modules/next/dist/server/lib/render-server-standalone.js -index a888ced..5be3463 100644 ---- a/node_modules/next/dist/server/lib/render-server-standalone.js -+++ b/node_modules/next/dist/server/lib/render-server-standalone.js -@@ -11,6 +11,8 @@ Object.defineProperty(exports, "createServerHandler", { - const _httpproxy = /*#__PURE__*/ _interop_require_default(require("next/dist/compiled/http-proxy")); - const _jestworker = require("next/dist/compiled/jest-worker"); - const _utils = require("../../shared/lib/utils"); -+const _log = require("../../build/output/log"); -+ - function _interop_require_default(obj) { - return obj && obj.__esModule ? obj : { - default: obj -@@ -73,8 +75,29 @@ const createServerHandler = async ({ port , hostname , dir , dev =false , minima - }); - return proxyServer; - }; -+ // Fix hot module replacement with a standalone server -+ let addedUpgradeListener = false -+ const setupWebSocketHandler = (req) => { -+ if (addedUpgradeListener) { -+ return; -+ } -+ -+ let server = req?.socket?.server; -+ -+ if (!server) { -+ _log.error(`Invalid IncomingMessage received, make sure http.createServer is being used to handle requests.`); -+ } else { -+ server.on("upgrade", async (req, socket, head) => { -+ const proxyServer = getProxyServer(req.url || '/') -+ proxyServer.ws(req, socket, head) -+ }); -+ addedUpgradeListener = true; -+ } -+ } -+ - // proxy to router worker - return async (req, res)=>{ -+ setupWebSocketHandler(req); - const urlParts = (req.url || "").split("?"); - const urlNoQuery = urlParts[0]; - // this normalizes repeated slashes in the path e.g. hello//world -> diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index 33ad091d2..000000000 --- a/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/public/icons/arrow-left.svg b/public/icons/arrow-left.svg deleted file mode 100644 index b1c740c00..000000000 --- a/public/icons/arrow-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/arrow-right.svg b/public/icons/arrow-right.svg deleted file mode 100644 index e8dde4cf2..000000000 --- a/public/icons/arrow-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/avatar.svg b/public/icons/avatar.svg deleted file mode 100644 index 1c30c79ec..000000000 --- a/public/icons/avatar.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/public/icons/back.svg b/public/icons/back.svg new file mode 100644 index 000000000..eea075a2c --- /dev/null +++ b/public/icons/back.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/book-plus.svg b/public/icons/book-plus.svg deleted file mode 100644 index d41a8d642..000000000 --- a/public/icons/book-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/group.svg b/public/icons/book.svg similarity index 93% rename from public/icons/group.svg rename to public/icons/book.svg index 2a4669d11..ee85332a7 100644 --- a/public/icons/group.svg +++ b/public/icons/book.svg @@ -1 +1 @@ -book-open-page-variant +book-open-page-variant \ No newline at end of file diff --git a/public/icons/bookIcon.svg b/public/icons/bookIcon.svg new file mode 100644 index 000000000..398093b95 --- /dev/null +++ b/public/icons/bookIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/bookmark.svg b/public/icons/bookmark.svg index 952cb910e..0b796102f 100644 --- a/public/icons/bookmark.svg +++ b/public/icons/bookmark.svg @@ -1,3 +1,3 @@ - + diff --git a/public/icons/bookarchive.svg b/public/icons/bookshelf.svg similarity index 100% rename from public/icons/bookarchive.svg rename to public/icons/bookshelf.svg diff --git a/public/icons/calendar.svg b/public/icons/calendar.svg deleted file mode 100644 index 12aeecd27..000000000 --- a/public/icons/calendar.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/public/icons/check-circle.svg b/public/icons/check-circle.svg deleted file mode 100644 index 41caf2d30..000000000 --- a/public/icons/check-circle.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/public/icons/check-stroke.svg b/public/icons/check-stroke.svg deleted file mode 100644 index ed04a458f..000000000 --- a/public/icons/check-stroke.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/check.svg b/public/icons/check.svg deleted file mode 100644 index b8f67399b..000000000 --- a/public/icons/check.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/close.svg b/public/icons/close.svg index a40c618dc..afa266521 100644 --- a/public/icons/close.svg +++ b/public/icons/close.svg @@ -1,4 +1,3 @@ - - - + + diff --git a/public/icons/commentIcon.svg b/public/icons/commentIcon.svg new file mode 100644 index 000000000..afee45bc9 --- /dev/null +++ b/public/icons/commentIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/comments.svg b/public/icons/comments.svg deleted file mode 100644 index 76f31742d..000000000 --- a/public/icons/comments.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/delete.svg b/public/icons/delete.svg deleted file mode 100644 index f57c58509..000000000 --- a/public/icons/delete.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/error-circle.svg b/public/icons/error-circle.svg deleted file mode 100644 index 01eea9242..000000000 --- a/public/icons/error-circle.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/public/icons/error-with-exclamation.svg b/public/icons/error-with-exclamation.svg deleted file mode 100644 index 2ea65a586..000000000 --- a/public/icons/error-with-exclamation.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/hamburger.svg b/public/icons/hamburger.svg deleted file mode 100644 index a780d10fb..000000000 --- a/public/icons/hamburger.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/public/icons/discover.svg b/public/icons/hashtag.svg similarity index 100% rename from public/icons/discover.svg rename to public/icons/hashtag.svg diff --git a/public/icons/heart.svg b/public/icons/heart.svg deleted file mode 100644 index 18dd12e79..000000000 --- a/public/icons/heart.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/index.ts b/public/icons/index.ts deleted file mode 100644 index 6c3027649..000000000 --- a/public/icons/index.ts +++ /dev/null @@ -1,42 +0,0 @@ -// 로고 -export { default as LogoWithText } from './logo-with-text.svg'; - -// 상단 Nav & Header -export { default as IconArrowLeft } from './arrow-left.svg'; -export { default as IconClose } from './close.svg'; -export { default as IconPost } from './post.svg'; -export { default as IconHamburger } from './hamburger.svg'; -export { default as IconShare } from './share.svg'; - -// 하단 Nav -export { default as IconBookarchive } from './bookarchive.svg'; -export { default as IconDiscover } from './discover.svg'; -export { default as IconGroup } from './group.svg'; -export { default as IconProfile } from './profile.svg'; - -// 책 & 책장 -export { default as IconArrowRight } from './arrow-right.svg'; -export { default as IconBookmark } from './bookmark.svg'; -export { default as IconHeart } from './heart.svg'; - -// 검색 -export { default as IconSearch } from './search.svg'; -export { default as IconWarning } from './warning-circle.svg'; -export { default as IconSuccess } from './check-circle.svg'; -export { default as IconError } from './error-circle.svg'; -export { default as IconErrorExclamation } from './error-with-exclamation.svg'; - -// 독서 모임 -export { default as IconAvatar } from './avatar.svg'; -export { default as IconCalendar } from './calendar.svg'; -export { default as IconCheck } from './check.svg'; -export { default as IconCheckStroke } from './check-stroke.svg'; -export { default as IconComments } from './comments.svg'; -export { default as IconDelete } from './delete.svg'; -export { default as IconMembers } from './members.svg'; -export { default as IconPlus } from './plus.svg'; -export { default as IconBookPlus } from './book-plus.svg'; -export { default as IconSelect } from './select-icon.svg'; - -// 카카오 -export { default as IconKakao } from './kakao.svg'; diff --git a/public/icons/job-card.svg b/public/icons/job-card.svg new file mode 100644 index 000000000..8a0815c36 --- /dev/null +++ b/public/icons/job-card.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/icons/kakao.svg b/public/icons/kakao.svg index bfb0b4e59..286ff5fd5 100644 --- a/public/icons/kakao.svg +++ b/public/icons/kakao.svg @@ -1,3 +1,3 @@ - - + + diff --git a/public/icons/like.svg b/public/icons/like.svg new file mode 100644 index 000000000..9ed3e5fa1 --- /dev/null +++ b/public/icons/like.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/lock.svg b/public/icons/lock.svg new file mode 100644 index 000000000..34c335c6d --- /dev/null +++ b/public/icons/lock.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/logo.svg b/public/icons/logo_sm.svg similarity index 100% rename from public/icons/logo.svg rename to public/icons/logo_sm.svg diff --git a/public/icons/members.svg b/public/icons/members.svg deleted file mode 100644 index f17919114..000000000 --- a/public/icons/members.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/more-circle.svg b/public/icons/more-circle.svg new file mode 100644 index 000000000..472129c57 --- /dev/null +++ b/public/icons/more-circle.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/more.svg b/public/icons/more.svg new file mode 100644 index 000000000..216ec6c54 --- /dev/null +++ b/public/icons/more.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/options.svg b/public/icons/options.svg deleted file mode 100644 index 2e1d8c4a0..000000000 --- a/public/icons/options.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/public/icons/peopleIcon.svg b/public/icons/peopleIcon.svg new file mode 100644 index 000000000..c9d6c9a60 --- /dev/null +++ b/public/icons/peopleIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/plus-circle.svg b/public/icons/plus-circle.svg new file mode 100644 index 000000000..ba4b72e32 --- /dev/null +++ b/public/icons/plus-circle.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/plus.svg b/public/icons/plus.svg deleted file mode 100644 index 1488ee8e9..000000000 --- a/public/icons/plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/post.svg b/public/icons/post.svg deleted file mode 100644 index dac5f2632..000000000 --- a/public/icons/post.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/search.svg b/public/icons/search.svg index 908595ce3..744bed40c 100644 --- a/public/icons/search.svg +++ b/public/icons/search.svg @@ -1,4 +1,3 @@ - - - + + diff --git a/public/icons/select-icon.svg b/public/icons/select-icon.svg deleted file mode 100644 index e65119b7e..000000000 --- a/public/icons/select-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/share.svg b/public/icons/share.svg index d5f676a21..6730ca8c6 100644 --- a/public/icons/share.svg +++ b/public/icons/share.svg @@ -1,4 +1,4 @@ - - - + + + diff --git a/public/icons/unlock.svg b/public/icons/unlock.svg new file mode 100644 index 000000000..7869e0983 --- /dev/null +++ b/public/icons/unlock.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/profile.svg b/public/icons/user.svg similarity index 100% rename from public/icons/profile.svg rename to public/icons/user.svg diff --git a/public/icons/warning-circle.svg b/public/icons/warning-circle.svg deleted file mode 100644 index 2241fa97d..000000000 --- a/public/icons/warning-circle.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/public/icons/write.svg b/public/icons/write.svg new file mode 100644 index 000000000..708c8b07e --- /dev/null +++ b/public/icons/write.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/icon-128x128.png b/public/images/icon-128x128.png deleted file mode 100644 index 59c3c397e..000000000 Binary files a/public/images/icon-128x128.png and /dev/null differ diff --git a/public/images/icon-192x192.png b/public/images/icon-192x192.png deleted file mode 100644 index 8c5978af7..000000000 Binary files a/public/images/icon-192x192.png and /dev/null differ diff --git a/public/images/icon-256x256.png b/public/images/icon-256x256.png deleted file mode 100644 index 37ac64abd..000000000 Binary files a/public/images/icon-256x256.png and /dev/null differ diff --git a/public/images/icon-384x384.png b/public/images/icon-384x384.png deleted file mode 100644 index 56073404a..000000000 Binary files a/public/images/icon-384x384.png and /dev/null differ diff --git a/public/images/icon-512x512.png b/public/images/icon-512x512.png deleted file mode 100644 index 856ccc613..000000000 Binary files a/public/images/icon-512x512.png and /dev/null differ diff --git a/public/images/kakao.svg b/public/images/kakao.svg new file mode 100644 index 000000000..bdb41bc72 --- /dev/null +++ b/public/images/kakao.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/images/login-landing.jpg b/public/images/login-landing.jpg deleted file mode 100644 index cdde2fb4e..000000000 Binary files a/public/images/login-landing.jpg and /dev/null differ diff --git a/public/icons/logo-with-text.svg b/public/images/logo.svg similarity index 99% rename from public/icons/logo-with-text.svg rename to public/images/logo.svg index c79f66896..3864345a6 100644 --- a/public/icons/logo-with-text.svg +++ b/public/images/logo.svg @@ -1,4 +1,4 @@ - + diff --git a/public/images/splash-screens/10.2__iPad_landscape.png b/public/images/splash-screens/10.2__iPad_landscape.png deleted file mode 100644 index 19fed7266..000000000 Binary files a/public/images/splash-screens/10.2__iPad_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/10.2__iPad_portrait.png b/public/images/splash-screens/10.2__iPad_portrait.png deleted file mode 100644 index de10ae540..000000000 Binary files a/public/images/splash-screens/10.2__iPad_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/10.5__iPad_Air_landscape.png b/public/images/splash-screens/10.5__iPad_Air_landscape.png deleted file mode 100644 index 321b97461..000000000 Binary files a/public/images/splash-screens/10.5__iPad_Air_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/10.5__iPad_Air_portrait.png b/public/images/splash-screens/10.5__iPad_Air_portrait.png deleted file mode 100644 index acaf11a8b..000000000 Binary files a/public/images/splash-screens/10.5__iPad_Air_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/10.9__iPad_Air_landscape.png b/public/images/splash-screens/10.9__iPad_Air_landscape.png deleted file mode 100644 index d872e5c88..000000000 Binary files a/public/images/splash-screens/10.9__iPad_Air_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/10.9__iPad_Air_portrait.png b/public/images/splash-screens/10.9__iPad_Air_portrait.png deleted file mode 100644 index 52ad824f6..000000000 Binary files a/public/images/splash-screens/10.9__iPad_Air_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/11__iPad_Pro_M4_landscape.png b/public/images/splash-screens/11__iPad_Pro_M4_landscape.png deleted file mode 100644 index bdeb6a6fa..000000000 Binary files a/public/images/splash-screens/11__iPad_Pro_M4_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/11__iPad_Pro_M4_portrait.png b/public/images/splash-screens/11__iPad_Pro_M4_portrait.png deleted file mode 100644 index d2ab66bee..000000000 Binary files a/public/images/splash-screens/11__iPad_Pro_M4_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/11__iPad_Pro__10.5__iPad_Pro_landscape.png b/public/images/splash-screens/11__iPad_Pro__10.5__iPad_Pro_landscape.png deleted file mode 100644 index 5aa6ebaf8..000000000 Binary files a/public/images/splash-screens/11__iPad_Pro__10.5__iPad_Pro_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/11__iPad_Pro__10.5__iPad_Pro_portrait.png b/public/images/splash-screens/11__iPad_Pro__10.5__iPad_Pro_portrait.png deleted file mode 100644 index 5769587fe..000000000 Binary files a/public/images/splash-screens/11__iPad_Pro__10.5__iPad_Pro_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/12.9__iPad_Pro_landscape.png b/public/images/splash-screens/12.9__iPad_Pro_landscape.png deleted file mode 100644 index 4cec5988a..000000000 Binary files a/public/images/splash-screens/12.9__iPad_Pro_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/12.9__iPad_Pro_portrait.png b/public/images/splash-screens/12.9__iPad_Pro_portrait.png deleted file mode 100644 index 670779331..000000000 Binary files a/public/images/splash-screens/12.9__iPad_Pro_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/13__iPad_Pro_M4_landscape.png b/public/images/splash-screens/13__iPad_Pro_M4_landscape.png deleted file mode 100644 index 48f5ac774..000000000 Binary files a/public/images/splash-screens/13__iPad_Pro_M4_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/13__iPad_Pro_M4_portrait.png b/public/images/splash-screens/13__iPad_Pro_M4_portrait.png deleted file mode 100644 index 435614dd1..000000000 Binary files a/public/images/splash-screens/13__iPad_Pro_M4_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png b/public/images/splash-screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png deleted file mode 100644 index 8f12e75d8..000000000 Binary files a/public/images/splash-screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png b/public/images/splash-screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png deleted file mode 100644 index 1e5b8d371..000000000 Binary files a/public/images/splash-screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/8.3__iPad_Mini_landscape.png b/public/images/splash-screens/8.3__iPad_Mini_landscape.png deleted file mode 100644 index 7132a4ff5..000000000 Binary files a/public/images/splash-screens/8.3__iPad_Mini_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/8.3__iPad_Mini_portrait.png b/public/images/splash-screens/8.3__iPad_Mini_portrait.png deleted file mode 100644 index 33ebbef2c..000000000 Binary files a/public/images/splash-screens/8.3__iPad_Mini_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png b/public/images/splash-screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png deleted file mode 100644 index fce5cde48..000000000 Binary files a/public/images/splash-screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png b/public/images/splash-screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png deleted file mode 100644 index e5db44cb1..000000000 Binary files a/public/images/splash-screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png b/public/images/splash-screens/iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png deleted file mode 100644 index 7b47265f1..000000000 Binary files a/public/images/splash-screens/iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png b/public/images/splash-screens/iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png deleted file mode 100644 index 455afb284..000000000 Binary files a/public/images/splash-screens/iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_11__iPhone_XR_landscape.png b/public/images/splash-screens/iPhone_11__iPhone_XR_landscape.png deleted file mode 100644 index 32de992c5..000000000 Binary files a/public/images/splash-screens/iPhone_11__iPhone_XR_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_11__iPhone_XR_portrait.png b/public/images/splash-screens/iPhone_11__iPhone_XR_portrait.png deleted file mode 100644 index 707709b04..000000000 Binary files a/public/images/splash-screens/iPhone_11__iPhone_XR_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png b/public/images/splash-screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png deleted file mode 100644 index 8c0f64501..000000000 Binary files a/public/images/splash-screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png b/public/images/splash-screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png deleted file mode 100644 index e1e3efffe..000000000 Binary files a/public/images/splash-screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png b/public/images/splash-screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png deleted file mode 100644 index 7fb9978e1..000000000 Binary files a/public/images/splash-screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png b/public/images/splash-screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png deleted file mode 100644 index 7ba6131c4..000000000 Binary files a/public/images/splash-screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png b/public/images/splash-screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png deleted file mode 100644 index a674216f0..000000000 Binary files a/public/images/splash-screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png b/public/images/splash-screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png deleted file mode 100644 index 74f53e703..000000000 Binary files a/public/images/splash-screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_landscape.png b/public/images/splash-screens/iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_landscape.png deleted file mode 100644 index c8630bd45..000000000 Binary files a/public/images/splash-screens/iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_portrait.png b/public/images/splash-screens/iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_portrait.png deleted file mode 100644 index 8e152e16c..000000000 Binary files a/public/images/splash-screens/iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_15_Pro__iPhone_15__iPhone_14_Pro_landscape.png b/public/images/splash-screens/iPhone_15_Pro__iPhone_15__iPhone_14_Pro_landscape.png deleted file mode 100644 index 2fcbe2b65..000000000 Binary files a/public/images/splash-screens/iPhone_15_Pro__iPhone_15__iPhone_14_Pro_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_15_Pro__iPhone_15__iPhone_14_Pro_portrait.png b/public/images/splash-screens/iPhone_15_Pro__iPhone_15__iPhone_14_Pro_portrait.png deleted file mode 100644 index 50079351e..000000000 Binary files a/public/images/splash-screens/iPhone_15_Pro__iPhone_15__iPhone_14_Pro_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png b/public/images/splash-screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png deleted file mode 100644 index e9fdf1261..000000000 Binary files a/public/images/splash-screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png b/public/images/splash-screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png deleted file mode 100644 index ed76a7574..000000000 Binary files a/public/images/splash-screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png b/public/images/splash-screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png deleted file mode 100644 index 48e36a423..000000000 Binary files a/public/images/splash-screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png and /dev/null differ diff --git a/public/images/splash-screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png b/public/images/splash-screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png deleted file mode 100644 index a657b6349..000000000 Binary files a/public/images/splash-screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png and /dev/null differ diff --git a/public/mockServiceWorker.js b/public/mockServiceWorker.js deleted file mode 100644 index 51d85eeeb..000000000 --- a/public/mockServiceWorker.js +++ /dev/null @@ -1,303 +0,0 @@ -/* eslint-disable */ -/* tslint:disable */ - -/** - * Mock Service Worker (1.3.2). - * @see https://github.com/mswjs/msw - * - Please do NOT modify this file. - * - Please do NOT serve this file on production. - */ - -const INTEGRITY_CHECKSUM = '3d6b9f06410d179a7f7404d4bf4c3c70' -const activeClientIds = new Set() - -self.addEventListener('install', function () { - self.skipWaiting() -}) - -self.addEventListener('activate', function (event) { - event.waitUntil(self.clients.claim()) -}) - -self.addEventListener('message', async function (event) { - const clientId = event.source.id - - if (!clientId || !self.clients) { - return - } - - const client = await self.clients.get(clientId) - - if (!client) { - return - } - - const allClients = await self.clients.matchAll({ - type: 'window', - }) - - switch (event.data) { - case 'KEEPALIVE_REQUEST': { - sendToClient(client, { - type: 'KEEPALIVE_RESPONSE', - }) - break - } - - case 'INTEGRITY_CHECK_REQUEST': { - sendToClient(client, { - type: 'INTEGRITY_CHECK_RESPONSE', - payload: INTEGRITY_CHECKSUM, - }) - break - } - - case 'MOCK_ACTIVATE': { - activeClientIds.add(clientId) - - sendToClient(client, { - type: 'MOCKING_ENABLED', - payload: true, - }) - break - } - - case 'MOCK_DEACTIVATE': { - activeClientIds.delete(clientId) - break - } - - case 'CLIENT_CLOSED': { - activeClientIds.delete(clientId) - - const remainingClients = allClients.filter((client) => { - return client.id !== clientId - }) - - // Unregister itself when there are no more clients - if (remainingClients.length === 0) { - self.registration.unregister() - } - - break - } - } -}) - -self.addEventListener('fetch', function (event) { - const { request } = event - const accept = request.headers.get('accept') || '' - - // Bypass server-sent events. - if (accept.includes('text/event-stream')) { - return - } - - // Bypass navigation requests. - if (request.mode === 'navigate') { - return - } - - // Opening the DevTools triggers the "only-if-cached" request - // that cannot be handled by the worker. Bypass such requests. - if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { - return - } - - // Bypass all requests when there are no active clients. - // Prevents the self-unregistered worked from handling requests - // after it's been deleted (still remains active until the next reload). - if (activeClientIds.size === 0) { - return - } - - // Generate unique request ID. - const requestId = Math.random().toString(16).slice(2) - - event.respondWith( - handleRequest(event, requestId).catch((error) => { - if (error.name === 'NetworkError') { - console.warn( - '[MSW] Successfully emulated a network error for the "%s %s" request.', - request.method, - request.url, - ) - return - } - - // At this point, any exception indicates an issue with the original request/response. - console.error( - `\ -[MSW] Caught an exception from the "%s %s" request (%s). This is probably not a problem with Mock Service Worker. There is likely an additional logging output above.`, - request.method, - request.url, - `${error.name}: ${error.message}`, - ) - }), - ) -}) - -async function handleRequest(event, requestId) { - const client = await resolveMainClient(event) - const response = await getResponse(event, client, requestId) - - // Send back the response clone for the "response:*" life-cycle events. - // Ensure MSW is active and ready to handle the message, otherwise - // this message will pend indefinitely. - if (client && activeClientIds.has(client.id)) { - ;(async function () { - const clonedResponse = response.clone() - sendToClient(client, { - type: 'RESPONSE', - payload: { - requestId, - type: clonedResponse.type, - ok: clonedResponse.ok, - status: clonedResponse.status, - statusText: clonedResponse.statusText, - body: - clonedResponse.body === null ? null : await clonedResponse.text(), - headers: Object.fromEntries(clonedResponse.headers.entries()), - redirected: clonedResponse.redirected, - }, - }) - })() - } - - return response -} - -// Resolve the main client for the given event. -// Client that issues a request doesn't necessarily equal the client -// that registered the worker. It's with the latter the worker should -// communicate with during the response resolving phase. -async function resolveMainClient(event) { - const client = await self.clients.get(event.clientId) - - if (client?.frameType === 'top-level') { - return client - } - - const allClients = await self.clients.matchAll({ - type: 'window', - }) - - return allClients - .filter((client) => { - // Get only those clients that are currently visible. - return client.visibilityState === 'visible' - }) - .find((client) => { - // Find the client ID that's recorded in the - // set of clients that have registered the worker. - return activeClientIds.has(client.id) - }) -} - -async function getResponse(event, client, requestId) { - const { request } = event - const clonedRequest = request.clone() - - function passthrough() { - // Clone the request because it might've been already used - // (i.e. its body has been read and sent to the client). - const headers = Object.fromEntries(clonedRequest.headers.entries()) - - // Remove MSW-specific request headers so the bypassed requests - // comply with the server's CORS preflight check. - // Operate with the headers as an object because request "Headers" - // are immutable. - delete headers['x-msw-bypass'] - - return fetch(clonedRequest, { headers }) - } - - // Bypass mocking when the client is not active. - if (!client) { - return passthrough() - } - - // Bypass initial page load requests (i.e. static assets). - // The absence of the immediate/parent client in the map of the active clients - // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet - // and is not ready to handle requests. - if (!activeClientIds.has(client.id)) { - return passthrough() - } - - // Bypass requests with the explicit bypass header. - // Such requests can be issued by "ctx.fetch()". - if (request.headers.get('x-msw-bypass') === 'true') { - return passthrough() - } - - // Notify the client that a request has been intercepted. - const clientMessage = await sendToClient(client, { - type: 'REQUEST', - payload: { - id: requestId, - url: request.url, - method: request.method, - headers: Object.fromEntries(request.headers.entries()), - cache: request.cache, - mode: request.mode, - credentials: request.credentials, - destination: request.destination, - integrity: request.integrity, - redirect: request.redirect, - referrer: request.referrer, - referrerPolicy: request.referrerPolicy, - body: await request.text(), - bodyUsed: request.bodyUsed, - keepalive: request.keepalive, - }, - }) - - switch (clientMessage.type) { - case 'MOCK_RESPONSE': { - return respondWithMock(clientMessage.data) - } - - case 'MOCK_NOT_FOUND': { - return passthrough() - } - - case 'NETWORK_ERROR': { - const { name, message } = clientMessage.data - const networkError = new Error(message) - networkError.name = name - - // Rejecting a "respondWith" promise emulates a network error. - throw networkError - } - } - - return passthrough() -} - -function sendToClient(client, message) { - return new Promise((resolve, reject) => { - const channel = new MessageChannel() - - channel.port1.onmessage = (event) => { - if (event.data && event.data.error) { - return reject(event.data.error) - } - - resolve(event.data) - } - - client.postMessage(message, [channel.port2]) - }) -} - -function sleep(timeMs) { - return new Promise((resolve) => { - setTimeout(resolve, timeMs) - }) -} - -async function respondWithMock(response) { - await sleep(response.delay) - return new Response(response.body, response) -} diff --git a/public/pwaServiceWorker.js b/public/pwaServiceWorker.js deleted file mode 100644 index 323bb2055..000000000 --- a/public/pwaServiceWorker.js +++ /dev/null @@ -1,7 +0,0 @@ -self.addEventListener('install', () => { - console.log('Service worker installed'); -}); - -self.addEventListener('activate', () => { - console.log('Service worker activated'); -}); diff --git a/scripts/init-mkcert.sh b/scripts/init-mkcert.sh deleted file mode 100644 index 2e725bcae..000000000 --- a/scripts/init-mkcert.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -readonly DEFAULT_HOSTS="localhost 127.0.0.1 ::1" -readonly hostname=$1 - -readonly mkcert_intalled=$(which mkcert) - -readonly cert_dir="$PWD/.certificates" -readonly key_path="$cert_dir/localhost-key.pem" -readonly cert_path="$cert_dir/localhost.pem" - -if [ -z $mkcert_intalled ];then - echo "💬 Downloading mkcert package...\n" - brew install mkcert -fi - -mkdir $cert_dir - -echo "💬 Attempting to generate self-signed certificate...\n" - -if [ "$hostname" != "" ];then - mkcert -install -key-file $key_path -cert-file $cert_path $DEFAULT_HOSTS $hostname -else - mkcert -install -key-file $key_path -cert-file $cert_path $DEFAULT_HOSTS -fi - -echo "🚀 CA Root certificate created!" -echo "🚀 Certificates created in ${cert_dir}" diff --git a/scripts/server.js b/scripts/server.js deleted file mode 100644 index 7ea4a6710..000000000 --- a/scripts/server.js +++ /dev/null @@ -1,52 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -const fs = require('fs'); -const https = require('https'); -const path = require('path'); -const { parse } = require('url'); -const { execSync } = require('child_process'); -const next = require('next'); - -const dev = process.env.NODE_ENV !== 'production'; -const hostname = process.argv[2]; -const port = 3000; - -// when using middleware `hostname` and `port` must be provided below -const app = next({ dev, hostname, port }); -const handle = app.getRequestHandler(); - -const SELF_CERTIFICATES_PATH = { - ca: path.resolve( - execSync('mkcert -CAROOT').toString().replace(/\s$/, ''), - './rootCA.pem' - ), - key: './.certificates/localhost-key.pem', - cert: './.certificates/localhost.pem', -}; - -const option = { - key: fs.readFileSync(SELF_CERTIFICATES_PATH.key), - cert: fs.readFileSync(SELF_CERTIFICATES_PATH.cert), -}; - -// To resolve the 'unable to verify first certificate' error -process.env.NODE_EXTRA_CA_CERTS = SELF_CERTIFICATES_PATH.ca; - -app.prepare().then(() => { - https - .createServer(option, async (req, res) => { - try { - // Be sure to pass `true` as the second argument to `url.parse`. - // This tells it to parse the query portion of the URL. - const parsedUrl = parse(req.url, true); - handle(req, res, parsedUrl); - } catch (err) { - console.error('Error occurred handling', req.url, err); - res.statusCode = 500; - res.end('internal server error'); - } - }) - .listen(port, error => { - if (error) throw error; - console.log('\x1b[32m%s', `> ready on https://${hostname}:${port}\n`); - }); -}); diff --git a/scripts/updateDevHost.js b/scripts/updateDevHost.js deleted file mode 100644 index 9428540ca..000000000 --- a/scripts/updateDevHost.js +++ /dev/null @@ -1,86 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -const fs = require('fs'); -const { EOL } = require('os'); - -const LOCALHOST = '127.0.0.1'; -const IS_WINDOWS = process.platform === 'win32'; -const HOSTS_PATH = IS_WINDOWS - ? 'C:/Windows/System32/drivers/etc/hosts' - : '/etc/hosts'; - -/** - * @param {typeof HOSTS_PATH} filePath - hosts 파일의 path - * @param {string} host - 사용할 dev server host - * */ -const updateHostFile = (filePath, host) => { - /** @type {{origin: string, paresed: [ip: string, hostname: string]}[]} */ - const lines = []; - - fs.readFileSync(filePath, { encoding: 'utf8' }) - .split(/\r?\n/) - .forEach(line => { - const comments = line.replace(/#.*/, ''); - const matches = /^\s*?(.+?)\s+(.+?)\s*$/.exec(comments); - - if (matches && matches.length === 3) { - /** line을 읽으면서 { parsed: [ip, hostname] } 추가 */ - const [_, ip, hostname] = matches; - lines.push({ parsed: [ip, hostname], origin: line }); - } else { - /** 주석인 경우, { origin } 에만 추가 */ - lines.push({ origin: line }); - } - }); - - /** 일치하는 hostname이 있으면 종료 */ - for (let idx = 0; idx < lines.length; idx += 1) { - const { parsed } = lines[idx]; - - if (parsed) { - const [ip, hostname] = parsed; - if (hostname === host) { - console.log( - `🚀 entry [ ${ip} ${host} ] already exists in ${filePath}!` - ); - return true; - } - } - } - - const length = lines.length; - for (let idx = length - 1; idx >= 0; idx -= 1) { - const { parsed } = lines[idx]; - - if (!parsed) continue; - - /** 마지막 entry 아래에 host 추가 */ - const sliced = lines.slice(0, idx + 1); - - sliced.push({ origin: '# Added by Dadok' }); - sliced.push({ parsed: ['127.0.0.1', host], origin: `127.0.0.1 ${host}` }); - sliced.push(...lines.slice(idx + 1)); - - const state = fs.statSync(filePath); - fs.writeFileSync(filePath, sliced.map(({ origin }) => origin).join(EOL), { - mode: state.mode, - }); - - console.log(`🚀 entry [ ${LOCALHOST} ${host} ] added in ${filePath}!`); - return true; - } - - return false; -}; - -/** node command를 통해 updateHostFile 함수 실행 */ -try { - const host = process.argv[2]; - - if (!host) { - throw Error('Expected 1 argument.'); - } - - updateHostFile(HOSTS_PATH, host); -} catch (err) { - console.error(err); -} diff --git a/src/apis/book.ts b/src/apis/book/index.ts similarity index 76% rename from src/apis/book.ts rename to src/apis/book/index.ts index 423878ed3..16681199c 100644 --- a/src/apis/book.ts +++ b/src/apis/book/index.ts @@ -4,15 +4,13 @@ import type { APIBookCommentPagination, APIBookDetail, APIBookmarkedUserList, - APICreateBookCommentRequest, APIPatchBookCommentRequest, APISearchedBook, APISearchedBookPagination, APIRecentSearches, - APIBestSellerRes, } from '@/types/book'; -import bookshelfAPI from './bookshelf'; -import { publicApi } from './core/axios'; +import bookshelfAPI from '../bookshelf'; +import { publicApi } from '../core/axios'; const bookAPI = { searchBooks: ({ @@ -38,7 +36,7 @@ const bookAPI = { getBookInfo: (bookId: APIBook['bookId']) => publicApi.get(`/service-api/books/${bookId}`), - getBookmarkUserInfo: (bookId: APIBook['bookId']) => + getBookUserInfo: (bookId: APIBook['bookId']) => publicApi.get(`/service-api/books/${bookId}/users`), createBook: ({ book }: { book: APISearchedBook }) => @@ -46,9 +44,9 @@ const bookAPI = { creaetComment: ( bookId: APIBook['bookId'], - comment: APICreateBookCommentRequest['comment'] + { comment }: { comment: APIPatchBookCommentRequest['comment'] } ) => - publicApi.post( + publicApi.post( `/service-api/books/${bookId}/comments`, { comment } ), @@ -81,14 +79,14 @@ const bookAPI = { commentId: APIBookComment['commentId'] ) => publicApi.delete(`/service-api/books/${bookId}/comments/${commentId}`), - addBookmark: (bookId: APIBook['bookId']) => + setBookMarked: (bookId: APIBook['bookId']) => bookshelfAPI.getMySummaryBookshelf().then(({ data: { bookshelfId } }) => publicApi.post(`/service-api/bookshelves/${bookshelfId}/books`, { bookId, }) ), - removeBookmark: (bookId: APIBook['bookId']) => + unsetBookMarked: (bookId: APIBook['bookId']) => bookshelfAPI .getMySummaryBookshelf() .then(({ data: { bookshelfId } }) => @@ -96,16 +94,6 @@ const bookAPI = { `/service-api/bookshelves/${bookshelfId}/books/${bookId}` ) ), - - getBestSellers: () => - publicApi.get( - `/aladin-api?QueryType=Bestseller&Cover=Big` - ), - - storeRecentSearch: (queryKeyword: string) => - publicApi.get( - `/service-api/books?page=1&pageSize=1&query=${queryKeyword}&isStoreRecent=true` - ), }; export default bookAPI; diff --git a/src/apis/bookshelf.ts b/src/apis/bookshelf/index.ts similarity index 96% rename from src/apis/bookshelf.ts rename to src/apis/bookshelf/index.ts index 93dc151fd..e326b7b40 100644 --- a/src/apis/bookshelf.ts +++ b/src/apis/bookshelf/index.ts @@ -4,7 +4,7 @@ import { APIBookshelfPagination, } from '@/types/bookshelf'; import { APIUser } from '@/types/user'; -import { publicApi } from './core/axios'; +import { publicApi } from '../core/axios'; const bookshelfAPI = { getUserSummaryBookshelf: ({ userId }: { userId: APIUser['userId'] }) => diff --git a/src/apis/core/axios.ts b/src/apis/core/axios.ts index 5f5a8b4a5..298fc3640 100644 --- a/src/apis/core/axios.ts +++ b/src/apis/core/axios.ts @@ -1,17 +1,19 @@ import axios, { CreateAxiosDefaults, InternalAxiosRequestConfig } from 'axios'; -import { AuthRefreshIgnoredError } from '@/types/customError'; import { ACCESS_TOKEN_STORAGE_KEY, SERVICE_ERROR_MESSAGE } from '@/constants'; import { isAuthFailedError, isAuthRefreshError, isAxiosErrorWithCustomCode, + setAxiosAuthHeader, + updateToken, } from '@/utils/helpers'; +import isClient from '@/utils/isClient'; import webStorage from '@/utils/storage'; const storage = webStorage(ACCESS_TOKEN_STORAGE_KEY); + const options: CreateAxiosDefaults = { - baseURL: process.env.NEXT_HOST, headers: { Accept: '*/*', 'Content-Type': 'application/json', @@ -51,7 +53,10 @@ const responseHandler = async (error: unknown) => { } if (isAuthFailedError(code)) { - removeToken(); + storage.remove(); + if (isClient()) { + history.pushState('', '', '/'); + } } } else { console.error('예상하지 못한 오류가 발생했어요.\n', error); @@ -60,48 +65,12 @@ const responseHandler = async (error: unknown) => { return Promise.reject(error); }; -const silentRefresh = async (originRequest: InternalAxiosRequestConfig) => { - try { - const newToken = await updateToken(); +const silentRefresh = (originRequest: InternalAxiosRequestConfig) => { + return updateToken().then(newToken => { storage.set(newToken); setAxiosAuthHeader(originRequest, newToken); - - return await publicApi(originRequest); - } catch (error) { - removeToken(); - return Promise.reject(error); - } -}; - -/** api 요청이 병렬적으로 이뤄질 때, - * 토큰 업데이트는 한번만 요청하기 위해 사용되는 flag 변수 */ -let isTokenRefreshing = false; - -const updateToken = () => - new Promise((resolve, reject) => { - if (isTokenRefreshing) { - reject(new AuthRefreshIgnoredError('Already trying to refresh token')); - return; - } - - isTokenRefreshing = true; - - axios - .post<{ accessToken: string }>('/service-api/auth/token') - .then(({ data }) => resolve(data.accessToken)) - .catch(reason => reject(reason)) - .finally(() => (isTokenRefreshing = false)); + return publicApi(originRequest); }); - -const removeToken = () => { - storage.remove(); -}; - -const setAxiosAuthHeader = ( - config: InternalAxiosRequestConfig, - token: string -) => { - config.headers['Authorization'] = `Bearers ${token}`; }; publicApi.interceptors.request.use(requestHandler); diff --git a/src/apis/group.ts b/src/apis/group/index.ts similarity index 94% rename from src/apis/group.ts rename to src/apis/group/index.ts index f122f405e..73849e926 100644 --- a/src/apis/group.ts +++ b/src/apis/group/index.ts @@ -6,15 +6,15 @@ import { APIGroupComment, APIGroupCommentPagination, } from '@/types/group'; -import { publicApi } from './core/axios'; +import { publicApi } from '../core/axios'; -const groupAPI = { +const GroupAPI = { getEntireGroups: (pageParam: string) => publicApi.get( `/service-api/book-groups?pageSize=10&groupCursorId=` + pageParam ), - createGroup: (group: APICreateGroup) => + createGroup: ({ group }: { group: APICreateGroup }) => publicApi.post('/service-api/book-groups', group), getGroupDetailInfo: ({ @@ -109,4 +109,4 @@ const groupAPI = { ), }; -export default groupAPI; +export default GroupAPI; diff --git a/src/apis/job.ts b/src/apis/job/index.ts similarity index 78% rename from src/apis/job.ts rename to src/apis/job/index.ts index 7a61e4fad..f48d25c27 100644 --- a/src/apis/job.ts +++ b/src/apis/job/index.ts @@ -1,5 +1,5 @@ import { APIAllJob } from '@/types/job'; -import { publicApi } from './core/axios'; +import { publicApi } from '../core/axios'; const jobAPI = { getAllJobs: () => publicApi.get(`/service-api/jobs`), diff --git a/src/apis/recommend.ts b/src/apis/recommend/index.ts similarity index 87% rename from src/apis/recommend.ts rename to src/apis/recommend/index.ts index 16133d2b2..e863575fe 100644 --- a/src/apis/recommend.ts +++ b/src/apis/recommend/index.ts @@ -4,9 +4,9 @@ import { APIRecommendedBooksPagination, } from '@/types/bookshelf'; import { APIJobGroup } from '@/types/job'; -import { publicApi } from '@/apis/core/axios'; +import { publicApi } from '../core/axios'; -const recommendAPI = { +const RecommendAPI = { getUnAuthRecommendedBookshelf: () => publicApi.get( `/service-api/suggestions/bookshelves/default` @@ -23,4 +23,4 @@ const recommendAPI = { ), }; -export default recommendAPI; +export default RecommendAPI; diff --git a/src/apis/user.ts b/src/apis/user.tsx similarity index 75% rename from src/apis/user.ts rename to src/apis/user.tsx index bc9e03e1f..b1f1b3b34 100644 --- a/src/apis/user.ts +++ b/src/apis/user.tsx @@ -1,10 +1,10 @@ import { APIJob, APIJobGroup } from '@/types/job'; -import { APIUser, APIUserProfile } from '@/types/user'; -import { publicApi } from '@/apis/core/axios'; +import { APIUser } from '@/types/user'; +import { publicApi } from './core/axios'; const userAPI = { getUserProfile: ({ userId }: { userId: APIUser['userId'] }) => - publicApi.get(`/service-api/users/${userId}/profile`), + publicApi.get(`/service-api/users/${userId}/profile`), getMyProfile: () => publicApi.get('/service-api/users/me'), diff --git a/src/app/[...not_found]/page.ts b/src/app/[...not_found]/page.ts deleted file mode 100644 index 023fbbd61..000000000 --- a/src/app/[...not_found]/page.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { notFound } from 'next/navigation'; - -const NotFoundCatchAll = () => notFound(); - -export default NotFoundCatchAll; diff --git a/src/app/book/[bookId]/page.tsx b/src/app/book/[bookId]/page.tsx index 57f4d2edb..70bd5c5e7 100644 --- a/src/app/book/[bookId]/page.tsx +++ b/src/app/book/[bookId]/page.tsx @@ -1,147 +1,99 @@ 'use client'; -import { useRef } from 'react'; -import { APIBook } from '@/types/book'; -import { useBookTitle } from '@/queries/book/useBookInfoQuery'; -import { useHasBookComment } from '@/queries/book/useBookCommentsQuery'; -import useCreateBookCommentMutation from '@/queries/book/useCreateBookCommentMutation'; -import useToast from '@/components/common/Toast/useToast'; -import useDisclosure from '@/hooks/useDisclosure'; -import { - checkAuthentication, - isAxiosErrorWithCustomCode, -} from '@/utils/helpers'; -import { SERVICE_ERROR_MESSAGE } from '@/constants'; +import { Box, Skeleton, SkeletonText, Text, VStack } from '@chakra-ui/react'; +import { useRouter } from 'next/navigation'; -import Skeleton from '@/components/common/Skeleton'; -import SSRSafeSuspense from '@/components/common/SSRSafeSuspense'; -import TopNavigation from '@/components/common/TopNavigation'; -import BottomActionButton from '@/components/common/BottomActionButton'; -import LoginBottomActionButton from '@/components/common/LoginBottomActionButton'; -import CommentDrawer from '@/components/comment/CommentDrawer'; -import BackButton from '@/components/common/BackButton'; -import BookInfo, { BookInfoSkeleton } from '@/components/book/detail/BookInfo'; -import BookCommentList from '@/components/comment/BookCommentList'; +import bookAPI from '@/apis/book'; +import useBookInfoQuery from '@/queries/book/useBookInfoQuery'; +import useBookUserInfoQuery from '@/queries/book/useBookUserInfoQuery'; +import { APIBook } from '@/types/book'; +import { BookCommentList, BookInfo } from '@/ui/BookDetail'; +import TopNavigation from '@/ui/common/TopNavigation'; +import debounce from '@/utils/debounce'; const BookDetailPage = ({ params: { bookId }, }: { params: { bookId: APIBook['bookId'] }; }) => { - const isAuthenticated = checkAuthentication(); - - return ( - <> - - }> -
- -
- - -
-
- {isAuthenticated ? ( - - ) : ( - - )} - - - ); -}; - -export default BookDetailPage; - -const BookPageSkeleton = () => ( -
- -
-); - -const BookTopNavigation = ({ bookId }: { bookId: APIBook['bookId'] }) => ( - - - - - - }> - - - - -); + const router = useRouter(); -const BookTitle = ({ bookId }: { bookId: APIBook['bookId'] }) => { - const { data: title } = useBookTitle(bookId); - return

{title}

; -}; - -const Heading = ({ text }: { text: string }) => ( -

{text}

-); - -const AddBookCommentButton = ({ bookId }: { bookId: APIBook['bookId'] }) => { - const { - isOpen: isDrawerOpen, - onOpen: onDrawerOpen, - onClose: onDrawerClose, - } = useDisclosure(); - const { show: showToast } = useToast(); + const bookQueryInfo = useBookInfoQuery(bookId, { + onError: () => { + /** @todo /404 페이지로 교체 */ + router.replace('/'); + }, + }); - const commentRef = useRef(null); - const createComment = useCreateBookCommentMutation(bookId); + const bookUserQueryInfo = useBookUserInfoQuery(bookId); - const { data: hasBookComment } = useHasBookComment(bookId); - - const handleCommentCreate = () => { - const comment = commentRef.current?.value; - - if (!comment) { + const updateBookmark = (isBookMarked: boolean) => { + if (!bookUserQueryInfo.isSuccess) { return; } - createComment.mutate(comment, { - onSuccess: () => { - onDrawerClose(); - showToast({ type: 'success', message: '코멘트를 등록했어요 🎉' }); - }, - onError: error => { - if (isAxiosErrorWithCustomCode(error)) { - const { code } = error.response.data; - const message = SERVICE_ERROR_MESSAGE[code]; - showToast({ type: 'error', message }); - return; - } + const { isInMyBookshelf } = bookUserQueryInfo.data; - showToast({ type: 'error', message: '코멘트를 등록하지 못했어요 🥲' }); - }, - }); + if (!isInMyBookshelf && isBookMarked) { + bookAPI.setBookMarked(bookId).then(() => { + bookUserQueryInfo.refetch(); + }); + } else if (isInMyBookshelf && !isBookMarked) { + bookAPI.unsetBookMarked(bookId).then(() => { + bookUserQueryInfo.refetch(); + }); + } }; - if (hasBookComment) { - return null; - } - return ( - <> - - 코멘트 작성하기 - - - + + + + {bookQueryInfo.isSuccess && bookUserQueryInfo.isSuccess && ( + + )} + {bookQueryInfo.isLoading && ( + + + + + )} + + + + + 책 코멘트 + + {bookUserQueryInfo.isSuccess && ( + + )} + + ); }; -const BookTitleSkeleton = () => ( - - - -); +export default BookDetailPage; diff --git a/src/app/book/search/page.tsx b/src/app/book/search/page.tsx index e5983ec76..927117ea6 100644 --- a/src/app/book/search/page.tsx +++ b/src/app/book/search/page.tsx @@ -1,203 +1,23 @@ 'use client'; -import { useRouter } from 'next/navigation'; -import { Suspense, useEffect } from 'react'; -import { useForm } from 'react-hook-form'; -import { useInView } from 'react-intersection-observer'; +import { VStack, Text } from '@chakra-ui/react'; -import { APIBook } from '@/types/book'; - -import useBookSearchQuery from '@/queries/book/useBookSearchQuery'; -import { useRecentSearchListQuery } from '@/queries/book/useRecentSearchesQuery'; -import bookAPI from '@/apis/book'; - -import SSRSafeSuspense from '@/components/common/SSRSafeSuspense'; -import useDebounceValue from '@/hooks/useDebounce'; -import useQueryParams from '@/hooks/useQueryParams'; -import { checkAuthentication } from '@/utils/helpers'; - -import Loading from '@/components/common/Loading'; -import Input from '@/components/common/Input'; -import TopHeader from '@/components/common/TopHeader'; -import BestSellers, { - BestSellersSkeleton, -} from '@/components/bookSearch/BestSellers'; -import RecentSearchList, { - RecentSearchListSkeleton, -} from '@/components/bookSearch/RecentSearchList'; -import BookSearchList from '@/components/bookSearch/BookSearchList'; - -type FormValues = { - searchValue: string; -}; - -const KEYWORD = 'keyword'; - -const BookSearchPage = () => { - const { getQueryParam, setQueryParams, removeQueryParam } = useQueryParams(); - - const { register, watch, setValue } = useForm({ - mode: 'all', - defaultValues: { - searchValue: getQueryParam(KEYWORD) ?? '', - }, - }); - - const watchedKeyword = watch('searchValue'); - const debouncedKeyword = useDebounceValue(watchedKeyword, 1000); - - /* debounce된 keyword값에 따라 queryParameter를 수정하는 useEffect */ - useEffect(() => { - const queryValue = getQueryParam(KEYWORD); - - if (debouncedKeyword) { - setQueryParams({ [KEYWORD]: debouncedKeyword }); - } else if (!debouncedKeyword && queryValue) { - removeQueryParam(KEYWORD, 'replace'); - } - }, [debouncedKeyword, getQueryParam, setQueryParams, removeQueryParam]); - - /* TopHeader가 사라졌을 때 input의 위치 top: 5.8rem */ - const inputPositionClasses = watchedKeyword && 'sticky top-[5.8rem]'; +import BookSearch from '@/ui/BookSearch'; +const BookPage = () => { return ( - <> -
+ - -
-
- - - {/** 최근 검색어 + 베스트 셀러 */} -
- }> - setValue('searchValue', keyword)} - /> - - -
- - {/** 도서 검색 결과 */} - {watchedKeyword && ( -
- }> - {watchedKeyword === debouncedKeyword ? ( - - ) : ( - /* 타이핑 중 debounce가 적용되어 keyword가 업데이트 되지 않는 경우에 Loading 컴포넌트로 대체 */ - - )} - -
- )} -
- - ); -}; - -const BookSearchResult = ({ queryKeyword }: { queryKeyword: string }) => { - const router = useRouter(); - const { ref: inViewRef, inView } = useInView(); - - const bookSearchInfo = useBookSearchQuery({ - query: queryKeyword, - page: 1, - pageSize: 12, - }); - - const searchedBooks = bookSearchInfo.isSuccess - ? bookSearchInfo.data.pages.flatMap(page => page.searchBookResponseList) - : []; - const totalResultCount = bookSearchInfo.isSuccess - ? bookSearchInfo.data.pages[0].totalCount - : 0; - - const handleBookClick = async ({ bookId }: { bookId: APIBook['bookId'] }) => { - try { - await bookAPI.storeRecentSearch(queryKeyword); - router.push(`/book/${bookId}`); - } catch (error) { - console.error(error); - } - }; - - useEffect(() => { - if (inView && bookSearchInfo.hasNextPage) { - bookSearchInfo.fetchNextPage(); - } - }, [ - bookSearchInfo.fetchNextPage, - inView, - bookSearchInfo.hasNextPage, - queryKeyword, - bookSearchInfo, - ]); - - return ( - <> - -
- - ); -}; - -const RecentSearchResult = ({ - onItemClick, -}: { - onItemClick?: (item: string) => void; -}) => { - const isAuthenticated = checkAuthentication(); - - const { data: keywords } = useRecentSearchListQuery({ - enabled: isAuthenticated, - }); - - return ; -}; - -const BookSearchLoading = () => { - return ( - /** - * Loading 컴포넌트가 화면 중앙에 올바르게 표시되도록 height가 존재하는 relative div 요소 추가 - * 화면이 스크롤 되지 않는 크기: 100dvh - 23.3rem - */ -
- -
- ); -}; - -const ContentsSkelton = () => { - return ( - <> - - - + Discover + + + ); }; -export default BookSearchPage; +export default BookPage; diff --git a/src/app/book/sitemap.ts b/src/app/book/sitemap.ts deleted file mode 100644 index 04c60d8eb..000000000 --- a/src/app/book/sitemap.ts +++ /dev/null @@ -1,47 +0,0 @@ -import type { MetadataRoute } from 'next'; -import type { APIRecommendedBookshelf } from '@/types/bookshelf'; -import type { APIBook } from '@/types/book'; - -const options = { - headers: { - 'Content-Type': 'application/json', - }, - next: { revalidate: 60 * 60 * 24 }, -}; - -export async function booksSitemap() { - try { - const res = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/api/suggestions/bookshelves/default`, - options - ); - - if (!res.ok) { - return Promise.reject(); - } - - const data: APIRecommendedBookshelf = await res.json(); - - const books = new Set(); - - data.bookshelfResponses.forEach(bookshelf => - bookshelf.books.forEach(book => books.add(book.bookId)) - ); - - const filteredBooks = Array.from(books); - - return filteredBooks; - } catch { - return []; - } -} - -export default async function sitemap(): Promise { - const booksId = await booksSitemap(); - const sitemap = ['search', ...booksId]; - - return sitemap.map(value => ({ - url: `${process.env.NEXT_PUBLIC_HOST}/book/${value}`, - lastModified: new Date(), - })); -} diff --git a/src/app/bookarchive/page.tsx b/src/app/bookarchive/page.tsx index 302ef0e90..02346130e 100644 --- a/src/app/bookarchive/page.tsx +++ b/src/app/bookarchive/page.tsx @@ -1,33 +1,48 @@ 'use client'; import useMyProfileQuery from '@/queries/user/useMyProfileQuery'; - -import { checkAuthentication } from '@/utils/helpers'; - -import SSRSafeSuspense from '@/components/common/SSRSafeSuspense'; -import BookArchiveForAuth from '@/components/bookArchive/BookArchiveForAuth'; -import BookArchiveForUnAuth from '@/components/bookArchive/BookArchiveForUnAuth'; -import TopHeader from '@/components/common/TopHeader'; +import { isAuthed } from '@/utils/helpers'; +import { Skeleton, Text, VStack } from '@chakra-ui/react'; +import { Suspense } from 'react'; +import useMounted from '@/hooks/useMounted'; +import { BookArchiveForAuth, BookArchiveForUnAuth } from '@/ui/BookArchive'; export default function BookArchivePage() { return ( -
- - {/* TODO: 스켈레톤 컴포넌트로 교체 */} - + + + + BookArchive + + + + + + + + } + > - -
+ + ); } const Contents = () => { - const isAuthenticated = checkAuthentication(); const { data: userData } = useMyProfileQuery({ - enabled: isAuthenticated, + enabled: isAuthed(), }); + const mounted = useMounted(); + if (!mounted) return null; - return isAuthenticated ? ( + return isAuthed() ? ( ) : ( diff --git a/src/app/bookshelf/[bookshelfId]/page.tsx b/src/app/bookshelf/[bookshelfId]/page.tsx index 78fbbf8c8..263882573 100644 --- a/src/app/bookshelf/[bookshelfId]/page.tsx +++ b/src/app/bookshelf/[bookshelfId]/page.tsx @@ -1,26 +1,37 @@ 'use client'; +import { useToast } from '@/hooks/toast'; +import useBookshelfBooksQuery from '@/queries/bookshelf/useBookshelfBookListQuery'; +import useBookshelfInfoQuery from '@/queries/bookshelf/useBookshelfInfoQuery'; +import { + useBookshelfLike, + useBookshelfUnlike, +} from '@/queries/bookshelf/useBookshelfLikeMutation'; +import { APIBookshelf } from '@/types/bookshelf'; +import Button from '@/ui/common/Button'; +import IconButton from '@/ui/common/IconButton'; +import { LikeButton } from '@/ui/common/BookshelfLike/'; +import TopNavigation from '@/ui/common/TopNavigation'; +import InteractiveBookShelf from '@/ui/InteractiveBookShelf'; +import InitialBookShelfData from '@/ui/InteractiveBookShelf/InitialBookShelfData'; +import UserJobInfoTag from '@/ui/UserJobInfoTag'; +import { isAuthed } from '@/utils/helpers'; +import { + Box, + Flex, + Highlight, + HStack, + Image, + Link, + Skeleton, + Text, + VStack, +} from '@chakra-ui/react'; +import { usePathname } from 'next/navigation'; import { useEffect } from 'react'; -import Link from 'next/link'; import { useInView } from 'react-intersection-observer'; -import type { APIBookshelf } from '@/types/bookshelf'; - -import useBookShelfBooksQuery from '@/queries/bookshelf/useBookShelfBookListQuery'; -import useBookShelfInfoQuery from '@/queries/bookshelf/useBookShelfInfoQuery'; -import useMutateBookshelfLikeQuery from '@/queries/bookshelf/useMutateBookshelfLikeQuery'; -import { useMyProfileId } from '@/queries/user/useMyProfileQuery'; -import { checkAuthentication } from '@/utils/helpers'; -import { IconKakao } from '@public/icons'; -import { KAKAO_LOGIN_URL } from '@/constants'; - -import useToast from '@/components/common/Toast/useToast'; -import TopNavigation from '@/components/common/TopNavigation'; -import BookShelfRow from '@/components/bookShelf/BookShelfRow'; -import Button from '@/components/common/Button'; -import LikeButton from '@/components/common/LikeButton'; -import BackButton from '@/components/common/BackButton'; -import ShareButton from '@/components/common/ShareButton'; +const kakaoUrl = `${process.env.NEXT_PUBLIC_API_URL}/oauth2/authorize/kakao?redirect_uri=${process.env.NEXT_PUBLIC_CLIENT_REDIRECT_URI}`; export default function UserBookShelfPage({ params: { bookshelfId }, @@ -29,86 +40,23 @@ export default function UserBookShelfPage({ bookshelfId: APIBookshelf['bookshelfId']; }; }) { - return ( -
- - - - - - - - - - - -
- ); -} - -const BookShelfInfo = ({ bookshelfId }: { bookshelfId: number }) => { - const isAuthenticated = checkAuthentication(); - const { show: showToast } = useToast(); - - const { data } = useBookShelfInfoQuery(bookshelfId); - const { isLiked, likeCount, userId, userNickname, job } = data; - - const { mutate: mutateBookshelfLike } = - useMutateBookshelfLikeQuery(bookshelfId); - - const { data: myId } = useMyProfileId({ enabled: isAuthenticated }); - - const handleClickLikeButton = () => { - if (!isAuthenticated) { - showToast({ message: '로그인 후 이용해주세요' }); - return; - } - - if (userId === myId) { - showToast({ - message: '내 책장에는 좋아요를 누를 수 없어요', - }); - return; - } - - mutateBookshelfLike(isLiked); - }; - - return ( -
-

- {userNickname} - 님의 책장 -

-
- - {`${job.jobGroupKoreanName} • ${job.jobNameKoreanName}`} - - -
-
- ); -}; - -const BookShelfContent = ({ - bookshelfId, -}: { - bookshelfId: APIBookshelf['bookshelfId']; -}) => { - const isAuthenticated = checkAuthentication(); const { ref, inView } = useInView(); - + const { data: infoData, isSuccess: infoIsSuccess } = useBookshelfInfoQuery({ + bookshelfId, + }); + const { mutate: likeBookshelf } = useBookshelfLike(bookshelfId); + const { mutate: unlikeBookshelf } = useBookshelfUnlike(bookshelfId); + const pathname = usePathname(); + const { showToast } = useToast(); const { data: booksData, fetchNextPage, hasNextPage, - isSuccess, + isSuccess: booksIsSuccess, + isLoading, + isFetching, isFetchingNextPage, - } = useBookShelfBooksQuery({ bookshelfId }); + } = useBookshelfBooksQuery({ bookshelfId }); useEffect(() => { if (inView && hasNextPage) { @@ -116,68 +64,105 @@ const BookShelfContent = ({ } }, [fetchNextPage, inView, hasNextPage]); - // TODO: Suspense 적용 - if (!isSuccess) return null; + if (isLoading) { + return ( + + + + + + + ); + } - return isAuthenticated ? ( - <> - {booksData.pages.map(page => - page.books.map((rowBooks, idx) => ( - - )) - )} - {!isFetchingNextPage &&
} - - ) : ( - <> - - - - - ); -}; -const DummyBookShelfRow = () => ( -
- -
-); + if (!(infoIsSuccess && booksIsSuccess)) return null; -const BookShelfLoginBox = ({ - bookshelfId, -}: { - bookshelfId: APIBookshelf['bookshelfId']; -}) => { - const { data } = useBookShelfInfoQuery(bookshelfId); - const { userNickname } = data; + const filtered = () => { + const data = booksData.pages[0].books; + + if (isAuthed()) return data; + + return data.slice(0, 4); + }; + + const filteredData = filtered(); + + const handleClickShareButton = () => { + const url = 'https://dev.dadok.site' + pathname; + + navigator.clipboard + .writeText(url) + .then(() => { + showToast({ message: '복사 성공!' }); + }) + .catch(() => { + showToast({ message: '잠시 후 다시 시도해주세요' }); + }); + }; + + const handleBookshelfLikeButton = () => { + !infoData.isLiked ? likeBookshelf() : unlikeBookshelf(); + }; return ( -
-

- 지금 로그인하면 -
- 책장에 담긴 모든 책을 볼 수 있어요! -

-

- {userNickname}님의 책장에서 - 다양한 -
- 인사이트를 얻을 수 있어요. -

- - - -
+ + + + + + + + + {infoData.job.jobNameKoreanName && ( + + )} + + + + + {isAuthed() ? ( + booksData.pages.map((page, idx) => ( + + )) + ) : ( + <> + + + + 로그인 후에 +
+ + {`${infoData.bookshelfName}을 확인해 주세요!`} + +
+ + + + + )} + {isFetching && !isFetchingNextPage ? null : } +
+
); -}; - -const initialBookImageUrl = [ - { bookId: 1, title: 'book1', imageUrl: '/images/book-cover/book1.jpeg' }, - { bookId: 2, title: 'book2', imageUrl: '/images/book-cover/book2.jpeg' }, - { bookId: 3, title: 'book3', imageUrl: '/images/book-cover/book3.jpeg' }, - { bookId: 4, title: 'book4', imageUrl: '/images/book-cover/book4.jpeg' }, -]; +} diff --git a/src/app/bookshelf/sitemap.ts b/src/app/bookshelf/sitemap.ts deleted file mode 100644 index 35d7daf7b..000000000 --- a/src/app/bookshelf/sitemap.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { MetadataRoute } from 'next'; -import type { APIRecommendedBookshelf } from '@/types/bookshelf'; - -const options = { - headers: { - 'Content-Type': 'application/json', - }, - next: { revalidate: 60 * 60 * 24 }, -}; - -export async function bookshelvesSitemap() { - try { - const res = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/api/suggestions/bookshelves/default`, - options - ); - - if (!res.ok) { - return Promise.reject(); - } - - const data: APIRecommendedBookshelf = await res.json(); - const bookshelves = data.bookshelfResponses.map(({ bookshelfId }) => ({ - bookshelfId, - })); - - return bookshelves; - } catch { - return []; - } -} - -export default async function sitemap(): Promise { - const bookshelves = await bookshelvesSitemap(); - - return bookshelves.map(({ bookshelfId }) => ({ - url: `${process.env.NEXT_PUBLIC_HOST}/bookshelf/${bookshelfId}`, - lastModified: new Date(), - })); -} diff --git a/src/app/error.tsx b/src/app/error.tsx new file mode 100644 index 000000000..20abfc98a --- /dev/null +++ b/src/app/error.tsx @@ -0,0 +1,45 @@ +'use client'; + +import Button from '@/ui/common/Button'; +import { Text, Highlight, Image, VStack } from '@chakra-ui/react'; + +export const ErrorPage = () => { + return ( + + loading + + + + 다독이도 몰라요~ 왜 이래요~ + + + + + + ); +}; + +export default ErrorPage; diff --git a/src/app/global-error.tsx b/src/app/global-error.tsx deleted file mode 100644 index c6d9ab5d7..000000000 --- a/src/app/global-error.tsx +++ /dev/null @@ -1,38 +0,0 @@ -'use client'; - -import Button from '@/components/common/Button'; -import Image from 'next/image'; -import { useRouter } from 'next/navigation'; - -export const ErrorPage = () => { - const router = useRouter(); - - return ( - - -
- loading -
- 다독이도 몰라요~ 왜 - 이래요~ -
- -
- - - ); -}; - -export default ErrorPage; diff --git a/src/app/group/[groupId]/edit/page.tsx b/src/app/group/[groupId]/edit/page.tsx index b857e56b5..35d8efc56 100644 --- a/src/app/group/[groupId]/edit/page.tsx +++ b/src/app/group/[groupId]/edit/page.tsx @@ -1,102 +1,43 @@ 'use client'; -import { notFound, useRouter } from 'next/navigation'; -import { FormProvider, SubmitHandler, useForm } from 'react-hook-form'; - -import { - useBookGroupEditCurrentInfo, - useBookGroupInfoMutation, -} from '@/queries/group/useBookGroupQuery'; -import type { APIGroupDetail, APIEditBookGroup } from '@/types/group'; - -import { SERVICE_ERROR_MESSAGE } from '@/constants'; -import { isAxiosErrorWithCustomCode } from '@/utils/helpers'; -import useToast from '@/components/common/Toast/useToast'; - -import withAuthRequired from '@/hocs/withAuthRequired'; -import BookGroupEditDateForm from '@/components/bookGroup/edit/BookGroupEditDateForm'; -import BookGroupEditIntroduceForm from '@/components/bookGroup/edit/BookGroupEditIntroduceForm'; -import BookGroupEditTitleForm from '@/components/bookGroup/edit/BookGroupEditTitleForm'; -import BookGroupEditTopNavigation from '@/components/bookGroup/edit/BookGroupEditTopNavigation'; - -const BookGroupEditPage = ({ +import GroupAPI from '@/apis/group'; +import { APIGroupDetail } from '@/types/group'; +import AuthRequired from '@/ui/AuthRequired'; +import TopNavigation from '@/ui/common/TopNavigation'; +import EditGroupForm from '@/ui/Group/EditGroupForm'; +import { VStack } from '@chakra-ui/react'; +import { useCallback, useEffect, useState } from 'react'; + +const GroupEditPage = ({ params: { groupId }, }: { - params: { groupId: APIGroupDetail['bookGroupId'] }; + params: { groupId: number }; }) => { - const router = useRouter(); - - const { data: bookGroupData } = useBookGroupEditCurrentInfo(groupId); - const { isOwner, title, description, maxMemberCount, startDate, endDate } = - bookGroupData; - - /** - * @todo - * 401 페이지 만들기 (접근 권한이 없어요) - */ - if (!isOwner) { - notFound(); - } - - const bookGroupEdit = useBookGroupInfoMutation(groupId); - - const { show: showToast } = useToast(); - - const methods = useForm>({ - mode: 'all', - defaultValues: { - title: title, - introduce: description, - maxMemberCount: maxMemberCount ? maxMemberCount : 9999, - startDate: startDate, - endDate: endDate, - }, - }); - - const handleFormSubmit: SubmitHandler< - Omit - > = async ({ title, introduce, maxMemberCount, endDate }) => { - bookGroupEdit.mutate( - { title, introduce, maxMemberCount, endDate }, - { - onSuccess: () => { - router.push(`/group/${groupId}`); - - showToast({ type: 'success', message: '모임 정보를 수정했어요! 🎉' }); - return; - }, - onError: error => { - if (isAxiosErrorWithCustomCode(error)) { - const { code } = error.response.data; - const message = SERVICE_ERROR_MESSAGE[code]; - - showToast({ type: 'error', message }); - return; - } - - showToast({ - type: 'error', - message: '모임 정보 수정을 실패했어요 🥲', - }); - }, - } - ); - }; + const [group, setGroup] = useState(); + + const getGroup = useCallback(async () => { + try { + const { data } = await GroupAPI.getGroupDetailInfo({ + bookGroupId: groupId, + }); + setGroup(data); + } catch (error) { + console.error(error); + } + }, [groupId]); + + useEffect(() => { + getGroup(); + }, [getGroup]); return ( - - - -
- - - - -
+ + + + {group && } + + ); }; -export default withAuthRequired(BookGroupEditPage); +export default GroupEditPage; diff --git a/src/app/group/[groupId]/join/page.tsx b/src/app/group/[groupId]/join/page.tsx deleted file mode 100644 index 38a1a27ed..000000000 --- a/src/app/group/[groupId]/join/page.tsx +++ /dev/null @@ -1,106 +0,0 @@ -'use client'; - -import { notFound, useRouter } from 'next/navigation'; -import { SubmitHandler, useForm } from 'react-hook-form'; - -import useJoinBookGroup from '@/hooks/group/useJoinBookGroup'; - -import SSRSafeSuspense from '@/components/common/SSRSafeSuspense'; -import withAuthRequired from '@/hocs/withAuthRequired'; - -import Loading from '@/components/common/Loading'; -import Input from '@/components/common/Input'; -import InputLength from '@/components/common/InputLength'; -import ErrorMessage from '@/components/common/ErrorMessage'; -import BottomActionButton from '@/components/common/BottomActionButton'; -import BookGroupNavigation from '@/components/bookGroup/BookGroupNavigation'; - -type JoinFormValues = { - answer: string; -}; - -const JoinBookGroupPage = ({ - params: { groupId }, -}: { - params: { groupId: number }; -}) => { - return ( - }> - - - - - - - ); -}; - -export default withAuthRequired(JoinBookGroupPage); - -const BookGroupJoinForm = ({ groupId }: { groupId: number }) => { - const router = useRouter(); - const { isMember, hasPassword, question, joinBookGroup } = - useJoinBookGroup(groupId); - - if (isMember || !hasPassword) { - notFound(); - } - - const { - register, - watch, - handleSubmit, - formState: { errors }, - } = useForm({ mode: 'all' }); - - const submitJoinForm: SubmitHandler = ({ answer }) => { - joinBookGroup({ - answer, - onSuccess: () => router.replace(`/group/${groupId}`), - }); - }; - - return ( -
-

- {`문제를 맞추면 - 모임에 가입할 수 있어요`} -

-
-

{question}

-
- -
- - {errors.answer && ( - {errors.answer.message} - )} -
-
-
- 제출하기 -
- ); -}; diff --git a/src/app/group/[groupId]/not-found.tsx b/src/app/group/[groupId]/not-found.tsx deleted file mode 100644 index a5f205770..000000000 --- a/src/app/group/[groupId]/not-found.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import Button from '@/components/common/Button'; -import Image from 'next/image'; -import Link from 'next/link'; - -export default function NotFound() { - return ( -
- loading -

- 다독이가 길을 잃었어요. -

- - - -
- ); -} diff --git a/src/app/group/[groupId]/page.tsx b/src/app/group/[groupId]/page.tsx index 0e2d434d2..bf01dac1d 100644 --- a/src/app/group/[groupId]/page.tsx +++ b/src/app/group/[groupId]/page.tsx @@ -1,68 +1,19 @@ 'use client'; -import { notFound } from 'next/navigation'; -import { ErrorBoundary } from 'react-error-boundary'; +import { Flex } from '@chakra-ui/react'; -import { checkAuthentication } from '@/utils/helpers'; +import GroupDetail from '@/ui/Group/GroupDetail'; -import SSRSafeSuspense from '@/components/common/SSRSafeSuspense'; -import LoginBottomActionButton from '@/components/common/LoginBottomActionButton'; -import BookGroupNavigation from '@/components/bookGroup/BookGroupNavigation'; -import BookGroupInfo from '@/components/bookGroup/detail/BookGroupInfo'; -import JoinBookGroupButton from '@/components/bookGroup/detail/JoinBookGroupButton'; -import BookGroupCommentList from '@/components/comment/BookGroupCommentList'; - -const DetailBookGroupPage = ({ +const GroupDetailPage = ({ params: { groupId }, }: { params: { groupId: number }; }) => { - const isAuthenticated = checkAuthentication(); - return ( - - - - - - - - - }> -
- - -
- - -
-
- {isAuthenticated ? ( - - ) : ( - - )} -
-
+ + + ); }; -export default DetailBookGroupPage; - -const Heading = ({ text }: { text: string }) => ( -

{text}

-); - -const PageSkeleton = () => ( -
-
-
-
-
-
-
-
-
-); - -const Divider = () =>

; +export default GroupDetailPage; diff --git a/src/app/group/create/page.tsx b/src/app/group/create/page.tsx index 124bbfde1..1fd6d532d 100644 --- a/src/app/group/create/page.tsx +++ b/src/app/group/create/page.tsx @@ -1,11 +1,19 @@ 'use client'; -import withAuthRequired from '@/hocs/withAuthRequired'; +import AddGroupForm from '@/ui/Group/AddGroupForm'; +import { VStack } from '@chakra-ui/react'; +import TopNavigation from '@/ui/common/TopNavigation'; +import AuthRequired from '@/ui/AuthRequired'; -import CreateBookGroupFunnel from '@/components/bookGroup/create/CreateBookGroupFunnel'; - -const GroupCreateFunnelPage = () => { - return ; +const GroupCreatePage = () => { + return ( + + + + + + + ); }; -export default withAuthRequired(GroupCreateFunnelPage); +export default GroupCreatePage; diff --git a/src/app/group/page.tsx b/src/app/group/page.tsx index 24b67dcb5..200fc3bfc 100644 --- a/src/app/group/page.tsx +++ b/src/app/group/page.tsx @@ -1,124 +1,24 @@ 'use client'; -import { useRouter } from 'next/navigation'; -import { useEffect } from 'react'; -import { useInView } from 'react-intersection-observer'; - -import SSRSafeSuspense from '@/components/common/SSRSafeSuspense'; import useEntireGroupsQuery from '@/queries/group/useEntireGroupsQuery'; -import useMyGroupsQuery from '@/queries/group/useMyGroupQuery'; -import { useMyProfileId } from '@/queries/user/useMyProfileQuery'; - -import useMounted from '@/hooks/useMounted'; -import { checkAuthentication } from '@/utils/helpers'; -import useToast from '@/components/common/Toast/useToast'; +import GroupHeader from '@/ui/Group/GroupHeader'; +import GroupList from '@/ui/Group/GroupList'; +import GroupSearch from '@/ui/Group/GroupSearch'; +import { Box, Skeleton, VStack } from '@chakra-ui/react'; +import { useState, useEffect } from 'react'; +import { useInView } from 'react-intersection-observer'; -import FloatingButton from '@/components/common/FloatingButton'; -import Loading from '@/components/common/Loading'; -import TopHeader from '@/components/common/TopHeader'; -import DetailBookGroupCard, { - DetailBookGroupCardSkeleton, -} from '@/components/bookGroup/DetailBookGroupCard'; -import SearchGroupInput from '@/components/bookGroup/SearchGroup'; -import SimpleBookGroupCard, { - SimpleBookGroupCardSkeleton, -} from '@/components/bookGroup/SimpleBookGroupCard'; +interface SearchValue { + [key: string]: string; + input: string; + select: string; +} const GroupPage = () => { - const router = useRouter(); - const { show: showToast } = useToast(); - - const isAuthenticated = checkAuthentication(); - - const handleSearchInputClick = () => { - showToast({ message: '아직 준비 중인 기능이에요 🥹' }); - }; - - const handleCreateGroupClick = () => { - if (isAuthenticated) { - router.push('/group/create'); - } else { - showToast({ message: '로그인 후 이용해주세요' }); - } - - return; - }; - - const FLOATING_BUTTON_POSITION = - 'bottom-[calc(env(safe-area-inset-bottom)+8.3rem)] right-[1.7rem] desktop:right-1/2 desktop:translate-x-[19.8rem]'; - - return ( - <> - -
- - }> - {isAuthenticated && } - - -
- - - ); -}; - -export default GroupPage; - -const MyBookGroupList = () => { - const isAuthenticated = checkAuthentication(); - const { - data: { bookGroups }, - } = useMyGroupsQuery({ enabled: isAuthenticated }); - const { data: myId } = useMyProfileId({ enabled: isAuthenticated }); - - return ( -
- {bookGroups.map(({ title, book, bookGroupId, owner }) => ( - - ))} -
- ); -}; - -const PageSkeleton = () => { - const isMounted = useMounted(); - - if (!isMounted) { - return ; - } - - return ( - <> - -
- - - - -
- - ); -}; - -const MyBookGroupListSkeleton = () => ( -
- - - - -
-); - -const EntireBookGroupList = () => { + const [searchValue, setSearchValue] = useState({ + input: '', + select: '모임', + }); const { ref, inView } = useInView(); const { @@ -136,55 +36,50 @@ const EntireBookGroupList = () => { } }, [fetchNextPage, inView, hasNextPage]); + const handleSumbit = () => { + const { input } = searchValue; + if (input.trim().length === 0) { + /*공백만 입력한 경우 전체 데이터 렌더링 */ + } else { + /*검색 API호출 및 setMeetingListData 업데이트 */ + } + }; + + const handleChange = (name: string, value: string) => { + if (!(name in searchValue)) return; + const tempSearchValue = { ...searchValue }; + tempSearchValue[name] = value; + setSearchValue(tempSearchValue); + }; + if (isLoading) return ( -
- - - - -
+ + + + + + ); return ( - <> -
+ + + + {isSuccess && - data.pages.map(({ bookGroups }) => - bookGroups.map( - ({ - bookGroupId, - title, - introduce, - book, - startDate, - endDate, - owner, - memberCount, - commentCount, - isPublic, - }) => ( - - ) - ) - )} -
- {isFetchingNextPage && } -
- + data.pages.map((groups, idx) => { + return ; + })} + + + {isFetchingNextPage && } + ); }; + +export default GroupPage; diff --git a/src/app/group/sitemap.ts b/src/app/group/sitemap.ts deleted file mode 100644 index e963145bb..000000000 --- a/src/app/group/sitemap.ts +++ /dev/null @@ -1,38 +0,0 @@ -import type { MetadataRoute } from 'next'; -import type { APIGroupPagination } from '@/types/group'; - -const options = { - headers: { - 'Content-Type': 'application/json', - }, - next: { revalidate: 60 * 60 * 24 }, -}; - -export const bookGroupSitemap = async () => { - try { - const res = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/api/book-groups?pageSize=100`, - options - ); - - if (!res.ok) { - return Promise.reject(); - } - - const data: APIGroupPagination = await res.json(); - const bookGroups = data.bookGroups.map(group => group.bookGroupId); - - return bookGroups; - } catch { - return []; - } -}; - -export default async function sitemap(): Promise { - const bookGroups = await bookGroupSitemap(); - - return bookGroups.map(bookGroupId => ({ - url: `${process.env.NEXT_HOST}/group/${bookGroupId}`, - lastModified: new Date(), - })); -} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 460cd202f..73bb26c24 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,60 +1,16 @@ -import type { Metadata } from 'next'; +import ContextProvider from '@/components/ContextProvider'; +import { ReactNode } from 'react'; -import { appleSplashScreens } from '@/constants/metadata'; - -import ContextProvider from '@/components/common/ContextProvider'; -import AuthFailedErrorBoundary from '@/components/common/AuthFailedErrorBoundary'; -import Layout from '@/components/layout/Layout'; - -import { LineSeedKR } from '@/styles/font'; -import '@/styles/global.css'; - -export const metadata: Metadata = { - metadataBase: new URL(`${process.env.NEXT_HOST}`), - title: { - template: '%s | 다독다독', - default: '다독다독', - }, - description: '책에 대한 인사이트를 공유하고 소통하는 독서 소셜 플랫폼', - themeColor: '#FFFFFF', - keywords: [ - '다독다독', - 'dadok', - 'dadokdadok', - '책장', - '책추천', - '도서검색', - '독서모임', - '책', - '독서', - ], - viewport: - 'minimum-scale=1, initial-scale=1, width=device-width, shrink-to-fit=no, viewport-fit=cover', - verification: { - google: '72kN3MWyQHuvSb8V67dVkfPUPMrw102Tm6BsvTvfKmg', - other: { - 'naver-site-verification': '9046af5eda448309a92e2e923a45cb874df986a0', - }, - }, - icons: [ - { rel: 'apple-touch-icon', url: '/images/icon-192x192.png' }, - { rel: 'icon', url: '/favicon.ico' }, - ], - appleWebApp: { - title: '다독다독', - startupImage: appleSplashScreens, - }, -}; - -const RootLayout = ({ children }: { children: React.ReactNode }) => { +const RootLayout = ({ children }: { children: ReactNode }) => { return ( - - - - - {children} - - + + + 다독다독 + + + + + {children} ); diff --git a/src/app/loading.tsx b/src/app/loading.tsx deleted file mode 100644 index 71586d44c..000000000 --- a/src/app/loading.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import Loading from '@/components/common/Loading'; - -export default function RootLoading() { - return ; -} diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 8c02ff3da..bddebf3bb 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -1,54 +1,51 @@ 'use client'; +import { Highlight, Text, VStack } from '@chakra-ui/react'; import Image from 'next/image'; import Link from 'next/link'; -import { IconKakao } from '@public/icons'; -import { KAKAO_LOGIN_URL } from '@/constants'; - -import Button from '@/components/common/Button'; +import Button from '@/ui/common/Button'; +import Logo from '@/ui/common/Logo'; const LoginPage = () => { + const kakaoUrl = `${process.env.NEXT_PUBLIC_API_URL}/oauth2/authorize/kakao?redirect_uri=${process.env.NEXT_PUBLIC_CLIENT_REDIRECT_URI}`; + return ( - <> -
- 로그인랜딩이미지 -

- - 책에 대한 모든 이야기, - + + + + + 책에 대한 모든 이야기
- 다독다독에서 - 함께해요! -

-
- -
- - - - - - -
- + 다독다독에서 함께 해요 + + + + + + + ); }; diff --git a/src/app/login/redirect/page.tsx b/src/app/login/redirect/page.tsx index 3432803d5..bedf47e2a 100644 --- a/src/app/login/redirect/page.tsx +++ b/src/app/login/redirect/page.tsx @@ -1,42 +1,32 @@ 'use client'; -import { notFound, useRouter, useSearchParams } from 'next/navigation'; +import { Flex, Spinner } from '@chakra-ui/react'; +import { useRouter, useSearchParams } from 'next/navigation'; import { useCallback, useEffect } from 'react'; - import { setAuth } from '@/utils/helpers'; import userAPI from '@/apis/user'; -import Loading from '@/components/common/Loading'; - const RedirectPage = () => { const router = useRouter(); const searchParams = useSearchParams(); const accessToken = searchParams.get('access_token'); - if (!accessToken) { - notFound(); - } - const checkSavedAdditionalInfo = useCallback(async () => { - try { - const isSavedAdditionalInfo = await userAPI.getMyProfile().then( - ({ - data: { - job: { jobName, jobGroupName }, - nickname, - }, - }) => !!(nickname && jobGroupName && jobName) - ); - - if (!isSavedAdditionalInfo) { - router.replace('/profile/me/add'); - } - - router.replace('/bookarchive'); - } catch { - router.replace('/not-found'); + const isSavedAdditionalInfo = await userAPI.getMyProfile().then( + ({ + data: { + job: { jobName, jobGroupName }, + nickname, + }, + }) => !!(nickname && jobGroupName && jobName) + ); + + if (!isSavedAdditionalInfo) { + router.replace('/profile/me/add'); } + + router.replace('/bookarchive'); }, [router]); useEffect(() => { @@ -48,7 +38,11 @@ const RedirectPage = () => { } }, [accessToken, checkSavedAdditionalInfo]); - return ; + return ( + + + + ); }; export default RedirectPage; diff --git a/src/app/manifest.webmanifest b/src/app/manifest.webmanifest deleted file mode 100644 index 178fedd1c..000000000 --- a/src/app/manifest.webmanifest +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "다독다독", - "short_name": "다독다독", - "description": "책에 대한 인사이트를 공유하고 소통하는 독서 소셜 플랫폼", - "theme_color": "#FFA436", - "background_color": "#FFFFFF", - "display": "standalone", - "scope": "./", - "start_url": "./", - "icons": [ - { - "src": "images/icon-192x192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable any" - }, - { - "src": "images/icon-256x256.png", - "sizes": "256x256", - "type": "image/png", - "purpose": "maskable any" - }, - { - "src": "images/icon-384x384.png", - "sizes": "384x384", - "type": "image/png", - "purpose": "maskable any" - }, - { - "src": "images/icon-512x512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable any" - } - ] -} diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx index c7581591a..c52fc2f29 100644 --- a/src/app/not-found.tsx +++ b/src/app/not-found.tsx @@ -1,28 +1,45 @@ 'use client'; -import Button from '@/components/common/Button'; -import Image from 'next/image'; -import { useRouter } from 'next/navigation'; - -const NotFound = () => { - const router = useRouter(); +import Button from '@/ui/common/Button'; +import { Highlight, Image, Text, VStack } from '@chakra-ui/react'; +export const NotFoundPage = () => { return ( -
- loading -
- 다독이가 길을 잃었어요. -
- -
+ + loading + + + + 다독이가 길을 잃었어요. + + + + + ); }; -export default NotFound; +export default NotFoundPage; diff --git a/src/app/opengraph-image.jpg b/src/app/opengraph-image.jpg deleted file mode 100644 index 60da537d0..000000000 Binary files a/src/app/opengraph-image.jpg and /dev/null differ diff --git a/src/app/profile/[userId]/page.tsx b/src/app/profile/[userId]/page.tsx index b167df803..4ee797d9d 100644 --- a/src/app/profile/[userId]/page.tsx +++ b/src/app/profile/[userId]/page.tsx @@ -1,11 +1,10 @@ 'use client'; import { APIUser } from '@/types/user'; -import BackButton from '@/components/common/BackButton'; -import ShareButton from '@/components/common/ShareButton'; -import TopNavigation from '@/components/common/TopNavigation'; -import ProfileBookShelf from '@/components/profile/bookShelf/ProfileBookShelf'; -import ProfileInfo from '@/components/profile/info/ProfileInfo'; +import TopNavigation from '@/ui/common/TopNavigation'; +import ProfileBookShelf from '@/ui/Profile/ProfileBookshelf'; +import ProfileInfo from '@/ui/Profile/ProfileInfo'; +import { VStack } from '@chakra-ui/react'; const UserProfilePage = ({ params: { userId }, @@ -13,20 +12,13 @@ const UserProfilePage = ({ params: { userId: APIUser['userId'] }; }) => { return ( - <> - - - - - - - - -
+ + + -
- + + ); }; diff --git a/src/app/profile/me/add/page.tsx b/src/app/profile/me/add/page.tsx index 8d6b0e4f5..15a4455b3 100644 --- a/src/app/profile/me/add/page.tsx +++ b/src/app/profile/me/add/page.tsx @@ -1,29 +1,41 @@ 'use client'; import useAllJobQuery from '@/queries/job/useAllJobQuery'; +import useMyProfileQuery from '@/queries/user/useMyProfileQuery'; +import AuthRequired from '@/ui/AuthRequired'; +import ProfileForm from '@/ui/Profile/ProfileForm'; +import { isAuthed } from '@/utils/helpers'; +import { Text, VStack } from '@chakra-ui/react'; -import { checkAuthentication } from '@/utils/helpers'; +const AdditionalProfile = () => { + const allJobQuery = useAllJobQuery({ enabled: isAuthed() }); + const userProfileQuery = useMyProfileQuery({ enabled: isAuthed() }); -import SSRSafeSuspense from '@/components/common/SSRSafeSuspense'; -import withAuthRequired from '@/hocs/withAuthRequired'; + const isSuccess = allJobQuery.isSuccess && userProfileQuery.isSuccess; -import AddJobProfile from '@/components/profile/AddJobProfile'; - -const AddJobProfilePage = () => { return ( - - - + + + + 추가 정보를 입력해 주세요! + + + 추가 정보를 입력하면 +
+ + 다독다독 + + 이 추천하는 책장을 볼 수 있어요! +
+ {isSuccess && ( + + )} +
+
); }; -export default withAuthRequired(AddJobProfilePage); - -const Contents = () => { - const isAuthenticated = checkAuthentication(); - const allJobQuery = useAllJobQuery({ enabled: isAuthenticated }); - - return allJobQuery.isSuccess ? ( - - ) : null; -}; +export default AdditionalProfile; diff --git a/src/app/profile/me/edit/page.tsx b/src/app/profile/me/edit/page.tsx index eb416b593..537bc5506 100644 --- a/src/app/profile/me/edit/page.tsx +++ b/src/app/profile/me/edit/page.tsx @@ -2,31 +2,41 @@ import useAllJobQuery from '@/queries/job/useAllJobQuery'; import useMyProfileQuery from '@/queries/user/useMyProfileQuery'; - -import { checkAuthentication } from '@/utils/helpers'; - -import SSRSafeSuspense from '@/components/common/SSRSafeSuspense'; -import withAuthRequired from '@/hocs/withAuthRequired'; - -import EditProfile from '@/components/profile/EditProfile'; -import Loading from '@/components/common/Loading'; - -const EditProfilePage = () => { +import AuthRequired from '@/ui/AuthRequired'; +import TopNavigation from '@/ui/common/TopNavigation'; +import ProfileForm from '@/ui/Profile/ProfileForm'; +import { isAuthed } from '@/utils/helpers'; +import { Skeleton, VStack } from '@chakra-ui/react'; +import { Suspense } from 'react'; + +const EditMyPage = () => { return ( - }> - - + + + + + + + + + } + > + + + + ); }; -export default withAuthRequired(EditProfilePage); - const Contents = () => { - const isAuthenticated = checkAuthentication(); - const allJobQuery = useAllJobQuery({ enabled: isAuthenticated }); + const allJobQuery = useAllJobQuery({ enabled: isAuthed() }); const { data: profileData } = useMyProfileQuery(); return allJobQuery.isSuccess ? ( - + ) : null; }; + +export default EditMyPage; diff --git a/src/app/profile/me/group/page.tsx b/src/app/profile/me/group/page.tsx deleted file mode 100644 index 667ef5464..000000000 --- a/src/app/profile/me/group/page.tsx +++ /dev/null @@ -1,94 +0,0 @@ -'use client'; - -import useMyGroupsQuery from '@/queries/group/useMyGroupQuery'; -import { checkAuthentication } from '@/utils/helpers'; - -import SSRSafeSuspense from '@/components/common/SSRSafeSuspense'; -import withAuthRequired from '@/hocs/withAuthRequired'; - -import BackButton from '@/components/common/BackButton'; -import TopNavigation from '@/components/common/TopNavigation'; -import DetailBookGroupCard from '@/components/bookGroup/DetailBookGroupCard'; - -const UserGroupPage = () => { - return ( - <> - - - - - 내가 참여한 모임 - - }> - - - - ); -}; - -export default withAuthRequired(UserGroupPage); - -const UserGroupContent = () => { - const isAuthenticated = checkAuthentication(); - const { data } = useMyGroupsQuery({ enabled: isAuthenticated }); - - return ( -
    - {data.bookGroups.map( - ({ - title, - introduce, - book, - startDate, - endDate, - owner, - memberCount, - commentCount, - isPublic, - bookGroupId, - }) => ( -
  • - -
  • - ) - )} -
- ); -}; - -const PageSkeleton = () => ( -
    - {Array.from({ length: 4 }).map((_, index) => ( -
  • -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
  • - ))} -
-); diff --git a/src/app/profile/me/page.tsx b/src/app/profile/me/page.tsx index 879cd3809..775cb20b9 100644 --- a/src/app/profile/me/page.tsx +++ b/src/app/profile/me/page.tsx @@ -1,122 +1,54 @@ 'use client'; +import { Box, VStack } from '@chakra-ui/react'; import Link from 'next/link'; -import { useRouter } from 'next/navigation'; -import { useQueryClient } from '@tanstack/react-query'; - +import { usePathname, useRouter } from 'next/navigation'; + +import AuthRequired from '@/ui/AuthRequired'; +import ProfileInfo from '@/ui/Profile/ProfileInfo'; +import ProfileBookShelf from '@/ui/Profile/ProfileBookshelf'; +import ProfileGroup from '@/ui/Profile/ProfileGroup'; +import Button from '@/ui/common/Button'; +import { Menu, MenuItem } from '@/ui/common/Menu'; +import { removeAuth } from '@/utils/helpers'; import userAPI from '@/apis/user'; -import userKeys from '@/queries/user/key'; - -import { checkAuthentication, removeAuth } from '@/utils/helpers'; -import { KAKAO_LOGIN_URL } from '@/constants'; -import { IconArrowRight } from '@public/icons'; - -import SSRSafeSuspense from '@/components/common/SSRSafeSuspense'; - -import Avatar from '@/components/common/Avatar'; -import Button from '@/components/common/Button'; -import Loading from '@/components/common/Loading'; -import Menu from '@/components/common/Menu'; -import TopHeader from '@/components/common/TopHeader'; -import BookShelf from '@/components/bookShelf/BookShelf'; -import ProfileBookShelf from '@/components/profile/bookShelf/ProfileBookShelf'; -import ProfileGroup from '@/components/profile/group/ProfileGroup'; -import ProfileInfo from '@/components/profile/info/ProfileInfo'; - -const USER_ID = 'me'; const MyProfilePage = () => { - const isAuthenticated = checkAuthentication(); - return ( - }> - {isAuthenticated ? : } - - ); -}; - -const MyProfileForUnAuth = () => { - return ( - <> - -
-
- -
-

- 로그인 / 회원가입 -

-

- 카카오로 3초만에 가입할 수 있어요. -

-
- - - -
-
-
-

책장

-
- -
- -
-

- 책장이 비었어요. -

-
-
-
-
-
-

참여한 모임

-
-

- 참여 중인 모임이 없어요. -

-
-
-
- - ); -}; - -const MyProfileForAuth = () => { - const queryClient = useQueryClient(); - const router = useRouter(); + const { push } = useRouter(); + const pathname = usePathname(); const handleLogoutButtonClick = async () => { await userAPI.logout(); removeAuth(); - queryClient.removeQueries({ queryKey: userKeys.me(), exact: true }); - router.refresh(); + push('/'); }; return ( - <> - - - - - 로그아웃 - - - -
- - - - -
- - -
-
- + + + + + + + ); }; diff --git a/src/app/robots.ts b/src/app/robots.ts deleted file mode 100644 index 90f25b69b..000000000 --- a/src/app/robots.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { MetadataRoute } from 'next'; - -export default function robots(): MetadataRoute.Robots { - return { - rules: { - userAgent: '*', - allow: '/', - }, - sitemap: `${process.env.NEXT_HOST}/sitemap.xml`, - host: `${process.env.NEXT_HOST}`, - }; -} diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts deleted file mode 100644 index 3c01196ef..000000000 --- a/src/app/sitemap.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { MetadataRoute } from 'next'; - -import { default as bookSitemap } from './book/sitemap'; -import { default as bookshelfSitemap } from './bookshelf/sitemap'; -import { default as bookGroupSitemap } from './group/sitemap'; - -export default async function sitemap(): Promise { - return [ - { - url: `${process.env.NEXT_HOST}/bookarchive`, - lastModified: new Date(), - }, - { - url: `${process.env.NEXT_HOST}/group`, - lastModified: new Date(), - }, - { - url: `${process.env.NEXT_HOST}/profile/me`, - lastModified: new Date(), - }, - ...(await bookSitemap()), - ...(await bookshelfSitemap()), - ...(await bookGroupSitemap()), - ]; -} diff --git a/src/components/ChakraThemeProvider.tsx b/src/components/ChakraThemeProvider.tsx new file mode 100644 index 000000000..f6455931b --- /dev/null +++ b/src/components/ChakraThemeProvider.tsx @@ -0,0 +1,13 @@ +import theme from '@/styles/theme'; +import { ChakraProvider } from '@chakra-ui/react'; +import { NextPage } from 'next/types'; + +interface PropTypes { + children: React.ReactNode; +} + +const ChakraThemeProvider: NextPage = ({ children }) => { + return {children}; +}; + +export default ChakraThemeProvider; diff --git a/src/components/ContextProvider.tsx b/src/components/ContextProvider.tsx new file mode 100644 index 000000000..3086f9ba1 --- /dev/null +++ b/src/components/ContextProvider.tsx @@ -0,0 +1,30 @@ +'use client'; + +import { RecoilRoot } from 'recoil'; +import { LineSeed } from '@/styles/font'; +import Layout from '@/ui/common/Layout'; +import { Global } from '@emotion/react'; +import { ErrorBoundary } from 'react-error-boundary'; +import ChakraThemeProvider from '@/components/ChakraThemeProvider'; +import ReactQueryProvider from '@/components/ReactQueryProvider'; +import { ReactNode } from 'react'; +import ErrorPage from '@/app/error'; + +const ContextProvider = ({ children }: { children: ReactNode }) => { + return ( + <> + + + + + + {children} + + + + + + ); +}; + +export default ContextProvider; diff --git a/src/components/common/ReactQueryProvider.tsx b/src/components/ReactQueryProvider.tsx similarity index 69% rename from src/components/common/ReactQueryProvider.tsx rename to src/components/ReactQueryProvider.tsx index 1871e4227..d5b8db5df 100644 --- a/src/components/common/ReactQueryProvider.tsx +++ b/src/components/ReactQueryProvider.tsx @@ -1,4 +1,3 @@ -import AuthRefreshIgnoredError from '@/types/customError/AuthRefreshIgnoredError'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import { NextPage } from 'next/types'; @@ -14,19 +13,12 @@ const ReactQueryProvider: NextPage = ({ children }) => { new QueryClient({ defaultOptions: { queries: { - refetchOnWindowFocus: false, - retry: (_count, error) => { - if (error instanceof AuthRefreshIgnoredError) { - return true; - } - - return false; - }, + refetchOnWindowFocus: true, + retry: 0, }, }, }) ); - return ( diff --git a/src/components/book/BookCover.tsx b/src/components/book/BookCover.tsx deleted file mode 100644 index e19004b25..000000000 --- a/src/components/book/BookCover.tsx +++ /dev/null @@ -1,98 +0,0 @@ -'use client'; - -import { ComponentPropsWithoutRef, useState } from 'react'; -import Image from 'next/image'; -import { DATA_URL } from '@/constants'; - -type BookCoverSize = - | 'xsmall' - | 'small' - | 'medium' - | 'large' - | 'xlarge' - | '2xlarge' - | 'fill'; - -type BookCoverProps = Partial< - Pick, 'src'> -> & { - title?: string; - size?: BookCoverSize; -}; - -const getCoverSize = (size: BookCoverSize) => { - switch (size) { - case 'xsmall': { - return { - sizeClasses: 'w-[6.5rem] h-[9.1rem]', - sizeProps: { width: 65, height: 91 }, - } as const; - } - case 'small': { - return { - sizeClasses: 'w-[7.0rem] h-[9.8rem]', - sizeProps: { width: 70, height: 98 }, - } as const; - } - case 'medium': { - return { - sizeClasses: 'w-[7.5rem] h-[10.5rem]', - sizeProps: { width: 75, height: 105 }, - } as const; - } - case 'large': { - return { - sizeClasses: 'w-[9.0rem] h-[12.6rem]', - sizeProps: { width: 90, height: 126 }, - } as const; - } - case 'xlarge': { - return { - sizeClasses: 'w-[11.0rem] h-[15.4rem]', - sizeProps: { width: 110, height: 154 }, - } as const; - } - case '2xlarge': { - return { - sizeClasses: 'w-[14.0rem] h-[19.6rem]', - sizeProps: { width: 140, height: 196 }, - } as const; - } - case 'fill': - return { - sizeClasses: 'w-full aspect-[5/7]', - sizeProps: { fill: true, sizes: '100%' }, - }; - } -}; - -const BookCover = ({ src, title, size = 'medium' }: BookCoverProps) => { - const [isError, setIsError] = useState(false); - - const { sizeClasses, sizeProps } = getCoverSize(size); - const defaultCoverClass = src ? '' : 'shadow-bookcover'; - - return ( -
- {src && !isError ? ( - {title setIsError(true)} - {...sizeProps} - /> - ) : ( - /** default cover line */ -
- )} -
- ); -}; - -export default BookCover; diff --git a/src/components/book/detail/BookInfo.tsx b/src/components/book/detail/BookInfo.tsx deleted file mode 100644 index d106f0a50..000000000 --- a/src/components/book/detail/BookInfo.tsx +++ /dev/null @@ -1,150 +0,0 @@ -import { APIBook } from '@/types/book'; -import { IconBookmark } from '@public/icons'; -import { useBookInfo } from '@/queries/book/useBookInfoQuery'; -import useBookmarkUserQuery from '@/queries/book/useBookmarkUserQuery'; -import useUpdateBookmarkMutation from '@/queries/book/useUpdateBookmarkMutation'; -import useToast from '@/components/common/Toast/useToast'; -import { checkAuthentication } from '@/utils/helpers'; - -import Avatar, { AvatarGroup } from '@/components/common/Avatar'; -import Skeleton from '@/components/common/Skeleton'; -import BookCover from '@/components/book/BookCover'; - -const BookInfo = ({ bookId }: { bookId: APIBook['bookId'] }) => { - const { data } = useBookInfo(bookId); - const { title, author, imageUrl, summary, bookUrl } = data; - - return ( -
-
- - -
- - - -
-
- - - -
- ); -}; - -export default BookInfo; - -const BookTitle = ({ title }: { title: string }) => ( -

{title}

-); - -const BookAuthor = ({ author }: { author: string }) => ( -

{author}

-); - -const BookmarkButton = ({ bookId }: { bookId: APIBook['bookId'] }) => { - const isAuthenticated = checkAuthentication(); - const { show: showToast } = useToast(); - - const { data } = useBookmarkUserQuery(bookId); - const { isInMyBookshelf } = data; - - const { mutate } = useUpdateBookmarkMutation(bookId); - - const handleButtonClick = () => { - if (!isAuthenticated) { - // TODO: 로그인 유도 모달로 변경 - showToast({ message: '로그인 후에 책을 꽂을 수 있어요' }); - return; - } - - mutate(!isInMyBookshelf); - }; - - return ( - - ); -}; - -const BookSummary = ({ - summary, - bookUrl, -}: { - summary: string; - bookUrl: string; -}) => ( -

- {summary} ...  - {bookUrl && ( - - 더보기 - - )} -

-); - -const BookmarkUserInfo = ({ bookId }: { bookId: APIBook['bookId'] }) => { - const { data } = useBookmarkUserQuery(bookId); - const { totalCount, users } = data; - const avatarCount = users.length; - - return ( -
- {avatarCount !== 0 && ( - - {users.map(({ userId, profileImage }) => ( - - - - ))} - - )} -

- {getBookmarkedUserCountText(totalCount, avatarCount)} -

-
- ); -}; - -const getBookmarkedUserCountText = ( - totalCount: number, - avatarCount: number -) => { - const otherCount = totalCount - avatarCount; - - if (otherCount === 0 && totalCount === 0) { - return '아직 이 책을 책장에 꽂은 사람이 없어요.'; - } else if (otherCount === 0) { - return '님이 이 책을 책장에 꽂았어요.'; - } - - return `외 ${otherCount}명이 이 책을 책장에 꽂았어요.`; -}; - -export const BookInfoSkeleton = () => ( - -
-
-
- -
-
- - -
-
-
- - - - -
- -
-
-); diff --git a/src/components/bookArchive/BookArchiveForAuth.tsx b/src/components/bookArchive/BookArchiveForAuth.tsx deleted file mode 100644 index 433624438..000000000 --- a/src/components/bookArchive/BookArchiveForAuth.tsx +++ /dev/null @@ -1,60 +0,0 @@ -'use client'; - -import useAuthRecommendedBooks from '@/queries/recommend/useAuthRecommendedBooks'; -import useAuthRecommendedBookshelf from '@/queries/recommend/useAuthRecommendedBookshelf'; -import { APIJobGroup } from '@/types/job'; -import BookCover from '@/components/book/BookCover'; -import Link from 'next/link'; -import BookShelfCard from '../bookShelf/BookShelfCard'; - -const BookArchiveForAuth = ({ - userJobGroup, -}: { - userJobGroup: APIJobGroup['name']; -}) => { - const { - data: bookshelfData, - isSuccess: bookshelfIsSuccess, - isLoading: bookshelfIsLoading, - } = useAuthRecommendedBookshelf(userJobGroup); - const { - data: booksData, - isSuccess: booksIsSuccess, - isLoading: booksIsLoading, - } = useAuthRecommendedBooks(userJobGroup); - - const isSuccess = bookshelfIsSuccess && booksIsSuccess; - const isLoading = bookshelfIsLoading && booksIsLoading; - - if (isLoading) { - // TODO: 스켈레톤 컴포넌트로 교체 - return null; - } - - if (!isSuccess) return null; - if (!bookshelfData || !booksData) return null; - - return ( -
-

👀 이런 책들이 많이 꽂혔어요

-
    - {booksData.books.map(({ bookId, imageUrl, title }) => ( -
  • - - - - {title} - - -
  • - ))} -
-

🔥 인기 책장

- {...bookshelfData.bookshelfResponses.map(bookShelf => ( - - ))} -
- ); -}; - -export default BookArchiveForAuth; diff --git a/src/components/bookArchive/BookArchiveForUnAuth.tsx b/src/components/bookArchive/BookArchiveForUnAuth.tsx deleted file mode 100644 index 0550cba8c..000000000 --- a/src/components/bookArchive/BookArchiveForUnAuth.tsx +++ /dev/null @@ -1,25 +0,0 @@ -'use client'; - -import useUnAuthRecommendedBookshelfQuery from '@/queries/recommend/useUnAuthRecommendedBookshelfQuery'; -import BookShelfCard from '../bookShelf/BookShelfCard'; - -const BookArchiveForUnAuth = () => { - const { data, isSuccess, isLoading } = useUnAuthRecommendedBookshelfQuery(); - - if (isLoading) { - // TODO: 스켈레톤 컴포넌트로 교체 - return null; - } - if (!isSuccess) return null; - - return ( -
-

🔥 인기 책장

- {...data.bookshelfResponses.map(bookShelf => ( - - ))} -
- ); -}; - -export default BookArchiveForUnAuth; diff --git a/src/components/bookGroup/BookGroupNavigation.tsx b/src/components/bookGroup/BookGroupNavigation.tsx deleted file mode 100644 index ff8ebd2bd..000000000 --- a/src/components/bookGroup/BookGroupNavigation.tsx +++ /dev/null @@ -1,284 +0,0 @@ -import { useRouter } from 'next/navigation'; -import { - Children, - createContext, - isValidElement, - ReactNode, - useContext, - useRef, -} from 'react'; - -import { SERVICE_ERROR_MESSAGE } from '@/constants'; -import { IconArrowLeft, IconPost } from '@public/icons'; -import { isAxiosErrorWithCustomCode } from '@/utils/helpers'; - -import useDisclosure from '@/hooks/useDisclosure'; -import { - useBookGroupJoinInfo, - useBookGroupOwner, - useBookGroupTitle, -} from '@/queries/group/useBookGroupQuery'; -import useCreateBookGroupCommentMutation from '@/queries/group/useCreateBookGroupCommentMutation'; -import useDeleteBookGroupMutation from '@/queries/group/useDeleteBookGroupMutation'; - -import SSRSafeSuspense from '@/components/common/SSRSafeSuspense'; -import Button from '@/components/common/Button'; -import Menu from '@/components/common/Menu'; -import Modal from '@/components/common/Modal'; -import useToast from '@/components/common/Toast/useToast'; -import TopNavigation from '@/components/common/TopNavigation'; -import CommentDrawer from '@/components/comment/CommentDrawer'; - -const NavigationContext = createContext({} as { groupId: number }); - -const BookGroupNavigation = ({ - groupId, - children, -}: { - groupId: number; - children: ReactNode; -}) => { - return ( - - - - {getTargetChildren(children, BackButton)} - - - }> - {getTargetChildren(children, Title)} - - - - - {getTargetChildren(children, WriteButton)} - {getTargetChildren(children, MenuButton)} - - - - - ); -}; - -type BackButtonProps = - | { - routeOption: 'push'; - href: string; - } - | { - routeOption: 'replace'; - href: string; - } - | { - routeOption?: 'back'; - }; - -const BackButton = (props: BackButtonProps) => { - const { routeOption } = props; - const router = useRouter(); - - const handleClick = () => { - switch (routeOption) { - case 'push': - return router.push(props.href); - case 'replace': - return router.replace(props.href); - case 'back': - return router.back(); - default: - return router.back(); - } - }; - - return ( - - - - ); -}; - -const Title = () => { - const { groupId } = useContext(NavigationContext); - const { data: title } = useBookGroupTitle(groupId); - - return

{title}

; -}; - -const MenuButton = () => { - const { groupId } = useContext(NavigationContext); - const { data: owner } = useBookGroupOwner(groupId); - - const router = useRouter(); - - const deleteBookGroup = useDeleteBookGroupMutation(); - - const { show: showToast } = useToast(); - const { isOpen, onClose, onOpen } = useDisclosure(); - - const handleEditClick = () => { - router.push(`/group/${groupId}/edit`); - return; - }; - - const handleModalConfirm = async () => { - await deleteBookGroup.mutateAsync(groupId, { - onSuccess: () => { - showToast({ type: 'success', message: '모임을 삭제했어요' }); - router.replace('/group'); - }, - onError: error => { - if (isAxiosErrorWithCustomCode(error)) { - const { code } = error.response.data; - const message = SERVICE_ERROR_MESSAGE[code]; - showToast({ type: 'error', message }); - return; - } - - showToast({ type: 'error', message: '잠시 후 다시 시도해주세요' }); - }, - }); - }; - - return ( - <> - {owner.isMe && ( - <> - - - - 수정하기 - 삭제하기 - - - - - )} - - ); -}; - -const WriteButton = () => { - const { groupId } = useContext(NavigationContext); - const { data: joinInfo } = useBookGroupJoinInfo(groupId); - const { isMember } = joinInfo; - - const { show: showToast } = useToast(); - const { isOpen, onOpen, onClose } = useDisclosure(); - - const commentRef = useRef(null); - const createComment = useCreateBookGroupCommentMutation(groupId); - - const handleCommentCreate = () => { - const comment = commentRef.current?.value; - - if (!comment) { - return; - } - - createComment.mutate(comment, { - onSuccess: () => { - onClose(); - showToast({ type: 'success', message: '게시글을 등록했어요 🎉' }); - }, - onError: error => { - if (isAxiosErrorWithCustomCode(error)) { - const { code } = error.response.data; - const message = SERVICE_ERROR_MESSAGE[code]; - showToast({ type: 'error', message }); - return; - } - - showToast({ type: 'error', message: '게시글을 등록하지 못했어요 🥲' }); - }, - }); - }; - - return ( - <> - {isMember && ( - <> - - - - )} - - ); -}; - -BookGroupNavigation.BackButton = BackButton; -BookGroupNavigation.Title = Title; -BookGroupNavigation.MenuButton = MenuButton; -BookGroupNavigation.WriteButton = WriteButton; - -export default BookGroupNavigation; - -const TitleSkeleton = () => ( -
-); - -const DeleteBookGroupModal = ({ - isOpen, - onClose, - onConfirm, -}: { - isOpen: boolean; - onClose: () => void; - onConfirm?: () => void; -}) => { - const handleConfirm = () => { - onConfirm && onConfirm(); - onClose(); - }; - - return ( - -
-

모임을 정말 삭제할까요?

-

- 참여 중인 모임원이 있는 경우, 모임을 삭제할 수 없어요. -

-
-
- - -
-
- ); -}; - -const BackButtonType = ().type; -const TitleType = ().type; -const MenuButtonType = (<MenuButton />).type; -const WriteButtonType = (<WriteButton />).type; - -const getTargetChildren = ( - children: ReactNode, - targetType: - | typeof BackButtonType - | typeof TitleType - | typeof MenuButtonType - | typeof WriteButtonType -) => { - const childrenArray = Children.toArray(children); - - return childrenArray.find( - child => isValidElement(child) && child.type === targetType - ); -}; diff --git a/src/components/bookGroup/BookGroupStatus.tsx b/src/components/bookGroup/BookGroupStatus.tsx deleted file mode 100644 index b181d714c..000000000 --- a/src/components/bookGroup/BookGroupStatus.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { DdayStatus } from '@/types/dday'; - -import Badge from '@/components/common/Badge'; -import { getDdayCount } from '@/utils/date'; - -const getDdayStatus = (ddayByStart: number, ddayByEnd: number) => { - if (ddayByStart > 0) { - return 'before' as const; - } else if (ddayByStart === 0 && ddayByEnd > 0) { - return 'dday' as const; - } else if (ddayByStart < 0 && ddayByEnd >= 0) { - return 'ongoing' as const; - } else { - return 'end' as const; - } -}; - -const getBadgeProps = (status: DdayStatus, ddayCount: number) => { - switch (status) { - case 'before': - return { - colorScheme: 'main' as const, - isFilled: true, - text: `D-${ddayCount}`, - }; - case 'dday': - return { - colorScheme: 'main' as const, - isFilled: false, - text: 'D-day', - }; - case 'ongoing': - return { - colorScheme: 'main' as const, - isFilled: true, - text: '진행중', - }; - case 'end': - return { - colorScheme: 'grey' as const, - isFilled: true, - text: '모임종료', - }; - } -}; - -const BookGroupStatus = ({ start, end }: { start: string; end: string }) => { - const ddayByStart = getDdayCount(new Date(start)); - const ddayByEnd = getDdayCount(new Date(end)); - const ddayStatus = getDdayStatus(ddayByStart, ddayByEnd); - - const { text, ...badgeProps } = getBadgeProps(ddayStatus, ddayByStart); - - return ( - <Badge fontWeight="bold" {...badgeProps}> - {text} - </Badge> - ); -}; - -export default BookGroupStatus; diff --git a/src/components/bookGroup/BookInfoCard.tsx b/src/components/bookGroup/BookInfoCard.tsx deleted file mode 100644 index 826b184e7..000000000 --- a/src/components/bookGroup/BookInfoCard.tsx +++ /dev/null @@ -1,117 +0,0 @@ -'use client'; - -import { Suspense, useEffect, useState } from 'react'; -import Link from 'next/link'; - -import type { APIBook } from '@/types/book'; -import useBookInfoQuery from '@/queries/book/useBookInfoQuery'; - -import { IconArrowLeft, IconDelete } from '@public/icons'; -import BookCover from '@/components/book/BookCover'; - -const BookInfoCard = ({ - bookId, - removable = false, - onBookIdChange: _onBookIdChange, - onBookRemove, -}: { - bookId?: number; - removable?: boolean; - onBookIdChange?: (id: APIBook['bookId']) => void; - onBookRemove?: () => void; -}) => { - const [id, setId] = useState<typeof bookId | null>(bookId); - - useEffect(() => { - setId(bookId); - }, [bookId]); - - // TODO: 추후 EmptyBookInfoCard 컴포넌트를 쓰게되면 활용 - // const handleBookSelect = () => { - // TODO: 도서 선택 UI 제공 후 선택된 도서로 id 변경 - // setId(23); - // onBookIdChange?.(23); - // }; - - const handleBookInfoRemove = () => { - onBookRemove?.(); - setId(null); - }; - - if (!id) { - return <BookInfoCardSkeleton />; - } - - return ( - <Suspense fallback={<BookInfoCardSkeleton />}> - <BookInfoContent - bookId={id} - removable={removable} - onBookInfoRemove={handleBookInfoRemove} - /> - </Suspense> - ); -}; - -export default BookInfoCard; - -const BookInfoContent = ({ - bookId, - removable = false, - onBookInfoRemove, -}: { - bookId: number; - removable?: boolean; - onBookInfoRemove?: () => void; -}) => { - const { data: bookInfo } = useBookInfoQuery(bookId); - - return ( - <div className="flex min-h-[12.8rem] w-full gap-[2.4rem] rounded-[0.5rem] border-[0.05rem] border-shadow px-[2.2rem] py-[1.8rem]"> - <BookCover size="xsmall" src={bookInfo.imageUrl} title={bookInfo.title} /> - <div className="flex min-w-0 flex-grow flex-col"> - <span className="truncate font-body2-bold">{bookInfo.title}</span> - <span className="text-placeholder font-caption1-regular"> - {bookInfo.author} - </span> - </div> - {removable ? ( - <IconDelete - className="h-[2rem] w-[2rem] flex-shrink-0 cursor-pointer" - onClick={onBookInfoRemove} - /> - ) : ( - <Link href={`/book/${bookId}`} className="cursor-pointer"> - <IconArrowLeft className="h-[1.5rem] w-[1.5rem] flex-shrink-0 rotate-180" /> - </Link> - )} - </div> - ); -}; - -// TODO: 이후 퍼널 Step의 이동 로직이 변경되면 활용될 컴포넌트 -// const EmptyBookInfoCard = ({ onBookSelect }: { onBookSelect?: () => void }) => { -// return ( -// <div -// className="flex min-h-[12.8rem] w-full cursor-pointer flex-col items-center justify-center gap-[1rem] rounded-[0.5rem] border-[0.05rem] border-shadow shadow-bookcard" -// onClick={onBookSelect} -// > -// <IconBookPlus className="h-[2rem] w-[2rem] fill-placeholder" /> -// <p className="font-caption2-regular text-placeholder"> -// 독서모임에 사용할 책을 선택해주세요 -// </p> -// </div> -// ); -// }; - -const BookInfoCardSkeleton = () => { - return ( - <div className="flex min-h-[12.8rem] w-full animate-pulse cursor-pointer items-center gap-[2.4rem] rounded-[0.5rem] border-[0.05rem] border-shadow px-[2.2rem] py-[1.8rem]"> - <div className="h-[9.1rem] w-[6.5rem] rounded-[0.5rem] bg-placeholder"></div> - <div className="mt-[0.3rem] flex flex-col gap-[0.5rem] self-start"> - <div className="h-[1.4rem] w-[10rem] bg-placeholder"></div> - <div className="h-[1.2rem] w-[3rem] bg-placeholder"></div> - </div> - </div> - ); -}; diff --git a/src/components/bookGroup/DetailBookGroupCard.tsx b/src/components/bookGroup/DetailBookGroupCard.tsx deleted file mode 100644 index 4c11a9738..000000000 --- a/src/components/bookGroup/DetailBookGroupCard.tsx +++ /dev/null @@ -1,150 +0,0 @@ -import Link from 'next/link'; - -import { IconCalendar, IconMembers, IconComments } from '@public/icons'; -import BookGroupStatus from '@/components/bookGroup/BookGroupStatus'; -import Badge from '@/components/common/Badge'; -import Avatar from '@/components/common/Avatar'; -import BookCover from '@/components/book/BookCover'; - -interface DetailBookGroupCardProps { - title: string; - description: string; - bookImageSrc: string; - date: { start: string; end: string }; - owner: { name: string; profileImageSrc: string }; - memberCount: number; - commentCount: number; - isPublic: boolean; - bookGroupId: number; -} - -const DetailBookGroupCard = ({ - title, - description, - bookImageSrc, - date, - owner, - memberCount, - commentCount, - isPublic, - bookGroupId, -}: DetailBookGroupCardProps) => { - return ( - <Link href={`/group/${bookGroupId}`}> - <article className="w-full rounded-[0.4rem] p-[1.5rem] shadow-bookgroup-card"> - <div className="flex gap-[0.5rem]"> - <BookGroupStatus start={date.start} end={date.end} /> - <Public isPublic={isPublic} /> - </div> - <div className="flex justify-between gap-[1.5rem] pt-[1rem]"> - <div className="flex min-w-0 flex-grow flex-col justify-between "> - <Title title={title} /> - <Description description={description} /> - <Duration start={date.start} end={date.end} /> - <div className="flex justify-between"> - <Owner - name={owner.name} - profileImageSrc={owner.profileImageSrc} - /> - <div className="flex gap-[0.5rem]"> - <MemberCount memberCount={memberCount} /> - <CommentCount commentCount={commentCount} /> - </div> - </div> - </div> - <BookCover src={bookImageSrc} size="medium" /> - </div> - </article> - </Link> - ); -}; - -export default DetailBookGroupCard; - -const Public = ({ isPublic }: { isPublic: boolean }) => ( - <Badge colorScheme="grey">{isPublic ? '공개' : '비공개'}</Badge> -); - -const Title = ({ title }: { title: string }) => { - return <p className="min-w-0 truncate font-body1-bold">{title}</p>; -}; - -const Description = ({ description }: { description: string }) => { - return <p className="min-w-0 truncate font-body2-regular">{description}</p>; -}; - -const Duration = ({ start, end }: { start: string; end: string }) => { - const formatDateTime = (dateString: string) => - new Intl.DateTimeFormat('ko-KR', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - }).format(new Date(dateString)); - - return ( - <div className="flex items-center gap-[0.5rem]"> - <IconCalendar className="w-[1.2rem] fill-placeholder" /> - <p className="text-placeholder font-caption1-regular"> - {formatDateTime(start)} - {formatDateTime(end)} - </p> - </div> - ); -}; - -const Owner = ({ - name, - profileImageSrc, -}: { - name: string; - profileImageSrc: string; -}) => { - return ( - <div className="flex h-[2rem] gap-[0.5rem]"> - <Avatar name={name} src={profileImageSrc} size="small" /> - <div className="flex items-center font-caption1-regular"> - <p>{name}</p> - </div> - </div> - ); -}; - -const MemberCount = ({ memberCount }: { memberCount: number }) => { - return ( - <div className="flex items-center gap-[0.3rem]"> - <IconMembers className="h-[0.9rem] w-[1.3rem] fill-placeholder" /> - <p className="text-placeholder font-caption1-regular">{memberCount}</p> - </div> - ); -}; - -const CommentCount = ({ commentCount }: { commentCount: number }) => { - return ( - <div className="flex items-center gap-[0.3rem]"> - <IconComments className="h-[1.2rem] w-[1.2rem] fill-placeholder" /> - <p className="text-placeholder font-caption1-regular">{commentCount}</p> - </div> - ); -}; - -export const DetailBookGroupCardSkeleton = () => ( - <div className="w-full animate-pulse rounded-[0.5rem] p-[1.5rem] shadow-bookgroup-card"> - <div className="flex gap-[0.5rem]"> - <div className="h-[1.9rem] w-[4.8rem] rounded-[0.5rem] bg-black-400" /> - <div className="h-[2rem] w-[3.8rem] rounded-[0.5rem] bg-black-400" /> - </div> - <div className="flex justify-between gap-[1.5rem] pt-[1rem]"> - <div className="flex flex-grow flex-col justify-between "> - <div className="h-[2.2rem] w-[65%] bg-black-400" /> - <div className="h-[1.3rem] w-[75%] bg-black-400" /> - <div className="h-[1.3rem] w-[60%] bg-black-400" /> - <div className="flex w-full items-center gap-[0.5rem]"> - <div className="h-[2rem] w-[2rem] rounded-full bg-black-400" /> - <div className="h-[1.3rem] w-[4rem] bg-black-400" /> - <div className="flex-grow" /> - <div className="h-[1.3rem] w-[5rem] bg-black-400" /> - </div> - </div> - <div className="h-[10.5rem] w-[7.5rem] rounded-[0.5rem] bg-black-400"></div> - </div> - </div> -); diff --git a/src/components/bookGroup/SearchGroup.tsx b/src/components/bookGroup/SearchGroup.tsx deleted file mode 100644 index be056cf09..000000000 --- a/src/components/bookGroup/SearchGroup.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { IconSearch } from '@public/icons'; - -interface SearchGroupInputProps { - onClick?: () => void; -} - -const SearchGroupInput = ({ onClick }: SearchGroupInputProps) => { - return ( - <section className="flex"> - <div className="rounded-bl-[0.4rem] rounded-tl-[0.4rem] border-[0.1rem] border-r-[0rem] border-solid border-black-100 bg-white pl-[1rem] pt-[0.8rem]"> - <IconSearch className="fill-placeholder" /> - </div> - <input - id="groupSearching" - className="h-[3.7rem] w-full rounded-br-[0.4rem] rounded-tr-[0.4rem] border-[0.1rem] border-l-[0rem] border-black-100 pl-[2rem] text-[1.4rem] leading-[1.6rem] placeholder:text-placeholder focus:outline-0 disabled:cursor-not-allowed disabled:bg-white" - placeholder="모임을 검색해보세요" - type="text" - onClick={onClick} - readOnly - /> - </section> - ); -}; - -export default SearchGroupInput; diff --git a/src/components/bookGroup/SimpleBookGroupCard.tsx b/src/components/bookGroup/SimpleBookGroupCard.tsx deleted file mode 100644 index 5f2f1e7f4..000000000 --- a/src/components/bookGroup/SimpleBookGroupCard.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import Link from 'next/link'; -import BookCover from '../book/BookCover'; - -interface SimpleBookGroupCardProps { - title: string; - isOwner: boolean; - imageSource: string; - bookGroupId: number; -} - -const SimpleBookGroupCard = ({ - title, - isOwner, - imageSource, - bookGroupId, -}: SimpleBookGroupCardProps) => { - return ( - <Link href={`/group/${bookGroupId}`}> - <article className="flex w-[10rem] flex-col gap-[1rem]"> - <div className="bg-main-300 px-[1.8rem] py-[1.6rem]"> - <BookCover size="xsmall" src={imageSource} /> - </div> - <p className="break-keep text-center !leading-tight font-caption1-regular"> - {isOwner ? `👑 ${title}` : title} - </p> - </article> - </Link> - ); -}; - -export default SimpleBookGroupCard; - -export const SimpleBookGroupCardSkeleton = () => ( - <div className="flex animate-pulse flex-col gap-[1rem]"> - <div className="h-[12.3rem] w-[10rem] rounded-[0.5rem] bg-black-400" /> - <div className="h-[1.3rem] w-[5rem] self-center bg-black-400" /> - </div> -); diff --git a/src/components/bookGroup/create/CreateBookGroupFunnel.tsx b/src/components/bookGroup/create/CreateBookGroupFunnel.tsx deleted file mode 100644 index fa14f2e5a..000000000 --- a/src/components/bookGroup/create/CreateBookGroupFunnel.tsx +++ /dev/null @@ -1,160 +0,0 @@ -'use client'; - -import { useRouter } from 'next/navigation'; -import { FormProvider, SubmitHandler, useForm } from 'react-hook-form'; - -import type { CreateBookGroupFormValues } from '@/components/bookGroup/create/types'; -import useCreateBookGroupMutation from '@/queries/group/useCreateBookGroupMutation'; - -import { useFunnel } from '@/hooks/useFunnel'; -import useToast from '@/components/common/Toast/useToast'; -import { getTodayDate } from '@/utils/date'; -import { isAxiosErrorWithCustomCode } from '@/utils/helpers'; -import { SERVICE_ERROR_MESSAGE } from '@/constants'; - -import { IconArrowLeft } from '@public/icons'; -import TopNavigation from '@/components/common/TopNavigation'; -import Stepper from '@/components/common/Stepper'; -import { - EnterTitleStep, - SelectBookStep, - SelectJoinTypeStep, - SetUpDetailStep, -} from '@/components/bookGroup/create/steps'; - -const FUNNEL_STEPS = [ - 'SelectBook', - 'EnterTitle', - 'SetUpDetail', - 'SelectJoinType', -] as const; - -const steps = [ - { label: '도서선택' }, - { label: '모임이름' }, - { label: '모임정보' }, - { label: '가입유형' }, -]; - -const CreateBookGroupFunnel = () => { - const router = useRouter(); - const [Funnel, setStep, currentStep] = useFunnel(FUNNEL_STEPS, { - initialStep: 'SelectBook', - }); - const stepIndex = FUNNEL_STEPS.indexOf(currentStep); - const activeStep = stepIndex !== -1 ? stepIndex : 0; - - const { show: showToast } = useToast(); - const { mutate } = useCreateBookGroupMutation(); - - const methods = useForm<CreateBookGroupFormValues>({ - mode: 'all', - defaultValues: { - title: '', - maxMemberCount: 9999, - startDate: getTodayDate(), - isPublic: false, - hasJoinPassword: 'false', - }, - }); - - const handleBackButtonClick = () => { - const currentStepIndex = FUNNEL_STEPS.indexOf(currentStep); - - if (currentStepIndex === 0 || currentStepIndex === -1) { - router.back(); - } else { - setStep(FUNNEL_STEPS[currentStepIndex - 1]); - } - - return; - }; - - const handleCreateGroupSubmit: SubmitHandler< - CreateBookGroupFormValues - > = formValues => { - const requestBody = { - bookId: formValues.book.bookId, - title: formValues.title, - introduce: formValues.introduce, - maxMemberCount: - formValues.maxMemberCount !== 'custom' - ? formValues.maxMemberCount - : formValues.customMemberCount, - startDate: formValues.startDate, - endDate: formValues.endDate, - isPublic: formValues.isPublic, - hasJoinPasswd: formValues.hasJoinPassword === 'true' ? true : false, - joinQuestion: formValues.joinQuestion, - joinPasswd: formValues.joinPassword, - }; - - mutate(requestBody, { - onSuccess: data => { - router.replace(`/group/${data.bookGroupId}`); - showToast({ type: 'success', message: '독서모임을 생성했어요! 🎉' }); - - return; - }, - onError: error => { - if (isAxiosErrorWithCustomCode(error)) { - const { code } = error.response.data; - const message = SERVICE_ERROR_MESSAGE[code]; - - showToast({ type: 'error', message }); - - return; - } - - showToast({ - type: 'error', - message: '독서 모임을 생성하지 못했어요 🥲', - }); - }, - }); - }; - - return ( - <FormProvider {...methods}> - <TopNavigation> - <TopNavigation.LeftItem> - <IconArrowLeft onClick={handleBackButtonClick} /> - </TopNavigation.LeftItem> - </TopNavigation> - - <div className="sticky top-[5.4rem] z-10 -ml-[2rem] w-[calc(100%+4rem)] bg-white px-[2rem] pb-[3rem] pt-[1rem]"> - <div className="relative left-1/2 w-[98%] -translate-x-1/2 "> - <Stepper activeIndex={activeStep}> - {steps.map(({ label }, idx) => { - return <Stepper.Step key={idx} label={label} />; - })} - </Stepper> - </div> - </div> - - <form> - <Funnel> - <Funnel.Step name="SelectBook"> - <SelectBookStep onNextStep={() => setStep('EnterTitle')} /> - </Funnel.Step> - <Funnel.Step name="EnterTitle"> - <EnterTitleStep onNextStep={() => setStep('SetUpDetail')} /> - </Funnel.Step> - <Funnel.Step name="SetUpDetail"> - <SetUpDetailStep - goToSelectBookStep={() => setStep('SelectBook')} - onNextStep={() => setStep('SelectJoinType')} - /> - </Funnel.Step> - <Funnel.Step name="SelectJoinType"> - <SelectJoinTypeStep - onSubmit={methods.handleSubmit(handleCreateGroupSubmit)} - /> - </Funnel.Step> - </Funnel> - </form> - </FormProvider> - ); -}; - -export default CreateBookGroupFunnel; diff --git a/src/components/bookGroup/create/steps/EnterTitleStep/EnterTitleStep.tsx b/src/components/bookGroup/create/steps/EnterTitleStep/EnterTitleStep.tsx deleted file mode 100644 index 532808b5b..000000000 --- a/src/components/bookGroup/create/steps/EnterTitleStep/EnterTitleStep.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { useFormContext } from 'react-hook-form'; - -import type { MoveFunnelStepProps } from '@/components/common/Funnel'; -import type { EnterTitleStepFormValues } from '@/components/bookGroup/create/types'; - -import useRemoveVerticalScroll from '@/hooks/useRemoveVerticalScroll'; - -import { TitleField } from '@/components/bookGroup/create/steps/EnterTitleStep/fields'; -import BottomActionButton from '@/components/common/BottomActionButton'; - -const EnterTitleStep = ({ onNextStep }: MoveFunnelStepProps) => { - const { - handleSubmit, - formState: { isValid }, - } = useFormContext<EnterTitleStepFormValues>(); - - useRemoveVerticalScroll(); - - return ( - <article> - <section className="flex flex-col gap-[1.5rem]"> - <h2 className="text-black-700 font-subheading-bold"> - 독서모임 이름을 적어주세요 - </h2> - <TitleField name="title" /> - </section> - - <BottomActionButton - type="submit" - disabled={!isValid} - onClick={handleSubmit(() => onNextStep?.())} - > - 다음 - </BottomActionButton> - </article> - ); -}; - -export default EnterTitleStep; diff --git a/src/components/bookGroup/create/steps/EnterTitleStep/fields/TitleField.tsx b/src/components/bookGroup/create/steps/EnterTitleStep/fields/TitleField.tsx deleted file mode 100644 index 1aa594f70..000000000 --- a/src/components/bookGroup/create/steps/EnterTitleStep/fields/TitleField.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { useFormContext, useWatch } from 'react-hook-form'; - -import type { EnterTitleStepFormValues } from '../../../types'; - -import ErrorMessage from '@/components/common/ErrorMessage'; -import Input from '@/components/common/Input'; -import InputLength from '@/components/common/InputLength'; - -type DefaultFieldNameProps = { - name: keyof EnterTitleStepFormValues; -}; - -const TitleField = ({ name }: DefaultFieldNameProps) => { - const { - register, - control, - formState: { errors }, - } = useFormContext<EnterTitleStepFormValues>(); - - const titleValue = useWatch({ control, name: name }); - const titleErrors = errors[name]; - - return ( - <label htmlFor={name} className="flex flex-col gap-[0.5rem]"> - <Input - id={name} - placeholder="독서모임을 잘 표현할 수 있는 이름이면 좋아요." - error={!!titleErrors} - {...register(name, { - required: '독서모임 이름을 작성해 주세요', - minLength: { value: 2, message: '2글자 이상 입력해주세요' }, - maxLength: { value: 20, message: '20글자 이하로 입력해주세요' }, - })} - /> - <div className="flex flex-row-reverse justify-between"> - <InputLength - currentLength={titleValue.length} - isError={!!titleErrors} - maxLength={20} - /> - <ErrorMessage>{titleErrors?.message}</ErrorMessage> - </div> - </label> - ); -}; - -export default TitleField; diff --git a/src/components/bookGroup/create/steps/EnterTitleStep/fields/index.ts b/src/components/bookGroup/create/steps/EnterTitleStep/fields/index.ts deleted file mode 100644 index e25dc05fd..000000000 --- a/src/components/bookGroup/create/steps/EnterTitleStep/fields/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as TitleField } from './TitleField'; diff --git a/src/components/bookGroup/create/steps/SelectBookStep/SelectBookStep.tsx b/src/components/bookGroup/create/steps/SelectBookStep/SelectBookStep.tsx deleted file mode 100644 index 1181e5161..000000000 --- a/src/components/bookGroup/create/steps/SelectBookStep/SelectBookStep.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import { ComponentPropsWithoutRef, Suspense, useEffect, useState } from 'react'; -import { Controller, useFormContext } from 'react-hook-form'; -import { useInView } from 'react-intersection-observer'; - -import type { MoveFunnelStepProps } from '@/components/common/Funnel'; -import type { SelectBookStepFormValues } from '../../types'; - -import useBookSearchQuery from '@/queries/book/useBookSearchQuery'; -import debounce from '@/utils/debounce'; - -import Input from '@/components/common/Input'; -import Loading from '@/components/common/Loading'; -import BookSearchList from '@/components/bookSearch/BookSearchList'; - -const SelectBookStep = ({ onNextStep }: MoveFunnelStepProps) => { - const { control, getValues, setValue } = - useFormContext<SelectBookStepFormValues>(); - - const keywordValue = getValues('queryKeyword'); - const [keyword, setKeyword] = useState(keywordValue || ''); - const debouncedSetKeyword = debounce(setKeyword, 500); - - const handleEnterKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => { - if (e.code === 'Enter') e.preventDefault(); - - return; - }; - - return ( - <article className="relative flex w-full flex-col gap-[1rem]"> - <h2 className="font-subheading-bold"> - 어떤 책으로 독서모임을 시작할까요? - </h2> - - <Input - placeholder="책 제목, 작가를 검색해보세요" - inputStyle="line" - leftIconType="search" - className="mb-[1rem]" - defaultValue={keyword} - onChange={event => debouncedSetKeyword(event.target.value)} - onKeyDown={handleEnterKeyDown} - /> - - <Suspense fallback={<Loading fullpage />}> - <Controller - name="book" - control={control} - render={({ field: { onChange } }) => ( - <BookSearchResult - queryKeyword={keyword} - onBookClick={book => { - // update 'book' value in hook form - onChange(book); - // update 'queryKeyword' value in hook form - setValue('queryKeyword', keyword); - onNextStep && onNextStep(); - }} - /> - )} - /> - </Suspense> - </article> - ); -}; - -export default SelectBookStep; - -// TODO: 도서 검색 페이지 컴포넌트와 공유할 수 있도록 분리 -const BookSearchResult = ({ - queryKeyword, - onBookClick, -}: { - queryKeyword: string; - onBookClick?: ComponentPropsWithoutRef<typeof BookSearchList>['onBookClick']; -}) => { - const { ref: inViewRef, inView } = useInView(); - - const bookSearchInfo = useBookSearchQuery({ - query: queryKeyword, - page: 1, - pageSize: 12, - }); - - const searchedBooks = bookSearchInfo.isSuccess - ? bookSearchInfo.data.pages.flatMap(page => page.searchBookResponseList) - : []; - const totalResultCount = bookSearchInfo.isSuccess - ? bookSearchInfo.data.pages[0].totalCount - : 0; - - useEffect(() => { - if (inView && bookSearchInfo.hasNextPage) { - bookSearchInfo.fetchNextPage(); - } - }, [ - bookSearchInfo.fetchNextPage, - inView, - bookSearchInfo.hasNextPage, - queryKeyword, - bookSearchInfo, - ]); - - // queryKeyword가 빈 값인 경우 검색되지 않으므로 null 반환 - if (!queryKeyword) { - return null; - } - - return ( - <section> - <BookSearchList - books={searchedBooks} - totalCount={totalResultCount} - onBookClick={onBookClick} - /> - <div ref={inViewRef} /> - </section> - ); -}; diff --git a/src/components/bookGroup/create/steps/SelectJoinTypeStep/SelectJoinTypeStep.tsx b/src/components/bookGroup/create/steps/SelectJoinTypeStep/SelectJoinTypeStep.tsx deleted file mode 100644 index 4ef50567d..000000000 --- a/src/components/bookGroup/create/steps/SelectJoinTypeStep/SelectJoinTypeStep.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { useFormContext } from 'react-hook-form'; - -import type { MoveFunnelStepProps } from '@/components/common/Funnel'; -import type { SelectJoinTypeStepFormValues } from '@/components/bookGroup/create/types'; - -import { - JoinPasswordFieldset, - JoinTypeFieldset, -} from '@/components/bookGroup/create/steps/SelectJoinTypeStep/fields'; -import BottomActionButton from '@/components/common/BottomActionButton'; - -export type JoinTypeStepFieldName = keyof SelectJoinTypeStepFormValues; -export type JoinTypeStepFieldProp = { name: JoinTypeStepFieldName }; - -const SelectJoinTypeStep = ({ onSubmit }: MoveFunnelStepProps) => { - const { - handleSubmit, - formState: { isValid }, - } = useFormContext<SelectJoinTypeStepFormValues>(); - - return ( - <article className="pb-action-button"> - <h2 className="mb-[3rem] font-subheading-bold"> - 가입은 어떻게 받을까요? - </h2> - - <section className="flex flex-col gap-[2rem]"> - <JoinTypeFieldset> - <JoinTypeFieldset.RadioCardField name="hasJoinPassword" /> - </JoinTypeFieldset> - - <JoinPasswordFieldset joinTypeFieldName="hasJoinPassword"> - <JoinPasswordFieldset.QuestionField name="joinQuestion" /> - <JoinPasswordFieldset.AnswerField name="joinPassword" /> - </JoinPasswordFieldset> - </section> - - <BottomActionButton - type="submit" - disabled={!isValid} - onClick={onSubmit && handleSubmit(onSubmit)} - > - 독서모임 만들기 - </BottomActionButton> - </article> - ); -}; - -export default SelectJoinTypeStep; diff --git a/src/components/bookGroup/create/steps/SelectJoinTypeStep/fields/JoinPasswordFieldset.tsx b/src/components/bookGroup/create/steps/SelectJoinTypeStep/fields/JoinPasswordFieldset.tsx deleted file mode 100644 index 224965cda..000000000 --- a/src/components/bookGroup/create/steps/SelectJoinTypeStep/fields/JoinPasswordFieldset.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { PropsWithChildren } from 'react'; -import { useFormContext, useWatch } from 'react-hook-form'; - -import type { SelectJoinTypeStepFormValues } from '../../../types'; -import type { - JoinTypeStepFieldName, - JoinTypeStepFieldProp, -} from '../SelectJoinTypeStep'; - -import ErrorMessage from '@/components/common/ErrorMessage'; -import Input from '@/components/common/Input'; -import InputLength from '@/components/common/InputLength'; -import withScrollLockOnFocus from '@/hocs/withScrollLockOnFocus'; - -type JoinPasswordFieldsetProps = { - joinTypeFieldName: JoinTypeStepFieldName; -}; - -const JoinPasswordFieldset = ({ - joinTypeFieldName, - children, -}: PropsWithChildren<JoinPasswordFieldsetProps>) => { - const { control } = useFormContext<SelectJoinTypeStepFormValues>(); - const hasJoinPassword = useWatch({ control, name: joinTypeFieldName }); - - const shouldRender = hasJoinPassword === 'true'; - - return ( - <> - {shouldRender && ( - <fieldset className="flex flex-col gap-[1.5rem]">{children}</fieldset> - )} - </> - ); -}; - -const ScrollLockInput = withScrollLockOnFocus(Input); - -const JoinQuestionField = ({ name }: JoinTypeStepFieldProp) => { - const { - register, - control, - formState: { errors }, - } = useFormContext<SelectJoinTypeStepFormValues>(); - - const joinQuestion = useWatch({ control, name }); - - const questionLength = joinQuestion?.length; - const error = errors[name]; - - return ( - <label className="flex flex-col gap-[0.5rem]"> - <p>가입 문제</p> - <ScrollLockInput - placeholder="모임에 가입하기 위한 적절한 문제를 작성해주세요" - {...register(name, { - required: '1 ~ 30글자의 가입 문제가 필요해요', - maxLength: { - value: 30, - message: '1 ~ 30글자의 가입 문제를 작성해주세요', - }, - })} - error={!!error} - /> - <div className="flex flex-row-reverse justify-between"> - <InputLength - currentLength={questionLength} - isError={!!error} - maxLength={30} - /> - <ErrorMessage>{error?.message}</ErrorMessage> - </div> - </label> - ); -}; - -const JoinAnswerField = ({ name }: JoinTypeStepFieldProp) => { - const { - register, - control, - formState: { errors }, - } = useFormContext<SelectJoinTypeStepFormValues>(); - - const joinPasswd = useWatch({ control, name }); - - const passwordLength = joinPasswd?.length; - const error = errors[name]; - - return ( - <label className="flex flex-col gap-[0.5rem]"> - <p>정답</p> - <ScrollLockInput - placeholder="띄어쓰기 없이 정답을 작성해주세요" - {...register(name, { - required: '띄어쓰기 없이 10글자 이하의 정답이 필요해요', - maxLength: { - value: 10, - message: '띄어쓰기 없이 10글자 이하의 정답을 작성해주세요,', - }, - pattern: { - value: /^[ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9]+$/, - message: '띄어쓰기 없이 한글, 영어, 숫자만 입력할 수 있어요', - }, - })} - error={!!error} - /> - <div className="flex flex-row-reverse justify-between"> - <InputLength - currentLength={passwordLength} - isError={!!error} - maxLength={10} - /> - <ErrorMessage>{error?.message}</ErrorMessage> - </div> - </label> - ); -}; - -JoinPasswordFieldset.QuestionField = JoinQuestionField; -JoinPasswordFieldset.AnswerField = JoinAnswerField; - -export default JoinPasswordFieldset; diff --git a/src/components/bookGroup/create/steps/SelectJoinTypeStep/fields/JoinTypeFieldset.tsx b/src/components/bookGroup/create/steps/SelectJoinTypeStep/fields/JoinTypeFieldset.tsx deleted file mode 100644 index 10f189500..000000000 --- a/src/components/bookGroup/create/steps/SelectJoinTypeStep/fields/JoinTypeFieldset.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { useFormContext } from 'react-hook-form'; - -import type { SelectJoinTypeStepFormValues } from '@/components/bookGroup/create/types'; -import type { JoinTypeStepFieldProp } from '@/components/bookGroup/create/steps/SelectJoinTypeStep/SelectJoinTypeStep'; - -import JoinTypeRadioCard from '@/components/bookGroup/create/steps/SelectJoinTypeStep/fields/JoinTypeRadioCard'; - -const JoinTypeFieldset = ({ children }: { children?: React.ReactNode }) => { - return <fieldset className="flex flex-col gap-[1rem]">{children}</fieldset>; -}; - -const RadioCardField = ({ name }: JoinTypeStepFieldProp) => { - const { register } = useFormContext<SelectJoinTypeStepFormValues>(); - - return ( - <> - <JoinTypeRadioCard - {...register(name)} - id="no-password" - value="false" - label="문제 없이 가입할 수 있어요" - /> - <JoinTypeRadioCard - {...register(name)} - id="has-password" - value="true" - label="문제를 맞춰야 모임에 가입할 수 있어요" - /> - </> - ); -}; - -JoinTypeFieldset.RadioCardField = RadioCardField; - -export default JoinTypeFieldset; diff --git a/src/components/bookGroup/create/steps/SelectJoinTypeStep/fields/JoinTypeRadioCard.tsx b/src/components/bookGroup/create/steps/SelectJoinTypeStep/fields/JoinTypeRadioCard.tsx deleted file mode 100644 index ac4534c4a..000000000 --- a/src/components/bookGroup/create/steps/SelectJoinTypeStep/fields/JoinTypeRadioCard.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { forwardRef, InputHTMLAttributes, Ref } from 'react'; - -const BASE_CLASSES = - 'flex h-[8rem] w-full cursor-pointer items-center justify-between rounded-[0.5rem] border-[0.1rem] bg-white px-[2.5rem] text-black-600 font-body1-regular'; - -const JoinTypeRadioCard = ( - { - id, - value, - label, - ...props - }: Omit<InputHTMLAttributes<HTMLInputElement>, 'className' | 'type'> & { - label?: string; - }, - ref: Ref<HTMLInputElement> -) => { - const inputId = id || 'radio-card'; - - return ( - <div> - <input - type="radio" - id={inputId} - value={value} - className="peer hidden" - ref={ref} - {...props} - /> - <label - className={`${BASE_CLASSES} after:h-[2.4rem] peer-checked:border-main-900 peer-checked:bg-main-900/[0.05] peer-checked:text-main-brighter peer-checked:after:content-check`} - htmlFor={inputId} - > - <p>{label}</p> - </label> - </div> - ); -}; - -export default forwardRef(JoinTypeRadioCard); diff --git a/src/components/bookGroup/create/steps/SelectJoinTypeStep/fields/index.ts b/src/components/bookGroup/create/steps/SelectJoinTypeStep/fields/index.ts deleted file mode 100644 index 339224b1a..000000000 --- a/src/components/bookGroup/create/steps/SelectJoinTypeStep/fields/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as JoinTypeFieldset } from './JoinTypeFieldset'; -export { default as JoinPasswordFieldset } from './JoinPasswordFieldset'; diff --git a/src/components/bookGroup/create/steps/SetUpDetailStep/SetUpDetailStep.tsx b/src/components/bookGroup/create/steps/SetUpDetailStep/SetUpDetailStep.tsx deleted file mode 100644 index d0f08a6ed..000000000 --- a/src/components/bookGroup/create/steps/SetUpDetailStep/SetUpDetailStep.tsx +++ /dev/null @@ -1,321 +0,0 @@ -import { useFormContext, useWatch } from 'react-hook-form'; - -import type { MoveFunnelStepProps } from '@/components/common/Funnel'; -import type { SetUpDetailStepFormValues } from '../../types'; - -import { MAX_MEMBER_COUNT_OPTIONS } from '@/constants'; -import { getTodayDate } from '@/utils/date'; - -import withScrollLockOnFocus from '@/hocs/withScrollLockOnFocus'; -import BottomActionButton from '@/components/common/BottomActionButton'; -import DatePicker from '@/components/common/DatePicker'; -import ErrorMessage from '@/components/common/ErrorMessage'; -import Input from '@/components/common/Input'; -import InputLength from '@/components/common/InputLength'; -import RadioButton from '@/components/common/RadioButton'; -import Switch from '@/components/common/Switch'; -import TextArea from '@/components/common/TextArea'; -import BookInfoCard from '@/components/bookGroup/BookInfoCard'; - -interface SetUpDetailStepProps extends MoveFunnelStepProps { - goToSelectBookStep?: () => void; -} - -/** - * @todo - * Field 컴포넌트 분리 - */ - -const SetUpDetailStep = ({ - goToSelectBookStep, - onNextStep, -}: SetUpDetailStepProps) => { - const { - handleSubmit, - getValues, - formState: { isValid }, - } = useFormContext<SetUpDetailStepFormValues>(); - - return ( - <article className="pb-action-button flex flex-col gap-[2.5rem] overflow-y-scroll"> - <h2 className="font-subheading-bold">모임 정보를 설정해주세요</h2> - <TitleField name={'title'} /> - <SelectedBookInfoField - bookId={getValues('book.bookId')} - onRemoveButtonClick={goToSelectBookStep} - /> - <IntroduceField name={'introduce'} /> - - <section className="flex flex-col gap-[1.5rem] pb-[1rem]"> - <MaxMemberCountField name={'maxMemberCount'} /> - <CustomMemberCountField name={'customMemberCount'} /> - </section> - - <PickStartDateField name={'startDate'} /> - <PickEndDateField name={'endDate'} /> - - <SwitchIsPublicField name={'isPublic'} /> - - <BottomActionButton - type="submit" - disabled={!isValid} - onClick={handleSubmit(() => onNextStep?.())} - > - 다음 - </BottomActionButton> - </article> - ); -}; - -export default SetUpDetailStep; - -type SetUpDetailFieldProps = { - name: keyof SetUpDetailStepFormValues; -}; - -const ScrollLockInput = withScrollLockOnFocus(Input); - -const TitleField = ({ name }: SetUpDetailFieldProps) => { - const { - register, - control, - formState: { errors }, - } = useFormContext<SetUpDetailStepFormValues>(); - - const titleValue = useWatch({ control, name: name }); - const titleValueLength = - typeof titleValue === 'string' ? titleValue.length : 0; - const titleErrors = errors[name]; - - return ( - <section className="flex flex-col gap-[0.5rem]"> - <ScrollLockInput - fontSize="large" - inputStyle="line" - error={!!titleErrors} - {...register(name, { - required: '독서모임 이름을 적어주세요', - minLength: { value: 2, message: '2글자 이상 입력해주세요' }, - maxLength: { value: 20, message: '20글자 이하로 입력해주세요' }, - })} - /> - <div className="flex flex-row-reverse justify-between gap-[0.4rem]"> - <InputLength - currentLength={titleValueLength} - maxLength={20} - isError={!!titleErrors} - /> - <ErrorMessage>{titleErrors?.message}</ErrorMessage> - </div> - </section> - ); -}; - -const SelectedBookInfoField = ({ - bookId, - onRemoveButtonClick, -}: { - bookId?: number; - onRemoveButtonClick?: () => void; -}) => { - const { reset } = useFormContext<SetUpDetailStepFormValues>(); - - const handleBookRemove = () => { - onRemoveButtonClick?.(); - reset({ book: undefined }); - - return; - }; - - return ( - <section> - <BookInfoCard - bookId={bookId} - onBookRemove={handleBookRemove} - removable={true} - /> - </section> - ); -}; - -const ScrollLockTextArea = withScrollLockOnFocus(TextArea); - -const IntroduceField = ({ name }: SetUpDetailFieldProps) => { - const { - register, - formState: { errors }, - } = useFormContext<SetUpDetailStepFormValues>(); - - const introduceErrors = errors[name]; - - return ( - <section className="flex flex-col gap-[1.2rem]"> - <h2>활동 내용</h2> - <ScrollLockTextArea - count={true} - error={!!introduceErrors} - placeholder="독서모임에서 어떤 활동을 할 계획인지 자세히 설명해주세요" - {...register(name, { - required: '독서모임에 대한 설명을 적어주세요', - minLength: { value: 10, message: '10글자 이상 입력해주세요' }, - maxLength: { value: 500, message: '500자 이하로 입력해주세요' }, - })} - > - <ErrorMessage>{introduceErrors?.message}</ErrorMessage> - </ScrollLockTextArea> - </section> - ); -}; - -const MaxMemberCountField = ({ name }: SetUpDetailFieldProps) => { - const { - register, - formState: { errors }, - } = useFormContext<SetUpDetailStepFormValues>(); - - const maxMemberCountErrors = errors[name]; - - return ( - <> - <h2>최대 인원</h2> - <fieldset className="inline-flex w-[80%] flex-wrap gap-[1.2rem]"> - {MAX_MEMBER_COUNT_OPTIONS.map(option => ( - <RadioButton - key={option.value} - value={option.value} - label={option.label} - {...register(name, { - required: '모임 최대 인원을 선택해 주세요', - })} - /> - ))} - </fieldset> - <ErrorMessage>{maxMemberCountErrors?.message}</ErrorMessage> - </> - ); -}; - -const CustomMemberCountField = ({ name }: SetUpDetailFieldProps) => { - const { - register, - control, - formState: { errors }, - } = useFormContext<SetUpDetailStepFormValues>(); - - const maxMemberCount = useWatch({ control, name: 'maxMemberCount' }); - const isCustomInputCount = maxMemberCount === 'custom'; - const customMemberCountErrors = errors[name]; - - return ( - <> - {isCustomInputCount && ( - <div className="flex flex-col gap-[0.5rem]"> - <Input - type="number" - min={0} - placeholder="최대인원을 입력해주세요" - className="after:content-['명']" - error={!!customMemberCountErrors} - {...register(name, { - required: { - value: isCustomInputCount, - message: '모임 최대 인원을 입력해주세요', - }, - min: { value: 2, message: '모임 인원은 최소 2명부터 가능해요' }, - max: { - value: 1000, - message: '1000명 이상의 인원은 제한 없음을 선택해주세요', - }, - })} - /> - <ErrorMessage>{customMemberCountErrors?.message}</ErrorMessage> - </div> - )} - </> - ); -}; - -const PickStartDateField = ({ name }: SetUpDetailFieldProps) => { - const { - register, - control, - formState: { errors }, - } = useFormContext<SetUpDetailStepFormValues>(); - - const startDateErrors = errors[name]; - const endDate = useWatch({ control, name: 'endDate' }); - const todayDate = getTodayDate(); - - return ( - <section className="flex flex-col gap-[0.5rem]"> - <div className="flex items-center justify-between"> - <h2>모임 시작일</h2> - <DatePicker - {...register(name, { - required: '모임 시작일을 선택해주세요', - min: { - value: todayDate, - message: '모임 시작일은 오늘 혹은 그 이후로 선택해주세요', - }, - max: { - value: endDate, - message: '모임 시작일은 종료일 보다 빨라야해요', - }, - })} - /> - </div> - <ErrorMessage>{startDateErrors?.message}</ErrorMessage> - </section> - ); -}; - -const PickEndDateField = ({ name }: SetUpDetailFieldProps) => { - const { - register, - control, - formState: { errors }, - } = useFormContext<SetUpDetailStepFormValues>(); - - const startDate = useWatch({ control, name: 'startDate' }); - const todayDate = getTodayDate(); - - const endDateErrors = errors[name]; - - return ( - <section className="flex flex-col gap-[0.5rem]"> - <div className="flex items-center justify-between"> - <h2>모임 종료일</h2> - <DatePicker - {...register(name, { - required: '모임 종료일을 선택해주세요', - min: { - value: startDate || todayDate, - message: '모임 종료일은 시작일과 오늘 이후여야 해요', - }, - })} - /> - </div> - <ErrorMessage>{endDateErrors?.message}</ErrorMessage> - </section> - ); -}; - -const SwitchIsPublicField = ({ name }: SetUpDetailFieldProps) => { - const { register, control } = useFormContext<SetUpDetailStepFormValues>(); - - const isCommentPublic = useWatch({ control, name }); - - return ( - <section className="flex items-center justify-between"> - <div className="flex min-w-0 flex-col gap-[0.3rem]"> - <h2>댓글 공개 여부</h2> - <p className="text-placeholder font-caption1-regular"> - {isCommentPublic - ? '모임에 가입하지 않아도 댓글을 볼 수 있어요' - : '모임에 가입해야 댓글을 볼 수 있어요'} - </p> - </div> - <Switch {...register(name)} /> - </section> - ); -}; diff --git a/src/components/bookGroup/create/steps/index.ts b/src/components/bookGroup/create/steps/index.ts deleted file mode 100644 index 2b06facc9..000000000 --- a/src/components/bookGroup/create/steps/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { default as EnterTitleStep } from './EnterTitleStep/EnterTitleStep'; -export { default as SelectBookStep } from './SelectBookStep/SelectBookStep'; -export { default as SelectJoinTypeStep } from './SelectJoinTypeStep/SelectJoinTypeStep'; -export { default as SetUpDetailStep } from './SetUpDetailStep/SetUpDetailStep'; diff --git a/src/components/bookGroup/create/types.ts b/src/components/bookGroup/create/types.ts deleted file mode 100644 index a42f16fd8..000000000 --- a/src/components/bookGroup/create/types.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { SearchedBookWithId } from '@/types/book'; - -export type CreateBookGroupFormValues = { - book: SearchedBookWithId; - queryKeyword: string; - title: string; - introduce: string; - maxMemberCount: 9999 | 50 | 100 | 200 | 500 | 'custom'; - customMemberCount: number; - startDate: string; - endDate: string; - isPublic: boolean; - hasJoinPassword: 'true' | 'false'; - joinQuestion: string; - joinPassword: string; -}; - -export type SelectBookStepFormValues = Pick< - CreateBookGroupFormValues, - 'book' | 'queryKeyword' ->; - -export type EnterTitleStepFormValues = Pick<CreateBookGroupFormValues, 'title'>; - -export type SetUpDetailStepFormValues = Pick< - CreateBookGroupFormValues, - | 'book' - | 'title' - | 'introduce' - | 'maxMemberCount' - | 'customMemberCount' - | 'startDate' - | 'endDate' - | 'isPublic' ->; - -export type SelectJoinTypeStepFormValues = Pick< - CreateBookGroupFormValues, - 'hasJoinPassword' | 'joinQuestion' | 'joinPassword' ->; diff --git a/src/components/bookGroup/detail/BookGroupInfo.tsx b/src/components/bookGroup/detail/BookGroupInfo.tsx deleted file mode 100644 index 30ffe46c5..000000000 --- a/src/components/bookGroup/detail/BookGroupInfo.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import { IconCalendar, IconMembers } from '@public/icons'; -import Badge from '@/components/common/Badge'; -import Avatar from '@/components/common/Avatar'; -import BookGroupStatus from '@/components/bookGroup/BookGroupStatus'; -import BookInfoCard from '@/components/bookGroup/BookInfoCard'; - -import { useBookGroup } from '@/queries/group/useBookGroupQuery'; -import useUserProfileQuery from '@/queries/user/useUserProfileQuery'; - -const BookGroupInfo = ({ groupId }: { groupId: number }) => { - const { data: bookGroupInfo } = useBookGroup(groupId); - - return ( - <div className="flex flex-col gap-[1rem] pt-[2rem]"> - <div className="flex gap-[0.5rem]"> - <BookGroupStatus - start={bookGroupInfo.date.start} - end={bookGroupInfo.date.end} - /> - <Public isPublic={bookGroupInfo.isPublic} /> - </div> - <Owner userId={bookGroupInfo.owner.id} isMe={bookGroupInfo.owner.isMe} /> - <Title title={bookGroupInfo.title} /> - <BookInfoCard bookId={bookGroupInfo.bookId} /> - <div className="flex flex-col gap-[0.3rem]"> - <Duration - start={bookGroupInfo.date.start} - end={bookGroupInfo.date.end} - /> - <MemberCapacity - current={bookGroupInfo.memberCount.current} - max={bookGroupInfo.memberCount.max} - /> - </div> - <Description content={bookGroupInfo.description} /> - </div> - ); -}; - -export default BookGroupInfo; - -const Public = ({ isPublic }: { isPublic: boolean }) => ( - <Badge colorScheme="grey">{isPublic ? '공개' : '비공개'}</Badge> -); - -const Owner = ({ - userId, - isMe = false, -}: { - userId: number; - isMe?: boolean; -}) => { - const { data: userInfo } = useUserProfileQuery(userId); - - return ( - <div className="flex items-center gap-[1rem]"> - <Avatar - name={userInfo.nickname} - size="medium" - src={userInfo.profileImage} - /> - <span className="text-center font-body2-bold"> - <span>{userInfo.nickname}</span> - <span>{isMe && ' 👑'}</span> - </span> - </div> - ); -}; - -const Title = ({ title }: { title: string }) => { - return <p className="font-subheading-bold">{title}</p>; -}; - -const Duration = ({ start, end }: { start: string; end: string }) => { - return ( - <div className="flex items-center gap-[1rem]"> - <IconCalendar className="h-auto w-[1.6rem] fill-placeholder" /> - <span className="text-placeholder font-body2-regular"> - {start} ~ {end} - </span> - </div> - ); -}; - -const MemberCapacity = ({ - current, - max, -}: { - current: number; - max: number | null; -}) => { - return ( - <div className="flex items-center gap-[1rem]"> - <IconMembers className="h-auto w-[1.6rem] fill-placeholder" /> - <p className="text-placeholder font-body2-regular"> - <span className="text-main-900">{current}</span> - {`${max ? ` / ${max}` : ''}명`} - </p> - </div> - ); -}; - -const Description = ({ content }: { content: string }) => { - return <p className="leading-snug font-body1-regular">{content}</p>; -}; diff --git a/src/components/bookGroup/detail/JoinBookGroupButton.tsx b/src/components/bookGroup/detail/JoinBookGroupButton.tsx deleted file mode 100644 index 95457fe69..000000000 --- a/src/components/bookGroup/detail/JoinBookGroupButton.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { usePathname, useRouter } from 'next/navigation'; - -import useJoinBookGroup from '@/hooks/group/useJoinBookGroup'; -import BottomActionButton from '@/components/common/BottomActionButton'; - -const JoinBookGroupButton = ({ groupId }: { groupId: number }) => { - const router = useRouter(); - const pathname = usePathname(); - const { isExpired, isMember, hasPassword, joinBookGroup, refetch } = - useJoinBookGroup(groupId); - - const handleButtonClick = async () => { - if (hasPassword) { - router.replace(`${pathname}/join`); - return; - } - - joinBookGroup({ onSuccess: refetch }); - }; - - if (isMember) { - return null; - } - - if (isExpired) { - return ( - <BottomActionButton colorScheme="grey" disabled> - 모임이 종료되었어요. - </BottomActionButton> - ); - } - - return ( - <BottomActionButton onClick={handleButtonClick}> - 참여하기 - </BottomActionButton> - ); -}; - -export default JoinBookGroupButton; diff --git a/src/components/bookGroup/detail/MemberItem.tsx b/src/components/bookGroup/detail/MemberItem.tsx deleted file mode 100644 index fb809bb57..000000000 --- a/src/components/bookGroup/detail/MemberItem.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import Avatar from '@/components/common/Avatar'; - -interface MemberItemProps { - profileImageSrc: string; - name: string; - job: { group: string; name: string }; - isOwner: boolean; -} - -const MemberItem = ({ - profileImageSrc, - name, - job, - isOwner, -}: MemberItemProps) => { - return ( - <div className="flex gap-[0.8rem]"> - <Avatar src={profileImageSrc} name={name} /> - <div className="flex flex-col"> - <Name text={name} isMarked={isOwner} /> - <Job group={job.group} name={job.name} /> - </div> - </div> - ); -}; - -export default MemberItem; - -const Name = ({ text, isMarked }: { text: string; isMarked: boolean }) => ( - <p className="font-body2-bold"> - {text} {isMarked && ' 👑'} - </p> -); - -const Job = ({ group, name }: { group: string; name: string }) => ( - <p className="text-placeholder font-caption1-regular"> - {group} • {name} - </p> -); diff --git a/src/components/bookGroup/detail/ShortMemberInfo.tsx b/src/components/bookGroup/detail/ShortMemberInfo.tsx deleted file mode 100644 index 82f53afcc..000000000 --- a/src/components/bookGroup/detail/ShortMemberInfo.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import Link from 'next/link'; -import { usePathname } from 'next/navigation'; - -import { IconArrowLeft } from '@public/icons'; -import MemberItem from '@/components/bookGroup/detail/MemberItem'; -import Button from '@/components/common/Button'; - -type Member = { - id: number; - profileImageSrc: string; - name: string; - job: { group: string; name: string }; - isOwner: boolean; -}; - -interface ShortMemberInfoProps { - members: Member[]; -} - -const MEMBER_SHOW_LIMIT = 3; - -const ShortMemberInfo = ({ members }: ShortMemberInfoProps) => { - return ( - <div className="flex flex-col gap-[2rem]"> - <Heading text="멤버" /> - <MemberList members={members.slice(0, MEMBER_SHOW_LIMIT)} /> - <ViewAllButton /> - </div> - ); -}; - -export default ShortMemberInfo; - -const Heading = ({ text }: { text: string }) => ( - <p className="font-subheading-bold">{text}</p> -); - -const MemberList = ({ members }: { members: Member[] }) => ( - <div className="flex flex-col gap-[1rem]"> - {members.map(({ id, ...memberItemProps }) => ( - <MemberItem key={id} {...memberItemProps} /> - ))} - </div> -); - -const ViewAllButton = () => { - const pathname = usePathname(); - - return ( - <Link href={`${pathname}/members`}> - <Button size="full" colorScheme="main-light"> - <span className="mr-[0.5rem] text-black-700 font-body2-bold"> - 전체보기 - </span> - <IconArrowLeft className="inline-block h-[1rem] w-[1rem] rotate-180" /> - </Button> - </Link> - ); -}; diff --git a/src/components/bookGroup/edit/BookGroupEditDateForm.tsx b/src/components/bookGroup/edit/BookGroupEditDateForm.tsx deleted file mode 100644 index b707a058b..000000000 --- a/src/components/bookGroup/edit/BookGroupEditDateForm.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { useFormContext } from 'react-hook-form'; - -import type { APIEditBookGroup } from '@/types/group'; - -import DatePicker from '@/components/common/DatePicker'; -import ErrorMessage from '@/components/common/ErrorMessage'; - -type EditDateFormTypes = Pick<APIEditBookGroup, 'startDate' | 'endDate'>; - -const BookGroupEditDateForm = () => { - const { - register, - formState: { errors, defaultValues }, - } = useFormContext<EditDateFormTypes>(); - - return ( - <> - <section className="flex justify-between"> - <div> - <h2 className="text-black-500">모임 시작일</h2> - <p className="pt-[0.3rem] text-placeholder font-caption1-regular"> - 모임 시작일은 수정할 수 없어요 - </p> - </div> - <DatePicker disabled={true} {...register('startDate')} /> - </section> - <section className="flex flex-col gap-[0.5rem]"> - <div className="flex justify-between"> - <h2 className="text-black-700">모임 종료일</h2> - <DatePicker - {...register('endDate', { - required: { value: true, message: '종료일을 입력해주세요' }, - min: { - value: defaultValues?.startDate as string, - message: '종료일은 시작일보다 늦어야 해요', - }, - })} - /> - </div> - <div> - {errors.endDate && ( - <ErrorMessage>{errors.endDate.message}</ErrorMessage> - )} - </div> - </section> - </> - ); -}; - -export default BookGroupEditDateForm; diff --git a/src/components/bookGroup/edit/BookGroupEditIntroduceForm.tsx b/src/components/bookGroup/edit/BookGroupEditIntroduceForm.tsx deleted file mode 100644 index fa0f76516..000000000 --- a/src/components/bookGroup/edit/BookGroupEditIntroduceForm.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { useFormContext } from 'react-hook-form'; - -import ErrorMessage from '@/components/common/ErrorMessage'; -import TextArea from '@/components/common/TextArea'; -import { APIEditBookGroup } from '@/types/group'; - -type EditIntroduceFormTypes = Pick<APIEditBookGroup, 'introduce'>; - -const BookGroupEditIntroduceForm = () => { - const { - register, - formState: { errors, defaultValues }, - } = useFormContext<EditIntroduceFormTypes>(); - - return ( - <section className="flex flex-col gap-[0.6rem]"> - <h2 className="text-black-700 font-body1-regular">활동 내용</h2> - <TextArea - count={true} - maxLength={500} - defaultValue={defaultValues?.introduce} - {...register('introduce', { - required: '모임 설명을 입력해주세요', - minLength: { - value: 10, - message: '모임 설명을 10자 이상 입력해주세요', - }, - maxLength: { - value: 500, - message: '모임 설명은 500자를 넘을 수 없어요', - }, - })} - > - <ErrorMessage>{errors.introduce?.message}</ErrorMessage> - </TextArea> - </section> - ); -}; - -export default BookGroupEditIntroduceForm; diff --git a/src/components/bookGroup/edit/BookGroupEditTitleForm.tsx b/src/components/bookGroup/edit/BookGroupEditTitleForm.tsx deleted file mode 100644 index 71a2b92f2..000000000 --- a/src/components/bookGroup/edit/BookGroupEditTitleForm.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { useFormContext } from 'react-hook-form'; - -import type { APIEditBookGroup } from '@/types/group'; - -import Input from '@/components/common/Input'; -import InputLength from '@/components/common/InputLength'; -import ErrorMessage from '@/components/common/ErrorMessage'; - -type EditTitleFormTypes = Pick<APIEditBookGroup, 'title'>; - -const BookGroupEditTitleForm = () => { - const { - register, - watch, - formState: { errors }, - } = useFormContext<EditTitleFormTypes>(); - - return ( - <section className="flex flex-col gap-[0.5rem]"> - <Input - inputStyle="line" - fontSize="large" - {...register('title', { - required: '모임 제목을 입력해주세요', - minLength: { - value: 2, - message: '모임 제목을 2자 이상 입력해 주세요', - }, - maxLength: { - value: 30, - message: '모임 제목을 30자 이하 입력해 주세요', - }, - })} - /> - <div className="flex flex-row-reverse items-center justify-between"> - <InputLength - currentLength={watch('title')?.length} - isError={!!errors.title} - maxLength={30} - /> - {errors.title && <ErrorMessage>{errors.title.message}</ErrorMessage>} - </div> - </section> - ); -}; - -export default BookGroupEditTitleForm; diff --git a/src/components/bookGroup/edit/BookGroupEditTopNavigation.tsx b/src/components/bookGroup/edit/BookGroupEditTopNavigation.tsx deleted file mode 100644 index 01a94fa37..000000000 --- a/src/components/bookGroup/edit/BookGroupEditTopNavigation.tsx +++ /dev/null @@ -1,37 +0,0 @@ -'use client'; - -import { SubmitHandler, useFormContext } from 'react-hook-form'; - -import type { APIEditBookGroup } from '@/types/group'; - -import TopNavigation from '@/components/common/TopNavigation'; -import BackButton from '@/components/common/BackButton'; - -const BookGroupEditTopNavigation = ({ - onSubmit, -}: { - onSubmit: SubmitHandler<APIEditBookGroup>; -}) => { - const { handleSubmit } = useFormContext<APIEditBookGroup>(); - - return ( - <TopNavigation> - <TopNavigation.LeftItem> - <BackButton /> - </TopNavigation.LeftItem> - <TopNavigation.CenterItem> - <h1 className="text-black-900 font-body1-regular">모임 수정하기</h1> - </TopNavigation.CenterItem> - <TopNavigation.RightItem> - <button - onClick={handleSubmit(onSubmit)} - className="cursor-pointer text-main-900 font-body1-bold" - > - 완료 - </button> - </TopNavigation.RightItem> - </TopNavigation> - ); -}; - -export default BookGroupEditTopNavigation; diff --git a/src/components/bookSearch/BestSellers.tsx b/src/components/bookSearch/BestSellers.tsx deleted file mode 100644 index 1e7f4f9b4..000000000 --- a/src/components/bookSearch/BestSellers.tsx +++ /dev/null @@ -1,193 +0,0 @@ -import { useState } from 'react'; -import { useRouter } from 'next/navigation'; - -import type { APIBestSellerSearchRange, APISearchedBook } from '@/types/book'; -import useBestSellersQuery from '@/queries/book/useBestSellersQuery'; -import bookAPI from '@/apis/book'; - -import useToast from '@/components/common/Toast/useToast'; - -import BookCover from '@/components/book/BookCover'; -import Skeleton from '@/components/common/Skeleton'; - -const SEARCH_RANGES = { - 주간: 'WEEKLY', - 월간: 'MONTHLY', - 연간: 'YEARLY', -} as const; - -type SearchRangeTypes = keyof typeof SEARCH_RANGES; - -const BestSellers = () => { - const [bestSellerSearchRange, setBestSellerSearchRange] = - useState<APIBestSellerSearchRange>('WEEKLY'); - const searchRanges = Object.keys(SEARCH_RANGES) as SearchRangeTypes[]; - - const bestSellersInfo = useBestSellersQuery(); - const bestSellers = bestSellersInfo.isSuccess - ? bestSellersInfo.data.item - : []; - - const router = useRouter(); - const toast = useToast(); - - const handleClickBook = async (book: APISearchedBook) => { - try { - const { - data: { bookId }, - } = await bookAPI.createBook({ book }); - - router.push(`/book/${bookId}`); - } catch (error) { - toast.show({ - type: 'error', - message: '잠시 후 다시 시도해주세요', - }); - console.error(error); - } - }; - - return ( - <section className="flex flex-col gap-[1.5rem]"> - <h2 className="font-body1-regular">인기 도서</h2> - <ul className="flex w-[calc(100%+2rem)] gap-[0.8rem] overflow-x-scroll whitespace-nowrap"> - <li className="rounded-[1.5rem] bg-black-600 px-[1.5rem] py-[0.3rem]"> - <p className="font-normal text-white font-body2-regular">종합</p> - </li> - </ul> - - <ul className="flex w-full flex-row items-center divide-x divide-black-600 font-body2-regular"> - {searchRanges.map(keys => ( - <li - className={`flex h-[1.1rem] cursor-pointer items-center px-[0.9rem] ${ - SEARCH_RANGES[keys] === bestSellerSearchRange - ? 'text-black-800' - : 'text-black-500' - }`} - key={keys} - onClick={() => setBestSellerSearchRange(SEARCH_RANGES[keys])} - > - {keys} - </li> - ))} - </ul> - - {bestSellerSearchRange === 'WEEKLY' ? ( - <ul className="flex w-[calc(100%+2rem)] overflow-x-scroll pb-[1rem]"> - {bestSellers.map(book => ( - <BestSeller - key={book.isbn} - title={book.title} - author={book.author} - isbn={book.isbn} - contents={book.description} - url={book.link} - imageUrl={book.cover} - publisher={book.publisher} - bestRank={book.bestRank} - onClick={handleClickBook} - /> - ))} - </ul> - ) : ( - <p className="mb-[2.4rem] text-center text-placeholder font-body2-regular"> - 아직 준비중인 기능이에요 🔨 - </p> - )} - </section> - ); -}; - -export default BestSellers; - -type BestSellerProps = { - title: string; - author: string; - isbn: string; - contents: string; - url: string; - imageUrl: string; - publisher: string; - bestRank: number; - onClick: (book: APISearchedBook) => Promise<void>; -}; - -const BestSeller = ({ - title, - author, - isbn, - contents, - url, - imageUrl, - publisher, - bestRank, - onClick, -}: BestSellerProps) => { - const bookReqBody = { - title, - author, - isbn, - contents, - url, - imageUrl, - publisher, - apiProvider: 'ALADIN', - }; - - return ( - <div - className="flex w-[12.7rem] cursor-pointer flex-col gap-[1.3rem] px-[0.7rem]" - onClick={() => onClick(bookReqBody)} - > - <BookCover src={imageUrl} title={title} size={'xlarge'} /> - <div className="flex flex-row gap-[1rem]"> - <p className="text-black-900 font-heading-bold">{bestRank}</p> - <div className="flex min-w-0 flex-col gap-[0.3rem] font-body2-regular"> - <p className="line-clamp-2 !leading-tight text-black-800">{title}</p> - <p className="line-clamp-1 text-black-600 ">{author}</p> - </div> - </div> - </div> - ); -}; - -const BestSellerSkeleton = () => { - return ( - <div className="flex w-[12.7rem] flex-col gap-[1.3rem] px-[0.7rem]"> - <Skeleton.Rect width="11rem" height="15.4rem" rounded="medium" /> - <div className="flex flex-row gap-[1rem]"> - <Skeleton.Text width="1.25rem" fontSize="2xlarge" /> - <div className="flex min-w-0 flex-col gap-[0.3rem]"> - <Skeleton.Text width="8.75rem" fontSize="2xlarge" /> - <Skeleton.Text width="7.25rem" fontSize="xlarge" /> - </div> - </div> - </div> - ); -}; - -export const BestSellersSkeleton = () => { - return ( - <Skeleton> - <section className="flex flex-col gap-[1.5rem]"> - <Skeleton.Text width="7rem" fontSize="2xlarge" /> - <ul className="flex w-full gap-[1rem]"> - <Skeleton.Rect width="5.5rem" height="2.5rem" rounded="large" /> - </ul> - <ul className="flex w-[12.8rem] flex-row justify-around"> - <Skeleton.Text width="2.5rem" fontSize="xsmall" /> - <Skeleton.Text width="2.5rem" fontSize="xsmall" /> - <Skeleton.Text width="2.5rem" fontSize="xsmall" /> - </ul> - <ul className="flex w-[calc(100%+2rem)] overflow-x-scroll"> - <BestSellerSkeleton /> - <BestSellerSkeleton /> - <BestSellerSkeleton /> - <BestSellerSkeleton /> - </ul> - </section> - </Skeleton> - ); -}; - -// 'w-[11.0rem] h-[15.4rem]' diff --git a/src/components/bookSearch/BookSearchList.tsx b/src/components/bookSearch/BookSearchList.tsx deleted file mode 100644 index 5744ee9e9..000000000 --- a/src/components/bookSearch/BookSearchList.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import type { APISearchedBook, SearchedBookWithId } from '@/types/book'; - -import bookAPI from '@/apis/book'; -import useToast from '@/components/common/Toast/useToast'; - -import BookCover from '@/components/book/BookCover'; - -type BookSearchListProps = { - books: APISearchedBook[]; - totalCount?: number; - onBookClick?: (book: SearchedBookWithId) => void; -}; - -const BookSearchList = ({ - books, - totalCount, - onBookClick, -}: BookSearchListProps) => { - const { show: showToast } = useToast(); - - const handleBookClick = async (book: APISearchedBook) => { - try { - const { data } = await bookAPI.createBook({ book }); - const { bookId } = data; - - onBookClick && onBookClick({ ...book, bookId }); - } catch (error) { - showToast({ type: 'error', message: '잠시 후 다시 시도해주세요' }); - console.error(error); - } - }; - - if (!books.length) { - return ( - <p className="mb-[2.4rem] text-center text-placeholder font-body2-regular"> - 검색된 도서가 없어요 🥲 - </p> - ); - } - - return ( - <> - <h3 className="mb-[1rem] "> - <span className="text-black-600 font-body1-bold">검색 결과 </span> - <span className="pl-[0.2rem] text-black-500 font-body1-regular"> - {totalCount} - </span> - </h3> - <ul className="grid w-full grid-cols-3 gap-[1.6rem]"> - {books.map((book, idx) => ( - <BookSearchItem - key={`${book.isbn}-${idx}`} - imageUrl={book.imageUrl} - title={book.title} - onClick={() => handleBookClick(book)} - /> - ))} - </ul> - </> - ); -}; - -export default BookSearchList; - -const BookSearchItem = ({ - imageUrl, - title, - onClick, -}: { - imageUrl: string; - title: string; - onClick: () => void; -}) => { - return ( - <li - onClick={onClick} - className="flex min-h-0 w-full cursor-pointer flex-col gap-[0.8rem] bg-white p-[0.2rem]" - > - <BookCover size="fill" src={imageUrl} title={title} /> - <p className="line-clamp-2 !leading-tight text-black-900 font-body2-regular"> - {title} - </p> - </li> - ); -}; diff --git a/src/components/bookSearch/RecentSearchList.tsx b/src/components/bookSearch/RecentSearchList.tsx deleted file mode 100644 index 1e9a20ed5..000000000 --- a/src/components/bookSearch/RecentSearchList.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import type { APIBookRecentSearchResponse } from '@/types/book'; - -import Button from '@/components/common/Button'; -import Skeleton from '@/components/common/Skeleton'; - -type RecentSearchListProps = { - keywords?: APIBookRecentSearchResponse[]; - onClick?: (keyword: string) => void; -}; - -const RecentSearchList = ({ keywords, onClick }: RecentSearchListProps) => { - return ( - <section className="flex flex-col gap-[1.5rem]"> - <h2 className="font-body1-regular">최근 검색어</h2> - {keywords ? ( - <ul className="relative flex w-[calc(100%+2rem)] gap-[1rem] overflow-x-scroll whitespace-nowrap pb-[1rem]"> - {keywords.map(item => ( - <li key={`${item.keyword}-${item.modifiedAt}`}> - <Button - size="small" - fill={true} - fullRadius={true} - colorScheme="main-light" - onClick={() => onClick && onClick(item.keyword)} - > - {item.keyword} - </Button> - </li> - ))} - </ul> - ) : ( - <p className="mb-[2.4rem] text-center text-placeholder font-body2-regular"> - 검색 기록이 없어요! - </p> - )} - </section> - ); -}; - -export default RecentSearchList; - -export const RecentSearchListSkeleton = () => { - return ( - <Skeleton> - <section className="flex animate-pulse flex-col gap-[1.5rem] rounded-[0.5rem]"> - <Skeleton.Text width="8rem" fontSize="2xlarge" /> - <ul className="flex w-full gap-[1rem] pb-[1rem]"> - <Skeleton.Rect width="7.55rem" height="3.3rem" rounded="full" /> - <Skeleton.Rect width="7.55rem" height="3.3rem" rounded="full" /> - <Skeleton.Rect width="7.55rem" height="3.3rem" rounded="full" /> - <Skeleton.Rect width="7.55rem" height="3.3rem" rounded="full" /> - </ul> - </section> - </Skeleton> - ); -}; diff --git a/src/components/bookShelf/BookShelf.tsx b/src/components/bookShelf/BookShelf.tsx deleted file mode 100644 index 77cc45aed..000000000 --- a/src/components/bookShelf/BookShelf.tsx +++ /dev/null @@ -1,136 +0,0 @@ -'use client'; - -import { ReactNode, useState } from 'react'; -import Link from 'next/link'; -import Image from 'next/image'; - -import ColorThief from 'colorthief'; - -import { APIBook } from '@/types/book'; -import { APIBookshelf } from '@/types/bookshelf'; -import { IconArrowRight, IconHeart } from '@public/icons'; - -const BookShelf = ({ children }: { children: ReactNode }) => { - return <>{children}</>; -}; - -const Background = () => { - return ( - <div className="absolute bottom-0 w-full rounded-b-[inherit]"> - <div className="h-[3rem] bg-bookshelf-dark shadow-[0px_-3px_8px_0px_#F1F1F1_inset]" /> - <div className="h-[1rem] rounded-b-[inherit] bg-bookshelf-light shadow-[0px_-1px_8px_-4.5px_#494949]" /> - </div> - ); -}; - -type InfoProps = Omit<APIBookshelf, 'books'>; - -const Info = ({ bookshelfName, bookshelfId, likeCount }: InfoProps) => { - return ( - <div className="flex flex-col gap-[1rem] px-[2rem]"> - <div className="flex items-center justify-between"> - <Link - href={`/bookshelf/${bookshelfId}`} - className="flex select-none items-center gap-[0.5rem]" - > - <div className="font-body2-bold">{bookshelfName}</div> - <IconArrowRight width="1.2rem" height="1.2rem" /> - </Link> - <div className="flex items-center gap-[0.3rem] px-[0.6rem] py-[0.2rem]"> - <IconHeart className=" fill-warning-800 stroke-warning-800" /> - <p className=" text-black-600 font-caption2-bold">{likeCount}</p> - </div> - </div> - </div> - ); -}; - -type BooksProps = Pick<APIBookshelf, 'books'>; - -const Books = ({ books }: BooksProps) => { - return ( - <ul className="grid grid-cols-4 px-[1.5rem]"> - {books.map(book => ( - <li key={book.bookId} className="flex justify-center"> - <Book {...book} /> - </li> - ))} - </ul> - ); -}; - -const Book = ({ - imageUrl, - bookId, - title, -}: Pick<APIBook, 'bookId' | 'title' | 'imageUrl'>) => { - const [bookSpineColor, setBookSpineColor] = useState<string>(); - const placeholderClassName = bookSpineColor ? '' : 'bg-blur'; - - const handleOnLoadImage = (image: HTMLImageElement) => { - const colorThief = new ColorThief(); - const colorHex = colorThief - .getPalette(image, 2)[0] - .map(x => x.toString(16).padStart(2, '0')) - .join(''); - setBookSpineColor(`#${colorHex}`); - }; - - return ( - <Link - href={`/book/${bookId}`} - className="relative flex" - style={{ - transformStyle: 'preserve-3d', - transform: 'perspective(140px)', - }} - > - {/** 책 옆면 (책등) */} - <div - className={`h-full w-[1.5rem] ${placeholderClassName}`} - style={{ - backgroundColor: bookSpineColor, - transform: 'rotateY(320deg) translateX(1rem) translateZ(0.4rem)', - }} - > - {/** 옆면과 표지 사이 여백을 메꾸기 위해 추가 */} - <div - className={`absolute -right-[0.5px] h-full w-[2px] ${placeholderClassName}`} - style={{ backgroundColor: bookSpineColor }} - /> - </div> - - {/** 책 하단 그림자 */} - <div - className="absolute bottom-0 h-2 w-[calc(100%-1.5rem)] shadow-[1px_4px_10px_4px_#b1b1b1]" - style={{ - transform: 'rotateY(20deg) translateX(1.25rem) translateZ(-0.5rem)', - }} - /> - - {/** 책 표지 */} - <div - className="bg-blur relative h-[9.1rem] w-[6.5rem] rounded-[2px] after:absolute after:inset-0 after:border-[1px] after:border-black-900/[.06]" - style={{ - transform: 'rotateY(22deg) translateZ(0.3rem)', - }} - > - <Image - src={imageUrl} - alt={title} - onLoadingComplete={handleOnLoadImage} - className=" rounded-[1px] object-cover" - sizes="9.1rem" - fill - style={{ visibility: bookSpineColor ? 'visible' : 'hidden' }} - /> - </div> - </Link> - ); -}; - -BookShelf.Background = Background; -BookShelf.Info = Info; -BookShelf.Books = Books; - -export default BookShelf; diff --git a/src/components/bookShelf/BookShelfCard.tsx b/src/components/bookShelf/BookShelfCard.tsx deleted file mode 100644 index 28ab7d10d..000000000 --- a/src/components/bookShelf/BookShelfCard.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import type { APIBookshelf } from '@/types/bookshelf'; - -import BookShelf from '@/components/bookShelf/BookShelf'; - -const BookShelfCard = ({ - bookshelfName, - bookshelfId, - likeCount, - books, -}: APIBookshelf) => { - return ( - <BookShelf> - <div className="relative rounded-[2rem] pb-[2.5rem] pt-[2rem] shadow-[0px_0px_10px_0px_#D1D1D1]"> - <BookShelf.Background /> - <div className="flex flex-col gap-[2.6rem] bg-white"> - <BookShelf.Info - bookshelfName={bookshelfName} - bookshelfId={bookshelfId} - likeCount={likeCount} - /> - <BookShelf.Books books={books} /> - </div> - </div> - </BookShelf> - ); -}; - -export default BookShelfCard; diff --git a/src/components/bookShelf/BookShelfRow.tsx b/src/components/bookShelf/BookShelfRow.tsx deleted file mode 100644 index cb35cf14d..000000000 --- a/src/components/bookShelf/BookShelfRow.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import type { APIBookshelf } from '@/types/bookshelf'; - -import BookShelf from '@/components/bookShelf/BookShelf'; - -const BookShelfRow = ({ books }: Pick<APIBookshelf, 'books'>) => { - return ( - <BookShelf> - <div className="relative left-[-2rem] w-[calc(100%+4rem)] pb-[2.5rem] pt-[2rem] shadow-[0px_28px_20px_-16px_#D1D1D1]"> - <BookShelf.Background /> - <BookShelf.Books books={books} /> - </div> - </BookShelf> - ); -}; - -export default BookShelfRow; diff --git a/src/components/comment/BookCommentList.tsx b/src/components/comment/BookCommentList.tsx deleted file mode 100644 index 7c1eae37c..000000000 --- a/src/components/comment/BookCommentList.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import type { APIBookComment } from '@/types/book'; -import { useMyProfileId } from '@/queries/user/useMyProfileQuery'; -import { useBookComments } from '@/queries/book/useBookCommentsQuery'; -import usePatchBookCommentMutation from '@/queries/book/usePatchBookCommentMutation'; -import useDeleteBookCommentMutation from '@/queries/book/useDeleteBookCommentMutation'; - -import useToast from '@/components/common/Toast/useToast'; -import { checkAuthentication } from '@/utils/helpers'; - -import CommentList from '@/components/comment/CommentList'; - -const BookCommentList = ({ bookId }: { bookId: number }) => { - const isAuthenticated = checkAuthentication(); - - const { show: showToast } = useToast(); - - const { data: comments } = useBookComments(bookId); - const { data: myId } = useMyProfileId({ enabled: isAuthenticated }); - - const editComment = usePatchBookCommentMutation(bookId); - const deleteComment = useDeleteBookCommentMutation(bookId); - - const handleBookCommentEdit = ( - commentId: APIBookComment['commentId'], - comment: string - ) => { - editComment.mutate( - { commentId, comment }, - { - onSuccess: () => - showToast({ type: 'success', message: '코멘트를 수정했어요' }), - } - ); - }; - - const handleBookCommentDelete = (commentId: APIBookComment['commentId']) => { - deleteComment.mutate(commentId, { - onSuccess: () => - showToast({ type: 'success', message: '코멘트를 삭제했어요' }), - }); - }; - - return ( - <CommentList - name={'코멘트'} - comments={comments} - isEditableComment={({ writer }) => writer.id === myId} - emptyText={`아직 코멘트가 없어요. - 가장 먼저 코멘트를 남겨보세요!`} - onEditConfirm={handleBookCommentEdit} - onDeleteConfirm={handleBookCommentDelete} - /> - ); -}; - -export default BookCommentList; diff --git a/src/components/comment/BookGroupCommentList.tsx b/src/components/comment/BookGroupCommentList.tsx deleted file mode 100644 index 71b605419..000000000 --- a/src/components/comment/BookGroupCommentList.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { APIGroupComment } from '@/types/group'; -import { useBookGroupComments } from '@/queries/group/useBookGroupCommentsQuery'; -import { useMyProfileId } from '@/queries/user/useMyProfileQuery'; -import { useBookGroup } from '@/queries/group/useBookGroupQuery'; -import usePatchBookGroupCommentMutation from '@/queries/group/usePatchBookGroupCommentMutation'; -import useDeleteBookGroupCommentMutation from '@/queries/group/useDeleteBookGroupCommentMutation'; - -import useToast from '@/components/common/Toast/useToast'; -import { checkAuthentication } from '@/utils/helpers'; - -import CommentList from '@/components/comment/CommentList'; - -const BookGroupCommentList = ({ groupId }: { groupId: number }) => { - const isAuthenticated = checkAuthentication(); - - const { show: showToast } = useToast(); - - const { data: bookGroupInfo } = useBookGroup(groupId); - const { data: comments } = useBookGroupComments(groupId); - const { data: myId } = useMyProfileId({ enabled: isAuthenticated }); - - const editComment = usePatchBookGroupCommentMutation(groupId); - const deleteComment = useDeleteBookGroupCommentMutation(groupId); - - const { isPublic, isMember } = bookGroupInfo; - const isHidden = !isPublic && !isMember; - - const handleBookGroupCommentEdit = ( - commentId: APIGroupComment['commentId'], - comment: string - ) => { - editComment.mutate( - { commentId, comment }, - { - onSuccess: () => - showToast({ type: 'success', message: '코멘트를 수정했어요' }), - } - ); - }; - - const handleBookGroupCommentDelete = ( - commentId: APIGroupComment['commentId'] - ) => { - deleteComment.mutate(commentId, { - onSuccess: () => - showToast({ type: 'success', message: '코멘트를 삭제했어요' }), - }); - }; - - return ( - <CommentList - name={'게시글'} - comments={comments} - isEditableComment={({ writer }) => writer.id === myId} - isHidden={isHidden} - hiddenText={`멤버만 볼 수 있어요 🥲`} - emptyText={`아직 게시글이 없어요. - 가장 먼저 게시글을 남겨보세요!`} - onEditConfirm={handleBookGroupCommentEdit} - onDeleteConfirm={handleBookGroupCommentDelete} - /> - ); -}; - -export default BookGroupCommentList; diff --git a/src/components/comment/CommentDrawer.tsx b/src/components/comment/CommentDrawer.tsx deleted file mode 100644 index b0f46435d..000000000 --- a/src/components/comment/CommentDrawer.tsx +++ /dev/null @@ -1,70 +0,0 @@ -'use client'; - -import { forwardRef, useEffect } from 'react'; - -import Button from '@/components/common/Button'; -import Drawer from '@/components/common/Drawer'; - -interface CommentDrawerProps { - isOpen: boolean; - onClose: () => void; - onConfirm?: () => void; - title?: string; - defaultComment?: string; - placeholder?: string; -} - -const CommentDrawer = forwardRef<HTMLTextAreaElement, CommentDrawerProps>( - ({ isOpen, onClose, onConfirm, title, defaultComment, placeholder }, ref) => { - const handleConfirm = () => { - onConfirm && onConfirm(); - onClose(); - }; - - useEffect(() => { - if (!isOpen) return; - - // Drawer가 열릴 때 textarea의 끝에 focus - setTimeout(() => { - const textarea = document.querySelector('textarea'); - - if (textarea) { - textarea.focus(); - textarea.select(); - window.getSelection()?.collapseToEnd(); - } - }, 100); - }, [isOpen]); - - return ( - <Drawer isOpen={isOpen} onClose={onClose}> - <Drawer.Header> - <Drawer.CloseButton position="top-left" /> - <Drawer.Title text={title} /> - <Button - colorScheme="main" - fill={false} - size="medium" - className="flex-shrink-0 border-none !p-0 disabled:cursor-default disabled:text-placeholder" - onClick={handleConfirm} - > - 완료 - </Button> - </Drawer.Header> - <Drawer.Content> - <textarea - className="w-full resize-none border-none font-body1-regular focus:outline-none" - rows={15} - defaultValue={defaultComment} - placeholder={placeholder} - ref={ref} - /> - </Drawer.Content> - </Drawer> - ); - } -); - -CommentDrawer.displayName = 'CommentDrawer'; - -export default CommentDrawer; diff --git a/src/components/comment/CommentList.tsx b/src/components/comment/CommentList.tsx deleted file mode 100644 index 2fb4327ea..000000000 --- a/src/components/comment/CommentList.tsx +++ /dev/null @@ -1,206 +0,0 @@ -import { useMemo, useRef } from 'react'; - -import type { Writer } from '@/types/user'; - -import useDisclosure from '@/hooks/useDisclosure'; - -import EditCommentDrawer from '@/components/comment/CommentDrawer'; -import Avatar from '@/components/common/Avatar'; -import Menu from '@/components/common/Menu'; -import Button from '@/components/common/Button'; -import Modal from '@/components/common/Modal'; - -type Comment = { - id: number; - writer: Writer; - createdAt: string; - content: string; -}; - -interface CommentListProps { - comments: Comment[]; - name?: string; - isHidden?: boolean; - hiddenText?: string; - emptyText?: string; - isEditableComment?: (comment: Comment) => boolean; - onEditConfirm?: (commentId: Comment['id'], comment: string) => void; - onDeleteConfirm?: (commentId: Comment['id']) => void; -} - -const CommentList = ({ - name = '코멘트', - comments, - isHidden, - hiddenText, - emptyText, - isEditableComment, - onEditConfirm, - onDeleteConfirm, -}: CommentListProps) => { - const titleOnCommentEdit = useMemo( - () => [name, '수정하기'].join(' '), - [name] - ); - - if (isHidden) { - return ( - <p className="py-[2rem] text-center font-body2-regular">{hiddenText}</p> - ); - } - - if (comments.length === 0) { - return ( - <p className="self-center whitespace-pre-line py-[2rem] text-center font-body2-regular"> - {emptyText} - </p> - ); - } - - return ( - <ul className="flex flex-col gap-[1rem]"> - {comments.map(comment => { - const { id, writer, createdAt, content } = comment; - return ( - <li className="flex flex-col gap-[1rem] py-[1rem]" key={id}> - <div className="flex gap-[1rem]"> - <Avatar - src={writer.profileImageSrc} - name={writer.name} - size="medium" - /> - <div className="flex flex-grow flex-col"> - <Name name={writer.name} /> - <Date date={createdAt} /> - </div> - {isEditableComment && isEditableComment(comment) && ( - <CommentActionMenu - comment={comment} - titleOnCommentEdit={titleOnCommentEdit} - onEditConfirm={onEditConfirm} - onDeleteConfirm={onDeleteConfirm} - /> - )} - </div> - <CommentContent content={content} /> - </li> - ); - })} - </ul> - ); -}; - -export default CommentList; - -const Name = ({ name }: { name: string }) => ( - <p className="font-body2-bold">{name}</p> -); - -const Date = ({ date }: { date: string }) => ( - <p className="text-placeholder font-caption1-regular">{date}</p> -); - -const CommentContent = ({ content }: { content: string }) => ( - <p className="text-justify font-body1-regular">{content}</p> -); - -const CommentActionMenu = ({ - comment, - titleOnCommentEdit, - onEditConfirm, - onDeleteConfirm, -}: { - comment: Comment; - titleOnCommentEdit?: string; - onEditConfirm?: (commentId: Comment['id'], newComment: string) => void; - onDeleteConfirm?: (commentId: Comment['id']) => void; -}) => { - const { id: commentId, content } = comment; - const commentRef = useRef<HTMLTextAreaElement>(null); - - const { - isOpen: isDrawerOpen, - onOpen: onDrawerOpen, - onClose: onDrawerClose, - } = useDisclosure(); - - const { - isOpen: isModalOpen, - onOpen: onModalOpen, - onClose: onModalClose, - } = useDisclosure(); - - const handleEditConfirm = () => { - const comment = commentRef.current?.value; - - if (!comment) { - return; - } - - onEditConfirm && onEditConfirm(commentId, comment); - }; - - const handleDeleteConfirm = () => { - onDeleteConfirm && onDeleteConfirm(commentId); - }; - - return ( - <> - <Menu> - <Menu.Toggle /> - <Menu.DropdownList> - <Menu.Item onSelect={onDrawerOpen}>수정하기</Menu.Item> - <Menu.Item onSelect={onModalOpen}>삭제하기</Menu.Item> - </Menu.DropdownList> - </Menu> - <EditCommentDrawer - isOpen={isDrawerOpen} - onClose={onDrawerClose} - onConfirm={handleEditConfirm} - title={titleOnCommentEdit} - defaultComment={content} - placeholder={'더 멋진 코멘트를 작성해주세요!'} - ref={commentRef} - /> - <DeleteCommentModal - isOpen={isModalOpen} - onClose={onModalClose} - onConfirm={handleDeleteConfirm} - /> - </> - ); -}; - -const DeleteCommentModal = ({ - isOpen, - onClose, - onConfirm, -}: { - isOpen: boolean; - onClose: () => void; - onConfirm?: () => void; -}) => { - const handleConfirm = () => { - onConfirm && onConfirm(); - onClose(); - }; - - return ( - <Modal isOpen={isOpen} onClose={onClose}> - <div className="flex flex-col gap-[0.5rem] leading-loose font-subheading-bold"> - <p>정말 삭제할까요?</p> - <p className="text-black-500 font-body2-regular"> - 한번 삭제하면 되돌릴 수 없어요. - </p> - </div> - <div className="flex justify-end gap-[1rem]"> - <Button onClick={onClose} fill={false} colorScheme="grey" size="small"> - 취소 - </Button> - <Button onClick={handleConfirm} size="small"> - 확인 - </Button> - </div> - </Modal> - ); -}; diff --git a/src/components/common/AuthFailedErrorBoundary.tsx b/src/components/common/AuthFailedErrorBoundary.tsx deleted file mode 100644 index efd5ce15f..000000000 --- a/src/components/common/AuthFailedErrorBoundary.tsx +++ /dev/null @@ -1,43 +0,0 @@ -'use client'; - -import { useEffect } from 'react'; -import { QueryErrorResetBoundary } from '@tanstack/react-query'; -import { ErrorBoundary, FallbackProps } from 'react-error-boundary'; - -import useToast from '@/components/common/Toast/useToast'; -import { isAuthFailedError, isAxiosErrorWithCustomCode } from '@/utils/helpers'; -import Loading from '@/components/common/Loading'; - -const AuthFailedErrorBoundary = ({ - children, -}: { - children?: React.ReactNode; -}) => { - return ( - <QueryErrorResetBoundary> - {({ reset }) => ( - <ErrorBoundary onReset={reset} FallbackComponent={AuthFailedFallback}> - {children} - </ErrorBoundary> - )} - </QueryErrorResetBoundary> - ); -}; - -export default AuthFailedErrorBoundary; - -const AuthFailedFallback = ({ error, resetErrorBoundary }: FallbackProps) => { - const { show: showToast } = useToast(); - - useEffect(() => { - if ( - isAxiosErrorWithCustomCode(error) && - isAuthFailedError(error.response.data.code) - ) { - showToast({ message: '다시 로그인 해주세요' }); - resetErrorBoundary(); - } - }, [error, resetErrorBoundary, showToast]); - - return <Loading fullpage />; -}; diff --git a/src/components/common/Avatar.tsx b/src/components/common/Avatar.tsx deleted file mode 100644 index 04d3d2056..000000000 --- a/src/components/common/Avatar.tsx +++ /dev/null @@ -1,76 +0,0 @@ -'use client'; - -import { Children, ReactNode, useState } from 'react'; -import Image from 'next/image'; - -type AvatarSize = 'small' | 'medium' | 'large'; -interface AvatarProps { - name?: string; - src?: string; - size?: AvatarSize; - border?: boolean; -} - -const FALLBACK_IMAGE_SRC = '/icons/avatar.svg'; - -const getAvatarSize = (size: AvatarSize) => { - switch (size) { - case 'small': { - return { - sizeClasses: 'w-[2rem] h-[2rem]', - sizeProps: { width: 20, height: 20 }, - } as const; - } - case 'medium': { - return { - sizeClasses: 'w-[3.2rem] h-[3.2rem]', - sizeProps: { width: 32, height: 32 }, - } as const; - } - case 'large': { - return { - sizeClasses: 'w-[7rem] h-[7rem]', - sizeProps: { width: 70, height: 70 }, - } as const; - } - } -}; - -const Avatar = ({ name, src, size = 'medium', border }: AvatarProps) => { - const [image, setImage] = useState(src ?? FALLBACK_IMAGE_SRC); - - const { sizeClasses, sizeProps } = getAvatarSize(size); - const borderClass = border ? 'border-[0.15rem]' : 'border-none'; - - const setFallbackImage = () => setImage(FALLBACK_IMAGE_SRC); - - return ( - <span - className={`relative inline-block rounded-full border-white bg-white ${sizeClasses} ${borderClass}`} - > - <Image - alt={name || 'avatar'} - src={image} - className={`h-full w-full rounded-full object-cover`} - {...sizeProps} - onError={setFallbackImage} - /> - </span> - ); -}; - -export default Avatar; - -const AvatarGroup = ({ children }: { children?: ReactNode }) => { - return ( - <div className="mr-[0.75rem] flex flex-row-reverse items-center justify-end"> - {Children.toArray(children).map((avatar, idx) => ( - <span key={idx} className={`-me-[0.75rem] leading-none`}> - {avatar} - </span> - ))} - </div> - ); -}; - -export { AvatarGroup }; diff --git a/src/components/common/BackButton.tsx b/src/components/common/BackButton.tsx deleted file mode 100644 index d7215430c..000000000 --- a/src/components/common/BackButton.tsx +++ /dev/null @@ -1,15 +0,0 @@ -'use client'; - -import { IconArrowLeft } from '@public/icons'; -import { useRouter } from 'next/navigation'; - -const BackButton = () => { - const router = useRouter(); - return ( - <button onClick={() => router.back()}> - <IconArrowLeft /> - </button> - ); -}; - -export default BackButton; diff --git a/src/components/common/Badge.tsx b/src/components/common/Badge.tsx deleted file mode 100644 index 0076bbd56..000000000 --- a/src/components/common/Badge.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { PropsWithChildren, useMemo } from 'react'; - -type Size = 'small' | 'medium' | 'large'; -type ColorScheme = 'main' | 'main-light' | 'grey' | 'red'; -type FontWeight = 'thin' | 'normal' | 'bold'; - -type BadgeProps = PropsWithChildren<{ - size?: Size; - colorScheme?: ColorScheme; - fontWeight?: FontWeight; - isFilled?: boolean; -}>; - -const getSizeClasses = (size: Size) => { - switch (size) { - case 'small': { - return 'h-[1.8rem] text-2xs'; - } - case 'medium': { - return 'h-[1.9rem] text-xs'; - } - case 'large': { - return 'h-[2.1rem] text-xs'; - } - } -}; - -const getSchemeClasses = (colorScheme: ColorScheme, isFilled: boolean) => { - switch (colorScheme) { - case 'main': { - return isFilled - ? 'border-main-900 bg-main-900 text-white' - : 'border-main-900 text-main-900'; - } - case 'main-light': { - return isFilled - ? 'border-main-600 bg-main-600 text-white' - : 'border-main-600 text-main-600'; - } - case 'grey': { - return isFilled - ? 'border-black-100 bg-black-100 text-black-500' - : 'border-black-500 text-black-500'; - } - case 'red': { - return isFilled - ? 'border-warning-800 bg-warning-800 text-white' - : 'border-warning-800 text-warning-800'; - } - } -}; - -const getFontWeightClasses = (fontWeight: FontWeight) => { - switch (fontWeight) { - case 'thin': { - return 'font-thin'; - } - case 'normal': { - return 'font-normal'; - } - case 'bold': { - return 'font-bold'; - } - } -}; - -const Badge = ({ - size = 'medium', - colorScheme = 'main', - fontWeight = 'normal', - isFilled = true, - children, - ...props -}: BadgeProps) => { - const computedClasses = useMemo(() => { - const sizeClass = getSizeClasses(size); - const schemeClass = getSchemeClasses(colorScheme, isFilled); - const fontWeightClass = getFontWeightClasses(fontWeight); - - return [sizeClass, schemeClass, fontWeightClass].join(' '); - }, [size, colorScheme, isFilled, fontWeight]); - - return ( - <div - className={`m-0 flex w-fit items-center justify-center gap-[0.4rem] rounded-[0.5rem] border-[0.1rem] px-[0.6rem] py-[0.25rem] ${computedClasses}`} - {...props} - > - {children} - </div> - ); -}; - -export default Badge; diff --git a/src/components/common/BottomActionButton.tsx b/src/components/common/BottomActionButton.tsx deleted file mode 100644 index 1e5b3e5e2..000000000 --- a/src/components/common/BottomActionButton.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentPropsWithoutRef } from 'react'; - -import Button from '@/components/common/Button'; - -type BottomActionButtonProps = Omit< - ComponentPropsWithoutRef<typeof Button>, - 'className' ->; - -const BottomActionButton = ({ - children, - ...props -}: BottomActionButtonProps) => { - return ( - <footer className="fixed bottom-0 left-0 right-0 z-10 mx-auto w-full max-w-[43rem] bg-white px-[2.0rem] pb-[calc(env(safe-area-inset-bottom)+1.5rem)] pt-[1.5rem]"> - <Button size="full" {...props}> - {children} - </Button> - </footer> - ); -}; - -export default BottomActionButton; diff --git a/src/components/common/BottomNavigation.tsx b/src/components/common/BottomNavigation.tsx deleted file mode 100644 index f2470192b..000000000 --- a/src/components/common/BottomNavigation.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import Link from 'next/link'; - -import { - IconBookarchive, - IconDiscover, - IconGroup, - IconProfile, -} from '@public/icons'; - -type BottomNavigationProps = { - pathname?: string; -}; - -const icons = [ - { - icon: <IconBookarchive />, - label: '북카이브', - href: '/bookarchive', - }, - { - icon: <IconDiscover />, - label: '도서 검색', - href: '/book/search', - }, - { - icon: <IconGroup />, - label: '독서 모임', - href: '/group', - }, - { - icon: <IconProfile />, - label: '내 프로필', - href: '/profile/me', - }, -] as const; - -const iconColor = { - active: 'fill-main-900 text-main-900', - inactive: 'fill-black-900 text-black-900', -} as const; - -const BottomNavigation = ({ pathname }: BottomNavigationProps) => { - return ( - <nav className="fixed bottom-0 left-[50%] flex w-full max-w-[43rem] -translate-x-1/2 justify-between rounded-t-[2rem] border-t-[0.05rem] border-black-200 bg-white px-[3.2rem] pb-[calc(env(safe-area-inset-bottom)+1.4rem)] pt-[1.4rem] shadow-bottom-navigation"> - {icons.map(({ icon, label, href }) => ( - <Link key={label} type="button" href={href}> - <button - className={`flex h-[4.4rem] min-w-[4.503rem] flex-col items-center justify-center ${ - href === pathname ? iconColor.active : iconColor.inactive - }`} - > - <div className="h-[2.6rem] w-[2.6rem]">{icon}</div> - <p className="font-caption1-bold">{label}</p> - </button> - </Link> - ))} - </nav> - ); -}; - -export default BottomNavigation; diff --git a/src/components/common/BottomSheet.tsx b/src/components/common/BottomSheet.tsx deleted file mode 100644 index 8b8310989..000000000 --- a/src/components/common/BottomSheet.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { Dialog, Transition } from '@headlessui/react'; -import { Fragment, PropsWithChildren } from 'react'; - -interface BottomSheetProps { - isShow?: boolean; - onClose: () => void; -} - -const BottomSheet = ({ - isShow = false, - onClose, - children, -}: PropsWithChildren<BottomSheetProps>) => { - return ( - <Transition.Root show={isShow} as={Fragment}> - <Dialog as="div" className="relative z-10" onClose={onClose}> - <Transition.Child - as={Fragment} - enter="ease-in-out duration-300" - enterFrom="opacity-0" - enterTo="opacity-100" - leave="ease-in-out duration-300" - leaveFrom="opacity-100" - leaveTo="opacity-0" - > - <div className="fixed inset-0 bg-overlay/60 transition-opacity" /> - </Transition.Child> - - <div className="fixed inset-0 overflow-hidden"> - <div className="absolute inset-0 overflow-hidden"> - <div className="pointer-events-none fixed bottom-0 left-1/2 flex max-w-full -translate-x-1/2"> - <Transition.Child - as={Fragment} - enter="transform transition ease-in-out duration-300" - enterFrom="translate-y-full" - enterTo="translate-y-0" - leave="transform transition ease-in-out duration-300" - leaveFrom="translate-y-0" - leaveTo="translate-y-full" - > - <Dialog.Panel className="pointer-events-auto relative max-h-[100dvh] w-[43rem] rounded-t-[1.5rem] bg-white px-[1rem] py-[1.5rem]"> - {children} - </Dialog.Panel> - </Transition.Child> - </div> - </div> - </div> - </Dialog> - </Transition.Root> - ); -}; - -export default BottomSheet; diff --git a/src/components/common/Button.tsx b/src/components/common/Button.tsx deleted file mode 100644 index 5daa304af..000000000 --- a/src/components/common/Button.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import type { ComponentPropsWithoutRef, PropsWithChildren } from 'react'; -import { useMemo } from 'react'; - -type Size = 'small' | 'medium' | 'large' | 'full'; -type ColorScheme = 'main' | 'main-light' | 'warning' | 'grey' | 'kakao'; - -type ButtonProps = PropsWithChildren<{ - size?: Size; - colorScheme?: ColorScheme; - fill?: boolean; - fullRadius?: boolean; -}> & - ComponentPropsWithoutRef<'button'>; - -const getSizeClasses = (size: Size) => { - switch (size) { - case 'small': { - return 'font-body2-bold px-[1.2rem] py-[0.6rem]'; - } - case 'medium': { - return 'font-body1-bold px-[1.6rem] py-[0.8rem]'; - } - case 'large': { - return 'font-body1-bold px-[2.4rem] py-[1rem]'; - } - case 'full': { - return 'font-body1-bold px-[2.4rem] py-[1rem] w-full'; - } - default: { - // medium - return 'font-body1-bold px-[1.6rem] py-[0.8rem]'; - } - } -}; - -const getSchemeClasses = ( - theme: ColorScheme, - isFill: boolean, - disabled?: boolean -) => { - if (disabled) { - return ( - 'cursor-default ' + - (isFill - ? 'border-transparent bg-black-900/[0.12] text-black-900/[0.26]' - : 'border-black-900/[0.12] bg-white text-black-900/[0.26]') - ); - } - - switch (theme) { - case 'main': { - return isFill - ? 'border-main-900 bg-main-900 text-white' - : 'border-main-900 text-main-900'; - } - case 'main-light': { - return 'border-transparent bg-main-600/[.18] text-main-900 !font-normal'; - } - case 'warning': { - return isFill - ? 'border-warning-800 bg-warning-800 text-white ' - : 'border-warning-800 text-warning-800'; - } - case 'grey': { - return isFill - ? 'border-black-400 bg-black-400 text-black-500 ' - : 'border-black-400 text-black-500'; - } - case 'kakao': { - return 'border-kakao bg-kakao text-kakao-dark'; - } - } -}; - -const BASE_BUTTON_CLASSES = - 'cursor-pointer border-[0.1rem] leading-none inline-block focus:outline-none focus:ring-1'; - -const Button = ({ - size = 'medium', - colorScheme = 'main', - fill = true, - fullRadius = false, - className, - disabled, - children, - ...props -}: ButtonProps) => { - const computedClasses = useMemo(() => { - const sizeClass = getSizeClasses(size); - const schemeClass = getSchemeClasses(colorScheme, fill, disabled); - const roundedClass = fullRadius ? 'rounded-full' : 'rounded-[5px]'; - - return [sizeClass, schemeClass, roundedClass].join(' '); - }, [size, colorScheme, fill, fullRadius, disabled]); - - return ( - <button - type="button" - className={`${BASE_BUTTON_CLASSES} ${computedClasses} ${className}`} - disabled={disabled} - {...props} - > - {children} - </button> - ); -}; - -export default Button; diff --git a/src/components/common/ContextProvider.tsx b/src/components/common/ContextProvider.tsx deleted file mode 100644 index f9dce64ee..000000000 --- a/src/components/common/ContextProvider.tsx +++ /dev/null @@ -1,20 +0,0 @@ -'use client'; - -import { ReactNode } from 'react'; - -import PWAServiceWorkerProvider from '@/components/common/PWAServiceWorkerProvider'; -import ReactQueryProvider from '@/components/common/ReactQueryProvider'; - -import ToastProvider from '@/components/common/Toast/ToastProvider'; - -const ContextProvider = ({ children }: { children: ReactNode }) => { - return ( - <PWAServiceWorkerProvider> - <ReactQueryProvider> - <ToastProvider>{children}</ToastProvider> - </ReactQueryProvider> - </PWAServiceWorkerProvider> - ); -}; - -export default ContextProvider; diff --git a/src/components/common/DatePicker.tsx b/src/components/common/DatePicker.tsx deleted file mode 100644 index 9f6c40742..000000000 --- a/src/components/common/DatePicker.tsx +++ /dev/null @@ -1,86 +0,0 @@ -'use client'; - -import { - ChangeEventHandler, - forwardRef, - InputHTMLAttributes, - Ref, - useEffect, - useState, -} from 'react'; - -import { formatDateInputValue } from '@/utils/date'; - -import { IconSelect } from '@public/icons'; - -interface DatePickerProps - extends Omit< - InputHTMLAttributes<HTMLInputElement>, - 'value' | 'id' | 'className' - > { - defaultValue?: string; -} - -const DatePicker = ( - { - name, - onChange, - disabled = false, - defaultValue = '', - ...props - }: DatePickerProps, - ref: Ref<HTMLInputElement> -) => { - const [currentDate, setCurrentDate] = useState(defaultValue); - - const disabledClasses = disabled - ? 'text-black-500 cursor-not-allowed [&_svg]:fill-black-500' - : 'text-black-900 cursor-pointer [&_svg]:fill-black-900'; - - const handleInputChange: ChangeEventHandler<HTMLInputElement> = event => { - setCurrentDate(event.target.value); - onChange && onChange(event); - }; - - useEffect(() => { - if (defaultValue) return; - - const $date = document.querySelector(`input#${name}`) as HTMLInputElement; - - if (!$date) return; - setCurrentDate($date.value); - }, [defaultValue, name]); - - return ( - <label - className={`relative flex h-[3rem] max-w-[16rem] items-center justify-between gap-[0.5rem] bg-transparent ${disabledClasses}`} - htmlFor={name} - > - <div className="flex h-full min-w-0 flex-grow items-center"> - <input - id={name} - name={name} - ref={ref} - type="date" - className="h-full w-0" - disabled={disabled} - defaultValue={currentDate} - onChange={handleInputChange} - {...props} - /> - <p - className={`truncate font-body1-regular ${ - currentDate ? 'text-black-700' : 'text-placeholder' - }`} - > - {currentDate - ? formatDateInputValue(currentDate) - : '날짜를 선택해주세요'} - </p> - </div> - <IconSelect className={`h-[1.2rem] w-[1.2rem] flex-shrink-0`} /> - </label> - ); -}; - -export default forwardRef(DatePicker); diff --git a/src/components/common/Drawer.tsx b/src/components/common/Drawer.tsx deleted file mode 100644 index 6e1b34704..000000000 --- a/src/components/common/Drawer.tsx +++ /dev/null @@ -1,136 +0,0 @@ -import { - createContext, - Fragment, - PropsWithChildren, - ReactNode, - useContext, -} from 'react'; -import { Dialog, Transition } from '@headlessui/react'; - -import useRemoveVerticalScroll from '@/hooks/useRemoveVerticalScroll'; - -import { IconClose } from '@public/icons'; -import Button from '@/components/common/Button'; - -interface DrawerProps { - isOpen: boolean; - onClose: () => void; -} - -type DrawerContextValue = DrawerProps; - -const DrawerContext = createContext({} as DrawerContextValue); -const useDrawerContext = () => useContext(DrawerContext); - -const Drawer = ({ - isOpen, - onClose, - children, -}: PropsWithChildren<DrawerProps>) => { - useRemoveVerticalScroll({ enabled: isOpen }); - - return ( - <DrawerContext.Provider value={{ isOpen, onClose }}> - <Transition.Root show={isOpen} as={Fragment}> - <Dialog className="relative z-10" onClose={onClose}> - {/** overlay */} - <Transition.Child - as={Fragment} - enter="ease-in-out duration-500" - enterFrom="opacity-0" - enterTo="opacity-100" - leave="ease-in-out duration-500" - leaveFrom="opacity-100" - leaveTo="opacity-0" - > - <div className=" fixed inset-0 bg-black-900/50 transition-opacity" /> - </Transition.Child> - - <div className="fixed inset-0 overflow-hidden"> - <div className="absolute inset-0 overflow-hidden"> - <div - className={`pointer-events-none fixed inset-y-0 right-0 flex w-full max-w-full justify-center`} - > - <Transition.Child - as={Fragment} - enter="transform transition ease-in-out duration-500 sm:duration-600" - enterFrom="translate-x-full opacity-0" - enterTo="translate-x-0 opacity-1" - leave="transform transition ease-in-out duration-500 sm:duration-600" - leaveFrom="translate-x-0 opacity-1" - leaveTo="translate-x-full opacity-0" - > - <Dialog.Panel className="pointer-events-auto relative w-screen max-w-[43rem]"> - <div - className={`flex h-full flex-col overflow-y-scroll bg-white pt-6 shadow-xl`} - > - {children} - </div> - </Dialog.Panel> - </Transition.Child> - </div> - </div> - </div> - </Dialog> - </Transition.Root> - </DrawerContext.Provider> - ); -}; - -const DrawerHeader = ({ children }: { children?: ReactNode }) => { - return ( - <div className="flex items-center justify-between px-6 py-[0.5rem] sm:px-8"> - {children} - </div> - ); -}; - -const DrawerContent = ({ children }: { children?: ReactNode }) => { - return ( - <div className="w-full px-6 pt-6 font-body1-regular sm:px-8"> - {children} - </div> - ); -}; - -const Title = ({ text }: { text?: string }) => { - return ( - <h1 className="flex-grow truncate pl-[2.5rem] text-center font-body1-regular"> - {text} - </h1> - ); -}; - -type Position = 'top-left' | 'top-right'; - -const getPositionClasses = (postion: Position) => { - switch (postion) { - case 'top-right': - return 'top-[2.4rem] right-[1.8rem]'; - case 'top-left': - default: - return 'top-[2.4rem] left-[1.8rem]'; - } -}; - -const CloseButton = ({ position = 'top-left' }: { position?: Position }) => { - const { onClose } = useDrawerContext(); - const positionClasses = getPositionClasses(position); - - return ( - <Button - onClick={onClose} - fill={false} - className={`absolute border-none !p-0 ${positionClasses}`} - > - <IconClose className={`h-[2rem] w-[2rem] fill-black-900 `} /> - </Button> - ); -}; - -Drawer.Header = DrawerHeader; -Drawer.Content = DrawerContent; -Drawer.Title = Title; -Drawer.CloseButton = CloseButton; - -export default Drawer; diff --git a/src/components/common/ErrorMessage.tsx b/src/components/common/ErrorMessage.tsx deleted file mode 100644 index 124c2a1c9..000000000 --- a/src/components/common/ErrorMessage.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { ReactNode } from 'react'; -import { IconErrorExclamation } from '@public/icons'; - -const ErrorMessage = ({ children }: { children?: ReactNode }) => { - return ( - <> - {children && ( - <div className="flex items-center gap-[0.4rem] text-warning-800 font-caption1-regular"> - <div className="h-[1.2rem] w-[1.2rem]"> - <IconErrorExclamation /> - </div> - {children} - </div> - )} - </> - ); -}; - -export default ErrorMessage; diff --git a/src/components/common/FloatingButton.tsx b/src/components/common/FloatingButton.tsx deleted file mode 100644 index 2b63ef77e..000000000 --- a/src/components/common/FloatingButton.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { ComponentPropsWithoutRef } from 'react'; - -import { IconPlus } from '@public/icons'; - -import Portal from '@/components/common/Portal'; - -interface FloatingButtonProps extends ComponentPropsWithoutRef<'button'> { - position?: string; - onClick?: () => void; -} - -const FloatingButton = ({ - position, - onClick, - ...props -}: FloatingButtonProps) => { - return ( - <Portal id="floating-button-root"> - <button - className={`fixed ${position} flex h-[5.1rem] w-[5.1rem] items-center justify-center rounded-full bg-main-900 shadow-floating-button`} - onClick={onClick} - {...props} - > - <IconPlus className="fill-white" /> - </button> - </Portal> - ); -}; - -export default FloatingButton; diff --git a/src/components/common/Funnel.tsx b/src/components/common/Funnel.tsx deleted file mode 100644 index 10173bf39..000000000 --- a/src/components/common/Funnel.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { Children, ReactElement, ReactNode, isValidElement } from 'react'; - -import type { NonEmptyArray } from '@/hooks/useFunnel'; - -import { assert } from '@/utils/assert'; - -export interface MoveFunnelStepProps { - onPrevStep?: () => void; - onNextStep?: () => void; - onSubmit?: () => void; -} - -export interface FunnelProps<Steps extends NonEmptyArray<string>> { - steps: Steps; - step: Steps[number]; - children: - | Array<ReactElement<StepProps<Steps>>> - | ReactElement<StepProps<Steps>>; -} - -export const Funnel = <Steps extends NonEmptyArray<string>>({ - steps, - step, - children, -}: FunnelProps<Steps>) => { - const validChildren = Children.toArray(children) - .filter(isValidElement) - .filter(i => - steps.includes((i.props as Partial<StepProps<Steps>>).name ?? '') - ) as Array<ReactElement<StepProps<Steps>>>; - - const targetStep = validChildren.find(child => child.props.name === step); - - assert(targetStep != null, `${step} 스텝 컴포넌트를 찾지 못했습니다.`); - - return <>{targetStep}</>; -}; - -export interface StepProps<Steps extends NonEmptyArray<string>> { - name: Steps[number]; - children: ReactNode; -} - -export const Step = <T extends NonEmptyArray<string>>({ - children, -}: StepProps<T>) => { - return <>{children}</>; -}; diff --git a/src/components/common/Input.tsx b/src/components/common/Input.tsx deleted file mode 100644 index 8e1c97f61..000000000 --- a/src/components/common/Input.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { ComponentPropsWithoutRef, forwardRef, Ref } from 'react'; - -type InputStyle = 'default' | 'line'; -type FontSize = 'small' | 'large'; -type LeftIconType = 'search'; - -interface InputProps extends ComponentPropsWithoutRef<'input'> { - inputStyle?: InputStyle; - leftIconType?: LeftIconType; - fontSize?: FontSize; - error?: boolean; - showSearchIcon?: boolean; -} - -const FONT_SIZE_CLASSES = { - small: 'font-body1-regular after:font-body1-regular', - large: 'font-subheading-bold after:font-subheading-bold', -}; - -const getInputStyleClasses = (inputStyle: InputStyle) => { - switch (inputStyle) { - case 'line': - return 'border-b-[0.1rem] border-black-400'; - case 'default': - default: - return 'rounded-[0.5rem] border-[0.05rem] px-[1rem]'; - } -}; - -const getLeftIconClass = (iconType?: LeftIconType) => { - switch (iconType) { - case 'search': - return 'pr-[1rem] before:h-[2.2rem] before:min-w-[2rem] before:relative before:top-[0.2rem] before:mx-[1rem] before:content-search'; - default: - return ''; - } -}; - -const Input = ( - { - inputStyle = 'default', - fontSize = 'small', - error = false, - leftIconType, - className = '', - ...props - }: InputProps, - ref: Ref<HTMLInputElement> -) => { - const inputStyleClass = getInputStyleClasses(inputStyle); - const leftIconClass = getLeftIconClass(leftIconType); - const fontSizeClass = FONT_SIZE_CLASSES[fontSize]; - const borderColorClass = error - ? 'border-warning-800 focus-within:border-warning-800' - : 'border-black-400 focus-within:border-main-900'; - - return ( - <div - className={`flex w-full items-center bg-transparent ${inputStyleClass} ${borderColorClass} ${fontSizeClass} ${leftIconClass} ${className}`} - > - <input - className={`h-[4.4rem] w-full bg-transparent outline-none autofill:shadow-[inset_0_0_0px_1000px_rgb(255,255,255)] ${fontSizeClass}`} - {...props} - ref={ref} - /> - </div> - ); -}; - -export default forwardRef(Input); diff --git a/src/components/common/InputLength.tsx b/src/components/common/InputLength.tsx deleted file mode 100644 index 212585dfd..000000000 --- a/src/components/common/InputLength.tsx +++ /dev/null @@ -1,22 +0,0 @@ -type InputLengthProps = { - currentLength?: number; - isError?: boolean; - maxLength?: number; -}; - -const InputLength = ({ - currentLength, - isError = false, - maxLength, -}: InputLengthProps) => { - const textColor = isError ? 'text-warning-800 ' : 'text-main-900'; - - return ( - <p className="font-caption1-regular"> - <span className={textColor}>{currentLength ? currentLength : 0}</span>/ - {maxLength} - </p> - ); -}; - -export default InputLength; diff --git a/src/components/common/LikeButton.tsx b/src/components/common/LikeButton.tsx deleted file mode 100644 index 9b091d8ab..000000000 --- a/src/components/common/LikeButton.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { APIBookshelfInfo } from '@/types/bookshelf'; -import { IconHeart } from '@public/icons'; - -type LikeButtonProps = { - isLiked: APIBookshelfInfo['isLiked']; - likeCount: APIBookshelfInfo['likeCount']; - onClick?: () => void; -}; - -const LikeButton = ({ isLiked, likeCount, onClick }: LikeButtonProps) => { - const BG_COLOR_CLASS = isLiked ? 'bg-warning-800' : 'bg-white'; - const ICON_COLOR_CLASS = isLiked ? 'stroke-white' : 'stroke-warning-800'; - const TEXT_COLOR_CLASS = isLiked ? 'text-white' : 'text-warning-800'; - - return ( - <button - onClick={onClick} - className={`${BG_COLOR_CLASS} flex h-[2.4rem] items-center gap-[0.4rem] rounded-full border-[0.1rem] border-warning-800 bg-warning-800`} - > - <IconHeart className={`${ICON_COLOR_CLASS} ml-[1rem]`} /> - <p - className={`${TEXT_COLOR_CLASS} mr-[1.1rem] min-w-[1.2rem] text-end font-caption1-bold`} - > - {likeCount} - </p> - </button> - ); -}; - -export default LikeButton; diff --git a/src/components/common/Loading.tsx b/src/components/common/Loading.tsx deleted file mode 100644 index b114c8ed1..000000000 --- a/src/components/common/Loading.tsx +++ /dev/null @@ -1,55 +0,0 @@ -const schemes = { - main: 'bg-main-900', - grey: 'bg-black-400', -} as const; - -type DotScheme = keyof typeof schemes; -interface LoadingProps { - color?: DotScheme; - fullpage?: boolean; -} - -const Loading = ({ color = 'main', fullpage = false }: LoadingProps) => { - if (fullpage) { - return ( - <div className="fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"> - <LoadingDots color={color} /> - </div> - ); - } - - return <LoadingDots color={color} />; -}; - -export default Loading; - -const LoadingDots = ({ color }: { color: DotScheme }) => ( - <div className="flex gap-[1rem]"> - <LoadingDot color={color} animationStep={1} /> - <LoadingDot color={color} animationStep={2} /> - <LoadingDot color={color} animationStep={3} /> - </div> -); - -type AnimationStep = 1 | 2 | 3; -type LoadingAnimations = { - [key in AnimationStep]: string; -}; - -const animations: LoadingAnimations = { - 1: 'animate-dot-flash', - 2: 'animate-dot-flash-delay-0.5', - 3: 'animate-dot-flash-delay-1', -}; - -const LoadingDot = ({ - color, - animationStep = 1, -}: { - color: DotScheme; - animationStep?: AnimationStep; -}) => ( - <span - className={`h-[1rem] w-[1rem] rounded-full ${schemes[color]} ${animations[animationStep]} translate-y-[5px] opacity-20`} - ></span> -); diff --git a/src/components/common/LoginBottomActionButton.tsx b/src/components/common/LoginBottomActionButton.tsx deleted file mode 100644 index 991e11018..000000000 --- a/src/components/common/LoginBottomActionButton.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import Link from 'next/link'; - -import { KAKAO_LOGIN_URL } from '@/constants'; - -import BottomActionButton from '@/components/common/BottomActionButton'; - -const LoginBottomActionButton = () => ( - <Link href={KAKAO_LOGIN_URL}> - <BottomActionButton>로그인 및 회원가입</BottomActionButton> - </Link> -); - -export default LoginBottomActionButton; diff --git a/src/components/common/Menu.tsx b/src/components/common/Menu.tsx deleted file mode 100644 index 92c029d64..000000000 --- a/src/components/common/Menu.tsx +++ /dev/null @@ -1,99 +0,0 @@ -'use client'; - -import { - PropsWithChildren, - createContext, - useCallback, - useContext, - useMemo, - useState, -} from 'react'; - -import { IconHamburger } from '@public/icons'; -import useOutsideClickRef from '@/hooks/useOutsideClickRef'; - -import BottomSheet from '@/components/common/BottomSheet'; - -type MenuContextValue = { - isOpen: boolean; - toggle: () => void; -}; - -const MenuContext = createContext({} as MenuContextValue); - -const Menu = ({ children }: { children?: React.ReactNode }) => { - const [isOpen, setOpen] = useState(false); - const toggle = useCallback(() => setOpen(prev => !prev), []); - const value = useMemo(() => ({ isOpen, toggle }), [isOpen, toggle]); - - const ref = useOutsideClickRef<HTMLDivElement>(() => setOpen(false)); - - return ( - <div className="relative" ref={ref}> - <MenuContext.Provider value={value}>{children}</MenuContext.Provider> - </div> - ); -}; - -const Toggle = () => { - const { toggle } = useContext(MenuContext); - - return ( - <div - className="flex h-[2.3rem] w-[2.3rem] cursor-pointer items-center justify-center" - onClick={toggle} - > - <IconHamburger className="h-[2rem] w-[2rem] hover:fill-black-500" /> - </div> - ); -}; - -const BottomSheetList = ({ children }: { children?: React.ReactNode }) => { - const { isOpen, toggle } = useContext(MenuContext); - return ( - <BottomSheet isShow={isOpen} onClose={toggle}> - {children} - </BottomSheet> - ); -}; - -const DropdownList = ({ children }: { children?: React.ReactNode }) => { - const { isOpen } = useContext(MenuContext); - return ( - <> - {isOpen && ( - <ul className="absolute right-0 top-[3rem] z-50 min-w-[10rem] rounded-[0.5rem] bg-white py-[0.5rem] shadow-[0_0_15px_rgba(0,0,0,0.05),0_1px_2px_rgba(0,0,0,0.1)]"> - {children} - </ul> - )} - </> - ); -}; - -const Item = ({ - onSelect, - children, -}: PropsWithChildren<{ onSelect?: () => void }>) => { - const { toggle } = useContext(MenuContext); - - const handleItemClick = () => { - toggle(); - onSelect && onSelect(); - }; - - return ( - <li - className="block cursor-pointer list-none truncate whitespace-nowrap rounded-[0.5rem] px-[1rem] py-[0.7rem] font-body2-regular hover:bg-black-100" - onClick={handleItemClick} - > - {children} - </li> - ); -}; - -Menu.Toggle = Toggle; -Menu.BottomSheetList = BottomSheetList; -Menu.DropdownList = DropdownList; -Menu.Item = Item; - -export default Menu; diff --git a/src/components/common/Modal.tsx b/src/components/common/Modal.tsx deleted file mode 100644 index a7a0834b4..000000000 --- a/src/components/common/Modal.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { Dialog, Transition } from '@headlessui/react'; -import { Fragment, ReactNode } from 'react'; - -interface ModalProps { - isOpen: boolean; - onClose: () => void; - children?: ReactNode; -} - -const Modal = ({ isOpen, onClose, children }: ModalProps) => { - return ( - <Transition appear show={isOpen} as={Fragment}> - <Dialog as="div" className="relative z-10" onClose={onClose}> - <Transition.Child - as={Fragment} - enter="ease-out duration-300" - enterFrom="opacity-0" - enterTo="opacity-100" - leave="ease-in duration-200" - leaveFrom="opacity-100" - leaveTo="opacity-0" - > - <div className="fixed inset-0 bg-overlay bg-opacity-60" /> - </Transition.Child> - - <div className="fixed inset-0 overflow-y-auto"> - <div className="flex min-h-full items-center justify-center"> - <Transition.Child - as={Fragment} - enter="ease-out duration-300" - enterFrom="opacity-0 scale-95" - enterTo="opacity-100 scale-100" - leave="ease-in duration-200" - leaveFrom="opacity-100 scale-100" - leaveTo="opacity-0 scale-95" - > - <Dialog.Panel className="flex w-[31.3rem] transform flex-col gap-[2.5rem] overflow-hidden rounded-[0.4rem] bg-white px-[2.5rem] py-[2rem] transition-all"> - {children} - </Dialog.Panel> - </Transition.Child> - </div> - </div> - </Dialog> - </Transition> - ); -}; - -export default Modal; diff --git a/src/components/common/PWAServiceWorkerProvider.tsx b/src/components/common/PWAServiceWorkerProvider.tsx deleted file mode 100644 index c46713b5e..000000000 --- a/src/components/common/PWAServiceWorkerProvider.tsx +++ /dev/null @@ -1,31 +0,0 @@ -'use client'; - -import { useEffect } from 'react'; - -const PWAServiceWorkerProvider = ({ - children, -}: { - children: React.ReactNode; -}) => { - useEffect(() => { - if ('serviceWorker' in navigator) { - const registerWorker = async () => { - const registration = await navigator.serviceWorker.register( - '/pwaServiceWorker.js' - ); - registration.waiting?.postMessage('SKIP_WAITING'); - }; - - try { - registerWorker(); - console.log('register success!'); - } catch (error) { - console.error('register failed: ', error); - } - } - }, []); - - return <>{children}</>; -}; - -export default PWAServiceWorkerProvider; diff --git a/src/components/common/Portal.tsx b/src/components/common/Portal.tsx deleted file mode 100644 index 58a9255e9..000000000 --- a/src/components/common/Portal.tsx +++ /dev/null @@ -1,32 +0,0 @@ -'use client'; - -import { PropsWithChildren, useEffect, useState } from 'react'; -import { createPortal } from 'react-dom'; - -type PortalProps = { - id: string; -}; - -const Portal = ({ id, children }: PropsWithChildren<PortalProps>) => { - const [element, setElement] = useState<HTMLElement | null>(null); - - useEffect(() => { - let rootElement = document.getElementById(id); - - if (!rootElement) { - rootElement = document.createElement('div'); - rootElement.setAttribute('id', id); - document.body.appendChild(rootElement); - } - - setElement(rootElement); - }, [id]); - - if (!element) { - return null; - } - - return createPortal(children, element); -}; - -export default Portal; diff --git a/src/components/common/ProgressBar.tsx b/src/components/common/ProgressBar.tsx deleted file mode 100644 index 1c0bc23a2..000000000 --- a/src/components/common/ProgressBar.tsx +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @param value percentage - */ -const ProgressBar = ({ - value, - className, -}: { - value: number; - className?: string; -}) => { - return ( - <div - className={ - 'absolute inset-x-0 h-[0.2rem] w-full overflow-hidden ' + className - } - > - <div className="absolute h-full w-full bg-main-500" /> - <div - className="absolute h-full w-full bg-main-900" - style={{ - transform: `translateX(-${100 - value}%)`, - transition: 'transform 0.4s ease-in-out', - }} - /> - </div> - ); -}; - -export default ProgressBar; diff --git a/src/components/common/QueryErrorBoundaryFallback.tsx b/src/components/common/QueryErrorBoundaryFallback.tsx deleted file mode 100644 index 5146aecec..000000000 --- a/src/components/common/QueryErrorBoundaryFallback.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import Button from '@/components/common/Button'; - -const QueryErrorBoundaryFallback = ({ - resetErrorBoundary, -}: { - resetErrorBoundary: (...args: unknown[]) => void; -}) => { - return ( - <div className="flex h-full w-full flex-col items-center justify-center gap-[1rem] rounded-lg py-[2rem]"> - <p className="font-body1-bold">데이터를 불러오는 중 문제가 발생했어요.</p> - <Button size="small" onClick={resetErrorBoundary}> - 다시 불러오기 - </Button> - </div> - ); -}; - -export default QueryErrorBoundaryFallback; diff --git a/src/components/common/RadioButton.tsx b/src/components/common/RadioButton.tsx deleted file mode 100644 index 3372c616a..000000000 --- a/src/components/common/RadioButton.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { ComponentPropsWithoutRef, forwardRef, Ref } from 'react'; - -type RadioButtonProps = { - label?: string; -} & Omit<ComponentPropsWithoutRef<'input'>, 'id' | 'type' | 'className'>; - -const BASE_RADIO_BUTTON_CLASSES = - 'px-[1.4rem] py-[0.6rem] bg-main-600/[0.18] text-main-900 font-body2-regular rounded-[2rem] cursor-pointer peer-checked:bg-main-900 peer-checked:text-white'; - -const RadioButton = ( - { name, value, label, ...props }: RadioButtonProps, - ref: Ref<HTMLInputElement> -) => { - return ( - <label htmlFor={`id-${value}`}> - <input - id={`id-${value}`} - name={name} - className="peer hidden" - type="radio" - value={value} - ref={ref} - {...props} - /> - <p className={BASE_RADIO_BUTTON_CLASSES}>{label ?? value}</p> - </label> - ); -}; - -export default forwardRef(RadioButton); diff --git a/src/components/common/SSRSafeSuspense.tsx b/src/components/common/SSRSafeSuspense.tsx deleted file mode 100644 index 11dae7a7b..000000000 --- a/src/components/common/SSRSafeSuspense.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { ComponentPropsWithoutRef, Suspense } from 'react'; - -import useMounted from '@/hooks/useMounted'; - -const SSRSafeSuspense = (props: ComponentPropsWithoutRef<typeof Suspense>) => { - const isMounted = useMounted(); - - if (isMounted) { - return <Suspense {...props} />; - } - - return <>{props.fallback}</>; -}; - -export default SSRSafeSuspense; diff --git a/src/components/common/Select.tsx b/src/components/common/Select.tsx deleted file mode 100644 index da626aad8..000000000 --- a/src/components/common/Select.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { ComponentPropsWithoutRef, forwardRef, Ref } from 'react'; - -interface SelectProps - extends Omit< - ComponentPropsWithoutRef<'select'>, - 'className' | 'defaultValue' | 'required' - > { - error?: boolean; -} - -const _Select = ( - { error, children, placeholder, ...props }: SelectProps, - ref: Ref<HTMLSelectElement> -) => { - const borderColor = error - ? 'border-warning-800' - : 'border-black-400 focus:border-main-900'; - - return ( - <div className="font-body2-regular"> - <select - ref={ref} - defaultValue="" - required - className={`rounded-[0.5rem] border-[0.05rem] px-[1.0rem] py-[1.1rem] outline-none ${borderColor} w-full cursor-pointer appearance-none bg-[url('/icons/select-icon.svg')] bg-[length:1.5rem_1.5rem] bg-[calc(100%-1rem)_center] bg-no-repeat invalid:text-placeholder`} - {...props} - > - {placeholder && ( - <option value="" disabled> - {placeholder} - </option> - )} - {children} - </select> - </div> - ); -}; - -const Option = ({ - value, - children, - ...props -}: ComponentPropsWithoutRef<'option'>) => { - return ( - <option value={value} {...props}> - {children} - </option> - ); -}; - -const Select = Object.assign(forwardRef(_Select), { Option }); - -export default Select; diff --git a/src/components/common/ShareButton.tsx b/src/components/common/ShareButton.tsx deleted file mode 100644 index 8b6c057c6..000000000 --- a/src/components/common/ShareButton.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import useToast from '@/components/common/Toast/useToast'; - -import { IconShare } from '@public/icons'; - -const ShareButton = () => { - const { show: showToast } = useToast(); - - const handleClickShareButton = () => { - const url = window.location.href; - - navigator.clipboard - .writeText(url) - .then(() => { - showToast({ message: '링크를 복사했어요', type: 'success' }); - }) - .catch(() => { - showToast({ message: '잠시 후 다시 시도해주세요', type: 'error' }); - }); - }; - - return ( - <button onClick={handleClickShareButton}> - <IconShare /> - </button> - ); -}; - -export default ShareButton; diff --git a/src/components/common/Skeleton.tsx b/src/components/common/Skeleton.tsx deleted file mode 100644 index ffb4c24ee..000000000 --- a/src/components/common/Skeleton.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { ReactNode } from 'react'; - -const Skeleton = ({ children }: { children?: ReactNode }) => { - return <div className="animate-pulse">{children}</div>; -}; - -type Size = 'small' | 'medium' | 'large'; -type XSize = 'xsmall' | 'xlarge'; -type XXSize = '2xsmall' | '2xlarge'; -type FullSize = 'full'; - -/** Circle Skeleton */ -type CircleSize = Size; - -const getCircleSize = (size: CircleSize) => { - switch (size) { - case 'large': - return 'w-[7rem] h-[7rem]'; - case 'medium': - return 'w-[3.2rem] h-[3.2rem]'; - case 'small': - default: - return 'w-[2rem] h-[2rem]'; - } -}; - -const Circle = ({ size = 'small' }: { size?: CircleSize }) => { - const sizeClasses = getCircleSize(size); - return <div className={`rounded-full bg-black-400 ${sizeClasses}`} />; -}; - -/** Text Skeleton */ -type FontSize = Size | XSize | XXSize; - -const getTextHeight = (size?: FontSize) => { - switch (size) { - case '2xsmall': - return 'h-[1rem]'; - case 'xsmall': - return 'h-[1.2rem]'; - case 'small': - return 'h-[1.4rem]'; - case 'medium': - return 'h-[1.6rem]'; - case 'large': - return 'h-[1.8rem]'; - case 'xlarge': - return 'h-[2rem]'; - case '2xlarge': - return 'h-[2.2rem]'; - default: - return 'h-[1.2rem]'; // small - } -}; - -const Text = ({ - width, - fontSize = 'small', -}: { - width?: string; - fontSize?: FontSize; -}) => { - const heightClasses = getTextHeight(fontSize); - return <div className={`bg-black-400 ${heightClasses}`} style={{ width }} />; -}; - -/** Rectangle Skelton */ -type RoundedSize = Size | FullSize; - -const getRoundedSize = (size?: RoundedSize) => { - switch (size) { - case 'small': - return 'rounded-[0.2rem]'; - case 'medium': - return 'rounded-[0.5rem]'; - case 'large': - return 'rounded-[2rem]'; - case 'full': - return 'rounded-full'; - default: - return 'rounded-none'; - } -}; - -const Rect = ({ - width, - height, - rounded, -}: { - width?: string; - height?: string; - rounded?: RoundedSize; -}) => { - const roundedClass = getRoundedSize(rounded); - return ( - <div className={`bg-black-400 ${roundedClass}`} style={{ width, height }} /> - ); -}; - -Skeleton.Circle = Circle; -Skeleton.Text = Text; -Skeleton.Rect = Rect; - -export default Skeleton; diff --git a/src/components/common/Stepper.tsx b/src/components/common/Stepper.tsx deleted file mode 100644 index 4ee73d842..000000000 --- a/src/components/common/Stepper.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import { - Children, - createContext, - PropsWithChildren, - ReactNode, - useContext, -} from 'react'; - -import { IconCheckStroke } from '@public/icons'; -import ProgressBar from '@/components/common/ProgressBar'; - -type StepStatus = 'complete' | 'incomplete' | 'active'; - -type StepContextValues = { - index: number; - status: StepStatus; - count: number; -}; - -const StepperContext = createContext<StepContextValues>( - {} as StepContextValues -); - -const Stepper = ({ - activeIndex, - children, -}: PropsWithChildren<{ activeIndex: number }>) => { - const stepElements = Children.toArray(children); - const stepCount = stepElements.length; - - const progressPercent = - activeIndex === 0 ? 0 : Math.ceil((activeIndex / (stepCount - 1)) * 100); - - const getStepStatus = (step: number): StepStatus => { - if (step < activeIndex) return 'complete'; - if (step > activeIndex) return 'incomplete'; - return 'active'; - }; - - return ( - <div className="relative z-[1] flex w-full items-center justify-between"> - <ProgressBar value={progressPercent} className="-z-[1]" /> - {stepElements.map((child, index) => ( - <StepperContext.Provider - key={index} - value={{ index, status: getStepStatus(index), count: stepCount }} - > - {child} - </StepperContext.Provider> - ))} - </div> - ); -}; - -const getStepClasses = (status: StepStatus, label?: string) => { - switch (status) { - case 'complete': - return 'bg-main-900'; - // TODO: label text width 계산 로직 추가 - case 'active': - return `bg-main-900 ${label ? 'w-[7.4rem]' : ''}`; - case 'incomplete': - default: - return 'bg-main-500'; - } -}; - -const Step = ({ - label, - children, -}: { - label?: string; - children?: ReactNode; -}) => { - const { status, index } = useContext(StepperContext); - - const statusClasses = getStepClasses(status, label); - const labelPositionClass = label - ? 'self-baseline px-[1.2rem]' - : 'self-center'; - - // 첫번째 스텝이 아니고, 라벨 text가 있는 경우만 opacity transition 적용 - const activeAnimationClasses = - index !== 0 && label ? 'opacity-0 animate-stepper-transition' : 'opacity-1'; - - const stepNumberToRender = index + 1; - const labelToRender = label ? label : stepNumberToRender; - - return ( - <div - className={`relative flex h-[3rem] w-[3rem] shrink-0 flex-col items-center justify-center rounded-full duration-500 ${statusClasses} overflow-hidden`} - > - {status === 'complete' ? ( - <IconCheckStroke className="h-auto w-[1rem]" /> - ) : status === 'active' ? ( - <p - className={`relative whitespace-nowrap text-white font-body2-bold ${activeAnimationClasses} ${labelPositionClass}`} - > - {labelToRender} - </p> - ) : ( - <p className="relative text-white font-body2-bold"> - {stepNumberToRender} - </p> - )} - {children} - </div> - ); -}; - -Stepper.Step = Step; - -export default Stepper; diff --git a/src/components/common/Switch.tsx b/src/components/common/Switch.tsx deleted file mode 100644 index 55b018204..000000000 --- a/src/components/common/Switch.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { ComponentPropsWithoutRef, forwardRef, Ref } from 'react'; - -const Switch = ( - { - name, - ...props - }: Omit<ComponentPropsWithoutRef<'input'>, 'id' | 'type' | 'className'>, - ref: Ref<HTMLInputElement> -) => { - return ( - <label - className="relative inline-flex h-[2.8rem] w-[4.9rem] cursor-pointer items-center" - htmlFor={name} - > - <input - id={name} - name={name} - className="peer hidden" - type="checkbox" - ref={ref} - {...props} - /> - <div className="absolute bottom-0 left-0 right-0 top-0 rounded-full bg-shadow peer-checked:bg-main-900" /> - <span className="absolute left-0 h-[2.4rem] w-[2.4rem] translate-x-[0.2rem] transform rounded-full bg-white transition peer-checked:translate-x-[2.3rem]" /> - <span className="sr-only">{`Enable ${name}`}</span> - </label> - ); -}; - -export default forwardRef(Switch); diff --git a/src/components/common/TextArea.tsx b/src/components/common/TextArea.tsx deleted file mode 100644 index 35fc9bb1f..000000000 --- a/src/components/common/TextArea.tsx +++ /dev/null @@ -1,104 +0,0 @@ -'use client'; - -import { - ChangeEventHandler, - ForwardedRef, - PropsWithChildren, - TextareaHTMLAttributes, - forwardRef, - useState, - ReactNode, - isValidElement, - Children, -} from 'react'; - -import ErrorMessage from '@/components/common/ErrorMessage'; -import InputLength from '@/components/common/InputLength'; - -interface BaseTextAreaProps - extends TextareaHTMLAttributes<HTMLTextAreaElement> { - error?: boolean; - defaultValue?: string; -} -interface TextAreaProps extends BaseTextAreaProps { - count?: boolean; -} - -const _TextArea = ( - { - maxLength = 500, - defaultValue, - count = false, - error = false, - onChange, - children, - ...props - }: PropsWithChildren<TextAreaProps>, - ref: ForwardedRef<HTMLTextAreaElement> -) => { - const [value, setValue] = useState(defaultValue || ''); - - const handleChange: ChangeEventHandler<HTMLTextAreaElement> = e => { - setValue(e.target.value); - onChange && onChange(e); - }; - - return ( - <div> - <BaseTextArea - onChange={handleChange} - maxLength={maxLength} - error={error} - ref={ref} - {...props} - /> - <div className="flex justify-between gap-[0.4rem]"> - {/** 에러 메세지 */} - <div>{getErrorChildren(children)}</div> - {/** 글자수 카운트 */} - {count && ( - <InputLength - currentLength={value.length} - isError={error} - maxLength={maxLength} - /> - )} - </div> - </div> - ); -}; - -const TextArea = Object.assign(forwardRef(_TextArea), { - Error: ErrorMessage, -}); - -const ErrorMessageType = (<ErrorMessage />).type; - -const getErrorChildren = (children: ReactNode) => { - const childrenArray = Children.toArray(children); - - return childrenArray.find( - child => isValidElement(child) && child.type === ErrorMessageType - ); -}; - -export default TextArea; - -const BaseTextArea = forwardRef<HTMLTextAreaElement, BaseTextAreaProps>( - ({ placeholder, error, ...props }, ref) => { - const borderColor = error - ? 'border-warning-800 focus:border-warning-800' - : 'border-black-400 focus:border-main-900'; - - return ( - <textarea - className={`min-h-[8rem] w-full resize-none rounded-[0.5rem] border-[0.05rem] p-[1rem] outline-none font-body1-regular placeholder:text-placeholder ${borderColor}`} - placeholder={placeholder || '내용을 입력해주세요'} - ref={ref} - {...props} - /> - ); - } -); - -BaseTextArea.displayName = 'BaseTextArea'; diff --git a/src/components/common/Toast/ToastItem.tsx b/src/components/common/Toast/ToastItem.tsx deleted file mode 100644 index 0a26d0786..000000000 --- a/src/components/common/Toast/ToastItem.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import type { ToastOption } from '@/components/common/Toast/types'; - -import { IconSuccess, IconWarning, IconError } from '@public/icons'; - -const ICONS = { - success: <IconSuccess />, - error: <IconError />, - warning: <IconWarning />, -} as const; - -const ToastItem = ({ type = 'warning', message }: ToastOption) => { - const icon = ICONS[type]; - - return ( - <div - className={`flex min-h-[5.3rem] w-full min-w-fit flex-row items-center gap-[1rem] rounded-full bg-black-500/[.98] px-[2rem] shadow-bookcover`} - > - {icon} - <p className={`!leading-tight tracking-wide text-white font-body2-bold`}> - {message} - </p> - </div> - ); -}; - -export default ToastItem; diff --git a/src/components/common/Toast/ToastProvider.tsx b/src/components/common/Toast/ToastProvider.tsx deleted file mode 100644 index ba6205efc..000000000 --- a/src/components/common/Toast/ToastProvider.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { createContext, ReactNode, useMemo, useState } from 'react'; - -import type { - ToastController, - ToastOption, -} from '@/components/common/Toast/types'; - -import ToastItem from '@/components/common/Toast/ToastItem'; -import Portal from '@/components/common/Portal'; - -export const ToastContext = createContext({} as ToastController); - -type SlideAnimation = 'slide-in' | 'slide-out' | 'slide-init'; - -const animations = { - 'slide-in': 'animate-slide-in', - 'slide-out': 'animate-slide-out', - 'slide-init': 'animate-slide-init', -} as const; - -const ToastProvider = ({ children }: { children?: ReactNode }) => { - const [toast, setToast] = useState<ToastOption | null>(null); - const [animation, setAnimation] = useState<SlideAnimation>('slide-init'); - - const controller = useMemo<ToastController>( - () => ({ - show: ({ type, message, duration = 2000 }) => { - setToast({ type, message, duration }); - - setAnimation('slide-init'); - setAnimation('slide-in'); - - setTimeout(() => { - setAnimation('slide-out'); - }, duration); - }, - }), - [] - ); - - return ( - <ToastContext.Provider value={controller}> - {children} - <Portal id="toast"> - <div - className={`fixed bottom-[calc(env(safe-area-inset-bottom)+1.5rem)] w-full max-w-[43rem] translate-y-[300%] ${animations[animation]} z-20 m-auto px-[1.5rem]`} - > - {toast && <ToastItem type={toast.type} message={toast.message} />} - </div> - </Portal> - </ToastContext.Provider> - ); -}; - -export default ToastProvider; diff --git a/src/components/common/Toast/types.ts b/src/components/common/Toast/types.ts deleted file mode 100644 index b867e684c..000000000 --- a/src/components/common/Toast/types.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type ToastType = 'warning' | 'success' | 'error'; - -export type ToastOption = { - type?: ToastType; - message: string; - duration?: number; -}; - -export type ToastController = { - show: (option: ToastOption) => void; -}; diff --git a/src/components/common/Toast/useToast.ts b/src/components/common/Toast/useToast.ts deleted file mode 100644 index ee2a900bb..000000000 --- a/src/components/common/Toast/useToast.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { useContext } from 'react'; - -import type { ToastOption } from '@/components/common/Toast/types'; - -import { ToastContext } from '@/components/common/Toast/ToastProvider'; - -const useToast = () => { - const toastController = useContext(ToastContext); - - return { - show: (option: ToastOption) => { - toastController.show(option); - }, - }; -}; - -export default useToast; diff --git a/src/components/common/TopHeader.tsx b/src/components/common/TopHeader.tsx deleted file mode 100644 index 7c2fc553e..000000000 --- a/src/components/common/TopHeader.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { PropsWithChildren } from 'react'; - -type TopHeaderProps = PropsWithChildren<{ - text: string; -}>; - -const TopHeader = ({ text, children }: TopHeaderProps) => { - return ( - <header className="flex w-full items-center justify-between pb-[2rem]"> - <h1 className="text-main-900 font-heading-bold">{text}</h1> - {children} - </header> - ); -}; - -export default TopHeader; diff --git a/src/components/common/TopNavigation.tsx b/src/components/common/TopNavigation.tsx deleted file mode 100644 index d5fc3cd78..000000000 --- a/src/components/common/TopNavigation.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { PropsWithChildren, ReactNode } from 'react'; - -interface TopNavigationProps { - children?: ReactNode; -} - -type ItemProps = TopNavigationProps; - -const TopNavigation = ({ children }: TopNavigationProps) => { - return ( - <div className="fixed left-0 right-0 top-0 z-50 mx-auto flex h-[2.4rem] w-full max-w-[43rem] items-center justify-center bg-white px-[4rem] py-[2.7rem] font-body1-regular"> - {children} - </div> - ); -}; - -const LeftItem = ({ children }: ItemProps) => { - return ( - <div className="absolute left-[0rem] flex pl-[2rem] [&_svg]:h-[2rem] [&_svg]:w-[2rem] [&_svg]:cursor-pointer"> - {children} - </div> - ); -}; - -type CenterItemProps = PropsWithChildren<{ textAlign?: 'left' | 'center' }>; - -const textAligns = { - left: 'text-left', - center: 'text-center', -} as const; - -const CenterItem = ({ children, textAlign = 'center' }: CenterItemProps) => { - const alignClassName = textAligns[textAlign]; - return ( - <div className={`w-full px-[1.5rem] ${alignClassName}`}>{children}</div> - ); -}; - -const RightItem = ({ children }: ItemProps) => { - return ( - <div className="absolute right-[0rem] flex gap-[1rem] pr-[2rem] [&_svg]:h-[2rem] [&_svg]:w-[2rem] [&_svg]:cursor-pointer"> - {children} - </div> - ); -}; - -TopNavigation.LeftItem = LeftItem; - -TopNavigation.CenterItem = CenterItem; - -TopNavigation.RightItem = RightItem; - -export default TopNavigation; diff --git a/src/components/layout/Layout.tsx b/src/components/layout/Layout.tsx deleted file mode 100644 index fc279e3bc..000000000 --- a/src/components/layout/Layout.tsx +++ /dev/null @@ -1,33 +0,0 @@ -'use client'; - -import { usePathname } from 'next/navigation'; - -import BottomNavigation from '@/components/common/BottomNavigation'; - -type LayoutProps = { - children?: React.ReactNode; -}; - -const rootPaths = ['/bookarchive', '/book/search', '/group', '/profile/me']; - -const Layout = ({ children }: LayoutProps) => { - const pathname = usePathname(); - const isRootPath = pathname && rootPaths.includes(pathname); - - const dynamicClass = isRootPath - ? 'pb-[calc(env(safe-area-inset-bottom)+7rem)] pt-[2rem]' - : 'pb-[calc(env(safe-area-inset-bottom)+2rem)] pt-[5.4rem]'; - - return ( - <> - <main - className={`h-auto min-h-[100dvh] w-full max-w-[43rem] animate-page-transition px-[2rem] ${dynamicClass}`} - > - {children} - </main> - {isRootPath && <BottomNavigation pathname={pathname} />} - </> - ); -}; - -export default Layout; diff --git a/src/components/profile/AddJobProfile.tsx b/src/components/profile/AddJobProfile.tsx deleted file mode 100644 index cae37eb3d..000000000 --- a/src/components/profile/AddJobProfile.tsx +++ /dev/null @@ -1,198 +0,0 @@ -'use client'; - -import { useRouter } from 'next/navigation'; -import { SubmitHandler, useForm } from 'react-hook-form'; - -import type { APIJobGroup } from '@/types/job'; - -import { isAxiosError } from 'axios'; -import useMyProfileMutation from '@/queries/user/useMyProfileMutation'; - -import TopNavigation from '@/components/common/TopNavigation'; -import Input from '@/components/common/Input'; -import InputLength from '@/components/common/InputLength'; -import Select from '@/components/common/Select'; -import ErrorMessage from '@/components/common/ErrorMessage'; -import useToast from '@/components/common/Toast/useToast'; - -type AddJobProfileProps = { - jobCategories: APIJobGroup[]; -}; - -type FormValues = { - nickname: string; - jobGroup: string; - job: string; -}; - -const AddJobProfile = ({ jobCategories }: AddJobProfileProps) => { - const { - register, - watch, - handleSubmit, - formState: { errors }, - } = useForm<FormValues>({ - mode: 'all', - defaultValues: { - nickname: '', - jobGroup: '', - job: '', - }, - }); - - const router = useRouter(); - const myProfileMutation = useMyProfileMutation(); - const toast = useToast(); - - const showToastEditSuccess = () => - toast.show({ - type: 'success', - message: '프로필을 등록했어요!', - duration: 3000, - }); - - /** - * @todo - * showToastEditFailed() - * 범용적으로 에러 핸들링 할 수 있도록 수정 - */ - - const showToastEditFailed = () => - toast.show({ - type: 'error', - message: '잠시 후 다시 시도해 주세요', - duration: 3000, - }); - - const handleSubmitForm: SubmitHandler<FormValues> = ({ - nickname, - jobGroup, - job, - }) => { - myProfileMutation.mutateAsync( - { - nickname, - job: { jobGroup: jobGroup, jobName: job }, - }, - { - onSuccess: () => { - router.replace('/bookarchive'); - showToastEditSuccess(); - }, - onError: error => { - if (isAxiosError(error) && error.response) { - console.error(error.response.data); - showToastEditFailed(); - } - }, - } - ); - }; - - return ( - <> - <TopNavigation> - <TopNavigation.CenterItem textAlign="center"> - <p className="text-black-900 font-body1-regular">프로필 등록</p> - </TopNavigation.CenterItem> - <TopNavigation.RightItem> - <button - onClick={handleSubmit(handleSubmitForm)} - className="text-main-900 font-body1-bold" - > - 완료 - </button> - </TopNavigation.RightItem> - </TopNavigation> - - <div className="mt-[3.8rem] flex w-full flex-col gap-[3.3rem]"> - <div className="flex flex-col gap-[1rem]"> - <span className="text-black-700 font-subheading-bold"> - 프로필을 등록해주세요! - </span> - <div className="text-placeholder font-body2-regular"> - <p>프로필을 등록하면</p> - <p> - <span className="text-main-900">다독다독</span>이 추천하는 책장을 - 볼 수 있어요. - </p> - </div> - </div> - - <form - onSubmit={handleSubmit(handleSubmitForm)} - className="flex w-full flex-col gap-[3.2rem]" - > - <div className="flex flex-col gap-[1rem]"> - <p className="text-black-700">닉네임</p> - <div className="flex flex-col gap-[0.5rem]"> - <Input - placeholder="닉네임을 입력해주세요." - {...register('nickname', { - required: '닉네임을 입력해주세요.', - minLength: { value: 2, message: '2자 이상 입력해 주세요.' }, - maxLength: { value: 10, message: '10자 이하 입력해 주세요.' }, - })} - error={!!errors.nickname} - /> - <div className="flex h-[1.4rem] flex-row-reverse justify-between"> - <InputLength - currentLength={watch('nickname')?.length} - isError={!!errors.nickname} - maxLength={10} - /> - {errors.nickname && ( - <ErrorMessage>{errors.nickname.message}</ErrorMessage> - )} - </div> - </div> - </div> - - <div className="flex flex-col gap-[1rem]"> - <p className="text-black-700">직업/직군</p> - - <div className="flex flex-col gap-[0.5rem]"> - <Select - placeholder="직군을 선택해주세요." - {...register('jobGroup', { - required: '직군을 선택해주세요.', - })} - error={!!errors.jobGroup} - > - {jobCategories.map(({ name, koreanName }) => ( - <Select.Option key={name} value={name}> - {koreanName} - </Select.Option> - ))} - </Select> - {errors.jobGroup && ( - <ErrorMessage>{errors.jobGroup.message}</ErrorMessage> - )} - </div> - - <div className="flex flex-col gap-[0.5rem]"> - <Select - placeholder="직업을 선택해주세요." - {...register('job', { - required: '직업을 선택해주세요.', - })} - error={!!errors.job} - > - {jobCategories - .find(({ name }) => name === watch('jobGroup')) - ?.jobs.map(({ name, koreanName }) => ( - <Select.Option key={name} value={name}> - {koreanName} - </Select.Option> - ))} - </Select> - {errors.job && <ErrorMessage>{errors.job.message}</ErrorMessage>} - </div> - </div> - </form> - </div> - </> - ); -}; - -export default AddJobProfile; diff --git a/src/components/profile/EditProfile.tsx b/src/components/profile/EditProfile.tsx deleted file mode 100644 index 91bf593d7..000000000 --- a/src/components/profile/EditProfile.tsx +++ /dev/null @@ -1,187 +0,0 @@ -'use client'; - -import Link from 'next/link'; -import { useRouter } from 'next/navigation'; -import { SubmitHandler, useForm } from 'react-hook-form'; - -import type { APIJobGroup } from '@/types/job'; -import type { APIUser } from '@/types/user'; - -import { isAxiosError } from 'axios'; -import useMyProfileMutation from '@/queries/user/useMyProfileMutation'; - -import { IconClose } from '@public/icons'; - -import TopNavigation from '@/components/common/TopNavigation'; -import Input from '@/components/common/Input'; -import InputLength from '@/components/common/InputLength'; -import Select from '@/components/common/Select'; -import ErrorMessage from '@/components/common/ErrorMessage'; -import useToast from '@/components/common/Toast/useToast'; - -type UserProfileProps = { - profile: Pick<APIUser, 'nickname' | 'job'>; - jobGroups: APIJobGroup[]; -}; - -type FormValues = { - nickname: string; - jobGroup: string; - job: string; -}; - -const EditProfile = ({ profile, jobGroups }: UserProfileProps) => { - const { - register, - watch, - handleSubmit, - formState: { errors }, - } = useForm<FormValues>({ - mode: 'all', - defaultValues: { - nickname: profile.nickname || '', - jobGroup: profile.job.jobGroupName || '', - job: profile.job.jobName || '', - }, - }); - - const router = useRouter(); - const myProfileMutation = useMyProfileMutation(); - const toast = useToast(); - - const showToastEditSuccess = () => - toast.show({ - type: 'success', - message: '프로필을 수정했어요', - duration: 3000, - }); - - const showToastEditFailed = () => - toast.show({ - type: 'error', - message: '잠시 후 다시 시도해주세요', - duration: 3000, - }); - - const handleSubmitForm: SubmitHandler<FormValues> = ({ - nickname, - jobGroup, - job, - }) => { - myProfileMutation.mutateAsync( - { - nickname, - job: { jobGroup, jobName: job }, - }, - { - onSuccess: () => { - router.replace('/profile/me'); - showToastEditSuccess(); - }, - onError: error => { - if (isAxiosError(error) && error.response) { - console.error(error.response.data); - showToastEditFailed(); - } - }, - } - ); - }; - - return ( - <> - <TopNavigation> - <TopNavigation.LeftItem> - <Link href="/profile/me" className="h-[2rem] w-[2rem] cursor-pointer"> - <IconClose className="fill-black-900" /> - </Link> - </TopNavigation.LeftItem> - <TopNavigation.CenterItem textAlign="center"> - <p className="text-black-900">프로필 수정</p> - </TopNavigation.CenterItem> - <TopNavigation.RightItem> - <button - onClick={handleSubmit(handleSubmitForm)} - className="text-main-900 font-body1-bold" - > - 완료 - </button> - </TopNavigation.RightItem> - </TopNavigation> - - <form - onSubmit={handleSubmit(handleSubmitForm)} - className="mt-[3.8rem] flex w-full flex-col gap-[3.2rem]" - > - <div className="flex flex-col gap-[1rem]"> - <p className=" text-black-700">닉네임</p> - <div className="flex flex-col gap-[0.5rem]"> - <Input - placeholder="닉네임을 입력해주세요." - {...register('nickname', { - required: '닉네임을 입력해주세요.', - minLength: { value: 2, message: '2자 이상 입력해 주세요.' }, - maxLength: { value: 10, message: '10자 이하 입력해 주세요.' }, - })} - error={!!errors.nickname} - /> - <div className="flex h-[1.4rem] flex-row-reverse justify-between"> - <InputLength - currentLength={watch('nickname')?.length} - isError={!!errors.nickname} - maxLength={10} - /> - {errors.nickname && ( - <ErrorMessage>{errors.nickname.message}</ErrorMessage> - )} - </div> - </div> - </div> - - <div className="flex flex-col gap-[1rem]"> - <p className="text-black-700">직업/직군</p> - - <div className="flex flex-col gap-[0.5rem]"> - <Select - placeholder="직군을 선택해주세요." - {...register('jobGroup', { - required: '직군을 선택해주세요.', - })} - error={!!errors.jobGroup} - > - {jobGroups.map(({ name, koreanName }) => ( - <Select.Option key={name} value={name}> - {koreanName} - </Select.Option> - ))} - </Select> - {errors.jobGroup && ( - <ErrorMessage>{errors.jobGroup.message}</ErrorMessage> - )} - </div> - - <div className="flex flex-col gap-[0.5rem]"> - <Select - placeholder="직업을 선택해주세요." - {...register('job', { - required: '직업을 선택해주세요.', - })} - error={!!errors.job} - > - {jobGroups - .find(({ name }) => name === watch('jobGroup')) - ?.jobs.map(({ name, koreanName }) => ( - <Select.Option key={name} value={name}> - {koreanName} - </Select.Option> - ))} - </Select> - {errors.job && <ErrorMessage>{errors.job.message}</ErrorMessage>} - </div> - </div> - </form> - </> - ); -}; - -export default EditProfile; diff --git a/src/components/profile/LoginBottomSheet.tsx b/src/components/profile/LoginBottomSheet.tsx deleted file mode 100644 index 93a324da1..000000000 --- a/src/components/profile/LoginBottomSheet.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { IconClose, IconKakao, LogoWithText } from '@public/icons'; - -import Button from '@/components/common/Button'; -import BottomSheet from '@/components/common/BottomSheet'; - -type LoginBottomSheetProps = { - isOpen: boolean; - onClose: () => void; -}; - -const LoginBottomSheet = ({ isOpen, onClose }: LoginBottomSheetProps) => { - const handleClickKakaoLogin = () => { - return (location.href = `${process.env.NEXT_PUBLIC_API_URL}/oauth2/authorize/kakao?redirect_uri=${process.env.NEXT_PUBLIC_CLIENT_REDIRECT_URI}`); - }; - - return ( - <BottomSheet isShow={isOpen} onClose={onClose}> - <IconClose - className="absolute right-0 top-0 mr-[2rem] mt-[2rem] h-[2rem] w-[2rem] cursor-pointer fill-black-900" - onClick={onClose} - /> - <div className="m-auto flex w-full max-w-[38rem] flex-col items-center gap-[2.5rem] px-[2rem] pt-[5rem]"> - <LogoWithText className="h-auto w-[6rem]" /> - <p className="text-black-700 font-subheading-bold"> - 로그인이 필요한 서비스에요! - </p> - <p className="whitespace-pre-line text-center text-placeholder font-body2-regular"> - 간편하게 카카오로 로그인을 하고, - <br /> - <span className="text-main-900">다독다독</span>의 다양한 기능을 - 이용해보세요. - </p> - <Button onClick={handleClickKakaoLogin} colorScheme="kakao" size="full"> - <div className="flex w-full items-center justify-center gap-[1rem]"> - <IconKakao className="h-auto w-[1.6rem]" /> - <p>카카오 로그인</p> - </div> - </Button> - </div> - </BottomSheet> - ); -}; - -export default LoginBottomSheet; diff --git a/src/components/profile/bookShelf/MyProfileBookshelfContainer.tsx b/src/components/profile/bookShelf/MyProfileBookshelfContainer.tsx deleted file mode 100644 index 763c99e71..000000000 --- a/src/components/profile/bookShelf/MyProfileBookshelfContainer.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import useMySummaryBookshelfQuery from '@/queries/bookshelf/useMySummaryBookShelfQuery'; - -import ProfileBookshelfPresenter from '@/components/profile/bookShelf/ProfileBookshelfPresenter'; - -const MyProfileBookshelfContainer = () => { - const { data } = useMySummaryBookshelfQuery(); - - return <ProfileBookshelfPresenter {...data} />; -}; - -export default MyProfileBookshelfContainer; diff --git a/src/components/profile/bookShelf/ProfileBookShelf.tsx b/src/components/profile/bookShelf/ProfileBookShelf.tsx deleted file mode 100644 index 8005fc5cf..000000000 --- a/src/components/profile/bookShelf/ProfileBookShelf.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import type { APIUser } from '@/types/user'; - -import MyProfileBookshelfContainer from '@/components/profile/bookShelf/MyProfileBookshelfContainer'; -import UserProfileBookshelfContainer from '@/components/profile/bookShelf/UserProfileBookshelfContainer'; - -const ProfileBookShelf = ({ userId }: { userId: 'me' | APIUser['userId'] }) => { - return userId === 'me' ? ( - <MyProfileBookshelfContainer /> - ) : ( - <UserProfileBookshelfContainer userId={userId} /> - ); -}; - -export default ProfileBookShelf; diff --git a/src/components/profile/bookShelf/ProfileBookshelfPresenter.tsx b/src/components/profile/bookShelf/ProfileBookshelfPresenter.tsx deleted file mode 100644 index 0bccbbb86..000000000 --- a/src/components/profile/bookShelf/ProfileBookshelfPresenter.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { APIBookshelf } from '@/types/bookshelf'; - -import BookShelf from '@/components/bookShelf/BookShelf'; - -import { IconArrowRight, IconHeart } from '@public/icons'; -import Link from 'next/link'; - -const ProfileBookshelfPresenter = ({ - bookshelfId, - books, - likeCount, -}: APIBookshelf) => { - return ( - <div className="flex flex-col gap-[1rem]"> - <div className="flex items-center justify-between"> - <Link - href={`/bookshelf/${bookshelfId}`} - className="flex items-center gap-[0.5rem]" - > - <h3 className="font-body1-bold">책장</h3> - <IconArrowRight height="1.3rem" width="1.3rem" /> - </Link> - <div className="flex items-center gap-[0.3rem] px-[0.6rem] py-[0.2rem]"> - <IconHeart className=" fill-warning-800 stroke-warning-800" /> - <p className=" text-black-600 font-caption2-bold">{likeCount}</p> - </div> - </div> - - <BookShelf> - <div className="w-app pb-[2.5rem] pt-[2rem] shadow-[0px_20px_20px_-16px_#D1D1D1]"> - <BookShelf.Background /> - <BookShelf.Books books={books} /> - </div> - </BookShelf> - </div> - ); -}; - -export default ProfileBookshelfPresenter; diff --git a/src/components/profile/bookShelf/UserProfileBookshelfContainer.tsx b/src/components/profile/bookShelf/UserProfileBookshelfContainer.tsx deleted file mode 100644 index 3269dba7b..000000000 --- a/src/components/profile/bookShelf/UserProfileBookshelfContainer.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import useUserSummaryBookshelfQuery from '@/queries/bookshelf/useUserSummaryBookShelfQuery'; -import type { APIUser } from '@/types/user'; - -import ProfileBookshelfPresenter from '@/components/profile/bookShelf/ProfileBookshelfPresenter'; - -const UserProfileBookshelfContainer = ({ - userId, -}: { - userId: APIUser['userId']; -}) => { - const { data } = useUserSummaryBookshelfQuery(userId); - - return <ProfileBookshelfPresenter {...data} />; -}; - -export default UserProfileBookshelfContainer; diff --git a/src/components/profile/group/ProfileGroup.tsx b/src/components/profile/group/ProfileGroup.tsx deleted file mode 100644 index d729b5337..000000000 --- a/src/components/profile/group/ProfileGroup.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import SSRSafeSuspense from '@/components/common/SSRSafeSuspense'; - -import { APIUser } from '@/types/user'; - -import ProfileGroupContainer from '@/components/profile/group/ProfileGroupContainer'; -import Skeleton from '@/components/common/Skeleton'; - -const ProfileGroup = ({ userId }: { userId: 'me' | APIUser['userId'] }) => { - return ( - <SSRSafeSuspense fallback={<ProfileGroupSkeleton />}> - <ProfileGroupContainer userId={userId} /> - </SSRSafeSuspense> - ); -}; - -export default ProfileGroup; - -const ProfileGroupSkeleton = () => { - return ( - <Skeleton> - <div className="flex flex-col gap-[1.5rem]"> - <Skeleton.Text fontSize="2xlarge" width="6rem" /> - <div className="flex gap-[1rem] overflow-scroll"> - <div className="flex flex-col gap-[1rem]"> - <Skeleton.Rect rounded="small" width="10rem" height="12.3rem" /> - <Skeleton.Text fontSize="small" width="10rem" /> - </div> - <div className="flex flex-col gap-[1rem]"> - <Skeleton.Rect rounded="small" width="10rem" height="12.3rem" /> - <Skeleton.Text fontSize="small" width="10rem" /> - </div> - <div className="flex flex-col gap-[1rem]"> - <Skeleton.Rect rounded="small" width="10rem" height="12.3rem" /> - <Skeleton.Text fontSize="small" width="10rem" /> - </div> - <div className="flex flex-col gap-[1rem]"> - <Skeleton.Rect rounded="small" width="10rem" height="12.3rem" /> - <Skeleton.Text fontSize="small" width="10rem" /> - </div> - </div> - </div> - </Skeleton> - ); -}; diff --git a/src/components/profile/group/ProfileGroupContainer.tsx b/src/components/profile/group/ProfileGroupContainer.tsx deleted file mode 100644 index edf0270e5..000000000 --- a/src/components/profile/group/ProfileGroupContainer.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import useMyGroupsQuery from '@/queries/group/useMyGroupQuery'; -import useMyProfileQuery from '@/queries/user/useMyProfileQuery'; -import type { APIUser } from '@/types/user'; - -import { checkAuthentication } from '@/utils/helpers'; - -import ProfileGroupPresenter from '@/components/profile/group/ProfileGroupPresenter'; - -const ProfileGroupContainer = ({ - userId, -}: { - userId: 'me' | APIUser['userId']; -}) => { - const isAuthenticated = checkAuthentication(); - - const { data } = useMyGroupsQuery({ enabled: isAuthenticated }); - const { - data: { userId: myId }, - } = useMyProfileQuery({ enabled: userId === 'me' }); - - const isMeOwner = (ownerId: number) => ownerId === myId; - - return ( - <ProfileGroupPresenter userId={userId} isGroupOwner={isMeOwner} {...data} /> - ); -}; - -export default ProfileGroupContainer; diff --git a/src/components/profile/group/ProfileGroupPresenter.tsx b/src/components/profile/group/ProfileGroupPresenter.tsx deleted file mode 100644 index 9f99d8645..000000000 --- a/src/components/profile/group/ProfileGroupPresenter.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { APIGroup } from '@/types/group'; -import { APIUser } from '@/types/user'; -import SimpleBookGroupCard from '@/components/bookGroup/SimpleBookGroupCard'; -import { IconArrowRight } from '@public/icons'; -import Link from 'next/link'; - -interface ProfileGroupPresenterProps { - userId: 'me' | APIUser['userId']; - bookGroups: APIGroup[]; - isGroupOwner?: (ownerId: number) => boolean; -} - -const ProfileGroupPresenter = ({ - userId, - bookGroups, - isGroupOwner, -}: ProfileGroupPresenterProps) => { - return ( - <div className="mt-[0.5rem] flex flex-col gap-[1.5rem]"> - <Link - href={`/profile/${userId}/group`} - className="flex w-fit items-center gap-[0.5rem]" - > - <h3 className="font-body1-bold">참여한 모임</h3> - <IconArrowRight height="1.3rem" width="1.3rem" /> - </Link> - - <ul className="relative left-0 flex w-[calc(100%+2rem)] gap-[1rem] overflow-y-hidden overflow-x-scroll pb-[1.5rem] pr-[2rem]"> - {bookGroups.map(({ bookGroupId, title, owner, book: { imageUrl } }) => ( - <li key={bookGroupId}> - <SimpleBookGroupCard - title={title} - imageSource={imageUrl} - isOwner={!!isGroupOwner && isGroupOwner(owner.id)} - bookGroupId={bookGroupId} - /> - </li> - ))} - </ul> - </div> - ); -}; - -export default ProfileGroupPresenter; diff --git a/src/components/profile/info/ProfileInfo.tsx b/src/components/profile/info/ProfileInfo.tsx deleted file mode 100644 index ad52ea252..000000000 --- a/src/components/profile/info/ProfileInfo.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import type { APIUser } from '@/types/user'; - -import SSRSafeSuspense from '@/components/common/SSRSafeSuspense'; - -import MyProfileContainer from '@/components/profile/info/MyProfileInfoContainer'; -import UserProfileInfoContainer from '@/components/profile/info/UserProfileInfoContainer'; -import Skeleton from '@/components/common/Skeleton'; - -type ProfileInfoProps = { - userId: 'me' | APIUser['userId']; -}; - -const ProfileInfo = ({ userId }: ProfileInfoProps) => { - return ( - <SSRSafeSuspense fallback={<ProfileInfoSkeleton />}> - {userId === 'me' ? ( - <MyProfileContainer /> - ) : ( - <UserProfileInfoContainer userId={userId} /> - )} - </SSRSafeSuspense> - ); -}; - -export default ProfileInfo; - -const ProfileInfoSkeleton = () => { - return ( - <Skeleton> - <div className="mb-[2rem] flex flex-col gap-[2rem]"> - <div className="flex gap-[0.8rem]"> - <Skeleton.Rect width="3.8rem" height="2.1rem" /> - <Skeleton.Rect width="10.4rem" height="2.1rem" /> - </div> - <div className="flex items-center gap-[1rem]"> - <Skeleton.Circle size="large" /> - <Skeleton.Text fontSize="2xlarge" width="18rem" /> - </div> - </div> - </Skeleton> - ); -}; diff --git a/src/components/profile/info/ProfileInfoPresenter.tsx b/src/components/profile/info/ProfileInfoPresenter.tsx deleted file mode 100644 index d2d3df0dd..000000000 --- a/src/components/profile/info/ProfileInfoPresenter.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import type { APIUser } from '@/types/user'; -import Avatar from '@/components/common/Avatar'; -import Badge from '@/components/common/Badge'; - -type ProfileInfoProps = Pick<APIUser, 'nickname' | 'profileImage' | 'job'>; - -const ProfileInfoPresenter = ({ - nickname, - profileImage, - job: { jobGroupKoreanName, jobNameKoreanName }, -}: ProfileInfoProps) => { - return ( - <div className="mb-[2rem] flex flex-col gap-[2rem]"> - <div className="flex gap-[0.8rem]"> - <Badge - colorScheme="main" - isFilled={false} - size="large" - fontWeight="bold" - > - {jobGroupKoreanName} - </Badge> - <Badge - colorScheme="main" - isFilled={false} - size="large" - fontWeight="bold" - > - {jobNameKoreanName} - </Badge> - </div> - <div className="flex items-center gap-[1rem]"> - <Avatar src={profileImage} size="large" /> - <h2 className="font-subheading-regular"> - <b>{nickname}</b>님의 공간 - </h2> - </div> - </div> - ); -}; - -export default ProfileInfoPresenter; diff --git a/src/constants/FormRule/index.ts b/src/constants/FormRule/index.ts new file mode 100644 index 000000000..9b8a3b818 --- /dev/null +++ b/src/constants/FormRule/index.ts @@ -0,0 +1,120 @@ +import type { RegisterOptions } from 'react-hook-form'; + +const FORM_RULES: { + [index: string]: RegisterOptions; +} = { + nickname: { + required: '닉네임을 입력해주세요.', + minLength: { + value: 2, + message: '닉네임을 2자 이상 입력해주세요.', + }, + maxLength: { + value: 10, + message: '닉네임을 10자 이하로 입력해주세요.', + }, + pattern: { + value: /^[가-힣0-9a-zA-Z]{2,10}$/, + message: '한글, 영문, 숫자만 입력 가능해요.', + }, + }, + email: { + required: '이메일을 입력해주세요', + pattern: { + value: + /([\w-.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/, + message: '이메일 형식을 다시 확인해주세요.', + }, + }, + jobGroup: { + required: '직군을 선택해주세요.', + }, + job: { + required: '직업을 선택해주세요.', + }, + title: { + required: '모임 제목을 입력해 주세요.', + minLength: { + value: 2, + message: '모임 제목을 2자 이상 입력해 주세요.', + }, + maxLength: { + value: 30, + message: '모임 제목을 30자 이하로 입력해 주세요.', + }, + }, + introduce: { + required: '모임 설명을 입력해 주세요.', + minLength: { + value: 10, + message: '모임 설명을 10자 이상 입력해 주세요.', + }, + maxLength: { + value: 150, + message: '모임 설명을 150자 이하로 입력해 주세요.', + }, + }, + maxMemberCount: { + required: '모임 인원을 입력해 주세요.', + min: { + value: 1, + message: '모임 인원을 1명 이상 입력해 주세요.', + }, + max: { + value: 500, + message: '인원이 너무 많습니다.', + }, + pattern: { + value: /^[0-9]+$/, + message: '숫자를 입력해 주세요.', + }, + }, + startDate: { + required: '모임 시작일을 선택해 주세요.', + validate: value => + new Date(value).setHours(0, 0, 0, 0) >= new Date().setHours(0, 0, 0, 0) || + '시작일은 오늘부터 가능해요.', + }, + endDate: { + required: '모임 종료일을 선택해 주세요.', + validate: { + possible: (_, { startDate, endDate }) => + new Date(startDate) <= new Date(endDate) || + '종료일은 시작일보다 늦어야 해요.', + }, + }, + bookId: { + required: true, + validate: { + positive: value => Number(value) > 0, + }, + }, + joinQuestion: { + required: '문제 설명을 입력해 주세요.', + minLength: { + value: 5, + message: '문제 설명을 5자 이상 입력해 주세요.', + }, + maxLength: { + value: 30, + message: '문제 설명을 30자 이하로 입력해 주세요.', + }, + }, + joinPasswd: { + required: '정답을 입력해 주세요.', + minLength: { + value: 1, + message: '정답을 1자 이상 입력해 주세요.', + }, + maxLength: { + value: 30, + message: '정답을 10자 이하로 입력해 주세요.', + }, + pattern: { + value: /^[ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9]{1,10}$/, + message: '띄어쓰기 없이 정답을 입력해 주세요.', + }, + }, +} as const; + +export default FORM_RULES; diff --git a/src/constants/groupRadioValues.ts b/src/constants/groupRadioValues.ts index 6851c1b04..b49e44caa 100644 --- a/src/constants/groupRadioValues.ts +++ b/src/constants/groupRadioValues.ts @@ -1,8 +1,42 @@ -export const MAX_MEMBER_COUNT_OPTIONS = [ - { label: '제한없음', value: 9999 }, - { label: '50명', value: 50 }, - { label: '100명', value: 100 }, - { label: '200명', value: 200 }, - { label: '500명', value: 500 }, - { label: '직접 입력', value: 'custom' }, -] as const; +export const MAX_MEMBER_COUNT_VALUE = [ + { + value: 'null', + text: '제한없음', + }, + { + value: '500', + text: '500명', + }, + { + value: '200', + text: '200명', + }, + { + value: '100', + text: '100명', + }, + { + value: '50', + text: '50명', + }, + { + value: '직접입력', + text: '직접입력', + }, +]; + +export const MAX_MEMBER_DEFAULT_VALUE = 'null'; + +export const IS_PUBLICK_VALUE = [ + { value: 'true', text: '공개' }, + { value: 'false', text: '비공개' }, +]; + +export const IS_PUBLICK_DEFAULT_VALUE = 'true'; + +export const HAS_JOIN_PASSWORD_VALUE = [ + { value: 'true', text: '필요' }, + { value: 'false', text: '불필요' }, +]; + +export const HAS_JOIN_PASSWORD_DEFAULT_VALUE = 'false'; diff --git a/src/constants/index.ts b/src/constants/index.ts index c8d049316..a42b42ad7 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1,4 +1,3 @@ export * from './storage'; export * from './error'; export * from './groupRadioValues'; -export * from './url'; diff --git a/src/constants/initialBookGroupComments.ts b/src/constants/initialBookGroupComments.ts new file mode 100644 index 000000000..7a7ad88ff --- /dev/null +++ b/src/constants/initialBookGroupComments.ts @@ -0,0 +1,38 @@ +export const initialBookGroupComments = [ + { + userId: 1, + commentId: 11414, + contents: + '다독 서비스 개발자 백민종님은 누구보다 열정적이고 훌륭한 개발자입니다. 리더십이 뛰어납니다. 그리고 내기를 좋아합니다. 도박을 좋아하는 것은 아니고 콜라, 커피내기를 주로 합니다. 승률은 낮습니다.', + userProfileImage: '', + nickname: '고양시MZ', + writtenByCurrentUser: false, + }, + { + userId: 2, + commentId: 53452, + contents: + '다독 서비스 개발자 우대현님은 착하고 성실하고 성숙하고 센스있고 어른스럽습니다. 죄송합니다. 제가 이 부분을 만들었기 때문에 제가 상상하는 미래의 제 모습을 적어 보았습니다.', + userProfileImage: '', + nickname: 'OLDBOY', + writtenByCurrentUser: false, + }, + { + userId: 3, + commentId: 36363, + contents: + '다독 서비스 개발자 김규란님은 근면성실은 아니지만 정말 열심히 공부하고 개발하는 개발자 입니다. 운동신경이 뛰어납니다. 저희 팀 내에서 운동 관련 승률이 가장 높습니다. 이기고 싶다면 규란님과 팀을 해야 합니다.', + userProfileImage: '', + nickname: 'fired계란', + writtenByCurrentUser: false, + }, + { + userId: 4, + commentId: 67951, + contents: + '다독 서비스 개발자 김재현님은 의외성 No.1 입니다. 맡은 일을 뚝딱뚝딱 잘해내 팀원들을 놀라게 하는것이 특기입니다. 또한 프로젝트 기간 동안 데브코스 강의장과 가장 가까이 지내면서 여유를 부리다 늦게와 구론산을 많이 샀습니다.(늦게 오는것은 아니고 항상 1-3분 정도? ㅎ)', + userProfileImage: '', + nickname: 'OneMetro', + writtenByCurrentUser: false, + }, +]; diff --git a/src/constants/metadata/appleSplashScreens.ts b/src/constants/metadata/appleSplashScreens.ts deleted file mode 100644 index a6063ec48..000000000 --- a/src/constants/metadata/appleSplashScreens.ts +++ /dev/null @@ -1,232 +0,0 @@ -const appleSplashScreens = [ - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)', - url: '/images/splash-screens/iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)', - url: '/images/splash-screens/iPhone_15_Pro__iPhone_15__iPhone_14_Pro_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)', - url: '/images/splash-screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)', - url: '/images/splash-screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)', - url: '/images/splash-screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)', - url: '/images/splash-screens/iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)', - url: '/images/splash-screens/iPhone_11__iPhone_XR_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)', - url: '/images/splash-screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)', - url: '/images/splash-screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)', - url: '/images/splash-screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 1032px) and (device-height: 1376px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)', - url: '/images/splash-screens/13__iPad_Pro_M4_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)', - url: '/images/splash-screens/12.9__iPad_Pro_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 834px) and (device-height: 1210px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)', - url: '/images/splash-screens/11__iPad_Pro_M4_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)', - url: '/images/splash-screens/11__iPad_Pro__10.5__iPad_Pro_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 820px) and (device-height: 1180px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)', - url: '/images/splash-screens/10.9__iPad_Air_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)', - url: '/images/splash-screens/10.5__iPad_Air_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)', - url: '/images/splash-screens/10.2__iPad_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)', - url: '/images/splash-screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)', - url: '/images/splash-screens/8.3__iPad_Mini_landscape.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)', - url: '/images/splash-screens/iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)', - url: '/images/splash-screens/iPhone_15_Pro__iPhone_15__iPhone_14_Pro_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)', - url: '/images/splash-screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)', - url: '/images/splash-screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)', - url: '/images/splash-screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)', - url: '/images/splash-screens/iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)', - url: '/images/splash-screens/iPhone_11__iPhone_XR_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)', - url: '/images/splash-screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)', - url: '/images/splash-screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)', - url: '/images/splash-screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 1032px) and (device-height: 1376px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)', - url: '/images/splash-screens/13__iPad_Pro_M4_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)', - url: '/images/splash-screens/12.9__iPad_Pro_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 834px) and (device-height: 1210px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)', - url: '/images/splash-screens/11__iPad_Pro_M4_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)', - url: '/images/splash-screens/11__iPad_Pro__10.5__iPad_Pro_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 820px) and (device-height: 1180px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)', - url: '/images/splash-screens/10.9__iPad_Air_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)', - url: '/images/splash-screens/10.5__iPad_Air_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)', - url: '/images/splash-screens/10.2__iPad_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)', - url: '/images/splash-screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png', - }, - { - rel: 'apple-touch-startup-image', - media: - 'screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)', - url: '/images/splash-screens/8.3__iPad_Mini_portrait.png', - }, -]; - -export default appleSplashScreens; diff --git a/src/constants/metadata/index.ts b/src/constants/metadata/index.ts deleted file mode 100644 index 6066e9b53..000000000 --- a/src/constants/metadata/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as appleSplashScreens } from './appleSplashScreens'; diff --git a/src/constants/url.ts b/src/constants/url.ts deleted file mode 100644 index 78b83ec13..000000000 --- a/src/constants/url.ts +++ /dev/null @@ -1,6 +0,0 @@ -export const DATA_URL = { - placeholder: - 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUGFdjWL9+/X8ABysDDapsaG4AAAAASUVORK5CYII=', // data url for placeholder color (#AFAFAF) -}; - -export const KAKAO_LOGIN_URL = `${process.env.NEXT_PUBLIC_API_URL}/oauth2/authorize/kakao?redirect_uri=${process.env.NEXT_PUBLIC_CLIENT_REDIRECT_URI}`; diff --git a/src/hocs/withAuthRequired.tsx b/src/hocs/withAuthRequired.tsx deleted file mode 100644 index db655b3ae..000000000 --- a/src/hocs/withAuthRequired.tsx +++ /dev/null @@ -1,36 +0,0 @@ -'use client'; - -import { useRouter } from 'next/navigation'; -import { useEffect, useState } from 'react'; - -import { checkAuthentication } from '@/utils/helpers'; - -const withAuthRequired = <P extends object>( - WrappedComponent: React.ComponentType<P> -) => { - const Component = (props: P) => { - const router = useRouter(); - - const [isAuthenticated, setIsAuthenticated] = useState(false); - - useEffect(() => { - const hasAccessToken = checkAuthentication(); - - if (!hasAccessToken) { - router.push('/login'); - } else { - setIsAuthenticated(hasAccessToken); - } - }, [router]); - - if (!isAuthenticated) { - return null; - } else { - return <WrappedComponent {...props} />; - } - }; - - return Component; -}; - -export default withAuthRequired; diff --git a/src/hocs/withScrollLockOnFocus.tsx b/src/hocs/withScrollLockOnFocus.tsx deleted file mode 100644 index 034462b75..000000000 --- a/src/hocs/withScrollLockOnFocus.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { forwardRef, Ref, useState } from 'react'; - -import useRemoveVerticalScroll from '@/hooks/useRemoveVerticalScroll'; - -const withScrollLockOnFocus = <P extends object>( - WrappedComponent: React.ComponentType<P> -) => { - const Component = (props: P, ref: Ref<HTMLElement>) => { - const [focus, setFocus] = useState(false); - useRemoveVerticalScroll({ enabled: focus }); - - return ( - <WrappedComponent - {...props} - onFocus={() => setFocus(true)} - onBlur={() => setFocus(false)} - ref={ref} - /> - ); - }; - - return forwardRef(Component); -}; - -export default withScrollLockOnFocus; diff --git a/src/hooks/auth/atoms/index.ts b/src/hooks/auth/atoms/index.ts new file mode 100644 index 000000000..db67d71fd --- /dev/null +++ b/src/hooks/auth/atoms/index.ts @@ -0,0 +1,22 @@ +import { atom, useRecoilState, useResetRecoilState } from 'recoil'; + +import { ACCESS_TOKEN_STORAGE_KEY } from '@/constants/index'; +import webStorage from '@/utils/storage'; + +const accessTokenAtom = atom<string | null>({ + key: 'accessToken', + default: null, + effects: [ + ({ setSelf }) => { + const storage = webStorage(ACCESS_TOKEN_STORAGE_KEY); + const storedToken = storage.get(); + + storedToken && setSelf(storedToken); + }, + ], +}); + +const useAccessToken = () => useRecoilState(accessTokenAtom); +const useResetAccessToken = () => useResetRecoilState(accessTokenAtom); + +export { useAccessToken, useResetAccessToken }; diff --git a/src/hooks/auth/index.ts b/src/hooks/auth/index.ts new file mode 100644 index 000000000..7fa087d9f --- /dev/null +++ b/src/hooks/auth/index.ts @@ -0,0 +1 @@ +export { default as useAuth } from './useAuth'; diff --git a/src/hooks/auth/useAuth.ts b/src/hooks/auth/useAuth.ts new file mode 100644 index 000000000..6a7783a3b --- /dev/null +++ b/src/hooks/auth/useAuth.ts @@ -0,0 +1,23 @@ +import { ACCESS_TOKEN_STORAGE_KEY } from '@/constants/index'; +import webStorage from '@/utils/storage'; + +const useAuth = () => { + const storage = webStorage(ACCESS_TOKEN_STORAGE_KEY); + const accessToken = storage.get(); + + const setAuth = (newToken: string) => { + storage.set(newToken); + }; + + const removeAuth = () => { + storage.remove(); + }; + + return { + isAuthed: !!accessToken, + setAuth, + removeAuth, + }; +}; + +export default useAuth; diff --git a/src/hooks/group/useJoinBookGroup.ts b/src/hooks/group/useJoinBookGroup.ts deleted file mode 100644 index 1894392ad..000000000 --- a/src/hooks/group/useJoinBookGroup.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { isAxiosErrorWithCustomCode } from '@/utils/helpers'; -import { SERVICE_ERROR_MESSAGE } from '@/constants'; -import groupAPI from '@/apis/group'; -import useToast from '@/components/common/Toast/useToast'; -import { useBookGroupJoinInfo } from '@/queries/group/useBookGroupQuery'; - -const useJoinBookGroup = (groupId: number) => { - const { data: bookGroupJoinData, refetch } = useBookGroupJoinInfo(groupId); - const { isExpired, isMember, hasPassword, question } = bookGroupJoinData; - - const toast = useToast(); - - const joinBookGroup = async ({ - answer, - onSuccess, - }: { - answer?: string; - onSuccess?: () => void; - }) => { - try { - await groupAPI.joinGroup({ bookGroupId: groupId, password: answer }); - toast.show({ message: '🎉 모임에 가입되었어요! 🎉', type: 'success' }); - onSuccess && onSuccess(); - } catch (error) { - if (!isAxiosErrorWithCustomCode(error)) { - toast.show({ message: '잠시 후 다시 시도해주세요', type: 'error' }); - return; - } - - const { code } = error.response.data; - const message = SERVICE_ERROR_MESSAGE[code]; - const isWrongAnswerErrorCode = code === 'BG3'; - - if (isWrongAnswerErrorCode) { - toast.show({ - message: '정답이 아니에요. 다시 시도해주세요!', - type: 'error', - }); - return; - } - - toast.show({ message, type: 'error' }); - } - }; - - return { - isExpired, - isMember, - hasPassword, - question, - refetch, - joinBookGroup, - }; -}; - -export default useJoinBookGroup; diff --git a/src/hooks/toast/atoms/index.ts b/src/hooks/toast/atoms/index.ts new file mode 100644 index 000000000..6d5cb7af7 --- /dev/null +++ b/src/hooks/toast/atoms/index.ts @@ -0,0 +1,12 @@ +import { atom } from 'recoil'; + +export interface ToastAtom { + id: number; + message: string; + duration?: number; +} + +export const toastsAtom = atom<ToastAtom[]>({ + key: 'toasts', + default: [], +}); diff --git a/src/hooks/toast/index.ts b/src/hooks/toast/index.ts new file mode 100644 index 000000000..1077520cf --- /dev/null +++ b/src/hooks/toast/index.ts @@ -0,0 +1 @@ +export { default as useToast } from './useToast'; diff --git a/src/hooks/toast/useToast.ts b/src/hooks/toast/useToast.ts new file mode 100644 index 000000000..1d6759cc1 --- /dev/null +++ b/src/hooks/toast/useToast.ts @@ -0,0 +1,29 @@ +import { useCallback } from 'react'; +import { useSetRecoilState } from 'recoil'; +import { ToastAtom, toastsAtom } from './atoms'; + +const useToast = () => { + const setToasts = useSetRecoilState(toastsAtom); + + const hideToast = useCallback( + (toastId: ToastAtom['id']) => { + setToasts(currentToasts => + currentToasts.filter(toast => toast.id !== toastId) + ); + }, + [setToasts] + ); + + const showToast = useCallback( + ({ message, duration = 2000 }: Pick<ToastAtom, 'message' | 'duration'>) => { + const id = new Date().getTime(); + setToasts(currentToasts => [...currentToasts, { message, duration, id }]); + setTimeout(() => hideToast(id), 500 + duration); + }, + [hideToast, setToasts] + ); + + return { showToast }; +}; + +export default useToast; diff --git a/src/hooks/useDisclosure.ts b/src/hooks/useDisclosure.ts deleted file mode 100644 index 8310847a7..000000000 --- a/src/hooks/useDisclosure.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { useState } from 'react'; - -const useDisclosure = () => { - const [isOpen, setIsOpen] = useState<boolean>(false); - - const onOpen = () => { - setIsOpen(true); - }; - - const onClose = () => { - setIsOpen(false); - }; - - return { isOpen, onOpen, onClose }; -}; - -export default useDisclosure; diff --git a/src/hooks/useFunnel.tsx b/src/hooks/useFunnel.tsx deleted file mode 100644 index 3241a6532..000000000 --- a/src/hooks/useFunnel.tsx +++ /dev/null @@ -1,93 +0,0 @@ -'use client'; - -import { useEffect, useMemo, useRef } from 'react'; -import { usePathname, useRouter, useSearchParams } from 'next/navigation'; - -import { assert } from '@/utils/assert'; - -import type { FunnelProps, StepProps } from '@/components/common/Funnel'; -import { Funnel, Step } from '@/components/common/Funnel'; - -export type NonEmptyArray<T> = readonly [T, ...T[]]; - -type RouteFunnelProps<Steps extends NonEmptyArray<string>> = Omit< - FunnelProps<Steps>, - 'steps' | 'step' ->; - -type FunnelComponent<Steps extends NonEmptyArray<string>> = (( - props: RouteFunnelProps<Steps> -) => JSX.Element) & { - Step: (props: StepProps<Steps>) => JSX.Element; -}; - -const DEFAULT_STEP_QUERY_KEY = 'funnel-step'; - -/** - * 사용자에게 초기 step을 강제하고 싶을 땐 - * option의 initialStep을 작성해 주세요. - */ -export const useFunnel = <Steps extends NonEmptyArray<string>>( - steps: Steps, - options?: { - stepQueryKey?: string; - initialStep?: Steps[number]; - onStepChange?: (name: Steps[number]) => void; - } -): readonly [ - FunnelComponent<Steps>, - (step: Steps[number]) => void, - Steps[number] -] => { - const router = useRouter(); - const searchParams = useSearchParams(); - const pathname = usePathname(); - - const hasRunOnce = useRef(false); - - const step = searchParams.get('funnel-step') as string; - const stepQueryKey = options?.stepQueryKey ?? DEFAULT_STEP_QUERY_KEY; - - useEffect(() => { - if (options?.initialStep && !hasRunOnce.current) { - hasRunOnce.current = true; - router.replace(pathname); - } - }, [options?.initialStep, router, pathname]); - - assert(steps.length > 0, 'steps가 비어있습니다.'); - - const FunnelComponent = useMemo( - () => - Object.assign( - function RouteFunnel(props: RouteFunnelProps<Steps>) { - const currentStep = step ?? options?.initialStep; - - assert( - currentStep != null, - `표시할 스텝을 ${stepQueryKey} 쿼리 파라미터에 지정해주세요. 쿼리 파라미터가 없을 때 초기 스텝을 렌더하려면 useFunnel의 두 번째 파라미터 options에 initialStep을 지정해주세요.` - ); - - return <Funnel<Steps> steps={steps} step={currentStep} {...props} />; - }, - { - Step, - } - ), - // eslint-disable-next-line react-hooks/exhaustive-deps - [step] - ); - - const setStep = (step: Steps[number]) => { - const params = new URLSearchParams(searchParams.toString()); - params.set('funnel-step', `${step}`); - - return router.replace(`?${params.toString()}`, { shallow: true }); - }; - - return [FunnelComponent, setStep, step] as unknown as readonly [ - FunnelComponent<Steps>, - (step: Steps[number]) => Promise<void>, - Steps[number] - ]; -}; diff --git a/src/hooks/useOutsideClickRef.ts b/src/hooks/useOutsideClickRef.ts deleted file mode 100644 index 62b0721a3..000000000 --- a/src/hooks/useOutsideClickRef.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { RefObject, useEffect, useRef } from 'react'; - -const useOutsideClickRef = <T extends HTMLElement = HTMLElement>( - handler: () => void -) => { - const ref = useRef<T>(null); - - useEffect(() => { - const onClick = (event: MouseEvent) => { - if (ref && isValidEvent(event, ref)) { - handler(); - } - }; - - const doc = getOwnerDocument(ref.current); - - doc.addEventListener('click', onClick); - - return () => { - doc.removeEventListener('click', onClick); - }; - }, [handler]); - - return ref; -}; - -const isValidEvent = (event: Event, ref: RefObject<HTMLElement>) => { - const target = event.target as HTMLElement; - - if (target) { - const doc = getOwnerDocument(target); - if (!doc.contains(target)) return false; - } - - return !ref.current?.contains(target); -}; - -const getOwnerDocument = (node?: Element | null): Document => { - return node?.ownerDocument ?? document; -}; - -export default useOutsideClickRef; diff --git a/src/hooks/useQueryParams.ts b/src/hooks/useQueryParams.ts deleted file mode 100644 index eed7e94b2..000000000 --- a/src/hooks/useQueryParams.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { useRouter, useSearchParams } from 'next/navigation'; -import { useCallback } from 'react'; - -type RouteOptions = 'push' | 'replace'; - -type QueryParams = { [key: string]: string }; - -const useQueryParams = () => { - const router = useRouter(); - const searchParams = useSearchParams(); - - const queryParams = searchParams.toString(); - - const getQueryParam = useCallback( - (queryKey: string) => { - const queryParam = searchParams.get(queryKey); - - return queryParam; - }, - [searchParams] - ); - - const setQueryParams = useCallback( - (queryParams: QueryParams, option?: RouteOptions) => { - const prevParams = new URLSearchParams(searchParams.toString()); - - for (const queryKey in queryParams) { - prevParams.set(queryKey, queryParams[queryKey]); - } - - const newQueryParams = prevParams.toString(); - - switch (option) { - case 'replace': - router.replace(`?${newQueryParams}`, { shallow: true }); - return; - case 'push': - default: - router.push(`?${newQueryParams}`, { shallow: true }); - return; - } - }, - [router, searchParams] - ); - - const removeQueryParam = useCallback( - (queryKey: string, option?: RouteOptions) => { - const prevParams = new URLSearchParams(searchParams.toString()); - if (!prevParams.has(queryKey)) return; - prevParams.delete(queryKey); - - const newQueryParams = prevParams.toString(); - - switch (option) { - case 'replace': - router.replace(`?${newQueryParams}`, { shallow: true }); - return; - case 'push': - default: - router.push(`?${newQueryParams}`, { shallow: true }); - return; - } - }, - [router, searchParams] - ); - - return { queryParams, getQueryParam, setQueryParams, removeQueryParam }; -}; - -export default useQueryParams; diff --git a/src/hooks/useQueryWithSuspense.ts b/src/hooks/useQueryWithSuspense.ts index 835f2b1a1..349be76b8 100644 --- a/src/hooks/useQueryWithSuspense.ts +++ b/src/hooks/useQueryWithSuspense.ts @@ -7,7 +7,7 @@ import { UseQueryResult, } from '@tanstack/react-query'; -export type UseQueryOptionWithoutSuspense< +export type useQueryOptionWithOutSuspense< TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, @@ -22,7 +22,7 @@ const useQueryWithSuspense = < >( queryKey: TQueryKey, queryFunction?: QueryFunction<TQueryFnData, TQueryKey>, - queryOptions?: UseQueryOptionWithoutSuspense< + queryOptions?: useQueryOptionWithOutSuspense< TQueryFnData, TError, TData, diff --git a/src/hooks/useRemoveVerticalScroll.ts b/src/hooks/useRemoveVerticalScroll.ts deleted file mode 100644 index 293b5bbb3..000000000 --- a/src/hooks/useRemoveVerticalScroll.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { useCallback, useEffect, useRef } from 'react'; -import { nonPassive } from '@/utils/eventListener'; - -type Options = { - enabled: boolean; -}; - -const getTouchXY = (event: TouchEvent | WheelEvent) => - 'changedTouches' in event - ? [event.changedTouches[0].clientX, event.changedTouches[0].clientY] - : [0, 0]; - -const useRemoveVerticalScroll = (options?: Options) => { - const enabled = options ? options.enabled : true; - - const touchStartRef = useRef([0, 0]); - - const scrollTouchStart = useCallback((event: TouchEvent) => { - touchStartRef.current = getTouchXY(event); - }, []); - - const shouldLock = useCallback((event: TouchEvent | WheelEvent) => { - if (!event.target) return; - - const node = event.target as HTMLElement; - const { clientHeight, scrollHeight, scrollTop } = node; - - const touch = getTouchXY(event); - const touchStart = touchStartRef.current; - const deltaY = 'deltaY' in event ? event.deltaY : touchStart[1] - touch[1]; - - const isDeltaYPositive = deltaY > 0; // scroll down - - const isScrollToTopEnd = !isDeltaYPositive && scrollTop === 0; - const isScrollToBottomEnd = - isDeltaYPositive && scrollTop + clientHeight === scrollHeight; - - if ( - node.tagName !== 'TEXTAREA' || - isScrollToTopEnd || - isScrollToBottomEnd - ) { - if (event.cancelable) { - event.preventDefault(); - } - } - }, []); - - useEffect(() => { - if (!enabled) { - return; - } - - document.addEventListener('wheel', shouldLock, nonPassive); - document.addEventListener('touchmove', shouldLock, nonPassive); - document.addEventListener('touchstart', scrollTouchStart, nonPassive); - - return () => { - document.removeEventListener('wheel', shouldLock, nonPassive); - document.removeEventListener('touchmove', shouldLock, nonPassive); - document.removeEventListener('touchstart', scrollTouchStart, nonPassive); - }; - }, [enabled, shouldLock, scrollTouchStart]); -}; - -export default useRemoveVerticalScroll; diff --git a/src/hooks/useScroll.ts b/src/hooks/useScroll.ts new file mode 100644 index 000000000..a2aefbb73 --- /dev/null +++ b/src/hooks/useScroll.ts @@ -0,0 +1,21 @@ +import debounce from '@/utils/debounce'; +import { useState, useEffect } from 'react'; + +export function useScroll() { + const [scroll, setScroll] = useState<number>(0); + + const listener = () => { + setScroll(window.pageYOffset); + }; + + const delay = 60; + + useEffect(() => { + window.addEventListener('scroll', debounce(listener, delay)); + return () => window.removeEventListener('scroll', listener); + }); + + return { + scroll, + }; +} diff --git a/src/hooks/useToggle.ts b/src/hooks/useToggle.ts new file mode 100644 index 000000000..a51f7d437 --- /dev/null +++ b/src/hooks/useToggle.ts @@ -0,0 +1,10 @@ +import { useState } from 'react'; + +const useToggle = () => { + const [value, setValue] = useState<boolean>(false); + const toggle = () => setValue(value => !value); + + return { value, toggle, setValue }; +}; + +export default useToggle; diff --git a/src/queries/book/key.ts b/src/queries/book/key.ts deleted file mode 100644 index 02b990f83..000000000 --- a/src/queries/book/key.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { APIBook } from '@/types/book'; - -const bookKeys = { - all: ['book'] as const, - details: () => [...bookKeys.all, 'detail'] as const, - detail: (bookId: APIBook['bookId']) => - [...bookKeys.details(), bookId] as const, - bookmark: (bookId: APIBook['bookId']) => - [...bookKeys.detail(bookId), 'bookmark'] as const, - comments: (bookId: APIBook['bookId']) => - [...bookKeys.detail(bookId), 'comments'] as const, - bookSearch: (query: string) => - [...bookKeys.all, 'bookSearch', query] as const, - recentSearch: () => [...bookKeys.all, 'recentSearch'] as const, - bestSeller: () => [...bookKeys.all, 'bestSeller'] as const, -}; - -export default bookKeys; diff --git a/src/queries/book/useBestSellersQuery.ts b/src/queries/book/useBestSellersQuery.ts deleted file mode 100644 index c66e56c25..000000000 --- a/src/queries/book/useBestSellersQuery.ts +++ /dev/null @@ -1,19 +0,0 @@ -import useQueryWithSuspense, { - type UseQueryOptionWithoutSuspense, -} from '@/hooks/useQueryWithSuspense'; - -import bookAPI from '@/apis/book'; -import type { APIBestSellerRes } from '@/types/book'; - -import bookKeys from './key'; - -const useBestSellersQuery = <TData = APIBestSellerRes>( - options?: UseQueryOptionWithoutSuspense<APIBestSellerRes, unknown, TData> -) => - useQueryWithSuspense( - bookKeys.bestSeller(), - () => bookAPI.getBestSellers().then(({ data }) => data), - options - ); - -export default useBestSellersQuery; diff --git a/src/queries/book/useBookCommentPatchMutation.ts b/src/queries/book/useBookCommentPatchMutation.ts new file mode 100644 index 000000000..69178a3bd --- /dev/null +++ b/src/queries/book/useBookCommentPatchMutation.ts @@ -0,0 +1,17 @@ +import bookAPI from '@/apis/book'; + +import { useMutation, useQueryClient } from '@tanstack/react-query'; + +const useBookCommentPatchMutation = () => { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: (data: Parameters<typeof bookAPI.patchComment>[0]) => + bookAPI.patchComment(data).then(({ data }) => data), + onSettled: (_data, _err, { bookId }) => { + queryClient.invalidateQueries(['bookComments', bookId]); + }, + }); +}; + +export default useBookCommentPatchMutation; diff --git a/src/queries/book/useBookCommentsQuery.ts b/src/queries/book/useBookCommentsQuery.ts index 0f641e0ae..82738f809 100644 --- a/src/queries/book/useBookCommentsQuery.ts +++ b/src/queries/book/useBookCommentsQuery.ts @@ -1,56 +1,19 @@ -import { UseQueryOptions } from '@tanstack/react-query'; +import { UseQueryOptions, useQuery } from '@tanstack/react-query'; -import type { - APIBook, - APIBookCommentPagination, - BookComment, -} from '@/types/book'; import bookAPI from '@/apis/book'; -import useQueryWithSuspense from '@/hooks/useQueryWithSuspense'; -import bookKeys from './key'; +import type { APIBook } from '@/types/book'; -const useBookCommentsQuery = <TData = APIBookCommentPagination>( +const useBookCommentsQuery = ( bookId: APIBook['bookId'], - options?: UseQueryOptions< - Awaited<ReturnType<typeof bookAPI.getComments>>['data'], - unknown, - TData + options?: Pick< + UseQueryOptions<Awaited<ReturnType<typeof bookAPI.getComments>>['data']>, + 'onSuccess' | 'onError' > ) => - useQueryWithSuspense( - bookKeys.comments(bookId), + useQuery( + ['bookComments', bookId], () => bookAPI.getComments(bookId).then(({ data }) => data), options ); export default useBookCommentsQuery; - -const transformBookCommentsData = ({ - bookComments, -}: APIBookCommentPagination) => { - return bookComments.map( - ({ contents, createdAt, commentId, userId, userProfileImage, nickname }) => - ({ - id: commentId, - writer: { - id: userId, - profileImageSrc: userProfileImage, - name: nickname, - }, - createdAt, - content: contents, - } as BookComment) - ); -}; - -export const useBookComments = (bookId: APIBook['bookId']) => - useBookCommentsQuery(bookId, { - select: transformBookCommentsData, - }); - -export const useHasBookComment = (bookId: APIBook['bookId']) => - useBookCommentsQuery(bookId, { - select: ({ bookComments }) => - bookComments.filter(comment => comment.writtenByCurrentUser === true) - .length, - }); diff --git a/src/queries/book/useBookInfoQuery.ts b/src/queries/book/useBookInfoQuery.ts index 0475d90de..234b0ee80 100644 --- a/src/queries/book/useBookInfoQuery.ts +++ b/src/queries/book/useBookInfoQuery.ts @@ -1,41 +1,19 @@ -import { UseQueryOptions } from '@tanstack/react-query'; - -import type { APIBook, APIBookDetail, BookDetail } from '@/types/book'; +import { UseQueryOptions, useQuery } from '@tanstack/react-query'; import bookAPI from '@/apis/book'; -import useQueryWithSuspense from '@/hooks/useQueryWithSuspense'; -import bookKeys from './key'; +import type { APIBook } from '@/types/book'; -const useBookInfoQuery = <TData = APIBookDetail>( +const useBookInfoQuery = ( bookId: APIBook['bookId'], - options?: UseQueryOptions<APIBookDetail, unknown, TData> + options?: Pick< + UseQueryOptions<Awaited<ReturnType<typeof bookAPI.getBookInfo>>['data']>, + 'onSuccess' | 'onError' + > ) => - useQueryWithSuspense( - bookKeys.detail(bookId), + useQuery( + ['bookInfo', bookId], () => bookAPI.getBookInfo(bookId).then(({ data }) => data), options ); export default useBookInfoQuery; - -const transformBookData = (data: APIBookDetail) => - ({ - bookId: data.bookId, - title: data.title, - author: data.author, - isbn: data.isbn, - summary: data.contents, - bookUrl: data.url, - imageUrl: data.imageUrl.replace('R120x174.q85', 'R300x0.q100'), - publisher: data.publisher, - } as BookDetail); - -export const useBookInfo = (bookId: APIBook['bookId']) => - useBookInfoQuery(bookId, { - select: transformBookData, - }); - -export const useBookTitle = (bookId: APIBook['bookId']) => - useBookInfoQuery(bookId, { - select: data => data.title, - }); diff --git a/src/queries/book/useBookSearchQuery.ts b/src/queries/book/useBookSearchQuery.ts index ee67008e1..6ef217995 100644 --- a/src/queries/book/useBookSearchQuery.ts +++ b/src/queries/book/useBookSearchQuery.ts @@ -1,7 +1,5 @@ -import { useInfiniteQuery } from '@tanstack/react-query'; - import bookAPI from '@/apis/book'; -import bookKeys from './key'; +import { useInfiniteQuery } from '@tanstack/react-query'; const useBookSearchQuery = ({ query, @@ -13,7 +11,7 @@ const useBookSearchQuery = ({ pageSize: number; }) => useInfiniteQuery( - bookKeys.bookSearch(query), + ['booksearch', query], ({ pageParam = page }) => bookAPI .searchBooks({ query, page: pageParam, pageSize }) @@ -24,7 +22,6 @@ const useBookSearchQuery = ({ }, staleTime: 3000, enabled: !!query, - suspense: true, } ); diff --git a/src/queries/book/useBookUserInfoQuery.ts b/src/queries/book/useBookUserInfoQuery.ts new file mode 100644 index 000000000..54fbfccfb --- /dev/null +++ b/src/queries/book/useBookUserInfoQuery.ts @@ -0,0 +1,19 @@ +import { useQuery, UseQueryOptions } from '@tanstack/react-query'; +import bookAPI from '@/apis/book'; + +const useBookUserInfoQuery = ( + bookId: number, + options?: Pick< + UseQueryOptions< + Awaited<ReturnType<typeof bookAPI.getBookUserInfo>>['data'] + >, + 'enabled' + > +) => + useQuery( + ['bookUserInfo', bookId], + () => bookAPI.getBookUserInfo(bookId).then(({ data }) => data), + options + ); + +export default useBookUserInfoQuery; diff --git a/src/queries/book/useBookmarkUserQuery.ts b/src/queries/book/useBookmarkUserQuery.ts deleted file mode 100644 index bdc5ee9b2..000000000 --- a/src/queries/book/useBookmarkUserQuery.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { UseQueryOptions } from '@tanstack/react-query'; -import { APIBookmarkedUserList } from '@/types/book'; -import bookAPI from '@/apis/book'; -import useQueryWithSuspense from '@/hooks/useQueryWithSuspense'; -import bookKeys from './key'; - -const useBookmarkUserQuery = <TData = APIBookmarkedUserList>( - bookId: number, - options?: UseQueryOptions<APIBookmarkedUserList, unknown, TData> -) => - useQueryWithSuspense( - bookKeys.bookmark(bookId), - () => bookAPI.getBookmarkUserInfo(bookId).then(({ data }) => data), - options - ); - -export default useBookmarkUserQuery; diff --git a/src/queries/book/useCreateBookCommentMutation.ts b/src/queries/book/useCreateBookCommentMutation.ts deleted file mode 100644 index 6581b4b9b..000000000 --- a/src/queries/book/useCreateBookCommentMutation.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { APIBook } from '@/types/book'; -import bookAPI from '@/apis/book'; -import bookKeys from './key'; - -const useCreateBookCommentMutation = (bookId: APIBook['bookId']) => { - const queryClient = useQueryClient(); - - return useMutation({ - mutationFn: (newComment: string) => - bookAPI.creaetComment(bookId, newComment).then(({ data }) => data), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: bookKeys.comments(bookId) }); - }, - }); -}; - -export default useCreateBookCommentMutation; diff --git a/src/queries/book/useDeleteBookCommentMutation.ts b/src/queries/book/useDeleteBookCommentMutation.ts deleted file mode 100644 index ac91ecd31..000000000 --- a/src/queries/book/useDeleteBookCommentMutation.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { APIBook, APIBookComment } from '@/types/book'; -import bookAPI from '@/apis/book'; -import bookKeys from './key'; - -const useDeleteBookCommentMutation = (bookId: APIBook['bookId']) => { - const queryClient = useQueryClient(); - - return useMutation({ - mutationFn: (commentId: APIBookComment['commentId']) => - bookAPI.deletComment(bookId, commentId).then(({ data }) => data), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: bookKeys.comments(bookId) }); - }, - }); -}; - -export default useDeleteBookCommentMutation; diff --git a/src/queries/book/usePatchBookCommentMutation.ts b/src/queries/book/usePatchBookCommentMutation.ts deleted file mode 100644 index 2694b3a4b..000000000 --- a/src/queries/book/usePatchBookCommentMutation.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { APIBook, APIBookComment } from '@/types/book'; -import bookAPI from '@/apis/book'; -import bookKeys from './key'; - -const usePatchBookCommentMutation = (bookId: APIBook['bookId']) => { - const queryClient = useQueryClient(); - - return useMutation({ - mutationFn: (data: { - commentId: APIBookComment['commentId']; - comment: string; - }) => bookAPI.patchComment({ bookId, data }).then(({ data }) => data), - onSettled: () => { - queryClient.invalidateQueries({ queryKey: bookKeys.comments(bookId) }); - }, - }); -}; - -export default usePatchBookCommentMutation; diff --git a/src/queries/book/useRecentSearchesQuery.ts b/src/queries/book/useRecentSearchesQuery.ts index c97f9f978..518e3fc15 100644 --- a/src/queries/book/useRecentSearchesQuery.ts +++ b/src/queries/book/useRecentSearchesQuery.ts @@ -1,25 +1,14 @@ -import useQueryWithSuspense, { - type UseQueryOptionWithoutSuspense, -} from '@/hooks/useQueryWithSuspense'; +import { useQuery } from '@tanstack/react-query'; import bookAPI from '@/apis/book'; import type { APIRecentSearches } from '@/types/book'; +import type { QueryOptions } from '@/types/query'; -import bookKeys from './key'; - -const useRecentSearchesQuery = <TData = APIRecentSearches>( - options?: UseQueryOptionWithoutSuspense<APIRecentSearches, unknown, TData> -) => - useQueryWithSuspense( - bookKeys.recentSearch(), +const useRecentSearchesQuery = (options?: QueryOptions<APIRecentSearches>) => + useQuery( + ['recentSearches'], () => bookAPI.getRecentSearches().then(({ data }) => data), options ); export default useRecentSearchesQuery; - -export const useRecentSearchListQuery = ({ enabled }: { enabled: boolean }) => - useRecentSearchesQuery({ - select: ({ bookRecentSearchResponses }) => bookRecentSearchResponses, - enabled, - }); diff --git a/src/queries/book/useUpdateBookmarkMutation.ts b/src/queries/book/useUpdateBookmarkMutation.ts deleted file mode 100644 index 02ff938c7..000000000 --- a/src/queries/book/useUpdateBookmarkMutation.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import type { APIBook, APIBookmarkedUserList } from '@/types/book'; -import bookAPI from '@/apis/book'; -import bookKeys from './key'; - -const updateBookmark = ({ - bookId, - newValue, -}: { - bookId: APIBook['bookId']; - newValue: boolean; -}) => { - return newValue - ? bookAPI.addBookmark(bookId).then(({ data }) => data) - : bookAPI.removeBookmark(bookId).then(({ data }) => data); -}; - -const useUpdateBookmarkMutation = (bookId: APIBook['bookId']) => { - const queryClient = useQueryClient(); - const bookmarkQueryKey = bookKeys.bookmark(bookId); - - return useMutation({ - mutationFn: (newValue: boolean) => updateBookmark({ bookId, newValue }), - onMutate: async newValue => { - await queryClient.cancelQueries({ queryKey: bookmarkQueryKey }); - - const previousData = - queryClient.getQueryData<APIBookmarkedUserList>(bookmarkQueryKey); - - if (previousData) { - // 낙관적 업데이트 - queryClient.setQueryData<APIBookmarkedUserList>(bookmarkQueryKey, { - ...previousData, - isInMyBookshelf: newValue, - }); - } - - return { previousData }; - }, - onError: (_err, _variables, context) => { - if (!context || !context.previousData) { - return; - } - - queryClient.setQueryData<APIBookmarkedUserList>( - bookmarkQueryKey, - context.previousData - ); - }, - onSettled: () => { - queryClient.invalidateQueries({ queryKey: bookmarkQueryKey }); - }, - }); -}; - -export default useUpdateBookmarkMutation; diff --git a/src/queries/bookshelf/key.ts b/src/queries/bookshelf/key.ts deleted file mode 100644 index 3264767b1..000000000 --- a/src/queries/bookshelf/key.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { APIBookshelf } from '@/types/bookshelf'; - -const bookShelfKeys = { - all: ['bookShelf'] as const, - info: (bookshelfId: APIBookshelf['bookshelfId']) => - [...bookShelfKeys.all, bookshelfId] as const, - books: (bookshelfId: APIBookshelf['bookshelfId']) => - [...bookShelfKeys.all, bookshelfId, 'books'] as const, - summary: (userId: string) => [...bookShelfKeys.all, 'summary', userId], -}; - -export default bookShelfKeys; diff --git a/src/queries/bookshelf/useBookShelfBookListQuery.ts b/src/queries/bookshelf/useBookShelfBookListQuery.ts deleted file mode 100644 index 427bc7a45..000000000 --- a/src/queries/bookshelf/useBookShelfBookListQuery.ts +++ /dev/null @@ -1,37 +0,0 @@ -import bookshelfAPI from '@/apis/bookshelf'; -import { APIBookshelf } from '@/types/bookshelf'; -import { useInfiniteQuery } from '@tanstack/react-query'; -import bookShelfKeys from './key'; - -const useBookShelfBooksQuery = ({ - bookshelfId, -}: { - bookshelfId: APIBookshelf['bookshelfId']; -}) => - useInfiniteQuery({ - queryKey: bookShelfKeys.books(bookshelfId), - queryFn: ({ pageParam = '' }) => - bookshelfAPI - .getBookshelfBooks(bookshelfId, pageParam) - .then(response => response.data), - getNextPageParam: lastPage => - !lastPage.isLast ? lastPage.books[15].bookshelfItemId : undefined, - staleTime: 3000, - - select: data => { - const pages = data.pages.map(({ books, ...page }) => { - const newBooks = []; - for (let i = 0; i < books.length; i += 4) { - newBooks.push(books.slice(i, i + 4)); - } - return { ...page, books: newBooks }; - }); - - return { - pages, - pageParams: [...data.pageParams], - }; - }, - }); - -export default useBookShelfBooksQuery; diff --git a/src/queries/bookshelf/useBookShelfInfoQuery.ts b/src/queries/bookshelf/useBookShelfInfoQuery.ts deleted file mode 100644 index c6230a80d..000000000 --- a/src/queries/bookshelf/useBookShelfInfoQuery.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { UseQueryOptions } from '@tanstack/react-query'; -import { APIBookshelfInfo } from '@/types/bookshelf'; -import useQueryWithSuspense from '@/hooks/useQueryWithSuspense'; -import bookshelfAPI from '@/apis/bookshelf'; -import bookShelfKeys from './key'; - -const useBookShelfInfoQuery = <TData = APIBookshelfInfo>( - bookshelfId: APIBookshelfInfo['bookshelfId'], - options?: UseQueryOptions<APIBookshelfInfo, unknown, TData> -) => - useQueryWithSuspense( - bookShelfKeys.info(bookshelfId), - () => - bookshelfAPI - .getBookshelfInfo(bookshelfId) - .then(response => response.data), - options - ); - -export default useBookShelfInfoQuery; diff --git a/src/queries/bookshelf/useBookshelfBookListQuery/index.ts b/src/queries/bookshelf/useBookshelfBookListQuery/index.ts new file mode 100644 index 000000000..69175a720 --- /dev/null +++ b/src/queries/bookshelf/useBookshelfBookListQuery/index.ts @@ -0,0 +1,23 @@ +import bookshelfAPI from '@/apis/bookshelf'; +import { APIBookshelf } from '@/types/bookshelf'; +import { useInfiniteQuery } from '@tanstack/react-query'; + +const useBookshelfBooksQuery = ({ + bookshelfId, +}: { + bookshelfId: APIBookshelf['bookshelfId']; +}) => + useInfiniteQuery( + ['bookshelfBooks'], + ({ pageParam = '' }) => + bookshelfAPI + .getBookshelfBooks(bookshelfId, pageParam) + .then(response => response.data), + { + getNextPageParam: lastPage => + !lastPage.isLast ? lastPage.books[15].bookshelfItemId : undefined, + staleTime: 3000, + } + ); + +export default useBookshelfBooksQuery; diff --git a/src/queries/bookshelf/useBookshelfInfoQuery/index.ts b/src/queries/bookshelf/useBookshelfInfoQuery/index.ts new file mode 100644 index 000000000..d986a867d --- /dev/null +++ b/src/queries/bookshelf/useBookshelfInfoQuery/index.ts @@ -0,0 +1,14 @@ +import bookshelfAPI from '@/apis/bookshelf'; +import { APIBookshelfInfo } from '@/types/bookshelf'; +import { useQuery } from '@tanstack/react-query'; + +const useBookshelfInfoQuery = ({ + bookshelfId, +}: { + bookshelfId: APIBookshelfInfo['bookshelfId']; +}) => + useQuery(['bookshelfInfo', bookshelfId], () => + bookshelfAPI.getBookshelfInfo(bookshelfId).then(response => response.data) + ); + +export default useBookshelfInfoQuery; diff --git a/src/queries/bookshelf/useBookshelfLikeMutation.ts b/src/queries/bookshelf/useBookshelfLikeMutation.ts new file mode 100644 index 000000000..03124e5ca --- /dev/null +++ b/src/queries/bookshelf/useBookshelfLikeMutation.ts @@ -0,0 +1,87 @@ +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import type { APIBookshelfInfo } from '@/types/bookshelf'; +import bookshelfAPI from '@/apis/bookshelf'; + +export const useBookshelfLike = ( + bookshelfId: APIBookshelfInfo['bookshelfId'] +) => { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async () => bookshelfAPI.likeBookshelf(bookshelfId), + onMutate: async () => { + await queryClient.cancelQueries(['bookshelfInfo', bookshelfId]); + + const oldData = queryClient.getQueryData<APIBookshelfInfo>([ + 'bookshelfInfo', + bookshelfId, + ]); + + if (oldData) { + const newData: APIBookshelfInfo = { + ...oldData, + isLiked: !oldData.isLiked, + likeCount: oldData.likeCount + 1, + }; + + queryClient.setQueryData<APIBookshelfInfo>( + ['bookshelfInfo', bookshelfId], + newData + ); + } + + return { oldData }; + }, + onError: (_error, _value, context) => { + queryClient.setQueryData( + ['bookshelfInfo', bookshelfId], + context?.oldData + ); + }, + onSettled: () => { + queryClient.invalidateQueries(['bookshelfInfo', bookshelfId]); + }, + }); +}; + +export const useBookshelfUnlike = ( + bookshelfId: APIBookshelfInfo['bookshelfId'] +) => { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async () => bookshelfAPI.unlikeBookshelf(bookshelfId), + onMutate: async () => { + await queryClient.cancelQueries(['bookshelfInfo', bookshelfId]); + + const oldData = queryClient.getQueryData<APIBookshelfInfo>([ + 'bookshelfInfo', + bookshelfId, + ]); + + if (oldData) { + const newData: APIBookshelfInfo = { + ...oldData, + isLiked: !oldData.isLiked, + likeCount: oldData.likeCount - 1, + }; + + queryClient.setQueryData<APIBookshelfInfo>( + ['bookshelfInfo', bookshelfId], + newData + ); + } + + return { oldData }; + }, + onError: (_error, _value, context) => { + queryClient.setQueryData( + ['bookshelfInfo', bookshelfId], + context?.oldData + ); + }, + onSettled: () => { + queryClient.invalidateQueries(['bookshelfInfo', bookshelfId]); + }, + }); +}; diff --git a/src/queries/bookshelf/useMutateBookshelfLikeQuery.ts b/src/queries/bookshelf/useMutateBookshelfLikeQuery.ts deleted file mode 100644 index 97c797485..000000000 --- a/src/queries/bookshelf/useMutateBookshelfLikeQuery.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; -import type { APIBookshelfInfo } from '@/types/bookshelf'; -import bookshelfAPI from '@/apis/bookshelf'; -import bookShelfKeys from './key'; - -const useMutateBookshelfLikeQuery = ( - bookshelfId: APIBookshelfInfo['bookshelfId'] -) => { - const queryClient = useQueryClient(); - - return useMutation({ - mutationFn: async (isLiked: APIBookshelfInfo['isLiked']) => - !isLiked - ? bookshelfAPI.likeBookshelf(bookshelfId) - : bookshelfAPI.unlikeBookshelf(bookshelfId), - onMutate: async () => { - await queryClient.cancelQueries(bookShelfKeys.info(bookshelfId)); - - const prevData = queryClient.getQueryData<APIBookshelfInfo>( - bookShelfKeys.info(bookshelfId) - ); - - if (prevData) { - const newData: APIBookshelfInfo = { - ...prevData, - isLiked: !prevData.isLiked, - likeCount: prevData.isLiked - ? prevData.likeCount - 1 - : prevData.likeCount + 1, - }; - - queryClient.setQueryData<APIBookshelfInfo>( - bookShelfKeys.info(bookshelfId), - newData - ); - } - - return { prevData }; - }, - onError: (_error, _value, context) => { - queryClient.setQueryData( - bookShelfKeys.info(bookshelfId), - context?.prevData - ); - }, - onSettled: () => { - queryClient.invalidateQueries(bookShelfKeys.info(bookshelfId)); - }, - }); -}; - -export default useMutateBookshelfLikeQuery; diff --git a/src/queries/bookshelf/useMySummaryBookShelfQuery.ts b/src/queries/bookshelf/useMySummaryBookShelfQuery.ts deleted file mode 100644 index 4d7c00bcb..000000000 --- a/src/queries/bookshelf/useMySummaryBookShelfQuery.ts +++ /dev/null @@ -1,15 +0,0 @@ -import bookshelfAPI from '@/apis/bookshelf'; -import type { APIBookshelf } from '@/types/bookshelf'; -import type { QueryOptions } from '@/types/query'; - -import useQueryWithSuspense from '@/hooks/useQueryWithSuspense'; -import bookShelfKeys from './key'; - -const useMySummaryBookshelfQuery = (options?: QueryOptions<APIBookshelf>) => - useQueryWithSuspense( - bookShelfKeys.summary('me'), - () => bookshelfAPI.getMySummaryBookshelf().then(({ data }) => data), - options - ); - -export default useMySummaryBookshelfQuery; diff --git a/src/queries/bookshelf/useMySummaryBookshelfQuery/index.ts b/src/queries/bookshelf/useMySummaryBookshelfQuery/index.ts new file mode 100644 index 000000000..a359cd562 --- /dev/null +++ b/src/queries/bookshelf/useMySummaryBookshelfQuery/index.ts @@ -0,0 +1,13 @@ +import bookshelfAPI from '@/apis/bookshelf'; +import { useQuery } from '@tanstack/react-query'; +import type { QueryOptions } from '@/types/query'; +import type { APIBookshelf } from '@/types/bookshelf'; + +const useMySummaryBookshlefQuery = (options?: QueryOptions<APIBookshelf>) => + useQuery( + ['summaryBookshlef', 'me'], + () => bookshelfAPI.getMySummaryBookshelf().then(({ data }) => data), + options + ); + +export default useMySummaryBookshlefQuery; diff --git a/src/queries/bookshelf/useUserSummaryBookShelfQuery.ts b/src/queries/bookshelf/useUserSummaryBookshelfQuery/index.ts similarity index 60% rename from src/queries/bookshelf/useUserSummaryBookShelfQuery.ts rename to src/queries/bookshelf/useUserSummaryBookshelfQuery/index.ts index 891976497..33f3da4de 100644 --- a/src/queries/bookshelf/useUserSummaryBookShelfQuery.ts +++ b/src/queries/bookshelf/useUserSummaryBookshelfQuery/index.ts @@ -1,19 +1,18 @@ import bookshelfAPI from '@/apis/bookshelf'; +import { useQuery } from '@tanstack/react-query'; import type { QueryOptions } from '@/types/query'; import type { APIUser } from '@/types/user'; import type { APIBookshelf } from '@/types/bookshelf'; -import bookShelfKeys from './key'; -import useQueryWithSuspense from '@/hooks/useQueryWithSuspense'; -const useUserSummaryBookshelfQuery = ( +const useUserSummaryBookshlefQuery = ( userId: APIUser['userId'], options?: QueryOptions<APIBookshelf> ) => - useQueryWithSuspense( - bookShelfKeys.summary(String(userId)), + useQuery( + ['summaryBookshlef', String(userId)], () => bookshelfAPI.getUserSummaryBookshelf({ userId }).then(({ data }) => data), options ); -export default useUserSummaryBookshelfQuery; +export default useUserSummaryBookshlefQuery; diff --git a/src/queries/group/key.ts b/src/queries/group/key.ts deleted file mode 100644 index f3e4171b9..000000000 --- a/src/queries/group/key.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { APIGroupDetail } from '@/types/group'; - -const bookGroupKeys = { - all: ['bookGroup'] as const, - details: () => [...bookGroupKeys.all, 'detail'] as const, - detail: (id: APIGroupDetail['bookGroupId']) => - [...bookGroupKeys.details(), id] as const, - comments: (id: APIGroupDetail['bookGroupId']) => - [...bookGroupKeys.details(), id, 'comments'] as const, - me: () => [...bookGroupKeys.all, 'me'], -}; - -export default bookGroupKeys; diff --git a/src/queries/group/useBookGroupCommentsQuery.ts b/src/queries/group/useBookGroupCommentsQuery.ts deleted file mode 100644 index 17578d036..000000000 --- a/src/queries/group/useBookGroupCommentsQuery.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - APIGroupCommentPagination, - APIGroupDetail, - BookGroupComment, -} from '@/types/group'; - -import GroupAPI from '@/apis/group'; -import bookGroupKeys from './key'; -import useQueryWithSuspense, { - UseQueryOptionWithoutSuspense, -} from '@/hooks/useQueryWithSuspense'; - -const transformComments = ({ bookGroupComments }: APIGroupCommentPagination) => - bookGroupComments.map<BookGroupComment>(comment => ({ - id: comment.commentId, - writer: { - id: comment.userId, - profileImageSrc: comment.userProfileImage, - name: comment.nickname, - }, - createdAt: comment.createdAt, - content: comment.contents, - })); - -const useBookGroupCommentsQuery = <TData = APIGroupCommentPagination>( - groupId: APIGroupDetail['bookGroupId'], - options?: UseQueryOptionWithoutSuspense< - APIGroupCommentPagination, - unknown, - TData - > -) => - useQueryWithSuspense( - bookGroupKeys.comments(groupId), - () => - GroupAPI.getGroupComments({ bookGroupId: groupId }).then( - ({ data }) => data - ), - options - ); - -export default useBookGroupCommentsQuery; - -export const useBookGroupComments = (groupId: APIGroupDetail['bookGroupId']) => - useBookGroupCommentsQuery(groupId, { - select: transformComments, - }); diff --git a/src/queries/group/useBookGroupQuery.ts b/src/queries/group/useBookGroupQuery.ts deleted file mode 100644 index cacf376bb..000000000 --- a/src/queries/group/useBookGroupQuery.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { - useMutation, - useQueryClient, - UseQueryOptions, -} from '@tanstack/react-query'; - -import type { - APIGroupDetail, - BookGroupDetail, - APIEditBookGroup, -} from '@/types/group'; -import useQueryWithSuspense from '@/hooks/useQueryWithSuspense'; -import groupAPI from '@/apis/group'; -import { isExpired } from '@/utils/date'; - -import bookGroupKeys from './key'; - -const transformBookGroupDetail = (data: APIGroupDetail) => - ({ - title: data.title, - description: data.introduce, - bookId: data.book.id, - owner: { isMe: data.isOwner, id: data.owner.id }, - date: { start: data.startDate, end: data.endDate }, - memberCount: { current: data.currentMemberCount, max: data.maxMemberCount }, - isPublic: data.isPublic, - isMember: data.isGroupMember, - } as BookGroupDetail); - -export const useBookGroupQuery = <TData = APIGroupDetail>( - groupId: APIGroupDetail['bookGroupId'], - options?: UseQueryOptions<APIGroupDetail, unknown, TData> -) => - useQueryWithSuspense( - bookGroupKeys.detail(groupId), - () => - groupAPI - .getGroupDetailInfo({ bookGroupId: groupId }) - .then(({ data }) => data), - options - ); - -export default useBookGroupQuery; - -export const useBookGroup = (groupId: APIGroupDetail['bookGroupId']) => - useBookGroupQuery(groupId, { - select: transformBookGroupDetail, - }); - -export const useBookGroupTitle = (groupId: APIGroupDetail['bookGroupId']) => - useBookGroupQuery(groupId, { select: data => data.title }); - -export const useBookGroupOwner = (groupId: APIGroupDetail['bookGroupId']) => - useBookGroupQuery(groupId, { - select: data => ({ isMe: data.isOwner, id: data.owner.id }), - }); - -export const useBookGroupJoinInfo = (groupId: APIGroupDetail['bookGroupId']) => - useBookGroupQuery(groupId, { - select: data => ({ - isExpired: isExpired(data.endDate), - isMember: data.isGroupMember, - hasPassword: data.hasJoinPasswd, - question: data.joinQuestion, - }), - }); - -export const useBookGroupEditCurrentInfo = ( - groupId: APIGroupDetail['bookGroupId'] -) => - useBookGroupQuery(groupId, { - select: data => ({ - isOwner: data.isOwner, - title: data.title, - description: data.introduce, - maxMemberCount: data.maxMemberCount, - startDate: data.startDate, - endDate: data.endDate, - }), - }); - -export const useBookGroupInfoMutation = ( - bookGroupId: APIGroupDetail['bookGroupId'] -) => { - const queryClient = useQueryClient(); - - return useMutation({ - mutationFn: (group: Omit<APIEditBookGroup, 'isOwner' | 'startDate'>) => - groupAPI.updateGroupInfo({ bookGroupId, group }).then(({ data }) => data), - onSuccess: () => - queryClient.invalidateQueries({ - queryKey: bookGroupKeys.detail(bookGroupId), - }), - }); -}; diff --git a/src/queries/group/useCreateBookGroupCommentMutation.ts b/src/queries/group/useCreateBookGroupCommentMutation.ts deleted file mode 100644 index d50e6ffa3..000000000 --- a/src/queries/group/useCreateBookGroupCommentMutation.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { APIGroup } from '@/types/group'; -import groupAPI from '@/apis/group'; -import bookGroupKeys from './key'; - -const useCreateBookGroupCommentMutation = ( - bookGroupId: APIGroup['bookGroupId'] -) => { - const queryClient = useQueryClient(); - - return useMutation({ - mutationFn: (comment: string) => - groupAPI - .createGroupComment({ bookGroupId, comment }) - .then(({ data }) => data), - onSuccess: () => { - queryClient.invalidateQueries({ - queryKey: bookGroupKeys.comments(bookGroupId), - }); - }, - }); -}; - -export default useCreateBookGroupCommentMutation; diff --git a/src/queries/group/useCreateBookGroupMutation.ts b/src/queries/group/useCreateBookGroupMutation.ts deleted file mode 100644 index 041841d99..000000000 --- a/src/queries/group/useCreateBookGroupMutation.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { useMutation } from '@tanstack/react-query'; - -import type { APICreateGroup } from '@/types/group'; -import groupAPI from '@/apis/group'; - -const useCreateBookGroupMutation = () => { - return useMutation({ - mutationFn: (formData: APICreateGroup) => - groupAPI.createGroup(formData).then(({ data }) => data), - }); -}; - -export default useCreateBookGroupMutation; diff --git a/src/queries/group/useDeleteBookGroupCommentMutation.ts b/src/queries/group/useDeleteBookGroupCommentMutation.ts deleted file mode 100644 index 64d32617a..000000000 --- a/src/queries/group/useDeleteBookGroupCommentMutation.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { APIGroup, APIGroupComment } from '@/types/group'; -import groupAPI from '@/apis/group'; -import bookGroupKeys from './key'; - -const useDeleteBookGroupCommentMutation = ( - bookGroupId: APIGroup['bookGroupId'] -) => { - const queryClient = useQueryClient(); - - return useMutation({ - mutationFn: (commentId: APIGroupComment['commentId']) => - groupAPI - .deleteGroupComment({ bookGroupId, commentId }) - .then(({ data }) => data), - onSuccess: () => { - queryClient.invalidateQueries({ - queryKey: bookGroupKeys.comments(bookGroupId), - }); - }, - }); -}; - -export default useDeleteBookGroupCommentMutation; diff --git a/src/queries/group/useDeleteBookGroupMutation.ts b/src/queries/group/useDeleteBookGroupMutation.ts deleted file mode 100644 index 0f748ed25..000000000 --- a/src/queries/group/useDeleteBookGroupMutation.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { useMutation } from '@tanstack/react-query'; - -import type { APIGroup } from '@/types/group'; - -import groupAPI from '@/apis/group'; - -const useDeleteBookGroupMutation = () => { - return useMutation({ - mutationFn: (bookGroupId: APIGroup['bookGroupId']) => - groupAPI.deleteGroup({ bookGroupId }).then(({ data }) => data), - }); -}; - -export default useDeleteBookGroupMutation; diff --git a/src/queries/group/useEntireGroupsQuery.ts b/src/queries/group/useEntireGroupsQuery/index.tsx similarity index 100% rename from src/queries/group/useEntireGroupsQuery.ts rename to src/queries/group/useEntireGroupsQuery/index.tsx diff --git a/src/queries/group/useGroupCommentsQuery/index.tsx b/src/queries/group/useGroupCommentsQuery/index.tsx new file mode 100644 index 000000000..7cc0c1adc --- /dev/null +++ b/src/queries/group/useGroupCommentsQuery/index.tsx @@ -0,0 +1,14 @@ +import GroupAPI from '@/apis/group'; +import { APIGroupDetail } from '@/types/group'; +import { useQuery } from '@tanstack/react-query'; + +const useGroupCommentsQuery = ({ + bookGroupId, +}: { + bookGroupId: APIGroupDetail['bookGroupId']; +}) => + useQuery(['group', bookGroupId, 'comments'], () => + GroupAPI.getGroupComments({ bookGroupId }).then(({ data }) => data) + ); + +export default useGroupCommentsQuery; diff --git a/src/queries/group/useGroupInfoQuery.ts b/src/queries/group/useGroupInfoQuery/index.tsx similarity index 100% rename from src/queries/group/useGroupInfoQuery.ts rename to src/queries/group/useGroupInfoQuery/index.tsx diff --git a/src/queries/group/useMyGroupQuery.ts b/src/queries/group/useMyGroupsQuery/index.ts similarity index 68% rename from src/queries/group/useMyGroupQuery.ts rename to src/queries/group/useMyGroupsQuery/index.ts index 9c11ef519..0359c6916 100644 --- a/src/queries/group/useMyGroupQuery.ts +++ b/src/queries/group/useMyGroupsQuery/index.ts @@ -1,12 +1,11 @@ import GroupAPI from '@/apis/group'; -import useQueryWithSuspense from '@/hooks/useQueryWithSuspense'; +import { useQuery } from '@tanstack/react-query'; import type { QueryOptions } from '@/types/query'; import type { APIGroupPagination } from '@/types/group'; -import bookGroupKeys from './key'; const useMyGroupsQuery = (options?: QueryOptions<APIGroupPagination>) => - useQueryWithSuspense( - bookGroupKeys.me(), + useQuery( + ['groups', 'me'], () => GroupAPI.getMyGroups().then(({ data }) => data), options ); diff --git a/src/queries/group/usePatchBookGroupCommentMutation.ts b/src/queries/group/usePatchBookGroupCommentMutation.ts deleted file mode 100644 index 54bf225be..000000000 --- a/src/queries/group/usePatchBookGroupCommentMutation.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { useMutation, useQueryClient } from '@tanstack/react-query'; - -import { APIGroup, APIGroupComment } from '@/types/group'; -import groupAPI from '@/apis/group'; -import bookGroupKeys from './key'; - -const usePatchBookGroupCommentMutation = ( - bookGroupId: APIGroup['bookGroupId'] -) => { - const queryClient = useQueryClient(); - - return useMutation({ - mutationFn: ({ - commentId, - comment, - }: { - commentId: APIGroupComment['commentId']; - comment: string; - }) => - groupAPI - .updateGroupComment({ bookGroupId, commentId, comment }) - .then(({ data }) => data), - onSettled: () => { - queryClient.invalidateQueries({ - queryKey: bookGroupKeys.comments(bookGroupId), - }); - }, - }); -}; - -export default usePatchBookGroupCommentMutation; diff --git a/src/queries/job/key.ts b/src/queries/job/key.ts deleted file mode 100644 index ee7526382..000000000 --- a/src/queries/job/key.ts +++ /dev/null @@ -1,6 +0,0 @@ -const jobKeys = { - all: ['job'] as const, - category: () => [...jobKeys.all, 'category'] as const, -}; - -export default jobKeys; diff --git a/src/queries/job/useAllJobQuery.ts b/src/queries/job/useAllJobQuery/index.ts similarity index 77% rename from src/queries/job/useAllJobQuery.ts rename to src/queries/job/useAllJobQuery/index.ts index 8a88bbb33..b8e6efd4f 100644 --- a/src/queries/job/useAllJobQuery.ts +++ b/src/queries/job/useAllJobQuery/index.ts @@ -1,8 +1,5 @@ -import { useQuery, UseQueryOptions } from '@tanstack/react-query'; - import jobAPI from '@/apis/job'; - -import jobKeys from '@/queries/job/key'; +import { useQuery, UseQueryOptions } from '@tanstack/react-query'; type Options = Pick< UseQueryOptions<Awaited<ReturnType<typeof jobAPI.getAllJobs>>['data']>, @@ -11,9 +8,9 @@ type Options = Pick< const useAllJobQuery = (options?: Options) => useQuery( - jobKeys.category(), + ['allJob'], () => jobAPI.getAllJobs().then(response => response.data), - { ...options, staleTime: Infinity } + options ); export default useAllJobQuery; diff --git a/src/queries/recommend/useAuthRecommendedBooks.ts b/src/queries/recommend/useAuthRecommendedBooks/index.tsx similarity index 64% rename from src/queries/recommend/useAuthRecommendedBooks.ts rename to src/queries/recommend/useAuthRecommendedBooks/index.tsx index d793ac896..dbe6a10c4 100644 --- a/src/queries/recommend/useAuthRecommendedBooks.ts +++ b/src/queries/recommend/useAuthRecommendedBooks/index.tsx @@ -1,13 +1,12 @@ -import { useQuery } from '@tanstack/react-query'; - +import RecommendAPI from '@/apis/recommend'; import { APIJobGroup } from '@/types/job'; -import recommendAPI from '@/apis/recommend'; +import { useQuery } from '@tanstack/react-query'; const useAuthRecommendedBooks = (jobGroup: APIJobGroup['name']) => useQuery(['authRecommendedBooks', jobGroup], () => - recommendAPI - .getAuthRecommendedBooks(jobGroup) - .then(response => response.data) + RecommendAPI.getAuthRecommendedBooks(jobGroup).then( + response => response.data + ) ); export default useAuthRecommendedBooks; diff --git a/src/queries/recommend/useAuthRecommendedBookshelf.ts b/src/queries/recommend/useAuthRecommendedBookshelf/index.tsx similarity index 64% rename from src/queries/recommend/useAuthRecommendedBookshelf.ts rename to src/queries/recommend/useAuthRecommendedBookshelf/index.tsx index 656f10f7c..007ab485d 100644 --- a/src/queries/recommend/useAuthRecommendedBookshelf.ts +++ b/src/queries/recommend/useAuthRecommendedBookshelf/index.tsx @@ -1,13 +1,12 @@ -import { useQuery } from '@tanstack/react-query'; - +import RecommendAPI from '@/apis/recommend'; import { APIJobGroup } from '@/types/job'; -import recommendAPI from '@/apis/recommend'; +import { useQuery } from '@tanstack/react-query'; const useAuthRecommendedBookshelf = (jobGroup: APIJobGroup['name']) => useQuery(['authRecommendedBookshelf', jobGroup], () => - recommendAPI - .getAuthRecommendedBookshelf(jobGroup) - .then(response => response.data) + RecommendAPI.getAuthRecommendedBookshelf(jobGroup).then( + response => response.data + ) ); export default useAuthRecommendedBookshelf; diff --git a/src/queries/recommend/useUnAuthRecommendedBookshelfQuery.ts b/src/queries/recommend/useUnAuthRecommendedBookshelfQuery/index.tsx similarity index 66% rename from src/queries/recommend/useUnAuthRecommendedBookshelfQuery.ts rename to src/queries/recommend/useUnAuthRecommendedBookshelfQuery/index.tsx index a7b369fad..490518530 100644 --- a/src/queries/recommend/useUnAuthRecommendedBookshelfQuery.ts +++ b/src/queries/recommend/useUnAuthRecommendedBookshelfQuery/index.tsx @@ -1,10 +1,9 @@ +import RecommendAPI from '@/apis/recommend'; import { useQuery } from '@tanstack/react-query'; -import recommendAPI from '@/apis/recommend'; - const useUnAuthRecommendedBookshelfQuery = () => useQuery(['unAuthRecommendedBookshelf'], () => - recommendAPI.getUnAuthRecommendedBookshelf().then(response => response.data) + RecommendAPI.getUnAuthRecommendedBookshelf().then(response => response.data) ); export default useUnAuthRecommendedBookshelfQuery; diff --git a/src/queries/user/key.ts b/src/queries/user/key.ts deleted file mode 100644 index b5434f72b..000000000 --- a/src/queries/user/key.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { APIUser } from '@/types/user'; - -const userKeys = { - all: ['user'] as const, - details: () => [...userKeys.all, 'detail'] as const, - detail: (id: APIUser['userId']) => [...userKeys.details(), id] as const, - me: () => [...userKeys.details(), 'me'] as const, -}; - -export default userKeys; diff --git a/src/queries/user/useMyProfileMutation.ts b/src/queries/user/useMyProfileMutation/index.ts similarity index 99% rename from src/queries/user/useMyProfileMutation.ts rename to src/queries/user/useMyProfileMutation/index.ts index eb43eb33e..00c4ce00a 100644 --- a/src/queries/user/useMyProfileMutation.ts +++ b/src/queries/user/useMyProfileMutation/index.ts @@ -1,5 +1,4 @@ import { useMutation } from '@tanstack/react-query'; - import userAPI from '@/apis/user'; import { APIUser } from '@/types/user'; import { APIJob, APIJobGroup } from '@/types/job'; diff --git a/src/queries/user/useMyProfileQuery.ts b/src/queries/user/useMyProfileQuery.ts index b1cb9662a..f9356487c 100644 --- a/src/queries/user/useMyProfileQuery.ts +++ b/src/queries/user/useMyProfileQuery.ts @@ -1,24 +1,14 @@ import userAPI from '@/apis/user'; import type { APIUser } from '@/types/user'; import useQueryWithSuspense, { - UseQueryOptionWithoutSuspense, + useQueryOptionWithOutSuspense, } from '@/hooks/useQueryWithSuspense'; -import userKeys from './key'; -const useMyProfileQuery = <TData = APIUser>( - options?: UseQueryOptionWithoutSuspense<APIUser, unknown, TData> -) => +const useMyProfileQuery = (options?: useQueryOptionWithOutSuspense<APIUser>) => useQueryWithSuspense( - userKeys.me(), + ['user', 'me'], () => userAPI.getMyProfile().then(({ data }) => data), - { ...options, staleTime: Infinity } + options ); export default useMyProfileQuery; - -export const useMyProfileId = ( - options?: Omit< - UseQueryOptionWithoutSuspense<APIUser, unknown, unknown>, - 'select' - > -) => useMyProfileQuery({ ...options, select: data => data.userId }); diff --git a/src/queries/user/useUserProfileQuery.ts b/src/queries/user/useUserProfileQuery.ts index ac2c183d1..f064c2943 100644 --- a/src/queries/user/useUserProfileQuery.ts +++ b/src/queries/user/useUserProfileQuery.ts @@ -1,17 +1,15 @@ -import type { APIUser, APIUserProfile } from '@/types/user'; +import userAPI from '@/apis/user'; import useQueryWithSuspense, { - UseQueryOptionWithoutSuspense, + useQueryOptionWithOutSuspense, } from '@/hooks/useQueryWithSuspense'; - -import userAPI from '@/apis/user'; -import userKeys from './key'; +import type { APIUser } from '@/types/user'; const useUserProfileQuery = ( userId: APIUser['userId'], - options?: UseQueryOptionWithoutSuspense<APIUserProfile> + options?: useQueryOptionWithOutSuspense<APIUser> ) => useQueryWithSuspense( - userKeys.detail(userId), + ['user', String(userId)], () => userAPI.getUserProfile({ userId }).then(({ data }) => data), options ); diff --git a/src/stories/book/detail/BookInfo.stories.tsx b/src/stories/book/detail/BookInfo.stories.tsx deleted file mode 100644 index c2afb6029..000000000 --- a/src/stories/book/detail/BookInfo.stories.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import BookInfo from '@/components/book/detail/BookInfo'; - -const meta: Meta<typeof BookInfo> = { - title: 'book/detail/BookInfo', - component: BookInfo, -}; - -export default meta; - -type Story = StoryObj<typeof BookInfo>; - -export const Default: Story = { - args: { bookId: 22 }, -}; diff --git a/src/stories/bookGroup/BookGroupStatus.stories.tsx b/src/stories/bookGroup/BookGroupStatus.stories.tsx deleted file mode 100644 index 018edc589..000000000 --- a/src/stories/bookGroup/BookGroupStatus.stories.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import BookGroupStatus from '@/components/bookGroup/BookGroupStatus'; -import { Meta, StoryObj } from '@storybook/react'; - -const meta: Meta<typeof BookGroupStatus> = { - title: 'bookgroup/BookGroupStatus', - component: BookGroupStatus, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof BookGroupStatus>; - -export const Default: Story = { - args: { - start: '2023-12-31', - end: '2024-01-08', - }, -}; diff --git a/src/stories/bookGroup/BookInfoCard.stories.tsx b/src/stories/bookGroup/BookInfoCard.stories.tsx deleted file mode 100644 index a8bb41be5..000000000 --- a/src/stories/bookGroup/BookInfoCard.stories.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import BookInfoCard from '@/components/bookGroup/BookInfoCard'; - -const meta: Meta<typeof BookInfoCard> = { - title: 'bookGroup/BookInfoCard', - component: BookInfoCard, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof BookInfoCard>; - -export const Default: Story = { - args: { bookId: 23 }, -}; - -export const Removable: Story = { - args: { bookId: 23, removable: true }, -}; diff --git a/src/stories/bookGroup/DetailBookGroupCard.stories.tsx b/src/stories/bookGroup/DetailBookGroupCard.stories.tsx deleted file mode 100644 index 26db5221f..000000000 --- a/src/stories/bookGroup/DetailBookGroupCard.stories.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; - -import DetailBookGroupCard from '@/components/bookGroup/DetailBookGroupCard'; - -const meta: Meta<typeof DetailBookGroupCard> = { - title: 'bookgroup/DetailBookGroupCard', - component: DetailBookGroupCard, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof DetailBookGroupCard>; - -export const Default: Story = { - args: { - title: '프롱이 리팩터링 스터디', - description: - '제1차 프롱이 기수연합 독서 스터디 입니다. 마틴 파울러의 저서 ‘리팩터링 2판’과 함께 진행합니다.', - bookImageSrc: 'https://image.yes24.com/goods/89649360/XL', - date: { - start: '2023-10-31', - end: '2023-11-27', - }, - memberCount: 3, - owner: { - name: '소피아', - profileImageSrc: '', - }, - isPublic: false, - commentCount: 12, - bookGroupId: 1, - }, -}; diff --git a/src/stories/bookGroup/SearchGroup.stories.tsx b/src/stories/bookGroup/SearchGroup.stories.tsx deleted file mode 100644 index 6adf06b18..000000000 --- a/src/stories/bookGroup/SearchGroup.stories.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import SearchGroup from '@/components/bookGroup/SearchGroup'; - -const meta: Meta<typeof SearchGroup> = { - title: 'Common/SearchGroup', - component: SearchGroup, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof SearchGroup>; - -const handleClick = () => { - document.getElementById('groupSearching')?.blur(); - alert( - ` - 죄송합니다. - 검색 기능은 현재 준비중에 있습니다. 👀 - ` - ); -}; - -export const Default: Story = { - render: () => <SearchGroup onClick={handleClick} />, -}; diff --git a/src/stories/bookGroup/SimpleBookGroupCard.stories.tsx b/src/stories/bookGroup/SimpleBookGroupCard.stories.tsx deleted file mode 100644 index d3c9a3e43..000000000 --- a/src/stories/bookGroup/SimpleBookGroupCard.stories.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import SimpleBookGroupCard from '@/components/bookGroup/SimpleBookGroupCard'; - -const meta: Meta<typeof SimpleBookGroupCard> = { - title: 'BookGroup/SimpleBookGroupCard', - component: SimpleBookGroupCard, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof SimpleBookGroupCard>; - -export const Default: Story = { - args: { - title: '데일카네기 인간관계론', - imageSource: 'https://image.yes24.com/goods/79297023/XL', - isOwner: false, - bookGroupId: 1, - }, -}; - -export const OwnerCase: Story = { - args: { - title: '데일카네기 인간관계론', - imageSource: 'https://image.yes24.com/goods/79297023/XL', - isOwner: true, - bookGroupId: 1, - }, -}; diff --git a/src/stories/bookGroup/create/steps/EnterTitleStep.stories.tsx b/src/stories/bookGroup/create/steps/EnterTitleStep.stories.tsx deleted file mode 100644 index ee74133c8..000000000 --- a/src/stories/bookGroup/create/steps/EnterTitleStep.stories.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import { FormProvider, useForm } from 'react-hook-form'; - -import type { EnterTitleStepFormValues } from '@/components/bookGroup/create/types'; - -import { appLayoutMeta } from '@/stories/meta'; -import { EnterTitleStep } from '@/components/bookGroup/create/steps'; - -const meta: Meta<typeof EnterTitleStep> = { - title: 'bookGroup/create/steps/EnterTitleStep', - component: EnterTitleStep, - ...appLayoutMeta, -}; - -export default meta; - -type Story = StoryObj<typeof EnterTitleStep>; - -const EnterTitleForm = () => { - const methods = useForm<EnterTitleStepFormValues>({ - mode: 'all', - defaultValues: { - title: '', - }, - }); - - return ( - <FormProvider {...methods}> - <form> - <EnterTitleStep /> - </form> - </FormProvider> - ); -}; - -export const Default: Story = { - render: () => <EnterTitleForm />, -}; diff --git a/src/stories/bookGroup/create/steps/SelectBookStep.stories.tsx b/src/stories/bookGroup/create/steps/SelectBookStep.stories.tsx deleted file mode 100644 index 851dbe5e9..000000000 --- a/src/stories/bookGroup/create/steps/SelectBookStep.stories.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import { FormProvider, useForm } from 'react-hook-form'; - -import type { SelectBookStepFormValues } from '@/components/bookGroup/create/types'; - -import { appLayoutMeta } from '@/stories/meta'; -import { SelectBookStep } from '@/components/bookGroup/create/steps'; - -const meta: Meta<typeof SelectBookStep> = { - title: 'bookGroup/create/steps/SelectBookStep', - component: SelectBookStep, - ...appLayoutMeta, -}; - -export default meta; - -type Story = StoryObj<typeof SelectBookStep>; - -const RenderSelectBookStep = () => { - const methods = useForm<SelectBookStepFormValues>(); - - const goNextStep = () => { - const book = methods.getValues('book'); - alert([`title: ${book.title}`, `id: ${book.bookId}`].join('\n')); - }; - - return ( - <FormProvider {...methods}> - <form> - <SelectBookStep onNextStep={goNextStep} /> - </form> - </FormProvider> - ); -}; - -export const Default: Story = { - render: RenderSelectBookStep, -}; diff --git a/src/stories/bookGroup/create/steps/SelectJoinTypeStep.stories.tsx b/src/stories/bookGroup/create/steps/SelectJoinTypeStep.stories.tsx deleted file mode 100644 index bb0bb8c86..000000000 --- a/src/stories/bookGroup/create/steps/SelectJoinTypeStep.stories.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import { FormProvider, useForm } from 'react-hook-form'; - -import type { SelectJoinTypeStepFormValues } from '@/components/bookGroup/create/types'; - -import { appLayoutMeta } from '@/stories/meta'; -import { SelectJoinTypeStep } from '@/components/bookGroup/create/steps'; - -const meta: Meta<typeof SelectJoinTypeStep> = { - title: 'bookGroup/create/steps/SelectJoinTypeStep', - component: SelectJoinTypeStep, - ...appLayoutMeta, -}; - -export default meta; - -type Story = StoryObj<typeof SelectJoinTypeStep>; - -const RenderSelectJoinTypeStep = () => { - const methods = useForm<SelectJoinTypeStepFormValues>({ - defaultValues: { - hasJoinPassword: 'false', - }, - mode: 'all', - }); - - const onSubmit = () => { - const { hasJoinPassword, joinPassword, joinQuestion } = methods.getValues(); - alert( - `가입 문제 유무: ${hasJoinPassword}\n가입 문제: ${joinQuestion}\n정답: ${joinPassword}` - ); - }; - - return ( - <FormProvider {...methods}> - <form> - <SelectJoinTypeStep onSubmit={onSubmit} /> - </form> - </FormProvider> - ); -}; - -export const Default: Story = { - render: () => <RenderSelectJoinTypeStep />, -}; diff --git a/src/stories/bookGroup/create/steps/SetUpDetailStep.stories.tsx b/src/stories/bookGroup/create/steps/SetUpDetailStep.stories.tsx deleted file mode 100644 index d350b4d7d..000000000 --- a/src/stories/bookGroup/create/steps/SetUpDetailStep.stories.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import { FormProvider, useForm } from 'react-hook-form'; - -import type { SetUpDetailStepFormValues } from '@/components/bookGroup/create/types'; - -import { getTodayDate } from '@/utils/date'; - -import { appLayoutMeta } from '@/stories/meta'; -import { SetUpDetailStep } from '@/components/bookGroup/create/steps'; - -const meta: Meta<typeof SetUpDetailStep> = { - title: 'bookGroup/create/steps/SetUpDetailStep', - component: SetUpDetailStep, - ...appLayoutMeta, -}; - -export default meta; - -type Story = StoryObj<typeof SetUpDetailStep>; - -const SetUpDetailForm = () => { - const methods = useForm<SetUpDetailStepFormValues>({ - mode: 'all', - defaultValues: { - title: '', - book: { - bookId: 23, - }, - startDate: getTodayDate(), - }, - }); - - const onNextStep = () => { - const { - book, - title, - introduce, - maxMemberCount, - customMemberCount, - startDate, - endDate, - isPublic, - } = methods.getValues(); - alert(` - bookId: ${book.bookId}, - title: ${title}, - introduce: ${introduce}, - maxMemberCount: ${maxMemberCount}, - customMemberCount: ${customMemberCount}, - startDate: ${startDate}, - endDate: ${endDate}, - isPublic: ${isPublic}`); - }; - - return ( - <FormProvider {...methods}> - <form> - <SetUpDetailStep - goToSelectBookStep={() => alert('goToSelectBookStep')} - onNextStep={onNextStep} - /> - </form> - </FormProvider> - ); -}; - -export const Default: Story = { - render: () => <SetUpDetailForm />, -}; diff --git a/src/stories/bookGroup/detail/MemberItem.stories.tsx b/src/stories/bookGroup/detail/MemberItem.stories.tsx deleted file mode 100644 index 73075cd59..000000000 --- a/src/stories/bookGroup/detail/MemberItem.stories.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; - -import MemberItem from '@/components/bookGroup/detail/MemberItem'; - -const meta: Meta<typeof MemberItem> = { - title: 'bookgroup/detail/MemberItem', - component: MemberItem, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof MemberItem>; - -export const Default: Story = { - args: { - profileImageSrc: 'https://bit.ly/dan-abramov', - name: '댄', - job: { group: '개발', name: '프론트엔드 개발자' }, - isOwner: true, - }, -}; diff --git a/src/stories/bookGroup/detail/ShortMemberInfo.stories.tsx b/src/stories/bookGroup/detail/ShortMemberInfo.stories.tsx deleted file mode 100644 index c15bccecf..000000000 --- a/src/stories/bookGroup/detail/ShortMemberInfo.stories.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; - -import ShortMemberInfo from '@/components/bookGroup/detail/ShortMemberInfo'; - -const meta: Meta<typeof ShortMemberInfo> = { - title: 'bookgroup/detail/ShortMemberInfo', - component: ShortMemberInfo, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof ShortMemberInfo>; - -export const Default: Story = { - args: { - members: [ - { - id: 1, - profileImageSrc: 'https://bit.ly/dan-abramov', - name: '댄', - job: { group: '개발', name: '프론트엔드 개발자' }, - isOwner: true, - }, - { - id: 2, - profileImageSrc: 'https://bit.ly/kent-c-dodds', - name: '콜라', - job: { group: '개발', name: '백엔드 개발자' }, - isOwner: false, - }, - { - id: 3, - profileImageSrc: 'https://bit.ly/code-beast', - name: 'Code Beast', - job: { group: '디자인', name: 'UI/UX 디자이너' }, - isOwner: false, - }, - { - id: 4, - profileImageSrc: 'https://bit.ly/ryan-florence', - name: 'Ryan', - job: { group: '개발', name: '유니티 개발자' }, - isOwner: false, - }, - ], - }, -}; diff --git a/src/stories/bookSearch/BestSellers.stories.tsx b/src/stories/bookSearch/BestSellers.stories.tsx deleted file mode 100644 index 109345683..000000000 --- a/src/stories/bookSearch/BestSellers.stories.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import BestSellers from '@/components/bookSearch/BestSellers'; - -const meta: Meta<typeof BestSellers> = { - title: 'bookSearch/BestSellers', - component: BestSellers, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof BestSellers>; - -export const Default: Story = {}; diff --git a/src/stories/bookSearch/RecentSearch.stories.tsx b/src/stories/bookSearch/RecentSearch.stories.tsx deleted file mode 100644 index fb5c860d9..000000000 --- a/src/stories/bookSearch/RecentSearch.stories.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import RecentSearch from '@/components/bookSearch/RecentSearchList'; - -const meta: Meta<typeof RecentSearch> = { - title: 'bookSearch/RecentSearch', - component: RecentSearch, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof RecentSearch>; - -export const Default: Story = { - args: { - keywords: undefined, - onClick: () => alert('선택한 검색어 검색!'), - }, -}; - -export const RecentSearches: Story = { - args: { - keywords: [ - { keyword: '21', modifiedAt: 'now' }, - { keyword: 'I Love It', modifiedAt: 'now' }, - { keyword: 'D (Half Moon)', modifiedAt: 'now' }, - { keyword: 'What 2 Do', modifiedAt: 'now' }, - { keyword: 'Bonnie & Clyde', modifiedAt: 'now' }, - { keyword: '풀어', modifiedAt: 'now' }, - { keyword: '어때', modifiedAt: 'now' }, - ], - onClick: () => alert('선택한 검색어 검색!'), - }, -}; diff --git a/src/stories/bookSearch/SearchResult.stories.tsx b/src/stories/bookSearch/SearchResult.stories.tsx deleted file mode 100644 index 4fa738576..000000000 --- a/src/stories/bookSearch/SearchResult.stories.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import type { APISearchedBook } from '@/types/book'; -import BookSearchList from '@/components/bookSearch/BookSearchList'; - -const meta: Meta<typeof BookSearchList> = { - title: 'bookSearch/BookSearchList', - component: BookSearchList, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof BookSearchList>; - -const SEARCHED_BOOK: APISearchedBook = { - title: '리팩터링', - author: '마틴 파울러', - isbn: '9791162242742', - contents: - '지난 20년간 전 세계 프로그래머에게 리팩터링의 교본이었던 이 책의 1판은, 기존 코드의 디자인을 개선하고 소프트웨어 유지 관리 능력을 향상시켰으며 기존 코드를 이해하기 쉽게 만드는 데 도움을 주었습니다. 간절히 기다려온 이번 개정판에는 프로그래밍 환경의 중요한 변화가 대거 반영되었습니다. 새로운 리팩터링 카탈로그를 자바스크립트 코드로 제시합니다. 리팩터링 원칙부터 클래스 없이 리팩터링하는 방법과 데이터 조직화, 조건부 로직 간소화 방법을 다룹니다. 또한', - url: 'https://search.daum.net/search?w=bookpage&bookId=5326912&q=%EB%A6%AC%ED%8C%A9%ED%84%B0%EB%A7%81', - imageUrl: - 'https://search1.kakaocdn.net/thumb/R120x174.q85/?fname=http%3A%2F%2Ft1.daumcdn.net%2Flbook%2Fimage%2F5326912%3Ftimestamp%3D20231207165435', - publisher: '한빛미디어', - apiProvider: 'KAKAO', -}; - -export const Default: Story = { - args: { - books: [SEARCHED_BOOK, SEARCHED_BOOK, SEARCHED_BOOK, SEARCHED_BOOK], - }, -}; diff --git a/src/stories/bookShelf/BookShelfCard.stories.tsx b/src/stories/bookShelf/BookShelfCard.stories.tsx deleted file mode 100644 index 8c3efe076..000000000 --- a/src/stories/bookShelf/BookShelfCard.stories.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import BookShelfCard from '@/components/bookShelf/BookShelfCard'; -import { Meta, StoryObj } from '@storybook/react'; - -const meta: Meta<typeof BookShelfCard> = { - title: 'bookShelf/BookShelf', - component: BookShelfCard, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof BookShelfCard>; - -// TODO: 스토리북에서 이미지를 불러올 때 발생하는 CORS 이슈 해결 -export const Default: Story = { - args: { - bookshelfId: 9, - bookshelfName: '백민종님의 책장', - books: [ - { - bookId: 3, - title: '리액트를 다루는 기술', - imageUrl: '/images/book-cover/book1.jpeg', - }, - { - bookId: 11, - title: '모던 자바스크립트 Deep Dive', - imageUrl: '/images/book-cover/book2.jpeg', - }, - { - bookId: 22, - title: '이펙티브 타입스크립트', - imageUrl: '/images/book-cover/book3.jpeg', - }, - { - bookId: 23, - title: '리팩터링 2판', - imageUrl: '/images/book-cover/book4.jpeg', - }, - ], - likeCount: 3, - }, -}; diff --git a/src/stories/comment/CommentList.stories.tsx b/src/stories/comment/CommentList.stories.tsx deleted file mode 100644 index d1930e63a..000000000 --- a/src/stories/comment/CommentList.stories.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import CommentList from '@/components/comment/CommentList'; - -const meta: Meta<typeof CommentList> = { - title: 'comment/CommentList', - component: CommentList, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof CommentList>; - -const comments = [ - { - id: 1, - writer: { - id: 2, - profileImageSrc: 'https://bit.ly/kent-c-dodds', - name: 'Kent C. Dodds', - }, - createdAt: '2023.02.05', - content: '추천해요!', - }, - { - id: 2, - writer: { - id: 3, - profileImageSrc: 'https://i.pravatar.cc/300', - name: '김계란', - }, - createdAt: '2023.02.07', - content: '읽고 또 읽어도 새로워요. 🫠', - }, -]; - -export const Default: Story = { - args: { - comments, - isEditableComment: ({ writer }) => writer.id === 3, - }, -}; - -export const Hidden: Story = { - args: { - comments, - isHidden: true, - hiddenText: '멤버만 볼 수 있어요 🥲', - }, -}; - -export const Empty: Story = { - args: { - comments: [], - emptyText: `아직 코멘트가 없어요. - 첫 코멘트의 주인공이 되어보세요!`, - }, -}; diff --git a/src/stories/common/Avatar.stories.tsx b/src/stories/common/Avatar.stories.tsx deleted file mode 100644 index eea91e563..000000000 --- a/src/stories/common/Avatar.stories.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; - -import Avatar from '@/components/common/Avatar'; - -const meta: Meta<typeof Avatar> = { - title: 'Common/Avatar', - component: Avatar, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof Avatar>; - -export const Default: Story = { - args: {}, -}; - -export const WithSrc: Story = { - args: { src: '/icons/logo.svg', name: 'dadok', size: 'large' }, -}; diff --git a/src/stories/common/Badge.stories.tsx b/src/stories/common/Badge.stories.tsx deleted file mode 100644 index de90e2e4c..000000000 --- a/src/stories/common/Badge.stories.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import Badge from '@/components/common/Badge'; -import { IconHeart } from '@public/icons'; -import { Meta, StoryObj } from '@storybook/react'; - -const meta: Meta<typeof Badge> = { - title: 'Common/Badge', - component: Badge, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof Badge>; - -export const Default: Story = { - args: { - size: 'small', - colorScheme: 'main-light', - fontWeight: 'bold', - }, - render: args => <Badge {...args}>프론트엔드 개발자</Badge>, -}; - -export const BookshelfLike: Story = { - args: { - size: 'small', - colorScheme: 'red', - fontWeight: 'bold', - }, - render: args => ( - <Badge {...args}> - <div className="h-[1.3rem] w-[1.3rem] fill-white"> - <IconHeart /> - </div> - 99 - </Badge> - ), -}; - -export const GroupProgress: Story = { - args: { - size: 'large', - colorScheme: 'main', - fontWeight: 'bold', - }, - render: args => <Badge {...args}>진행중</Badge>, -}; - -export const GroupDisclosure: Story = { - args: { - size: 'medium', - colorScheme: 'grey', - fontWeight: 'normal', - }, - render: args => <Badge {...args}>공개</Badge>, -}; diff --git a/src/stories/common/BottomActionButton.stories.tsx b/src/stories/common/BottomActionButton.stories.tsx deleted file mode 100644 index cee9d753f..000000000 --- a/src/stories/common/BottomActionButton.stories.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import BottomActionButton from '@/components/common/BottomActionButton'; -import { Meta, StoryObj } from '@storybook/react'; - -const meta: Meta<typeof BottomActionButton> = { - title: 'Common/BottomActionButton', - component: BottomActionButton, - tags: ['autodocs'], - parameters: { - docs: { - story: { - inline: false, - }, - }, - }, -}; - -export default meta; - -type Story = StoryObj<typeof BottomActionButton>; - -export const Default: Story = { - args: {}, - render: () => ( - <BottomActionButton onClick={() => alert('click!')}> - 다음 - </BottomActionButton> - ), -}; diff --git a/src/stories/common/BottomNavigation.stories.tsx b/src/stories/common/BottomNavigation.stories.tsx deleted file mode 100644 index 7bf66300d..000000000 --- a/src/stories/common/BottomNavigation.stories.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; - -import BottomNavigation from '@/components/common/BottomNavigation'; - -const meta: Meta<typeof BottomNavigation> = { - title: 'Common/BottomNavigation', - component: BottomNavigation, - tags: ['autodocs'], - parameters: { - docs: { - story: { - inline: false, - }, - }, - }, -}; - -export default meta; - -type Story = StoryObj<typeof BottomNavigation>; - -export const Default: Story = { - args: { pathname: '/bookarchive' }, - render: args => <BottomNavigation {...args} />, -}; - -export const Search: Story = { - args: { pathname: '/book/search' }, - render: args => <BottomNavigation {...args} />, -}; - -export const Group: Story = { - args: { pathname: '/group' }, - render: args => <BottomNavigation {...args} />, -}; - -export const Profile: Story = { - args: { pathname: '/profile/me' }, - render: args => <BottomNavigation {...args} />, -}; diff --git a/src/stories/common/BottomSheet.stories.tsx b/src/stories/common/BottomSheet.stories.tsx deleted file mode 100644 index 80fe1cdfa..000000000 --- a/src/stories/common/BottomSheet.stories.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; - -import { IconClose, IconKakao, LogoWithText } from '@public/icons'; -import Button from '@/components/common/Button'; -import BottomSheet from '@/components/common/BottomSheet'; -import useDisclosure from '@/hooks/useDisclosure'; - -const meta: Meta<typeof BottomSheet> = { - title: 'Common/BottomSheet', - component: BottomSheet, - tags: ['autodocs'], -}; - -const DefaultBottomSheet = () => { - const { isOpen, onOpen, onClose } = useDisclosure(); - - return ( - <> - <Button onClick={onOpen}>기본 바텀시트 열기</Button> - <BottomSheet isShow={isOpen} onClose={onClose}> - <p className="text-center text-lg">바텀시트 예시</p> - </BottomSheet> - </> - ); -}; - -const LoginBottomSheet = () => { - const { isOpen, onOpen, onClose } = useDisclosure(); - - return ( - <> - <Button onClick={onOpen}>로그인 바텀시트 열기</Button> - <BottomSheet isShow={isOpen} onClose={onClose}> - <div - className="absolute right-0 top-0 mr-[2rem] mt-[2rem] h-[2rem] w-[2rem] cursor-pointer" - onClick={onClose} - > - <IconClose /> - </div> - <div className="m-auto flex w-full max-w-[38rem] flex-col items-center gap-[2.5rem] px-[2rem] pt-[5rem]"> - <div className="h-auto w-[6rem]"> - <LogoWithText /> - </div> - <p className="text-lg font-bold text-black-700"> - 로그인이 필요한 서비스에요! - </p> - <p className="text-center text-sm font-normal text-placeholder"> - 간편하게 카카오로 로그인을 하고, - <br /> - <span className="text-main-900">다독다독</span>의 다양한 기능을 - 이용해보세요. - </p> - <Button colorScheme="kakao" size="full"> - <div className="flex w-full items-center justify-center gap-[0.7rem]"> - <div className="h-auto w-[1.6rem]"> - <IconKakao /> - </div> - <span className="text-md font-normal">카카오 로그인</span> - </div> - </Button> - </div> - </BottomSheet> - </> - ); -}; - -export default meta; - -type Story = StoryObj<typeof BottomSheet>; - -export const Default: Story = { - render: DefaultBottomSheet, -}; - -export const Login: Story = { - render: LoginBottomSheet, -}; diff --git a/src/stories/common/Button.stories.tsx b/src/stories/common/Button.stories.tsx deleted file mode 100644 index 355f5b650..000000000 --- a/src/stories/common/Button.stories.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; - -import Button from '@/components/common/Button'; - -const meta: Meta<typeof Button> = { - title: 'Common/Button', - component: Button, - tags: ['autodocs'], - argTypes: { - colorScheme: { control: 'select' }, - }, - args: { - size: 'medium', - fill: true, - fullRadius: false, - }, -}; - -export default meta; - -type Story = StoryObj<typeof Button>; - -export const Default: Story = { - render: args => <Button {...args}>버튼</Button>, -}; - -export const Main: Story = { - args: { - colorScheme: 'main', - }, - render: args => <Button {...args}>버튼</Button>, -}; - -export const MainLight: Story = { - args: { - colorScheme: 'main-light', - }, - render: args => <Button {...args}>버튼</Button>, -}; - -export const Warning: Story = { - args: { - colorScheme: 'warning', - }, - render: args => <Button {...args}>버튼</Button>, -}; - -export const Grey: Story = { - args: { - colorScheme: 'grey', - }, - render: args => <Button {...args}>버튼</Button>, -}; - -export const Kakao: Story = { - args: { - colorScheme: 'kakao', - }, - render: args => <Button {...args}>버튼</Button>, -}; - -export const Disabled: Story = { - args: { - disabled: true, - }, - render: args => ( - <div className="flex gap-[0.5rem]"> - <Button {...args} fill={true}> - 버튼 - </Button> - <Button {...args} fill={false}> - 버튼 - </Button> - </div> - ), -}; - -export const RecentSearch: Story = { - args: { - ...MainLight.args, - fullRadius: true, - }, - render: args => <Button {...args}>최근 검색어</Button>, -}; diff --git a/src/stories/common/DatePicker.stories.tsx b/src/stories/common/DatePicker.stories.tsx deleted file mode 100644 index 2d2968e2a..000000000 --- a/src/stories/common/DatePicker.stories.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { getTodayDate } from '@/utils/date'; -import Button from '@/components/common/Button'; -import DatePicker from '@/components/common/DatePicker'; -import ErrorMessage from '@/components/common/ErrorMessage'; -import { Meta, StoryObj } from '@storybook/react'; -import { SubmitHandler, useForm } from 'react-hook-form'; - -const meta: Meta<typeof DatePicker> = { - title: 'Common/DatePicker', - component: DatePicker, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof DatePicker>; - -export const Default: Story = { - args: { - defaultValue: '2023-06-16', - }, - render: args => <DatePicker {...args} />, -}; - -export const Disabled: Story = { - args: { - disabled: true, - defaultValue: '2023-06-16', - }, - render: args => <DatePicker {...args} />, -}; - -export const UseWithForm: Story = { - render: () => <DatePickerWithForm />, -}; - -type DefaultValues = { - startDate: string; - endDate: string; - hello: number; - hi: string; -}; - -const DatePickerWithForm = () => { - const { - register, - handleSubmit, - formState: { errors }, - } = useForm<DefaultValues>({ - mode: 'all', - defaultValues: { - startDate: getTodayDate(), - endDate: '2030-12-25', - }, - }); - - const handleSubmitForm: SubmitHandler<DefaultValues> = ({ - startDate, - endDate, - }) => { - alert(`startDate: ${startDate} endDate: ${endDate}`); - }; - - return ( - <form - onSubmit={handleSubmit(handleSubmitForm)} - className="flex flex-col gap-[3.2rem]" - > - <div className="flex flex-col gap-[0.5rem]"> - <DatePicker - disabled={true} - min={getTodayDate()} - {...register('startDate', { - required: { value: true, message: '종료일을 입력해주세요' }, - min: { - value: getTodayDate(), - message: '종료일은 시작일보다 늦어야 해요', - }, - })} - /> - {errors.startDate && ( - <ErrorMessage>{errors.startDate.message}</ErrorMessage> - )} - </div> - <div className="flex flex-col gap-[0.5rem]"> - <DatePicker - min={getTodayDate()} - {...register('endDate', { - required: { value: true, message: '종료일을 입력해주세요.' }, - min: { - value: getTodayDate(), - message: '종료일은 시작일보다 늦어야 해요.', - }, - })} - /> - {errors.endDate && ( - <ErrorMessage>{errors.endDate.message}</ErrorMessage> - )} - </div> - <Button - size="full" - type="submit" - onClick={handleSubmit(handleSubmitForm)} - > - Submit - </Button> - </form> - ); -}; diff --git a/src/stories/common/Drawer.stories.tsx b/src/stories/common/Drawer.stories.tsx deleted file mode 100644 index fdc41fa54..000000000 --- a/src/stories/common/Drawer.stories.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; - -import useDisclosure from '@/hooks/useDisclosure'; - -import Button from '@/components/common/Button'; -import Drawer from '@/components/common/Drawer'; - -const meta: Meta<typeof Drawer> = { - title: 'Common/Drawer', - component: Drawer, -}; - -export default meta; - -type Story = StoryObj<typeof Drawer>; - -const BaseDrawer = () => { - const { isOpen, onOpen, onClose } = useDisclosure(); - - return ( - <> - <Button onClick={onOpen}>Drawer 열기</Button> - <Drawer isOpen={isOpen} onClose={onClose}> - <Drawer.Header> - <Drawer.CloseButton position="top-right" /> - <Drawer.Title text="Drawer Header" /> - </Drawer.Header> - <Drawer.Content> - <p>Drawer Content</p> - </Drawer.Content> - </Drawer> - </> - ); -}; - -const AddCommentDrawer = () => { - const { isOpen, onOpen, onClose } = useDisclosure(); - - return ( - <> - <Button onClick={onOpen}>모임 글 작성하기</Button> - <Drawer isOpen={isOpen} onClose={onClose}> - <Drawer.Header> - <Drawer.CloseButton position="top-left" /> - <Drawer.Title text="모임 게시글 작성하기" /> - <Button - colorScheme="main" - fill={false} - size="medium" - className="flex-shrink-0 border-none !p-0" - onClick={onClose} - > - 완료 - </Button> - </Drawer.Header> - <Drawer.Content> - <textarea - className="h-[60vh] w-full resize-none border-none text-md focus:outline-none" - placeholder="책에 대한 여러분의 자유로운 생각을 들려주세요" - /> - </Drawer.Content> - </Drawer> - </> - ); -}; - -export const Default: Story = { - render: BaseDrawer, -}; - -export const AddComment: Story = { - render: AddCommentDrawer, -}; diff --git a/src/stories/common/FloatingButton.stories.tsx b/src/stories/common/FloatingButton.stories.tsx deleted file mode 100644 index c0445d6ae..000000000 --- a/src/stories/common/FloatingButton.stories.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import FloatingButton from '@/components/common/FloatingButton'; - -const meta: Meta<typeof FloatingButton> = { - title: 'Common/FloatingButton', - component: FloatingButton, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof FloatingButton>; - -export const Default: Story = { - args: { - position: 'bottom-right', - }, - render: args => <FloatingButton {...args} />, -}; diff --git a/src/stories/common/Input.stories.tsx b/src/stories/common/Input.stories.tsx deleted file mode 100644 index aa65a19c5..000000000 --- a/src/stories/common/Input.stories.tsx +++ /dev/null @@ -1,148 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import Input from '@/components/common/Input'; -import Button from '@/components/common/Button'; -import { Control, SubmitHandler, useForm, useWatch } from 'react-hook-form'; -import ErrorMessage from '@/components/common/ErrorMessage'; - -const meta: Meta<typeof Input> = { - title: 'Common/Input', - component: Input, - args: { - fontSize: 'small', - }, - argTypes: { - fontSize: { control: 'select', options: ['small', 'large'] }, - }, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof Input>; - -type DefaultValues = { - name: string; - age: number; -}; - -const InputWithUseForm = () => { - const { - register, - handleSubmit, - control, - formState: { errors }, - } = useForm<DefaultValues>({ - mode: 'all', - }); - - const handleSubmitForm: SubmitHandler<DefaultValues> = ({ name, age }) => { - alert(`name: ${name}, age: ${age}`); - }; - - return ( - <form - onSubmit={handleSubmit(handleSubmitForm)} - className="flex w-[43rem] flex-col gap-[1.6rem]" - > - <div className="flex flex-col gap-[0.5rem]"> - <Input - placeholder="이름을 입력해주세요." - {...register('name', { - required: '필수 항목입니다.', - minLength: { value: 2, message: '2자 이상 입력해 주세요.' }, - maxLength: { value: 10, message: '10자 이하 입력해 주세요.' }, - })} - error={!!errors.name} - /> - <div className="flex flex-row-reverse justify-between gap-[0.4rem]"> - <Length control={control} minLength={2} maxLength={10} /> - {errors.name && <ErrorMessage>{errors.name.message}</ErrorMessage>} - </div> - </div> - <div className="flex flex-col gap-[0.5rem]"> - <Input - placeholder="나이를 입력해 주세요." - {...register('age', { - pattern: { value: /^[0-9]+$/, message: '숫자만 입력 가능해요' }, - min: { value: 0, message: '0살부터 입력 가능해요.' }, - })} - error={!!errors.age} - /> - {errors.age && <ErrorMessage>{errors.age.message}</ErrorMessage>} - </div> - <Button - size="large" - type="submit" - onClick={handleSubmit(handleSubmitForm)} - > - Submit - </Button> - </form> - ); -}; - -const Length = ({ - control, - minLength, - maxLength, -}: { - control: Control<DefaultValues>; - minLength: number; - maxLength: number; -}) => { - const nickname = useWatch({ - control, - name: 'name', - }); - - const currentLength = nickname ? nickname.length : 0; - const isError = minLength > currentLength || currentLength > maxLength; - const textColor = isError ? 'text-warning-800 ' : 'text-main-900'; - - return ( - <div> - <span className={textColor}>{currentLength}</span>/{maxLength} - </div> - ); -}; - -export const Default: Story = { - args: { - placeholder: '입력해 주세요.', - }, -}; - -export const Line: Story = { - args: { - fontSize: 'large', - error: false, - }, - render: args => ( - <Input - inputStyle="line" - defaultValue="프롱이 리팩터링 스터디" - placeholder="제목을 작성해주세요" - {...args} - /> - ), -}; - -export const Invalid: Story = { - args: { - placeholder: '입력해 주세요.', - error: true, - }, - argTypes: { - inputStyle: { control: 'select', options: ['default', 'line'] }, - }, - render: args => ( - <div className="flex flex-col gap-[0.5rem]"> - <Input {...args} /> - <ErrorMessage>양식을 확인해주세요.</ErrorMessage> - </div> - ), -}; - -export const WithUseForm: Story = { - render: () => <InputWithUseForm />, -}; diff --git a/src/stories/common/InputLength.stories.tsx b/src/stories/common/InputLength.stories.tsx deleted file mode 100644 index 9e087c863..000000000 --- a/src/stories/common/InputLength.stories.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import { SubmitHandler, useForm } from 'react-hook-form'; - -import Button from '@/components/common/Button'; -import Input from '@/components/common/Input'; -import InputLength from '@/components/common/InputLength'; -import ErrorMessage from '@/components/common/ErrorMessage'; - -const meta: Meta<typeof InputLength> = { - title: 'Common/InputLength', - component: InputLength, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof InputLength>; - -type DefaultValues = { - password: string; -}; - -const InputLengthUseWithForm = () => { - const { - register, - watch, - handleSubmit, - formState: { errors }, - } = useForm<DefaultValues>({ - mode: 'all', - }); - - const handleSubmitForm: SubmitHandler<DefaultValues> = ({ password }) => { - alert(`password: ${password}`); - }; - - return ( - <form - onSubmit={handleSubmit(handleSubmitForm)} - className="flex w-full flex-col gap-[1.6rem]" - > - <div className="flex flex-col gap-[0.5rem]"> - <Input - placeholder="비밀번호를 입력해주세요." - {...register('password', { - required: '필수 항목입니다.', - minLength: { value: 2, message: '2자 이상 입력해 주세요.' }, - maxLength: { value: 10, message: '10자 이하 입력해 주세요.' }, - })} - error={!!errors.password} - /> - <div className="flex flex-row-reverse justify-between gap-[0.4rem]"> - <InputLength - currentLength={watch('password')?.length} - isError={!!errors.password} - maxLength={10} - /> - {errors.password && ( - <ErrorMessage>{errors.password.message}</ErrorMessage> - )} - </div> - </div> - <Button - size="large" - type="submit" - onClick={handleSubmit(handleSubmitForm)} - > - Submit - </Button> - </form> - ); -}; - -export const Default: Story = { - render: () => <InputLengthUseWithForm />, -}; diff --git a/src/stories/common/LikeButton.stories.tsx b/src/stories/common/LikeButton.stories.tsx deleted file mode 100644 index ca0d384b1..000000000 --- a/src/stories/common/LikeButton.stories.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import LikeButton from '@/components/common/LikeButton'; -import { Meta, StoryObj } from '@storybook/react'; - -const meta: Meta<typeof LikeButton> = { - title: 'Common/LikeButton', - component: LikeButton, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof LikeButton>; - -export const Default: Story = { - args: { - isLiked: false, - likeCount: 10, - }, -}; - -export const IsLiked: Story = { - args: { - isLiked: true, - likeCount: 999, - }, -}; diff --git a/src/stories/common/Loading.stories.tsx b/src/stories/common/Loading.stories.tsx deleted file mode 100644 index 7fac5a2da..000000000 --- a/src/stories/common/Loading.stories.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import Loading from '@/components/common/Loading'; - -const meta: Meta<typeof Loading> = { - title: 'Common/Loading', - component: Loading, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof Loading>; - -export const Default: Story = { - args: {}, -}; - -export const Main: Story = { - args: { color: 'main' }, -}; - -export const Grey: Story = { - args: { color: 'grey' }, -}; diff --git a/src/stories/common/Menu.stories.tsx b/src/stories/common/Menu.stories.tsx deleted file mode 100644 index c5103256c..000000000 --- a/src/stories/common/Menu.stories.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import Menu from '@/components/common/Menu'; - -const meta: Meta<typeof Menu> = { - title: 'Common/Menu', - component: Menu, -}; - -export default meta; - -type Story = StoryObj<typeof Menu>; - -export const Dropdown: Story = { - render: () => { - return ( - <div className="flex justify-end"> - <Menu> - <Menu.Toggle /> - <Menu.DropdownList> - <Menu.Item>수정하기</Menu.Item> - <Menu.Item>삭제하기</Menu.Item> - </Menu.DropdownList> - </Menu> - </div> - ); - }, -}; - -export const Bottomsheet: Story = { - render: () => { - return ( - <Menu> - <Menu.Toggle /> - <Menu.BottomSheetList> - <Menu.Item>수정하기</Menu.Item> - <Menu.Item>삭제하기</Menu.Item> - </Menu.BottomSheetList> - </Menu> - ); - }, -}; diff --git a/src/stories/common/Modal.stories.tsx b/src/stories/common/Modal.stories.tsx deleted file mode 100644 index b5fe7c0ca..000000000 --- a/src/stories/common/Modal.stories.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import Modal from '@/components/common/Modal'; -import useDisclosure from '@/hooks/useDisclosure'; -import Button from '@/components/common/Button'; -import { Fragment } from 'react'; - -const meta: Meta<typeof Modal> = { - title: 'Common/Modal', - component: Modal, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof Modal>; - -const BaseModal = () => { - const { isOpen, onOpen, onClose } = useDisclosure(); - - return ( - <> - <Button - onClick={() => { - onOpen(); - }} - > - Open Modal - </Button> - <Modal isOpen={isOpen} onClose={onClose}></Modal> - </> - ); -}; - -const DeleteModal = () => { - const { isOpen, onOpen, onClose } = useDisclosure(); - - const handleClick = () => { - alert('삭제되었습니다.'); - onClose(); - }; - - return ( - <> - <Button - onClick={() => { - onOpen(); - }} - > - Open Modal - </Button> - <Modal isOpen={isOpen} onClose={onClose}> - <div className="text-lg font-bold"> - 정말 삭제할까요? - <p className="text-xs font-normal text-black-500"> - 한번 삭제하면 되돌릴 수 없어요. - </p> - </div> - <div className="flex justify-end gap-[1rem]"> - <Button - onClick={onClose} - fill={false} - colorScheme="grey" - size="small" - > - 취소 - </Button> - <Button onClick={handleClick} size="small"> - 확인 - </Button> - </div> - </Modal> - </> - ); -}; - -export const Default: Story = { - render: () => <BaseModal />, -}; - -export const Delete: Story = { - render: () => <DeleteModal />, -}; diff --git a/src/stories/common/ProgressBar.stories.tsx b/src/stories/common/ProgressBar.stories.tsx deleted file mode 100644 index b68599692..000000000 --- a/src/stories/common/ProgressBar.stories.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import ProgressBar from '@/components/common/ProgressBar'; - -const meta: Meta<typeof ProgressBar> = { - title: 'Common/ProgressBar', - component: ProgressBar, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof ProgressBar>; - -export const Default: Story = { - args: { value: 30 }, -}; diff --git a/src/stories/common/RadioButton.stories.tsx b/src/stories/common/RadioButton.stories.tsx deleted file mode 100644 index 3636fce9e..000000000 --- a/src/stories/common/RadioButton.stories.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import { SubmitHandler, useForm } from 'react-hook-form'; - -import RadioButton from '@/components/common/RadioButton'; -import Button from '@/components/common/Button'; - -const meta: Meta<typeof RadioButton> = { - title: 'Common/RadioButton', - component: RadioButton, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof RadioButton>; - -type FormValues = { - radio: string; -}; - -const RadioButtonWithUseForm = () => { - const { register, handleSubmit, watch } = useForm<FormValues>({ - mode: 'all', - defaultValues: { radio: '라디오 A' }, - }); - - const handleSubmitForm: SubmitHandler<FormValues> = ({ radio }) => { - alert(`Submit as: ${radio}`); - }; - - return ( - <> - <form - onSubmit={handleSubmit(handleSubmitForm)} - className="flex w-[43rem] flex-col gap-[1.6rem]" - > - <div className="flex justify-between"> - <RadioButton {...register('radio')} value="라디오 A" /> - <RadioButton {...register('radio')} value="라디오 B" /> - <RadioButton {...register('radio')} value="라디오 C" /> - </div> - <Button size="large" type="submit"> - Submit - </Button> - </form> - <pre>{JSON.stringify(watch(), null, 2)}</pre> - </> - ); -}; - -export const Default: Story = { - render: args => <RadioButton {...args} value="라디오 버튼" />, -}; - -export const RadioButtonForm: Story = { - render: RadioButtonWithUseForm, -}; diff --git a/src/stories/common/Select.stories.tsx b/src/stories/common/Select.stories.tsx deleted file mode 100644 index 76b48a167..000000000 --- a/src/stories/common/Select.stories.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import Select from '@/components/common/Select'; -import { SubmitHandler, useForm } from 'react-hook-form'; -import Button from '@/components/common/Button'; -import ErrorMessage from '@/components/common/ErrorMessage'; - -const meta: Meta<typeof Select> = { - title: 'Common/Select', - component: Select, - tags: ['autodocs'], -}; - -const numbers = [1, 2, 3] as const; - -export default meta; - -type DefaultValues = { - requiredNumber: number; - number: number; -}; - -const SelectWithUseForm = () => { - const { - register, - handleSubmit, - formState: { errors }, - } = useForm<DefaultValues>({ - mode: 'all', - }); - - const handleSubmitForm: SubmitHandler<DefaultValues> = ({ - requiredNumber, - number, - }) => { - alert(`requiredNumber: ${requiredNumber}, number: ${number}`); - }; - - return ( - <form - onSubmit={handleSubmit(handleSubmitForm)} - className="flex w-[43rem] flex-col gap-[1.6rem]" - > - <div className="flex flex-col gap-[0.5rem]"> - <Select - placeholder="숫자를 선택해주세요. (필수)" - {...register('requiredNumber', { - required: '필수 항목입니다.', - })} - error={!!errors.requiredNumber} - > - {numbers.map(number => ( - <Select.Option key={number} value={number}> - {number} - </Select.Option> - ))} - </Select> - {errors.requiredNumber && ( - <ErrorMessage>{errors.requiredNumber.message}</ErrorMessage> - )} - </div> - <div className="flex flex-col gap-[0.5rem]"> - <Select - placeholder="숫자를 선택해주세요." - {...register('number')} - error={!!errors.number} - > - {numbers.map(number => ( - <Select.Option key={number} value={number}> - {number} - </Select.Option> - ))} - </Select> - {errors.number && <ErrorMessage>{errors.number.message}</ErrorMessage>} - </div> - <Button - size="large" - type="submit" - onClick={handleSubmit(handleSubmitForm)} - > - Submit - </Button> - </form> - ); -}; - -type Story = StoryObj<typeof Select>; - -export const Default: Story = { - args: { - placeholder: '선택해 주세요.', - }, - render: args => ( - <Select {...args}> - {numbers.map(number => ( - <Select.Option key={number} value={number}> - {number} - </Select.Option> - ))} - </Select> - ), -}; - -export const Invalid: Story = { - args: { - placeholder: '입력해 주세요.', - error: true, - }, - render: args => ( - <div className="flex flex-col gap-[0.5rem]"> - <Select {...args} /> - <ErrorMessage>양식을 확인해주세요.</ErrorMessage> - </div> - ), -}; - -export const WithUseForm: Story = { - render: () => ( - <div className="min-h-[20rem]"> - <SelectWithUseForm /> - </div> - ), -}; diff --git a/src/stories/common/Skeleton.stories.tsx b/src/stories/common/Skeleton.stories.tsx deleted file mode 100644 index 423a5cc98..000000000 --- a/src/stories/common/Skeleton.stories.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import Skeleton from '@/components/common/Skeleton'; - -const meta: Meta<typeof Skeleton> = { - title: 'Common/Skeleton', - component: Skeleton, -}; - -export default meta; - -type CircleStory = StoryObj<typeof Skeleton.Circle>; -type TextStory = StoryObj<typeof Skeleton.Text>; -type RectStory = StoryObj<typeof Skeleton.Rect>; - -const basicSizes = ['small', 'medium', 'large']; - -export const Circle: CircleStory = { - args: { size: 'small' }, - argTypes: { - size: { - options: [...basicSizes], - control: { type: 'radio' }, - }, - }, - render: args => ( - <Skeleton> - <Skeleton.Circle {...args} /> - </Skeleton> - ), -}; - -export const Text: TextStory = { - args: { fontSize: 'small', width: '50%' }, - argTypes: { - fontSize: { - options: ['2xsmall', 'xsmall', ...basicSizes, 'xlarge', '2xlarge'], - control: { type: 'radio' }, - }, - }, - render: args => ( - <Skeleton> - <Skeleton.Text {...args} /> - </Skeleton> - ), -}; - -export const Rectangle: RectStory = { - args: { width: '10rem', height: '12.3rem' }, - argTypes: { - rounded: { - options: [...basicSizes, 'full'], - control: { type: 'radio' }, - }, - }, - render: args => ( - <Skeleton> - <Skeleton.Rect {...args} /> - </Skeleton> - ), -}; diff --git a/src/stories/common/Stepper.stories.tsx b/src/stories/common/Stepper.stories.tsx deleted file mode 100644 index 800e5e92f..000000000 --- a/src/stories/common/Stepper.stories.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import Stepper from '@/components/common/Stepper'; - -const meta: Meta<typeof Stepper> = { - title: 'Common/Stepper', - component: Stepper, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof Stepper>; - -export const Default: Story = { - args: { activeIndex: 0 }, - - render: args => ( - <Stepper {...args}> - <Stepper.Step /> - <Stepper.Step /> - <Stepper.Step /> - </Stepper> - ), -}; diff --git a/src/stories/common/Switch.stories.tsx b/src/stories/common/Switch.stories.tsx deleted file mode 100644 index 28ed0f753..000000000 --- a/src/stories/common/Switch.stories.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import { SubmitHandler, useForm } from 'react-hook-form'; - -import Switch from '@/components/common/Switch'; -import Button from '@/components/common/Button'; - -const meta: Meta<typeof Switch> = { - title: 'Common/Switch', - component: Switch, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof Switch>; - -type FormValues = { - comment: boolean; -}; - -const SwitchWithUseForm = () => { - const { register, handleSubmit } = useForm<FormValues>({ - mode: 'all', - defaultValues: { comment: true }, - }); - - const handleSubmitForm: SubmitHandler<FormValues> = ({ comment }) => { - alert(`comment: ${comment ? 'public' : 'private'}`); - }; - - return ( - <form - onSubmit={handleSubmit(handleSubmitForm)} - className="flex w-[43rem] flex-col gap-[1.6rem]" - > - <div className="flex justify-between"> - <span className="text-md">댓글 공개</span> - <Switch {...register('comment')} /> - </div> - <Button - size="large" - type="submit" - onClick={handleSubmit(handleSubmitForm)} - > - Submit - </Button> - </form> - ); -}; - -export const Default: Story = { - args: { name: 'switch' }, -}; - -export const WithForm: Story = { - render: SwitchWithUseForm, -}; diff --git a/src/stories/common/TextArea.stories.tsx b/src/stories/common/TextArea.stories.tsx deleted file mode 100644 index c43e5eae7..000000000 --- a/src/stories/common/TextArea.stories.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import { SubmitHandler, useForm } from 'react-hook-form'; -import TextArea from '@/components/common/TextArea'; -import Button from '@/components/common/Button'; - -const meta: Meta<typeof TextArea> = { - title: 'Common/TextArea', - component: TextArea, -}; - -export default meta; - -type Story = StoryObj<typeof TextArea>; - -export const Default: Story = { - args: { placeholder: '어떤 이야기를 모임에서 나누면 좋을까요?' }, -}; - -type FormValue = { - content: string; -}; - -const TextAreaWithForm = () => { - const { - register, - handleSubmit, - formState: { errors }, - } = useForm<FormValue>({ mode: 'all' }); - - const handleTextAreaSubmit: SubmitHandler<FormValue> = value => { - alert(value.content); - }; - - return ( - <form onSubmit={handleSubmit(handleTextAreaSubmit)}> - <TextArea - {...register('content', { - maxLength: { value: 3, message: '최대 3자' }, - })} - count={true} - error={!!errors.content} - > - <TextArea.Error>{errors.content?.message}</TextArea.Error> - </TextArea> - <Button type="submit" size="full"> - submit - </Button> - </form> - ); -}; - -export const UseWithForm: Story = { - render: () => <TextAreaWithForm />, -}; diff --git a/src/stories/common/Toast.stories.tsx b/src/stories/common/Toast.stories.tsx deleted file mode 100644 index bf0863dea..000000000 --- a/src/stories/common/Toast.stories.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; - -import Button from '@/components/common/Button'; -import useToast from '@/components/common/Toast/useToast'; -import ToastItem from '@/components/common/Toast/ToastItem'; - -const meta: Meta<typeof ToastItem> = { - title: 'Common/Toast', - component: ToastItem, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof ToastItem>; - -const WarningToast = () => { - const toast = useToast(); - const handleButtonClick = () => - toast.show({ - type: 'warning', - message: '5초 동안 보여지는 토스트 메세지에요.', - duration: 5000, - }); - - return <Button onClick={handleButtonClick}>토스트 띄우기</Button>; -}; - -const SuccessToast = () => { - const toast = useToast(); - const handleButtonClick = () => - toast.show({ type: 'success', message: '링크가 복사되었어요' }); - - return <Button onClick={handleButtonClick}>링크 복사하기</Button>; -}; - -const ErrorToast = () => { - const toast = useToast(); - const handleButtonClick = () => - toast.show({ type: 'error', message: '잠시 후 다시 시도해주세요' }); - - return <Button onClick={handleButtonClick}>재시도</Button>; -}; - -export const Default: Story = { - args: { - message: '토스트 예시', - }, - render: args => ( - <div className="flex flex-col gap-[1rem]"> - <ToastItem type="warning" {...args} /> - <ToastItem type="error" {...args} /> - <ToastItem type="success" {...args} /> - </div> - ), -}; - -export const Normal: Story = { - render: WarningToast, -}; - -export const Success: Story = { - render: SuccessToast, -}; - -export const Error: Story = { - render: ErrorToast, -}; diff --git a/src/stories/common/TopHeader.stories.tsx b/src/stories/common/TopHeader.stories.tsx deleted file mode 100644 index fdc2d0f37..000000000 --- a/src/stories/common/TopHeader.stories.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import { IconHamburger } from '@public/icons'; -import TopHeader from '@/components/common/TopHeader'; - -const meta: Meta<typeof TopHeader> = { - title: 'Common/TopHeader', - component: TopHeader, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof TopHeader>; - -export const Default: Story = { - args: { text: 'BookArchive' }, - render: args => <TopHeader {...args} />, -}; - -export const WithMenu: Story = { - args: { text: 'Profile' }, - render: args => ( - <TopHeader {...args}> - <button - onClick={() => { - alert('HAMBURGUR MENU!🍔'); - }} - > - <IconHamburger width={20} height={20} alt="햄버거메뉴" /> - </button> - </TopHeader> - ), -}; diff --git a/src/stories/common/TopNavigation.stories.tsx b/src/stories/common/TopNavigation.stories.tsx deleted file mode 100644 index c15d3bcb1..000000000 --- a/src/stories/common/TopNavigation.stories.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react'; -import TopNavigation from '@/components/common/TopNavigation'; -import { - IconPost, - IconShare, - IconArrowLeft, - IconHamburger, - IconClose, -} from '@public/icons'; - -const meta: Meta<typeof TopNavigation> = { - title: 'Common/TopNavigation', - component: TopNavigation, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof TopNavigation>; - -export const Default: Story = { - render: () => ( - <TopNavigation> - <TopNavigation.LeftItem> - <IconArrowLeft /> - </TopNavigation.LeftItem> - <TopNavigation.CenterItem> - Refactoring 2nd(리팩터링 2판) - </TopNavigation.CenterItem> - <TopNavigation.RightItem> - <IconShare /> - </TopNavigation.RightItem> - </TopNavigation> - ), -}; - -export const OnlySide: Story = { - render: () => ( - <TopNavigation> - <TopNavigation.LeftItem> - <IconArrowLeft /> - </TopNavigation.LeftItem> - <TopNavigation.RightItem> - <IconShare /> - </TopNavigation.RightItem> - </TopNavigation> - ), -}; - -export const OnlyCenter: Story = { - render: () => ( - <TopNavigation> - <TopNavigation.CenterItem textAlign="left"> - Refactoring 2nd(리팩터링 2판) - </TopNavigation.CenterItem> - </TopNavigation> - ), -}; - -export const CenterWithLeft: Story = { - render: () => ( - <TopNavigation> - <TopNavigation.LeftItem> - <IconArrowLeft /> - </TopNavigation.LeftItem> - <TopNavigation.CenterItem textAlign="left"> - Refactoring 2nd(리팩터링 2판) - </TopNavigation.CenterItem> - </TopNavigation> - ), -}; - -export const CenterWithRight: Story = { - render: () => ( - <TopNavigation> - <TopNavigation.CenterItem> - Refactoring 2nd(리팩터링 2판) - </TopNavigation.CenterItem> - <TopNavigation.RightItem> - <IconShare /> - </TopNavigation.RightItem> - </TopNavigation> - ), -}; - -export const TextLeft: Story = { - render: () => ( - <TopNavigation> - <TopNavigation.LeftItem> - <IconArrowLeft /> - </TopNavigation.LeftItem> - <TopNavigation.CenterItem textAlign="left"> - 프롱이 리팩터링 스터디 - </TopNavigation.CenterItem> - <TopNavigation.RightItem> - <IconPost /> - <IconHamburger /> - </TopNavigation.RightItem> - </TopNavigation> - ), -}; - -export const PostWrite: Story = { - render: () => ( - <TopNavigation> - <TopNavigation.LeftItem> - <IconClose /> - </TopNavigation.LeftItem> - <TopNavigation.CenterItem>글 작성하기</TopNavigation.CenterItem> - <TopNavigation.RightItem> - <button className="font-bold text-main-900">완료</button> - </TopNavigation.RightItem> - </TopNavigation> - ), -}; diff --git a/src/stories/layout/Layout.stories.tsx b/src/stories/layout/Layout.stories.tsx deleted file mode 100644 index fc320c938..000000000 --- a/src/stories/layout/Layout.stories.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import Layout from '@/components/layout/Layout'; -import { Meta, StoryObj } from '@storybook/react'; - -const meta: Meta<typeof Layout> = { - title: 'layout/Layout', - component: Layout, - tags: ['autodocs'], -}; - -export default meta; - -type Story = StoryObj<typeof Layout>; - -export const Default: Story = { - parameters: { - nextjs: { - navigation: { - pathname: '/bookarchive', - }, - }, - }, - render: () => { - return <Layout>{'hello'}</Layout>; - }, -}; - -export const NotOnRootPath: Story = { - render: () => { - return <Layout>{'hello'}</Layout>; - }, -}; diff --git a/src/stories/meta.tsx b/src/stories/meta.tsx deleted file mode 100644 index 462fb9d37..000000000 --- a/src/stories/meta.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { Meta } from '@storybook/react'; -import Layout from '@/components/layout/Layout'; - -export const appLayoutMeta: Meta = { - parameters: { - layout: 'fullscreen', - }, - decorators: [ - Story => ( - <div className="m-auto max-w-[43rem] bg-white"> - <Layout> - <Story /> - </Layout> - </div> - ), - ], -}; diff --git a/src/styles/font/index.ts b/src/styles/font/index.tsx similarity index 83% rename from src/styles/font/index.ts rename to src/styles/font/index.tsx index c3995d8bd..8b42af9c3 100644 --- a/src/styles/font/index.ts +++ b/src/styles/font/index.tsx @@ -1,6 +1,6 @@ import localFont from 'next/font/local'; -export const LineSeedKR = localFont({ +export const LineSeed = localFont({ src: [ { path: './LINESeedKR-Th.woff2', @@ -18,5 +18,4 @@ export const LineSeedKR = localFont({ style: 'normal', }, ], - variable: '--font-lineseed', }); diff --git a/src/styles/global.css b/src/styles/global.css deleted file mode 100644 index 6b1607b4a..000000000 --- a/src/styles/global.css +++ /dev/null @@ -1,109 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@font-face { - font-family: 'LineSeedKR'; - font-weight: 100; - src: url('font/LINESeedKR-Th.woff2') format('woff2'); -} -@font-face { - font-family: 'LineSeedKR'; - font-weight: 400; - src: url('font/LINESeedKR-Rg.woff2') format('woff2'); -} -@font-face { - font-family: 'LineSeedKR'; - font-weight: 700; - src: url('font/LINESeedKR-Bd.woff2') format('woff2'); -} -@layer base { - html { - @apply w-full bg-background font-[LineSeedKR] text-[62.5%] text-black-700; - -webkit-tap-highlight-color: #ffffff50; - - /** from charka */ - -webkit-text-size-adjust: 100%; - font-family: system-ui, sans-serif; - -webkit-font-smoothing: antialiased; - text-rendering: optimizeLegibility; - -moz-osx-font-smoothing: grayscale; - touch-action: manipulation; - } - - body { - font-size: 1.6rem; - } - - .app-layout { - max-width: 43rem; - margin: 0 auto; - @apply bg-white; - } - - .sticky { - /* -webkit-sticky: Safari 브라우저 호환 */ - position: -webkit-sticky; - position: sticky; - } - - /* DatePicker Calendar 스타일링 */ - input[type='date']::-webkit-calendar-picker-indicator { - background-image: none; - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - margin: 0; - padding: 0; - cursor: pointer; - } - - input::-webkit-date-and-time-value { - display: none; - } - - input[type='date'] { - appearance: none; - -webkit-appearance: none; - } - - /* Input type=number 버튼 제거 */ - /* Chrome, Safari, Edge, Opera */ - input::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; - } - /* FireFox */ - input[type='number'] { - appearance: none; - -moz-appearance: textfield; - } - - input[type='search']::-webkit-search-cancel-button { - -webkit-appearance: none; - appearance: none; - width: 2.1rem; - height: 2.1rem; - cursor: pointer; - background-image: url('/icons/close.svg'); - background-position: center; - background-repeat: no-repeat; - } -} - -@layer utilities { - .w-app { - @apply relative -left-[2rem] w-[calc(100%+4rem)]; - } - - .bg-blur { - box-shadow: inset 0 0 3rem #dddddd; - @apply bg-placeholder; - } - - .pb-action-button { - @apply pb-[6.3rem]; - } -} diff --git a/src/styles/theme.tsx b/src/styles/theme.tsx new file mode 100644 index 000000000..43851ea60 --- /dev/null +++ b/src/styles/theme.tsx @@ -0,0 +1,139 @@ +import { + ChakraStyledOptions, + extendTheme, + ThemeOverride, +} from '@chakra-ui/react'; + +const fontSizes = { + xs: '1.2rem', + sm: '1.4rem', + md: '1.6rem', + lg: '1.8rem', + xl: '2rem', + '2xl': '2.2rem', +} as const; + +const buttonSizes = { + md: { + padding: '1.3rem 1rem', + height: '3.5rem', + }, + lg: { + padding: '2.5rem 1.8rem', + height: '4.5rem', + }, +} as const; + +const colors = { + main: '#F6AD55', // Main Theme + red: { + 800: '#F56565', // button (NoticeTheme) + 900: '#FF0000', // validation (NoticeTheme) + }, + yellow: { + 200: '#FFD4802E', + 900: '#FFA436', + }, + black: { + 400: '#C1C0C0', // subHeader (Slider) + 500: '#AFAFAF', // placeHolder (BookSearch) + 600: '#ACACAC', // placeHolder (MeetingEdit) + 700: '#727272', // subHeader (MeetingDetail) + 800: '#3D3D3D', // meetingPeriod (MeetingDetail) + 900: '#000000', // black + }, + white: { + 400: '#CFCFCF', // placeHolder (MyPage) + 500: '#D9D9D9', // addBook (MeetingCreate) + 600: '#E3E3E3', // bookBorder (Bookaive) + 700: '#E2E8F0', // inputBorder (Common) + 800: '#FAFAFA', // backGround + 900: '#FFFFFF', // white + }, + kakao: { + brown: '#191600', + yellow: '#fee102', + }, +} as const; + +interface SchemeTypings { + component: 'button'; + colorScheme: 'orange' | 'kakao' | 'orange-fill' | 'grey' | 'grey-fill'; + cssProps: ChakraStyledOptions; +} + +const scheme: Record< + SchemeTypings['component'], + Record<SchemeTypings['colorScheme'], Partial<SchemeTypings['cssProps']>> +> = { + button: { + orange: { + color: colors.main, + border: `${colors.main} 0.1rem solid`, + }, + 'orange-fill': { + color: colors.white[900], + backgroundColor: colors.main, + _hover: { + opacity: 0.8, + }, + }, + grey: { + color: colors.black[900], + border: `${colors.white[400]} 0.1rem solid`, + backgroundColor: colors.white[900], + _hover: { + color: colors.black['800'], + backgroundColor: colors.white[400], + }, + }, + 'grey-fill': { + color: colors.black[600], + backgroundColor: colors.white[400], + }, + kakao: { + color: colors.kakao.brown, + backgroundColor: colors.kakao.yellow, + }, + }, +}; + +const shadows = { + default: '0px 0px 7px -5px #000000', // BoxShadow (MeetingList Box) +}; + +const theme: ThemeOverride = extendTheme({ + fontSizes, + buttonSizes, + colors, + scheme, + styles: { + global: { + 'html, body': { + fontSize: '62.5%', + bg: 'white.800', + maxWidth: '43rem', + margin: '0 auto', + }, + 'input[type="date"]': { + position: 'relative', + }, + 'input[type="date"]::-webkit-inner-spin-button, input[type="date"]::-webkit-calendar-picker-indicator': + { + position: 'absolute', + left: 0, + top: 0, + width: '100%', + height: '100%', + background: 'transparent', + color: 'transparent', + cursor: 'pointer', + }, + }, + }, + shadows, +}); + +export default theme; + +export type ChakraTheme = typeof theme; diff --git a/src/types/book.ts b/src/types/book.ts index a63236bb0..2179783c2 100644 --- a/src/types/book.ts +++ b/src/types/book.ts @@ -1,6 +1,6 @@ -import { BookSearchPagination, Pagination } from './common'; +import { Pagination } from './common'; import { APIJobGroup } from './job'; -import { APIUser, Writer } from './user'; +import { APIUser } from './user'; export interface APIBook { bookId: number; @@ -13,13 +13,15 @@ export interface APIBook { publisher: string; } -export interface APISearchedBook extends Omit<APIBook, 'bookId'> { +export interface APISearchedBook + extends Pick< + APIBook, + 'title' | 'author' | 'isbn' | 'contents' | 'url' | 'imageUrl' | 'publisher' + > { apiProvider: string; } -export type SearchedBookWithId = APISearchedBook & Pick<APIBook, 'bookId'>; - -export interface APIBookRecentSearchResponse { +export interface APISearchedWordInfo { keyword: string; modifiedAt: string; } @@ -27,11 +29,16 @@ export interface APIBookRecentSearchResponse { export interface APIRecentSearches { count: number; isEmpty: boolean; - bookRecentSearchResponses: APIBookRecentSearchResponse[]; + bookRecentSearchResponses: APISearchedWordInfo[]; } -export interface APISearchedBookPagination extends BookSearchPagination { +export interface APISearchedBookPagination { searchBookResponseList: APISearchedBook[]; + requestedPageNumber: number; + requestedPageSize: number; + isLast: boolean; + pageableCount: number; + totalCount: number; } export interface APIBookDetail extends APIBook { @@ -39,17 +46,6 @@ export interface APIBookDetail extends APIBook { imageKey: string; } -export interface BookDetail { - bookId: APIBookDetail['bookId']; - title: APIBookDetail['title']; - author: APIBookDetail['author']; - isbn: APIBookDetail['isbn']; - summary: APIBookDetail['contents']; - bookUrl: APIBookDetail['url']; - imageUrl: APIBookDetail['imageUrl']; - publisher: APIBookDetail['publisher']; -} - export interface APIBookmarkedUserList { bookId: APIBook['bookId']; totalCount: number; @@ -75,11 +71,6 @@ export interface APIBookComment { writtenByCurrentUser: boolean; } -export interface APICreateBookCommentRequest - extends Pick<APIBookComment, 'commentId'> { - comment: string; -} - export interface APIPatchBookCommentRequest extends Pick<APIBookComment, 'commentId'> { comment: string; @@ -88,37 +79,3 @@ export interface APIPatchBookCommentRequest export interface APIBookCommentPagination extends Pagination { bookComments: APIBookComment[]; } - -export type BookComment = { - id: APIBook['bookId']; - writer: Writer; - createdAt: APIBookComment['createdAt']; - content: APIBookComment['contents']; -}; -export interface APIBestSeller { - title: string; - author: string; - isbn: string; - description: string; - link: string; - cover: string; - publisher: string; - bestRank: number; -} - -export interface APIBestSellerRes { - item: APIBestSeller[]; - itemsPerPage: number; - link: string; - logo: string; - pubDate: string; - query: string; - searchCategoryId: number; - searchCategoryName: string; - startIndex: number; - title: string; - totalResults: number; - version: string; -} - -export type APIBestSellerSearchRange = 'WEEKLY' | 'MONTHLY' | 'YEARLY'; diff --git a/src/types/bookshelf.ts b/src/types/bookshelf.ts index 82884f4d6..7be80ef0e 100644 --- a/src/types/bookshelf.ts +++ b/src/types/bookshelf.ts @@ -26,12 +26,10 @@ export type APIBookshelf = { export interface APIBookshelfInfo extends Pick<APIBookshelf, 'bookshelfId' | 'bookshelfName' | 'likeCount'>, - Pick<APIUser, 'userId' | 'name'> { + Pick<APIUser, 'userId' | 'name' | 'nickname' | 'profileImage'> { isLiked: boolean; isPublic: boolean; job: APIProfileJob; - userNickname: string; - userProfileImage: string; } export interface APIBookshelfPagination extends Pagination { diff --git a/src/types/common.ts b/src/types/common.ts index 57ebb2d6b..09e540e5c 100644 --- a/src/types/common.ts +++ b/src/types/common.ts @@ -5,11 +5,3 @@ export interface Pagination { count: number; isEmpty: boolean; } - -export interface BookSearchPagination { - requestedPageNumber: number; - requestedPageSize: number; - isLast: boolean; - pageableCount: number; - totalCount: number; -} diff --git a/src/types/customError/AuthRefreshIgnoredError.ts b/src/types/customError/AuthRefreshIgnoredError.ts deleted file mode 100644 index b85f0478b..000000000 --- a/src/types/customError/AuthRefreshIgnoredError.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * accessToken을 갱신하는 요청이 진행 중인 경우, 갱신 요청은 무시되고 해당 에러가 발생합니다. - */ -class AuthRefreshIgnoredError extends Error { - constructor(message: string) { - super(message); - this.name = this.constructor.name; - } -} - -export default AuthRefreshIgnoredError; diff --git a/src/types/customError/index.ts b/src/types/customError/index.ts deleted file mode 100644 index 176fe8d48..000000000 --- a/src/types/customError/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as AuthRefreshIgnoredError } from './AuthRefreshIgnoredError'; diff --git a/src/types/dday.ts b/src/types/dday.ts deleted file mode 100644 index d7ba22ce3..000000000 --- a/src/types/dday.ts +++ /dev/null @@ -1 +0,0 @@ -export type DdayStatus = 'before' | 'dday' | 'ongoing' | 'end'; diff --git a/src/types/group.ts b/src/types/group.ts index 289b95c76..4aed93969 100644 --- a/src/types/group.ts +++ b/src/types/group.ts @@ -1,12 +1,11 @@ import { APIBook } from './book'; -import { APIUser, Writer } from './user'; +import { APIUser } from './user'; import { Pagination } from './common'; type APIGroupOwner = { id: APIUser['userId']; profileUrl: APIUser['profileImage']; - // FIXME nickname: APIUser['nickname'] nullable 하지 않게 수정 후 다시 반영 - nickname: string; + nickname: APIUser['nickname']; }; type APIGroupBook = { @@ -24,7 +23,7 @@ export interface APIGroup { hasJoinPasswd: boolean; isPublic: boolean; bookGroupId: number; - currentMemberCount: number; + memberCount: number; commentCount: number; book: APIGroupBook; owner: APIGroupOwner; @@ -38,7 +37,7 @@ export interface APIGroupDetail extends APIGroup { } export interface APIGroupPagination extends Pagination { - bookGroups: (APIGroup & { memberCount: number })[]; + bookGroups: APIGroup[]; } export interface APICreateGroup @@ -66,41 +65,10 @@ export interface APIGroupComment { userProfileImage: APIUser['profileImage']; createdAt: string; modifiedAt: string; - nickname: string; + nickname: APIUser['nickname']; writtenByCurrentUser: boolean; } export interface APIGroupCommentPagination extends Pagination { - bookGroup: { isPublic: APIGroup['isPublic'] }; bookGroupComments: APIGroupComment[]; } - -export type BookGroupDetail = { - title: APIGroupDetail['title']; - description: APIGroupDetail['introduce']; - bookId: APIBook['bookId']; - owner: { isMe: boolean; id: APIUser['userId'] }; - date: { start: APIGroupDetail['startDate']; end: APIGroupDetail['endDate'] }; - memberCount: { - current: APIGroupDetail['currentMemberCount']; - max: APIGroupDetail['maxMemberCount']; - }; - isPublic: APIGroupDetail['isPublic']; - isMember: APIGroupDetail['isGroupMember']; -}; - -export type BookGroupComment = { - id: APIGroup['bookGroupId']; - writer: Writer; - createdAt: APIGroupComment['createdAt']; - content: APIGroupComment['contents']; -}; - -export type APIEditBookGroup = { - isOwner: APIGroupDetail['isOwner']; - title: APIGroupDetail['title']; - introduce: APIGroupDetail['introduce']; - maxMemberCount: APIGroupDetail['maxMemberCount']; - startDate: APIGroupDetail['startDate']; - endDate: APIGroupDetail['endDate']; -}; diff --git a/src/types/query.ts b/src/types/query.ts index d37e02188..75ca7662b 100644 --- a/src/types/query.ts +++ b/src/types/query.ts @@ -1,6 +1,3 @@ import { UseQueryOptions } from '@tanstack/react-query'; -export type QueryOptions< - TQueryFnData, - TQueryData = TQueryFnData -> = UseQueryOptions<Awaited<TQueryFnData>, unknown, TQueryData, string[]>; +export type QueryOptions<T> = UseQueryOptions<Awaited<T>, unknown, T, string[]>; diff --git a/src/types/user.ts b/src/types/user.ts index 8420e8980..1bbdf8845 100644 --- a/src/types/user.ts +++ b/src/types/user.ts @@ -1,26 +1,13 @@ import { APIProfileJob } from './job'; -export interface APIUserProfile { +export interface APIUser { userId: number; - nickname: string; - profileImage: string; - gender: string | null; - job: APIProfileJob; -} - -export interface APIMyProfile extends Omit<APIUserProfile, 'nickname'> { name: string | null; nickname: string | null; oauthNickname: string; email: string | null; - gender: string; - authProvider: string; + profileImage: string; + gender: true; + authProvider: true; + job: APIProfileJob; } - -export type APIUser = APIUserProfile & { name: string | null }; - -export type Writer = { - id: APIUser['userId']; - profileImageSrc: APIUser['profileImage']; - name: APIUser['nickname']; -}; diff --git a/src/ui/AuthRequired/index.tsx b/src/ui/AuthRequired/index.tsx new file mode 100644 index 000000000..a58f4877b --- /dev/null +++ b/src/ui/AuthRequired/index.tsx @@ -0,0 +1,23 @@ +import { ReactNode, useEffect, useState } from 'react'; + +import { useAuth } from '@/hooks/auth'; +import { useRouter } from 'next/navigation'; + +const AuthRequired = ({ children }: { children: ReactNode }) => { + const router = useRouter(); + const [mounted, setMounted] = useState(false); + const { isAuthed } = useAuth(); + + useEffect(() => { + if (!isAuthed) { + router.push('/'); + } + setMounted(true); + }, [isAuthed, router]); + + if (!isAuthed) return null; + + return <>{mounted && children}</>; +}; + +export default AuthRequired; diff --git a/src/ui/BookArchive/BookArchiveForAuth.tsx b/src/ui/BookArchive/BookArchiveForAuth.tsx new file mode 100644 index 000000000..3556ffbaf --- /dev/null +++ b/src/ui/BookArchive/BookArchiveForAuth.tsx @@ -0,0 +1,60 @@ +import useAuthRecommendedBooks from '@/queries/recommend/useAuthRecommendedBooks'; +import useAuthRecommendedBookshelf from '@/queries/recommend/useAuthRecommendedBookshelf'; +import { APIJobGroup } from '@/types/job'; +import { RecommendedBooks, RecommendedBookshelf } from '@/ui/Recommended'; +import { Flex, Skeleton, VStack } from '@chakra-ui/react'; + +const BookArchiveForAuth = ({ + userJobGroup, +}: { + userJobGroup: APIJobGroup['name']; +}) => { + const { + data: bookshelfData, + isSuccess: bookshelfIsSuccess, + isLoading: bookshelfIsLoading, + } = useAuthRecommendedBookshelf(userJobGroup); + const { + data: booksData, + isSuccess: booksIsSuccess, + isLoading: booksIsLoading, + } = useAuthRecommendedBooks(userJobGroup); + + const isSuccess = bookshelfIsSuccess && booksIsSuccess; + const isLoading = bookshelfIsLoading && booksIsLoading; + + if (isLoading) { + return ( + <VStack gap="3rem"> + <Skeleton width="39rem" height="19.6rem" /> + <Skeleton width="39rem" height="19.6rem" /> + <Skeleton width="39rem" height="19.6rem" /> + </VStack> + ); + } + + if (!isSuccess) return null; + if (!bookshelfData || !booksData) return null; + + return ( + <Flex direction="column" width="100%" gap="3rem"> + <RecommendedBooks + jobGroup={booksData.jobGroupKoreanName} + books={booksData.books} + /> + {bookshelfData.bookshelfResponses.map( + ({ bookshelfId, bookshelfName, books, likeCount }) => ( + <RecommendedBookshelf + key={bookshelfId} + bookshelfId={bookshelfId} + bookshelfName={bookshelfName} + books={books} + likeCount={likeCount} + /> + ) + )} + </Flex> + ); +}; + +export default BookArchiveForAuth; diff --git a/src/ui/BookArchive/BookArchiveForUnAuth.tsx b/src/ui/BookArchive/BookArchiveForUnAuth.tsx new file mode 100644 index 000000000..1ee0eab5e --- /dev/null +++ b/src/ui/BookArchive/BookArchiveForUnAuth.tsx @@ -0,0 +1,36 @@ +import useUnAuthRecommendedBookshelfQuery from '@/queries/recommend/useUnAuthRecommendedBookshelfQuery'; +import { Flex, Skeleton, VStack } from '@chakra-ui/react'; +import { RecommendedBookshelf } from '../Recommended'; + +const BookArchiveForUnAuth = () => { + const { data, isSuccess, isLoading } = useUnAuthRecommendedBookshelfQuery(); + + if (isLoading) { + return ( + <VStack gap="3rem"> + <Skeleton width="39rem" height="19.6rem" /> + <Skeleton width="39rem" height="19.6rem" /> + <Skeleton width="39rem" height="19.6rem" /> + </VStack> + ); + } + if (!isSuccess) return null; + + return ( + <Flex direction="column" width="100%" gap="3rem"> + {data.bookshelfResponses.map( + ({ bookshelfId, bookshelfName, books, likeCount }) => ( + <RecommendedBookshelf + key={bookshelfId} + bookshelfId={bookshelfId} + bookshelfName={bookshelfName} + books={books} + likeCount={likeCount} + /> + ) + )} + </Flex> + ); +}; + +export default BookArchiveForUnAuth; diff --git a/src/ui/BookArchive/index.tsx b/src/ui/BookArchive/index.tsx new file mode 100644 index 000000000..3c983211b --- /dev/null +++ b/src/ui/BookArchive/index.tsx @@ -0,0 +1,2 @@ +export { default as BookArchiveForAuth } from './BookArchiveForAuth'; +export { default as BookArchiveForUnAuth } from './BookArchiveForUnAuth'; diff --git a/src/ui/BookDetail/BookComment.tsx b/src/ui/BookDetail/BookComment.tsx new file mode 100644 index 000000000..476da6469 --- /dev/null +++ b/src/ui/BookDetail/BookComment.tsx @@ -0,0 +1,189 @@ +import { + AlertDialog, + AlertDialogBody, + AlertDialogContent, + AlertDialogFooter, + AlertDialogOverlay, + Avatar, + Button, + Flex, + Text, + useDisclosure, + useTheme, + VStack, +} from '@chakra-ui/react'; +import { CSSProperties, MutableRefObject, useRef } from 'react'; +import Link from 'next/link'; + +import { useToast } from '@/hooks/toast'; +import type { APIBookComment } from '@/types/book'; +import { Menu, MenuItem } from '@/ui/common/Menu'; + +import CommentDrawer from './CommentDrawer'; + +interface Props + extends Pick< + APIBookComment, + | 'commentId' + | 'userId' + | 'nickname' + | 'userProfileImage' + | 'createdAt' + | 'contents' + > { + style?: CSSProperties; + editable?: boolean; + onEdit?: (commentId: number, comment: string) => void; + onDelete?: (commentId: number) => void; +} + +const BookComment = ({ + commentId, + userId, + nickname, + userProfileImage, + createdAt, + contents, + editable = false, + onEdit, + onDelete, + style, +}: Props) => { + const { + isOpen: isDeleteModalOpen, + onClose: onDeleteModalClose, + onOpen: onDeleteModalOpen, + } = useDisclosure(); + const { + isOpen: isEditDrawerOpen, + onClose: onEditDrawerClose, + onOpen: onEditDrawerOpen, + } = useDisclosure(); + const { showToast } = useToast(); + + const cancelRef = useRef(null); + const textareaRef = useRef<HTMLTextAreaElement>(null); + + const handleCommentEdit = () => { + const comment = textareaRef.current?.value; + + if (!comment) { + showToast({ message: '코멘트를 입력해주세요!' }); + return; + } + + onEdit && onEdit(commentId, comment); + onEditDrawerClose(); + }; + + const handleCommentDelete = () => { + onDelete && onDelete(commentId); + onDeleteModalClose(); + }; + + return ( + <VStack + width="100%" + align="flex-start" + backgroundColor="white.900" + borderRadius="1rem" + p="2rem" + style={style} + > + <Flex gap="1rem" align="center" width="100%"> + <Avatar as={Link} href={`/profile/${userId}`} src={userProfileImage} /> + <VStack flexGrow="1" align="flex-start"> + <Text fontSize="sm" fontWeight="bold"> + {nickname} + </Text> + <Text fontSize="xs" style={{ margin: 0 }} color="black.500"> + {createdAt} + </Text> + </VStack> + {editable && ( + <Menu> + <MenuItem text="수정" onClick={onEditDrawerOpen}> + <CommentDrawer + title="책 코멘트 수정하기" + placeholder="더 멋진 코멘트를 작성해주세요!" + defaultComment={contents} + isOpen={isEditDrawerOpen} + onClose={onEditDrawerClose} + onComplete={handleCommentEdit} + textareaRef={textareaRef} + /> + </MenuItem> + <MenuItem text="삭제" color="red.300" onClick={onDeleteModalOpen}> + <DeleteComfirmDialog + cancelRef={cancelRef} + isOpen={isDeleteModalOpen} + onClose={onDeleteModalClose} + onDelete={handleCommentDelete} + /> + </MenuItem> + </Menu> + )} + </Flex> + <Text + fontSize="md" + py="0.5rem" + textOverflow="ellipsis" + wordBreak="break-all" + > + {contents} + </Text> + </VStack> + ); +}; + +const DeleteComfirmDialog = ({ + cancelRef, + isOpen, + onClose, + onDelete, +}: { + isOpen: boolean; + onClose: () => void; + onDelete: () => void; + cancelRef: MutableRefObject<null>; +}) => { + const theme = useTheme(); + + return ( + <AlertDialog + leastDestructiveRef={cancelRef} + isOpen={isOpen} + onClose={onClose} + > + <AlertDialogOverlay> + <AlertDialogContent alignSelf="center" p="1.5rem"> + <AlertDialogBody fontSize="md" py="1.5rem"> + 코멘트를 정말 삭제할까요? + </AlertDialogBody> + <AlertDialogFooter as={Flex} justify="center" gap="1rem"> + <Button + ref={cancelRef} + onClick={onClose} + flexGrow="1" + {...theme.buttonSizes['md']} + {...theme.scheme.button['grey']} + > + 취소 + </Button> + <Button + ref={cancelRef} + onClick={onDelete} + flexGrow="1" + {...theme.buttonSizes['md']} + {...theme.scheme.button['orange-fill']} + > + 삭제 + </Button> + </AlertDialogFooter> + </AlertDialogContent> + </AlertDialogOverlay> + </AlertDialog> + ); +}; + +export default BookComment; diff --git a/src/ui/BookDetail/BookCommentList.tsx b/src/ui/BookDetail/BookCommentList.tsx new file mode 100644 index 000000000..1417a077f --- /dev/null +++ b/src/ui/BookDetail/BookCommentList.tsx @@ -0,0 +1,167 @@ +'use clinet'; + +import { useDisclosure, VStack } from '@chakra-ui/react'; +import { useMemo, useRef } from 'react'; + +import bookAPI from '@/apis/book'; +import useBookCommentsQuery from '@/queries/book/useBookCommentsQuery'; +import Button from '@/ui/common/Button'; +import BookComment from './BookComment'; +import CommentDrawer from './CommentDrawer'; + +import type { APIBookComment, APIBookmarkedUserList } from '@/types/book'; + +import { SERVICE_ERROR_MESSAGE } from '@/constants'; +import { useToast } from '@/hooks/toast'; +import LoginBottomSheet from '@/ui/LoginBottomSheet'; +import { isAuthed, isAxiosErrorWithCustomCode } from '@/utils/helpers'; + +interface Props { + bookId: number; + isInMyBookshelf: APIBookmarkedUserList['isInMyBookshelf']; +} + +type CommentType = 'me' | 'user'; +type CommentRecordType = Record<CommentType, APIBookComment[]>; + +const BookCommentList = ({ bookId, isInMyBookshelf }: Props) => { + const { showToast } = useToast(); + const commentTextAreaRef = useRef<HTMLTextAreaElement>(null); + const bookCommentsQueryInfo = useBookCommentsQuery(bookId); + + const { + isOpen: isCreateDrawerOpen, + onOpen: onCreateDrawerOpen, + onClose: onCreateDrawerClose, + } = useDisclosure(); + const { + isOpen: isLoginBottomSheetOpen, + onOpen: onLoginBottomSheetOpen, + onClose: onLoginBottomSheetsClose, + } = useDisclosure(); + + const comments = useMemo<CommentRecordType>(() => { + const defaultComments = { me: [], user: [] }; + + if (!bookCommentsQueryInfo.isSuccess) { + return defaultComments; + } + + return bookCommentsQueryInfo.data.bookComments + .filter(comment => comment.bookId == bookId) + .reduce<CommentRecordType>( + (acc, comment) => ({ + ...acc, + [comment.writtenByCurrentUser ? 'me' : 'user']: [ + ...acc[comment.writtenByCurrentUser ? 'me' : 'user'], + comment, + ], + }), + defaultComments + ); + }, [bookCommentsQueryInfo, bookId]); + + const handleCommentError = (error: unknown) => { + if (!isAxiosErrorWithCustomCode(error)) { + return; + } + + const { code } = error.response.data; + const message = SERVICE_ERROR_MESSAGE[code]; + + if (code === 'BC1' || code === 'BC2') { + showToast({ message, duration: 3000 }); + } + }; + + const handleCommentCreate = () => { + const comment = commentTextAreaRef.current?.value; + + if (!comment) { + showToast({ message: '코멘트를 입력해주세요!' }); + return; + } + + bookAPI + .creaetComment(bookId, { comment }) + .then(() => bookCommentsQueryInfo.refetch()) + .catch(handleCommentError) + .finally(onCreateDrawerClose); + }; + + const handleCommentEdit = (commentId: number, comment: string) => { + bookAPI + .patchComment({ bookId, data: { commentId, comment } }) + .then(() => bookCommentsQueryInfo.refetch()) + .catch(handleCommentError); + }; + + const handleCommentDelete = (commentId: number) => { + bookAPI + .deletComment(bookId, commentId) + .then(() => bookCommentsQueryInfo.refetch()) + .catch(handleCommentError); + }; + + const handleCreateCommentDrawerOpen = () => { + if (!isAuthed()) { + onLoginBottomSheetOpen(); + return; + } + + if (!isInMyBookshelf) { + showToast({ + message: '책장에 책을 꽂은 후에 코멘트를 남길 수 있어요.', + duration: 3000, + }); + return; + } + + onCreateDrawerOpen(); + }; + + return ( + <VStack align="stretch" spacing="2rem" width="100%" pt="1rem"> + {!isAuthed() && ( + <LoginBottomSheet + isOpen={isLoginBottomSheetOpen} + onClose={onLoginBottomSheetsClose} + /> + )} + {!bookCommentsQueryInfo.isLoading && !comments.me.length && ( + <> + <Button + onClick={handleCreateCommentDrawerOpen} + scheme="orange-fill" + fullWidth + > + 코멘트 남기기 + </Button> + <CommentDrawer + title="책 코멘트 남기기" + placeholder="작성해주신 코멘트가 다른 사람들에게 많은 도움이 될 거예요!" + isOpen={isCreateDrawerOpen} + onClose={onCreateDrawerClose} + onComplete={handleCommentCreate} + textareaRef={commentTextAreaRef} + /> + </> + )} + {comments.me.map(comment => ( + <BookComment + key={comment.commentId} + {...comment} + editable + onEdit={handleCommentEdit} + onDelete={handleCommentDelete} + style={{ border: '1px solid #ffe6c6' }} + /> + ))} + {comments.user.map(comment => ( + <BookComment key={comment.commentId} {...comment} /> + ))} + </VStack> + ); +}; + +export default BookCommentList; diff --git a/src/ui/BookDetail/BookInfo.tsx b/src/ui/BookDetail/BookInfo.tsx new file mode 100644 index 000000000..3aaa10c12 --- /dev/null +++ b/src/ui/BookDetail/BookInfo.tsx @@ -0,0 +1,147 @@ +import { + Avatar, + AvatarGroup, + Box, + Flex, + Text, + useDisclosure, + useTheme, + VStack, +} from '@chakra-ui/react'; +import Image from 'next/image'; + +import IconButton from '@/ui/common/IconButton'; + +import type { APIBookDetail, APIBookmarkedUserList } from '@/types/book'; +import Link from 'next/link'; + +import { isAuthed } from '@/utils/helpers'; +import { useState } from 'react'; +import LoginBottomSheet from '../LoginBottomSheet'; + +type Props = Pick< + APIBookDetail, + 'title' | 'author' | 'contents' | 'imageUrl' | 'url' +> & + Omit<APIBookmarkedUserList, 'bookId'> & { + onBookmarkClick: (isBookMarked: boolean) => void; + }; + +const BookInfo = ({ + title, + author, + contents, + imageUrl, + url: contentsUrl, + onBookmarkClick, + ...bookmarkInfo +}: Props) => { + const theme = useTheme(); + const [bookmark, setBookmark] = useState(bookmarkInfo.isInMyBookshelf); + + const { + isOpen: isLoginBottomSheetOpen, + onOpen: onLoginBottomSheetOpen, + onClose: onLoginBottomSheetsClose, + } = useDisclosure(); + + const handleBookmarkClick = () => { + if (!isAuthed()) { + onLoginBottomSheetOpen(); + return; + } + + setBookmark(prev => { + const next = !prev; + onBookmarkClick(next); + return next; + }); + }; + + return ( + <> + <Flex gap="2rem" align="flex-end"> + <Box + shadow="lg" + position="relative" + width="18rem" + height="24rem" + flexShrink={0} + > + <Image + src={imageUrl.replace('R120x174.q85', 'R300x0.q100')} + alt="book" + fill + sizes="300px" + /> + </Box> + <VStack align="flex-start"> + <IconButton + name="bookmark" + color={theme.colors.main} + strokeWidth="0.15rem" + onClick={handleBookmarkClick} + fill={bookmark} + mb="0.5rem" + ml="-0.1rem" + /> + <Text fontSize="lg" fontWeight="bold"> + {title} + </Text> + <Text fontSize="sm">{author}</Text> + </VStack> + </Flex> + <Text fontSize="md"> + {contents} ...  + {contentsUrl && ( + <Text + as={Link} + href={contentsUrl} + color="main" + target="_blank" + rel="noopener noreferrer" + > + 더보기 + </Text> + )} + </Text> + + {!isAuthed() && ( + <LoginBottomSheet + isOpen={isLoginBottomSheetOpen} + onClose={onLoginBottomSheetsClose} + /> + )} + + <Flex align="center" minH="2rem"> + <AvatarGroup> + {bookmarkInfo.users.map(({ userId, profileImage }) => ( + <Avatar + as={Link} + href={`/profile/${userId}`} + key={userId} + src={profileImage} + /> + ))} + </AvatarGroup> + <Text fontSize="sm" pl="0.8rem"> + {getUserInfoText(bookmarkInfo.totalCount, bookmarkInfo.users.length)} + </Text> + </Flex> + </> + ); +}; + +const getUserInfoText = (totalCount: number, avatarCount: number) => { + const otherCount = totalCount - avatarCount; + + if (otherCount === 0 && totalCount === 0) { + return '아직 이 책을 책장에 꽂은 사람이 없어요.'; + } else if (otherCount === 0) { + return '님이 이 책을 책장에 꽂았어요.'; + } + + return `외 ${otherCount}명이 이 책을 책장에 꽂았어요.`; +}; + +export default BookInfo; diff --git a/src/ui/BookDetail/CommentDrawer.tsx b/src/ui/BookDetail/CommentDrawer.tsx new file mode 100644 index 000000000..db2c4cc18 --- /dev/null +++ b/src/ui/BookDetail/CommentDrawer.tsx @@ -0,0 +1,77 @@ +import { RefObject } from 'react'; +import { Drawer, DrawerContent, Flex, Text, Textarea } from '@chakra-ui/react'; + +import IconButton from '@/ui/common/IconButton'; + +interface Props { + title?: string; + placeholder?: string; + defaultComment?: string; + isOpen: boolean; + onClose: () => void; + onComplete: () => void; + textareaRef?: RefObject<HTMLTextAreaElement>; +} + +const CommentDrawer = ({ + title, + placeholder, + defaultComment, + isOpen, + onClose, + onComplete, + textareaRef, +}: Props) => { + // TODO : ref로 textarea 포커싱 + return ( + <Drawer isOpen={isOpen} onClose={onClose} placement="right" isFullHeight> + {isOpen && ( + <DrawerContent + bgColor="white" + p="2rem" + margin="0 auto" + style={{ + position: 'relative', + maxWidth: '43rem', + }} + > + <Flex align="center" justify="space-between"> + <IconButton + name="close" + size="2rem" + onClick={onClose} + alignSelf="flex-start" + /> + <Text fontSize="md" fontWeight="bold"> + {title} + </Text> + <Text + as="button" + fontSize="md" + fontWeight="bold" + color="main" + alignSelf="flex-end" + onClick={onComplete} + > + 완료 + </Text> + </Flex> + <Textarea + h="60vh" + border="none" + focusBorderColor="white.900" + resize="none" + px="0" + py="4rem" + ref={textareaRef} + placeholder={placeholder} + defaultValue={defaultComment} + spellCheck={false} + /> + </DrawerContent> + )} + </Drawer> + ); +}; + +export default CommentDrawer; diff --git a/src/ui/BookDetail/index.tsx b/src/ui/BookDetail/index.tsx new file mode 100644 index 000000000..9ed5ae067 --- /dev/null +++ b/src/ui/BookDetail/index.tsx @@ -0,0 +1,2 @@ +export { default as BookInfo } from './BookInfo'; +export { default as BookCommentList } from './BookCommentList'; diff --git a/src/ui/BookSearch/RecentSearches.tsx b/src/ui/BookSearch/RecentSearches.tsx new file mode 100644 index 000000000..fb01fe891 --- /dev/null +++ b/src/ui/BookSearch/RecentSearches.tsx @@ -0,0 +1,49 @@ +import { Flex, Text, VStack } from '@chakra-ui/react'; + +interface searchedWordsProps { + keyword: string; + modifiedAt: string; +} +interface RecentSearchesProps { + searchedWords?: searchedWordsProps[]; + setKeyword: (searchedWord: string) => void; +} + +const RecentSearches = ({ searchedWords, setKeyword }: RecentSearchesProps) => { + return ( + <VStack width="100%" alignItems="stretch"> + <Text fontSize="lg" color="black" my="1rem"> + 최근 검색어 + </Text> + {searchedWords ? ( + <Flex width="100%" gap="1rem" overflowX="scroll" pb="2rem"> + {searchedWords.map(({ keyword, modifiedAt }) => { + return ( + <Text + key={modifiedAt} + whiteSpace="nowrap" + fontSize="sm" + color="yellow.900" + p="0.8rem 1.6rem 0.6rem" + borderRadius="2.8rem" + bgColor="yellow.200" + onClick={() => { + setKeyword(keyword); + }} + cursor="pointer" + > + {keyword} + </Text> + ); + })} + </Flex> + ) : ( + <Text mb="1.5rem" fontSize="sm" color="black.700" alignSelf="center"> + 검색 기록이 없어요. + </Text> + )} + </VStack> + ); +}; + +export default RecentSearches; diff --git a/src/ui/BookSearch/SearchedBook.tsx b/src/ui/BookSearch/SearchedBook.tsx new file mode 100644 index 000000000..7622c79fa --- /dev/null +++ b/src/ui/BookSearch/SearchedBook.tsx @@ -0,0 +1,67 @@ +import bookAPI from '@/apis/book'; +import { APISearchedBook, APIBook } from '@/types/book'; +import { Center, Image, Text, VStack } from '@chakra-ui/react'; + +import LogoSmallIcon from '@public/icons/logo_sm.svg'; +import { useRouter } from 'next/navigation'; + +const SearchedBook = ({ + book, + onBookClick, +}: { + book: APISearchedBook; + onBookClick?: (book: APIBook) => void; +}) => { + const router = useRouter(); + + const handleClickBook = async (book: APISearchedBook) => { + try { + const { + data: { bookId }, + } = await bookAPI.createBook({ book }); + if (onBookClick) { + onBookClick({ ...book, bookId }); + } else { + router.push(`/book/${bookId}`); + } + } catch (error) { + console.error(error); + } + }; + + return ( + <VStack + key={book.isbn} + w="100%" + minH="18rem" + justify="center" + fontSize="sm" + bgColor="white" + p="1rem" + borderRadius={10} + boxShadow="lg" + cursor="pointer" + onClick={() => handleClickBook(book)} + > + {book.imageUrl ? ( + <Image src={book.imageUrl} alt="book-cover" /> + ) : ( + <Center bgColor="white" w="100%"> + <LogoSmallIcon /> + </Center> + )} + <Text + w="100%" + overflow="hidden" + whiteSpace="nowrap" + textOverflow="ellipsis" + textAlign="center" + fontSize="sm" + > + {book.title} + </Text> + </VStack> + ); +}; + +export default SearchedBook; diff --git a/src/ui/BookSearch/index.tsx b/src/ui/BookSearch/index.tsx new file mode 100644 index 000000000..0db7c94d0 --- /dev/null +++ b/src/ui/BookSearch/index.tsx @@ -0,0 +1,122 @@ +import { + Box, + Flex, + Input, + InputGroup, + InputLeftElement, + SimpleGrid, + Skeleton, + VStack, +} from '@chakra-ui/react'; +import { useEffect, useState } from 'react'; +import { useInView } from 'react-intersection-observer'; + +import type { APIBook } from '@/types/book'; +import useBookSearchQuery from '@/queries/book/useBookSearchQuery'; +import useRecentSearchesQuery from '@/queries/book/useRecentSearchesQuery'; +import useDebounceValue from '@/hooks/useDebounce'; +import SearchedBook from './SearchedBook'; +import RecentSearches from './RecentSearches'; +import SearchIcon from '@public/icons/search.svg'; +import { isAuthed } from '@/utils/helpers'; + +interface BookSearchProps { + onBookClick?: (bookId: APIBook) => void; +} + +const BookSearch = ({ onBookClick }: BookSearchProps) => { + const [inputValue, setInputValue] = useState(''); + const queryKeyword = useDebounceValue(inputValue, 1000); + + const { ref, inView } = useInView(); + + const bookSearchInfo = useBookSearchQuery({ + query: queryKeyword, + page: 1, + pageSize: 12, + }); + + const recentSearchesInfo = useRecentSearchesQuery({ enabled: isAuthed() }); + + const searchedBooks = bookSearchInfo.isSuccess + ? bookSearchInfo.data.pages.flatMap(page => page.searchBookResponseList) + : []; + + const recentSearches = recentSearchesInfo.isSuccess + ? recentSearchesInfo.data.bookRecentSearchResponses + : undefined; + + const onInputChange = (event: React.ChangeEvent<HTMLInputElement>) => { + if (!event.target) return; + const input = event.target.value; + setInputValue(input.trim()); + }; + + useEffect(() => { + if (inView && bookSearchInfo.hasNextPage) { + bookSearchInfo.fetchNextPage(); + } + isAuthed() && recentSearchesInfo.refetch(); + }, [ + bookSearchInfo.fetchNextPage, + inView, + bookSearchInfo.hasNextPage, + queryKeyword, + bookSearchInfo, + recentSearchesInfo, + ]); + + return ( + <VStack w="100%" gap="2rem"> + <InputGroup> + <InputLeftElement top="0.8rem"> + <Box w="1.8rem" h="1.8rem"> + <SearchIcon /> + </Box> + </InputLeftElement> + <Input + variant="flushed" + borderColor="black.500" + focusBorderColor="main" + fontSize="lg" + p="2rem 4rem" + value={inputValue} + onChange={onInputChange} + placeholder="책 제목, 작가를 검색해보세요" + _placeholder={{ color: 'black.500' }} + /> + </InputGroup> + + {!inputValue && ( + <RecentSearches + searchedWords={recentSearches} + setKeyword={setInputValue} + /> + )} + + {inputValue && ( + <SimpleGrid columns={3} gap="1rem"> + {searchedBooks.map((book, index) => ( + <SearchedBook + key={`${book.isbn}-${index}`} // API 데이터에 겹치는 isbn이 존재하여 임시 생성한 키 + book={book} + onBookClick={onBookClick} + /> + ))} + </SimpleGrid> + )} + + {inputValue && bookSearchInfo.isFetching && ( + <Flex gap="1rem" w="100%"> + <Skeleton w="100%" h="18rem" borderRadius={10} /> + <Skeleton w="100%" h="18rem" borderRadius={10} /> + <Skeleton w="100%" h="18rem" borderRadius={10} /> + </Flex> + )} + + <Box ref={ref} /> + </VStack> + ); +}; + +export default BookSearch; diff --git a/src/ui/BottomNavigation/NavigationItem/index.tsx b/src/ui/BottomNavigation/NavigationItem/index.tsx new file mode 100644 index 000000000..655c00226 --- /dev/null +++ b/src/ui/BottomNavigation/NavigationItem/index.tsx @@ -0,0 +1,52 @@ +import { Box, Flex, Text, useTheme } from '@chakra-ui/react'; +import dynamic from 'next/dynamic'; +import Link from 'next/link'; +import { MouseEvent, SVGProps, useMemo } from 'react'; + +interface NavigationItemPorps { + iconName: string; + label: string; + href: string; + isActive: boolean; + onClick?: (event: MouseEvent<HTMLAnchorElement>) => void; +} + +const NavigationItem = ({ + iconName, + label, + href, + isActive, + onClick, +}: NavigationItemPorps) => { + const theme = useTheme(); + const color = isActive ? theme.colors.main : theme.colors.black['900']; + + const Icon = useMemo( + () => + dynamic<SVGProps<SVGSVGElement>>( + () => import(`@/../public/icons/${iconName}.svg`) + ), + [iconName] + ); + + return ( + <Link onClick={onClick} href={href}> + <Flex + direction="column" + justify="center" + align="center" + gap="0.2rem" + cursor="pointer" + > + <Box w="2.6rem" h="2.6rem" position="relative"> + <Icon width="100%" height="100%" strokeWidth={0} fill={color} /> + </Box> + <Text fontSize="xs" fontWeight="bold" color={color}> + {label} + </Text> + </Flex> + </Link> + ); +}; + +export default NavigationItem; diff --git a/src/ui/BottomNavigation/index.tsx b/src/ui/BottomNavigation/index.tsx new file mode 100644 index 000000000..bcb7c08d1 --- /dev/null +++ b/src/ui/BottomNavigation/index.tsx @@ -0,0 +1,72 @@ +import { isAuthed } from '@/utils/helpers'; +import { Flex, useDisclosure } from '@chakra-ui/react'; +import { usePathname } from 'next/navigation'; +import { MouseEvent } from 'react'; +import LoginBottomSheet from '../LoginBottomSheet'; +import NavigationItem from './NavigationItem'; + +const BottomNavigation = () => { + const { isOpen, onOpen, onClose } = useDisclosure(); + + const pathname = usePathname(); + + const navigationItems = [ + { + iconName: 'bookshelf', + label: '북카이브', + href: '/bookarchive', + }, + { + iconName: 'book', + label: '도서 검색', + href: '/book/search', + }, + { + iconName: 'hashtag', + label: '독서 모임', + href: '/group', + }, + { + iconName: 'user', + label: '내 프로필', + href: '/profile/me', + onClick: (event: MouseEvent<HTMLAnchorElement>) => { + if (isAuthed()) return; + onOpen(); + event.preventDefault(); + }, + }, + ]; + + return ( + <> + <Flex + justify="space-between" + bg="white.900" + px="3.2rem" + py="1.4rem" + pos="fixed" + bottom={0} + w="100%" + maxW="43rem" + borderTopRadius={20} + boxShadow="rgba(0, 0, 0, 0.05) 0px 0px 10px 1px" + maxH="7rem" + > + {navigationItems.map(({ iconName, label, href, onClick }) => ( + <NavigationItem + key={href} + iconName={iconName} + label={label} + href={href} + isActive={pathname.indexOf(href) === 0} + onClick={onClick} + /> + ))} + </Flex> + <LoginBottomSheet isOpen={isOpen} onClose={onClose} /> + </> + ); +}; + +export default BottomNavigation; diff --git a/src/ui/FormInput/index.tsx b/src/ui/FormInput/index.tsx new file mode 100644 index 000000000..b1057f71a --- /dev/null +++ b/src/ui/FormInput/index.tsx @@ -0,0 +1,128 @@ +import FORM_RULES from '@/constants/FormRule'; +import { + FormControl, + FormErrorMessage, + FormLabel, + Input, + InputGroup, + InputRightElement, + Text, + useTheme, +} from '@chakra-ui/react'; +import CloseIcon from '@public/icons/close.svg'; +import { useEffect, useState } from 'react'; +import { useFormContext } from 'react-hook-form'; +import type { MouseEvent, TouchEvent } from 'react'; + +interface FormInputProps + extends Partial<Pick<HTMLInputElement, 'type' | 'disabled'>> { + label: string; + name: string; +} + +const FormInput = ({ + label, + name, + disabled = false, + type = 'text', +}: FormInputProps) => { + const theme = useTheme(); + const { colors } = theme; + + const { + register, + unregister, + setValue, + trigger, + getValues, + formState: { errors }, + } = useFormContext(); + + const error = errors[name]; + + const rules = FORM_RULES[name]; + + const onClearButtonClick = async ( + event: MouseEvent | TouchEvent<HTMLElement> + ) => { + setValue(name, ''); + await trigger(name); + event.preventDefault(); + }; + + const [isFocus, setIsFocus] = useState(false); + + const onInputFocus = () => { + setIsFocus(true); + }; + + const onInputBlur = () => { + setIsFocus(false); + }; + + useEffect(() => { + return () => { + unregister(name); + }; + }, [unregister, name, disabled]); + + return ( + <FormControl + isInvalid={!!error} + onFocus={onInputFocus} + onBlur={onInputBlur} + > + <FormLabel> + {label} + {!!rules.required && ( + <Text as="span" color="red"> + * + </Text> + )} + </FormLabel> + <InputGroup> + {disabled ? ( + <Input + focusBorderColor={colors.main} + py="2rem" + type={type} + bgColor="white" + disabled + {...register(name)} + /> + ) : ( + <Input + focusBorderColor={colors.main} + py="2rem" + type={type} + bgColor="white" + {...register(name, rules)} + /> + )} + + {isFocus && getValues(name).length && ( + <InputRightElement h="100%"> + <button + type="button" + onMouseDown={onClearButtonClick} + onTouchEnd={onClearButtonClick} + tabIndex={-1} + > + <CloseIcon + fill={colors.black['800']} + width="16" + height="16" + viewBox="0,0,24,24" + /> + </button> + </InputRightElement> + )} + </InputGroup> + {error?.message && ( + <FormErrorMessage>{String(error.message)}</FormErrorMessage> + )} + </FormControl> + ); +}; + +export default FormInput; diff --git a/src/ui/FormRadio/index.tsx b/src/ui/FormRadio/index.tsx new file mode 100644 index 000000000..1dc0af300 --- /dev/null +++ b/src/ui/FormRadio/index.tsx @@ -0,0 +1,71 @@ +import { + FormControl, + FormLabel, + RadioGroup, + Radio, + Stack, + Flex, +} from '@chakra-ui/react'; +import { useFormContext } from 'react-hook-form'; + +interface radioValues { + value: string; + text: string; +} + +interface FormRadioProps { + label: string; + name: string; + radioValues: radioValues[]; + value?: string; + onChange?: (value: string) => void; +} + +const FormRadio = ({ + label, + name, + radioValues, + value, + onChange, +}: FormRadioProps) => { + const { register } = useFormContext(); + + return ( + <FormControl> + <FormLabel>{label}</FormLabel> + <RadioGroup value={value} onChange={onChange}> + <Stack + width="100%" + direction="column" + spacing="1rem" + border="0.1rem solid" + borderColor="white.700" + borderRadius="0.4rem" + bgColor="white.900" + p="1rem 2rem" + > + <Flex flexWrap="wrap" justify="space-around"> + {radioValues.map(radioValue => { + const { value, text } = radioValue; + return ( + <Radio + key={value} + value={value} + colorScheme="orange" + flex="0 1 auto" + w="9rem" + {...register(name)} + > + {' '} + {text} + </Radio> + ); + })} + </Flex> + </Stack> + </RadioGroup> + </FormControl> + ); +}; + +export default FormRadio; diff --git a/src/ui/FormSelect/index.tsx b/src/ui/FormSelect/index.tsx new file mode 100644 index 000000000..f2b234425 --- /dev/null +++ b/src/ui/FormSelect/index.tsx @@ -0,0 +1,56 @@ +import FORM_RULES from '@/constants/FormRule'; +import { + FormControl, + FormErrorMessage, + FormLabel, + Select, + Text, + useTheme, +} from '@chakra-ui/react'; +import type { ReactNode } from 'react'; +import { useFormContext } from 'react-hook-form'; + +interface FormSelectProps { + label: string; + name: string; + children: ReactNode; +} + +const FormSelect = ({ label, name, children }: FormSelectProps) => { + const theme = useTheme(); + const { + register, + formState: { errors }, + } = useFormContext(); + + const error = errors[name]; + const rules = FORM_RULES[name]; + + return ( + <FormControl isInvalid={!!error}> + <FormLabel> + {label} + {!!rules.required && ( + <Text as="span" color="red"> + * + </Text> + )} + </FormLabel> + <Select + focusBorderColor={theme.colors.main} + placeholder={`${label}을 선택해주세요.`} + size="md" + h="4.2rem" + bgColor="white" + {...register(name, rules)} + > + {children} + </Select> + {error?.message && ( + <FormErrorMessage>{String(error.message)}</FormErrorMessage> + )} + </FormControl> + ); +}; + +export default FormSelect; diff --git a/src/ui/Group/AddGroupForm.tsx b/src/ui/Group/AddGroupForm.tsx new file mode 100644 index 000000000..909b52c9c --- /dev/null +++ b/src/ui/Group/AddGroupForm.tsx @@ -0,0 +1,340 @@ +import { + Box, + Center, + Flex, + Image, + useDisclosure, + useTheme, + VStack, + Input, + Text, + InputGroup, +} from '@chakra-ui/react'; +import { FormProvider, useForm } from 'react-hook-form'; +import FormInput from '@/ui/FormInput'; +import FormRadio from '@/ui/FormRadio'; +import BottomSheet from '@/ui/common/BottomSheet'; +import BookSearch from '@/ui/BookSearch'; +import { useEffect, useState } from 'react'; +import { APIBook } from '@/types/book'; +import GroupAPI from '@/apis/group'; +import { useRouter } from 'next/navigation'; +import { APICreateGroup } from '@/types/group'; +import { + MAX_MEMBER_COUNT_VALUE, + IS_PUBLICK_VALUE, + HAS_JOIN_PASSWORD_VALUE, +} from '../../constants/groupRadioValues'; +import Button from '@/ui/common/Button'; + +interface FormValues + extends Omit< + APICreateGroup, + 'maxMemberCount' | 'hasJoinPasswd' | 'isPublic' + > { + maxMemberCount: number | string | null; + hasJoinPasswd: 'true' | 'false' | boolean; + isPublic: 'true' | 'false' | boolean; +} + +const AddGroupForm = () => { + const router = useRouter(); + const [memberCountInput, setMemberCountInput] = useState(''); + const memberCountInputAsNumber = Number(memberCountInput); + + const [selectedBook, setSeletedBook] = useState<APIBook>(); + const { + isOpen: isBookSearchOpen, + onClose: onBookSearchClose, + onOpen: onBookSearchOpen, + } = useDisclosure(); + const { + isOpen: isMaxMemberSetOpen, + onClose: onMaxMemberSetClose, + onOpen: onMaxMemberSetOpen, + } = useDisclosure(); + + const date = new Date(); + const today = Date.now(); + const startDate = new Date(today - date.getTimezoneOffset() * 60000) + .toISOString() + .split('T')[0]; + + const methods = useForm<FormValues>({ + mode: 'all', + defaultValues: { + bookId: 0, + title: '', + introduce: '', + maxMemberCount: 'null', + startDate, + endDate: '', + hasJoinPasswd: 'false', + joinQuestion: '', + joinPasswd: '', + isPublic: 'true', + }, + }); + + const { isValid } = methods.formState; + const { maxMemberCount, hasJoinPasswd, isPublic } = methods.watch(); + + useEffect(() => { + if (hasJoinPasswd === 'false') { + methods.setValue('joinPasswd', ''); + methods.setValue('joinQuestion', ''); + methods.clearErrors('joinPasswd'); + methods.clearErrors('joinQuestion'); + } + if (maxMemberCount === '직접입력') { + setMemberCountInput(''); + onMaxMemberSetOpen(); + } + }, [methods, hasJoinPasswd, maxMemberCount, onMaxMemberSetOpen]); + + const onSubmit = async (group: FormValues) => { + let maxMemberCount = group.maxMemberCount; + + if (maxMemberCount === 'null') maxMemberCount = null; + else if (maxMemberCount === '직접입력') + maxMemberCount = memberCountInputAsNumber; + else maxMemberCount = Number(maxMemberCount); + + const request = { + ...group, + maxMemberCount, + isPublic: group.isPublic === 'true' ? true : false, + hasJoinPasswd: group.hasJoinPasswd === 'true' ? true : false, + }; + + try { + await GroupAPI.createGroup({ group: request }); + router.replace('/group'); + } catch (error) { + console.error(error); + } + }; + + const onMaxMemberInputComplete = () => { + const { isValid } = validateMaxMemberCount(memberCountInputAsNumber); + if (isValid) { + onMaxMemberSetClose(); + } + }; + + const validateMaxMemberCount = (value: number) => { + if (value > 1000) + return { isValid: false, message: '1000명 이하의 인원을 입력해 주세요' }; + + if (value < 1) + return { isValid: false, message: '1명 이상의 인원을 입력해 주세요' }; + + return { isValid: true, message: null }; + }; + + const getMaxMemberCountViewer = () => { + if (maxMemberCount === 'null') { + return '제한없음'; + } + + if (maxMemberCount === '직접입력') { + const { isValid } = validateMaxMemberCount(memberCountInputAsNumber); + return isValid ? `${memberCountInput}명` : ''; + } + + return `${maxMemberCount}명`; + }; + + const validationMessage = memberCountInput + ? validateMaxMemberCount(memberCountInputAsNumber).message + : ''; + + return ( + <> + <FormProvider {...methods}> + <Box as="form" w="100%" onSubmit={methods.handleSubmit(onSubmit)}> + <BookSelectBox + selectedBook={selectedBook} + onClick={onBookSearchOpen} + isShowError={!!methods.getFieldState('bookId').error} + /> + <Flex direction="column" gap="2rem" align="center"> + <Box display="none"> + <FormInput label="" name="bookId" /> + </Box> + <FormInput label="제목" name="title" /> + <FormInput label="설명" name="introduce" /> + <FormRadio + label={`참여 인원 : ${getMaxMemberCountViewer()}`} + name="maxMemberCount" + radioValues={MAX_MEMBER_COUNT_VALUE} + value={`${maxMemberCount}`} + /> + <FormRadio + label="댓글 공개 여부" + name="isPublic" + radioValues={IS_PUBLICK_VALUE} + value={`${isPublic}`} + /> + <FormRadio + label="모임 가입 문제" + name="hasJoinPasswd" + radioValues={HAS_JOIN_PASSWORD_VALUE} + value={`${hasJoinPasswd}`} + /> + <FormInput + label="문제" + name="joinQuestion" + disabled={ + methods.watch('hasJoinPasswd') === 'true' ? false : true + } + /> + <FormInput + label="정답" + name="joinPasswd" + disabled={ + methods.watch('hasJoinPasswd') === 'true' ? false : true + } + /> + <FormInput label="시작일" name="startDate" type="date" /> + <FormInput label="종료일" name="endDate" type="date" /> + </Flex> + <Button + type="submit" + scheme={isValid ? 'orange-fill' : 'grey-fill'} + my="4rem" + fullWidth + > + 모임 생성하기 + </Button> + </Box> + </FormProvider> + <BookSearchBottomSheet + isOpen={isBookSearchOpen} + onClose={onBookSearchClose} + onBookClick={book => { + setSeletedBook(book); + methods.setValue('bookId', book.bookId); + onBookSearchClose(); + }} + /> + <MaxMemberCountBottomSheet + isOpen={isMaxMemberSetOpen} + onClose={onMaxMemberSetClose} + onCancel={() => { + methods.setValue('maxMemberCount', 'null'); + }} + onComplete={onMaxMemberInputComplete} + inputValue={memberCountInput} + onInputChange={e => setMemberCountInput(e.target.value)} + validationMessage={validationMessage} + /> + </> + ); +}; + +const BookSelectBox = ({ + selectedBook, + onClick, + isShowError, +}: { + selectedBook?: APIBook; + isShowError?: boolean; + onClick: () => void; +}) => { + const theme = useTheme(); + return ( + <Box + onClick={onClick} + fontSize="md" + maxH="18rem" + w="fit-content" + mx="auto" + border={isShowError ? `2px solid ${theme.colors.red['500']}` : 'none'} + > + {selectedBook && selectedBook.imageUrl ? ( + <Image src={selectedBook.imageUrl} alt="book-cover" /> + ) : ( + <Center + borderRadius={10} + bgColor="white" + w="12rem" + h="17.4rem" + textAlign="center" + > + 책을 + <br /> + 선택해주세요. + </Center> + )} + </Box> + ); +}; + +const BookSearchBottomSheet = ({ + isOpen, + onClose, + onBookClick, +}: { + isOpen: boolean; + onClose: () => void; + onBookClick: (book: APIBook) => void; +}) => { + return ( + <BottomSheet isOpen={isOpen} onClose={onClose}> + <VStack px="2rem" py="2rem" h="95vh" gap="1rem" overflow="scroll"> + <BookSearch onBookClick={onBookClick} /> + </VStack> + </BottomSheet> + ); +}; + +const MaxMemberCountBottomSheet = ({ + inputValue, + onInputChange, + isOpen, + onClose, + onCancel, + onComplete, + validationMessage, +}: { + inputValue: string; + onInputChange: React.ChangeEventHandler<HTMLInputElement>; + isOpen: boolean; + onClose: () => void; + onCancel: () => void; + onComplete: () => void; + validationMessage: string | null; +}) => { + return ( + <BottomSheet isOpen={isOpen} onClose={onClose} onCancel={onCancel}> + <VStack px="2rem" py="2rem" h="50vh" gap="1rem" overflow="scroll"> + <Text + fontSize="lg" + alignSelf="flex-end" + bgColor="white.900" + cursor="pointer" + onClick={onComplete} + > + 확인 + </Text> + <Text fontSize="lg">참여 인원</Text> + <InputGroup> + <Input + h="4rem" + value={inputValue} + focusBorderColor="main" + type="number" + placeholder="모임 인원을 입력해주세요" + onChange={onInputChange} + /> + </InputGroup> + <Text fontSize="sm" color="red.900"> + {validationMessage} + </Text> + </VStack> + </BottomSheet> + ); +}; + +export default AddGroupForm; diff --git a/src/ui/Group/EditGroupForm.tsx b/src/ui/Group/EditGroupForm.tsx new file mode 100644 index 000000000..1c272e134 --- /dev/null +++ b/src/ui/Group/EditGroupForm.tsx @@ -0,0 +1,83 @@ +import { Box, Flex, Image, useTheme } from '@chakra-ui/react'; +import { FormProvider, useForm } from 'react-hook-form'; + +import FormInput from '@/ui/FormInput'; +import { APIGroupDetail } from '@/types/group'; +import GroupAPI from '@/apis/group'; +import { useRouter } from 'next/navigation'; + +interface EditGroupFormProps { + group: APIGroupDetail; +} + +const EditGroupForm = ({ group }: EditGroupFormProps) => { + const theme = useTheme(); + const router = useRouter(); + const methods = useForm({ + mode: 'all', + defaultValues: { + title: group.title, + introduce: group.introduce, + startDate: group.startDate, + maxMemberCount: group.maxMemberCount, + endDate: group.endDate, + }, + }); + + const onSubmit: Parameters<typeof methods.handleSubmit>[0] = async ({ + title, + introduce, + maxMemberCount, + endDate, + }) => { + try { + await GroupAPI.updateGroupInfo({ + bookGroupId: group.bookGroupId, + group: { title, introduce, endDate, maxMemberCount }, + }); + + router.push(`/group/${group.bookGroupId}`); + } catch (error) { + console.error(error); + } + }; + + return ( + <> + <FormProvider {...methods}> + <Box as="form" w="100%" onSubmit={methods.handleSubmit(onSubmit)}> + <Box fontSize="md" maxH="18rem" w="fit-content" mx="auto"> + <Image src={group.book.imageUrl} alt="book-cover" /> + </Box> + <Flex direction="column" gap="2rem" align="center"> + <FormInput label="제목" name="title" /> + <FormInput label="설명" name="introduce" /> + <FormInput label="시작일" name="startDate" type="date" disabled /> + <FormInput label="종료일" name="endDate" type="date" /> + </Flex> + <Box + as="button" + w="100%" + mt="4rem" + px="2rem" + py="1rem" + disabled={methods.formState.isSubmitting} + color={theme.colors.main} + border="1px solid" + borderRadius="5rem" + fontSize="md" + fontWeight="bold" + _disabled={{ + color: `${theme.colors.black['500']}`, + border: '1px solid', + }} + > + 모임 수정하기 + </Box> + </Box> + </FormProvider> + </> + ); +}; + +export default EditGroupForm; diff --git a/src/ui/Group/GroupComment/CommentDeleteModal.tsx b/src/ui/Group/GroupComment/CommentDeleteModal.tsx new file mode 100644 index 000000000..3ddd76c24 --- /dev/null +++ b/src/ui/Group/GroupComment/CommentDeleteModal.tsx @@ -0,0 +1,108 @@ +import { + Box, + Flex, + Button, + AlertDialog, + AlertDialogBody, + AlertDialogFooter, + AlertDialogContent, + AlertDialogOverlay, + useDisclosure, +} from '@chakra-ui/react'; + +import { useTheme } from '@chakra-ui/react'; +import { MutableRefObject, useRef } from 'react'; + +interface CommentDeleteModalProps { + commentId: number; + handleDeleteCommentBtnClick: (commentId: number) => void; +} + +const CommentDeleteModal = ({ + commentId, + handleDeleteCommentBtnClick, +}: CommentDeleteModalProps) => { + const { + isOpen: isDeleteModalOpen, + onClose: onDeleteModalClose, + onOpen: onDeleteModalOpen, + } = useDisclosure(); + + const cancelRef = useRef(null); + + const onDeleteCommentClick = () => { + handleDeleteCommentBtnClick(commentId); + onDeleteModalClose(); + }; + + return ( + <> + <Box + onClick={onDeleteModalOpen} + width="100%" + fontSize="md" + color="red.300" + > + 삭제 + </Box> + <DeleteComfirmDialog + cancelRef={cancelRef} + isOpen={isDeleteModalOpen} + onClose={onDeleteModalClose} + onDelete={onDeleteCommentClick} + /> + </> + ); +}; + +export default CommentDeleteModal; + +const DeleteComfirmDialog = ({ + cancelRef, + isOpen, + onClose, + onDelete, +}: { + isOpen: boolean; + onClose: () => void; + onDelete: () => void; + cancelRef: MutableRefObject<null>; +}) => { + const theme = useTheme(); + + return ( + <AlertDialog + leastDestructiveRef={cancelRef} + isOpen={isOpen} + onClose={onClose} + > + <AlertDialogOverlay> + <AlertDialogContent alignSelf="center" p="1.5rem"> + <AlertDialogBody fontSize="md" py="1.5rem"> + 댓글을 정말 삭제할까요? + </AlertDialogBody> + <AlertDialogFooter as={Flex} justify="center" gap="1rem"> + <Button + ref={cancelRef} + onClick={onClose} + flexGrow="1" + {...theme.buttonSizes['md']} + {...theme.scheme.button['grey']} + > + 취소 + </Button> + <Button + ref={cancelRef} + onClick={onDelete} + flexGrow="1" + {...theme.buttonSizes['md']} + {...theme.scheme.button['orange-fill']} + > + 삭제 + </Button> + </AlertDialogFooter> + </AlertDialogContent> + </AlertDialogOverlay> + </AlertDialog> + ); +}; diff --git a/src/ui/Group/GroupComment/CommentInputBox.tsx b/src/ui/Group/GroupComment/CommentInputBox.tsx new file mode 100644 index 000000000..720c7d06d --- /dev/null +++ b/src/ui/Group/GroupComment/CommentInputBox.tsx @@ -0,0 +1,73 @@ +import { Box, Flex } from '@chakra-ui/react'; +import { useRef } from 'react'; +import CommentDrawer from '@/ui/BookDetail/CommentDrawer'; +import { useDisclosure } from '@chakra-ui/react'; +interface CommentInputBoxProps { + isPartInUser: boolean; + handleCreateCommentBtnClick: (comment: string) => void; + userNickname?: string | null; + userAvatar?: string; +} + +const CommentInputBox = ({ + isPartInUser, + handleCreateCommentBtnClick, +}: CommentInputBoxProps) => { + const { + isOpen: isCommentDrawer, + onOpen: onCommentDrawerOpen, + onClose: onCommentDrawerClose, + } = useDisclosure(); + const commentTextAreaRef = useRef<HTMLTextAreaElement>(null); + + const onCompleteClick = () => { + const comment = commentTextAreaRef.current?.value; + if (comment) { + handleCreateCommentBtnClick(comment); + } + onCommentDrawerClose(); + }; + + return ( + <Box mt="1.5rem" h="100%"> + <Box fontSize="lg" fontWeight={700} mb="1rem"> + 댓글 작성 + </Box> + <Box p="1rem" bgColor="white" borderRadius="1rem" boxShadow="default"> + <Box m="1rem 0"> + <Flex + pl="1rem" + align="center" + w="100%" + h="4rem" + fontSize="md" + color="black.600" + border="solid 1px" + borderColor={!isPartInUser ? 'white.900' : 'main'} + backgroundColor={!isPartInUser ? 'white.700' : 'white.900'} + borderRadius="1rem" + onClick={() => { + if (isPartInUser) { + onCommentDrawerOpen(); + } + }} + > + {isPartInUser + ? '댓글을 입력해 주세요' + : '모임에 참여해야 글을 작성할 수 있습니다'} + </Flex> + </Box> + </Box> + <CommentDrawer + title="글 작성하기" + placeholder="여러분의 자유로운 이야기를 들려주세요" + isOpen={isCommentDrawer} + onClose={onCommentDrawerClose} + textareaRef={commentTextAreaRef} + onComplete={onCompleteClick} + /> + </Box> + ); +}; + +export default CommentInputBox; diff --git a/src/ui/Group/GroupComment/CommentModifyModal.tsx b/src/ui/Group/GroupComment/CommentModifyModal.tsx new file mode 100644 index 000000000..4507d5240 --- /dev/null +++ b/src/ui/Group/GroupComment/CommentModifyModal.tsx @@ -0,0 +1,58 @@ +import { useRef } from 'react'; +import { useDisclosure, Box } from '@chakra-ui/react'; + +import CommentDrawer from '@/ui/BookDetail/CommentDrawer'; + +interface CommentModifyModalProps { + commentId: number; + comment: string; + handleModifyCommentBtnClick: ( + modifiedComment: string, + commentId: number + ) => void; +} + +const CommentModifyModal = ({ + commentId, + comment, + handleModifyCommentBtnClick, +}: CommentModifyModalProps) => { + const commentTextAreaRef = useRef<HTMLTextAreaElement>(null); + const { + onOpen: onModifyModalOpen, + onClose: onModifyModalClose, + isOpen: isModifyModalOpen, + } = useDisclosure(); + + const onCompleteClick = () => { + const comment = commentTextAreaRef.current?.value; + if (comment) { + handleModifyCommentBtnClick(comment, commentId); + } + onModifyModalClose(); + }; + + return ( + <Box> + <Box + onClick={onModifyModalOpen} + w="10rem" + fontSize="md" + color="black.800" + > + 수정 + </Box> + <CommentDrawer + title="글 수정하기" + placeholder="글을 입력해 주세요!" + isOpen={isModifyModalOpen} + onClose={onModifyModalClose} + defaultComment={comment} + textareaRef={commentTextAreaRef} + onComplete={onCompleteClick} + /> + </Box> + ); +}; + +export default CommentModifyModal; diff --git a/src/ui/Group/GroupComment/GuideMessage.tsx b/src/ui/Group/GroupComment/GuideMessage.tsx new file mode 100644 index 000000000..791141599 --- /dev/null +++ b/src/ui/Group/GroupComment/GuideMessage.tsx @@ -0,0 +1,74 @@ +import { VStack, Text, Highlight, Link, Image, Box } from '@chakra-ui/react'; + +import Button from '@/ui/common/Button'; + +interface GuideMessageProps { + isAuthed: boolean; + isPublic: boolean; + isGroupMember: boolean; +} + +const GuideMessage = ({ + isAuthed, + isPublic, + isGroupMember, +}: GuideMessageProps) => { + const kakaoUrl = `${process.env.NEXT_PUBLIC_API_URL}/oauth2/authorize/kakao?redirect_uri=${process.env.NEXT_PUBLIC_CLIENT_REDIRECT_URI}`; + + return ( + <Box> + <Box> + {!isAuthed && !isPublic ? ( + <VStack h="20rem" direction="column" gap="1rem"> + <Text + w="100%" + textAlign="center" + mt="4rem" + fontSize="lg" + color="black.700" + > + <Highlight query="로그인" styles={{ color: 'main' }}> + 로그인 후 이용해 주세요 + </Highlight> + </Text> + <Link href={kakaoUrl} style={{ width: '100%' }}> + <Button scheme="kakao" fullWidth> + <Image + src="/images/kakao.svg" + alt="카카오 로고" + width={21} + height={19} + /> + 카카오 로그인 + </Button> + </Link> + </VStack> + ) : ( + '' + )} + </Box> + <Box> + {isAuthed && !isPublic && !isGroupMember ? ( + <Text + h="10rem" + w="100%" + textAlign="center" + mt="4rem" + fontSize="lg" + color="black.700" + > + <Highlight query="모임에 참여한 사람" styles={{ color: 'main' }}> + 이 모임은 모임에 참여한 사람만 + </Highlight> + <br /> + 글을 볼 수 있어요 + </Text> + ) : ( + '' + )} + </Box> + </Box> + ); +}; + +export default GuideMessage; diff --git a/src/ui/Group/GroupComment/index.tsx b/src/ui/Group/GroupComment/index.tsx new file mode 100644 index 000000000..3c5bff37e --- /dev/null +++ b/src/ui/Group/GroupComment/index.tsx @@ -0,0 +1,140 @@ +import { Avatar, Box, Flex, Highlight, Text } from '@chakra-ui/react'; +import Link from 'next/link'; + +import { initialBookGroupComments } from '@/constants/initialBookGroupComments'; +import { APIGroupComment } from '@/types/group'; +import { isAuthed } from '@/utils/helpers'; +import CommentDeleteModal from './CommentDeleteModal'; +import CommentModifyModal from './CommentModifyModal'; +import GuideMessage from './GuideMessage'; +import { Menu, MenuItem } from '@/ui/common/Menu'; + +interface commentsListProps { + isGroupMember: boolean; + isPublic: boolean; + isEmpty: boolean; + commentsListData: APIGroupComment[]; + handleDeleteCommentBtnClick: (commentId: number) => void; + handleModifyCommentBtnClick: ( + modifiedComment: string, + commentId: number + ) => void; +} + +const CommentsList = ({ + isGroupMember, + isPublic, + isEmpty, + commentsListData, + handleDeleteCommentBtnClick, + handleModifyCommentBtnClick, +}: commentsListProps) => { + const getFilteredComments = () => { + const commentsLength = commentsListData.length; + + if (!isAuthed() && !isPublic && commentsLength < 5) { + return initialBookGroupComments.slice(0, commentsLength); + } else if (!isAuthed() && !isPublic) { + return initialBookGroupComments; + } + + if (isAuthed() && !isPublic && !isGroupMember && commentsLength < 5) { + return initialBookGroupComments.slice(0, commentsLength); + } else if (isAuthed() && !isPublic && !isGroupMember) { + return initialBookGroupComments; + } + return commentsListData; + }; + + const filteredComments = getFilteredComments(); + + return isEmpty ? ( + <Text w="100%" textAlign="center" mt="4rem" fontSize="lg" color="black.700"> + <Highlight query="주인공" styles={{ color: 'main' }}> + 첫 번째 글 작성의 주인공이 되어주세요. + </Highlight> + </Text> + ) : ( + <Box mt="1.5rem"> + <Box fontSize="lg" fontWeight={700}> + 댓글 + </Box> + <Box> + {filteredComments && + filteredComments.map( + ({ + commentId, + userId, + contents, + userProfileImage, + nickname, + writtenByCurrentUser, + }) => { + return ( + <Box + filter="auto" + blur={ + (!isAuthed() && !isPublic) || + (isAuthed() && !isPublic && !isGroupMember) + ? '3px' + : 'undefined' + } + key={commentId} + mt="1rem" + p="1rem" + bgColor="white" + borderRadius="1.5rem" + boxShadow="default" + > + <Flex mb="0.5rem" justify="space-between"> + <Flex as={Link} href={`/profile/${userId}`}> + <Avatar src={userProfileImage} loading="lazy" /> + <Flex + align="center" + fontSize="sm" + ml="1rem" + fontWeight={500} + > + {nickname} + </Flex> + </Flex> + {writtenByCurrentUser && ( + <Menu> + <MenuItem> + <CommentModifyModal + commentId={commentId} + comment={contents} + handleModifyCommentBtnClick={ + handleModifyCommentBtnClick + } + /> + </MenuItem> + <MenuItem color="red.300"> + <CommentDeleteModal + commentId={commentId} + handleDeleteCommentBtnClick={ + handleDeleteCommentBtnClick + } + /> + </MenuItem> + </Menu> + )} + </Flex> + <Box lineHeight="2.2rem" fontSize="md"> + {contents} + </Box> + </Box> + ); + } + )} + </Box> + <GuideMessage + isAuthed={isAuthed()} + isPublic={isPublic} + isGroupMember={isGroupMember} + /> + </Box> + ); +}; + +export default CommentsList; diff --git a/src/ui/Group/GroupDetail/GroupInfo.tsx b/src/ui/Group/GroupDetail/GroupInfo.tsx new file mode 100644 index 000000000..c70811a48 --- /dev/null +++ b/src/ui/Group/GroupDetail/GroupInfo.tsx @@ -0,0 +1,321 @@ +import { + AlertDialog, + AlertDialogBody, + AlertDialogContent, + AlertDialogFooter, + AlertDialogOverlay, + Box, + Button, + Flex, + Image, + Input, + Text, + useDisclosure, + useTheme, +} from '@chakra-ui/react'; +import { MutableRefObject, useRef, useState } from 'react'; +import Link from 'next/link'; + +import { APIGroupDetail } from '@/types/group'; +import BottomSheet from '@/ui/common/BottomSheet'; + +import { useToast } from '@/hooks/toast'; +import TopNavigation from '@/ui/common/TopNavigation'; +import { Menu, MenuItem } from '@/ui/common/Menu'; +import LoginBottomSheet from '@/ui/LoginBottomSheet'; +import { isAuthed } from '@/utils/helpers'; + +interface GroupInfoProps { + groupInfoData: APIGroupDetail; + handleParticipateBtnClick: ( + password?: string, + onSuccess?: () => void, + onFailed?: () => void + ) => void; + handleDeleteGroupBtnClick: () => void; +} + +const GroupInfo = ({ + groupInfoData, + handleParticipateBtnClick, + handleDeleteGroupBtnClick, +}: GroupInfoProps) => { + const [password, setPassword] = useState(''); + const cancelRef = useRef(null); + const { + isOpen: isLoginModalOpen, + onOpen: onLoginModalOpen, + onClose: onLoginModalClose, + } = useDisclosure(); + const { + isOpen: isPasswordModalOpen, + onOpen: onPasswordModalOpen, + onClose: onPasswordModalClose, + } = useDisclosure(); + const { + isOpen: isDeleteModalOpen, + onClose: onDeleteModalClose, + onOpen: onDeleteModalOpen, + } = useDisclosure(); + + const { showToast } = useToast(); + + const { + bookGroupId, + title, + introduce, + startDate, + endDate, + hasJoinPasswd, + joinQuestion, + isPublic: _isPublic, + maxMemberCount: _maxMemberCount, + currentMemberCount, + commentCount, + owner: _owner, + book, + isOwner, + isGroupMember, + } = groupInfoData; + + const message = hasJoinPasswd ? '가입 비밀번호 입력 필요' : '바로 참여 가능'; + + const onDeleteGroupClick = () => { + if (currentMemberCount > 1) { + showToast({ + message: '혼자가 아니면 다른 모임원들이 있어 모임 삭제가 불가능해요!', + }); + onDeleteModalClose(); + return; + } + handleDeleteGroupBtnClick(); + onDeleteModalClose(); + }; + + const onChangePassword = (event: React.ChangeEvent<HTMLInputElement>) => { + setPassword(event.target.value); + }; + + const onPartInButtonClick = () => { + if (!isAuthed()) { + onLoginModalOpen(); + return; + } + hasJoinPasswd ? onPasswordModalOpen() : handleParticipateBtnClick(); + }; + + return ( + <> + <Flex align="center"> + <TopNavigation pageTitle="모임 상세 페이지" /> + {isOwner && ( + <Menu> + <MenuItem + text="수정" + as={Link} + href={`/group/${bookGroupId}/edit`} + /> + <MenuItem text="삭제" color="red.300" onClick={onDeleteModalOpen}> + <DeleteComfirmDialog + cancelRef={cancelRef} + isOpen={isDeleteModalOpen} + onClose={onDeleteModalClose} + onDelete={onDeleteGroupClick} + /> + </MenuItem> + </Menu> + )} + </Flex> + + <Flex direction="column" align="center"> + <Text fontSize="xl" fontWeight={700}> + {title} + </Text> + <Text fontSize="md" m="1rem 0"> + {introduce} + </Text> + </Flex> + <Flex mt="1.5rem" justify="space-between" h="14rem"> + <Box w="68%" bgColor="white" borderRadius="1rem" boxShadow="default"> + <Flex p="1rem" h="100%" direction="column" justify="space-between"> + <Box h="60%"> + <Box fontSize="1.2rem"> + {startDate} ~ {endDate} + </Box> + <Flex h="70%"> + <Text + fontSize="md" + overflow="hidden" + textOverflow="ellipsis" + whiteSpace="nowrap" + fontWeight={600} + > + {book.title} + </Text> + </Flex> + </Box> + <Box> + <Box fontSize="1.2rem" fontWeight={500} color="red.800"> + {isGroupMember ? '' : message} + </Box> + <Flex> + <Flex align="center" w="4rem"> + <Box> + <Image src="/icons/peopleIcon.svg" alt="peopleIcon" /> + </Box> + <Box fontSize="1rem" w="3rem" ml="0.5rem"> + {currentMemberCount} + </Box> + </Flex> + <Flex align="center" w="4rem" ml="0.5rem"> + <Box> + <Image src="/icons/commentIcon.svg" alt="commentIcon" /> + </Box> + <Text fontSize="1rem" w="3rem" ml="0.5rem"> + {commentCount} + </Text> + </Flex> + </Flex> + </Box> + </Flex> + </Box> + <Flex w="30%" justify="center" align="center"> + <Link href={`/book/${book.id}`}> + <Image + src={book.imageUrl} + alt="bookCover" + w="10rem" + objectFit="cover" + borderRadius="1rem" + boxShadow="default" + /> + </Link> + </Flex> + </Flex> + <Box mt="1.5rem"> + {!isOwner && ( + <> + <Button + w="100%" + h="4.5rem" + fontSize="md" + fontWeight="600" + borderRadius="1.2rem" + color="white.900" + border="0.1rem solid" + backgroundColor="main" + onClick={onPartInButtonClick} + isDisabled={isGroupMember} + _disabled={{ + border: 'none', + color: 'main', + background: 'white', + pointerEvents: 'none', + }} + > + {isGroupMember ? '참여 중' : '모임 참여하기'} + </Button> + <BottomSheet + isOpen={isPasswordModalOpen} + onClose={onPasswordModalClose} + > + <Flex p="3rem" h="90vh" gap="3rem" direction="column"> + <Button + alignSelf="flex-end" + bgColor="white.900" + onClick={() => { + handleParticipateBtnClick(password, () => { + onPasswordModalClose(); + setPassword(''); + }); + }} + > + 확인 + </Button> + <Flex direction="column" gap="1rem"> + <Text fontSize="xl" color="main"> + 질문 + </Text> + <Text fontSize="lg" fontWeight={700}> + {joinQuestion} + </Text> + </Flex> + <Flex direction="column" gap="1rem"> + <Text fontSize="xl" color="main"> + 정답 + </Text> + <Input + focusBorderColor="main" + value={password} + h="4rem" + placeholder="- 띄어쓰기 없이 정답을 입력해 주세요." + onChange={onChangePassword} + /> + </Flex> + </Flex> + <DeleteComfirmDialog + cancelRef={cancelRef} + isOpen={isDeleteModalOpen} + onClose={onDeleteModalClose} + onDelete={onDeleteGroupClick} + /> + </BottomSheet> + </> + )} + </Box> + <LoginBottomSheet isOpen={isLoginModalOpen} onClose={onLoginModalClose} /> + </> + ); +}; + +export default GroupInfo; + +const DeleteComfirmDialog = ({ + cancelRef, + isOpen, + onClose, + onDelete, +}: { + isOpen: boolean; + onClose: () => void; + onDelete: () => void; + cancelRef: MutableRefObject<null>; +}) => { + const theme = useTheme(); + + return ( + <AlertDialog + leastDestructiveRef={cancelRef} + isOpen={isOpen} + onClose={onClose} + > + <AlertDialogOverlay> + <AlertDialogContent alignSelf="center" p="1.5rem"> + <AlertDialogBody fontSize="md" py="1.5rem"> + 모임을 정말 삭제할까요? + </AlertDialogBody> + <AlertDialogFooter as={Flex} justify="center" gap="1rem"> + <Button + ref={cancelRef} + onClick={onClose} + flexGrow="1" + {...theme.buttonSizes['md']} + {...theme.scheme.button['grey']} + > + 취소 + </Button> + <Button + ref={cancelRef} + onClick={onDelete} + flexGrow="1" + {...theme.buttonSizes['md']} + {...theme.scheme.button['orange-fill']} + > + 삭제 + </Button> + </AlertDialogFooter> + </AlertDialogContent> + </AlertDialogOverlay> + </AlertDialog> + ); +}; diff --git a/src/ui/Group/GroupDetail/index.tsx b/src/ui/Group/GroupDetail/index.tsx new file mode 100644 index 000000000..7a609b116 --- /dev/null +++ b/src/ui/Group/GroupDetail/index.tsx @@ -0,0 +1,123 @@ +import { Flex, VStack, Skeleton } from '@chakra-ui/react'; +import { useRouter } from 'next/navigation'; + +import GroupInfo from '@/ui/Group/GroupDetail/GroupInfo'; +import CommentInputBox from '../GroupComment/CommentInputBox'; +import CommentsList from '../GroupComment'; +import useGroupInfoQuery from '@/queries/group/useGroupInfoQuery'; +import useGroupCommentsQuery from '@/queries/group/useGroupCommentsQuery'; +import GroupAPI from '@/apis/group'; +import { useToast } from '@/hooks/toast'; + +interface GroupDetailProps { + bookGroupId: number; +} + +const GroupDetail = ({ bookGroupId }: GroupDetailProps) => { + const groupInfoQuery = useGroupInfoQuery({ bookGroupId }); + const groupCommentsQuery = useGroupCommentsQuery({ bookGroupId }); + const { showToast } = useToast(); + const router = useRouter(); + + if (groupInfoQuery.isLoading || groupCommentsQuery.isLoading) + return ( + <VStack gap="2rem" align="stretch" w="100%" mt="2rem"> + <Skeleton height="3rem" /> + <Skeleton height="10rem" /> + <Skeleton height="18rem" /> + <Skeleton height="35rem" /> + </VStack> + ); + + const isSuccess = groupInfoQuery.isSuccess && groupCommentsQuery.isSuccess; + if (!isSuccess) return null; + + const handleParticipateBtnClick = async ( + password?: string, + onSuccess?: () => void + ) => { + try { + await GroupAPI.joinGroup({ bookGroupId, password }); + onSuccess && onSuccess(); + showToast({ message: '모임에 가입되었어요' }); + } catch (error) { + error && + showToast({ message: '정답이 아니에요 다시 한 번 도전해 주세요' }); + } + groupInfoQuery.refetch(); + }; + + const handleCreateCommentBtnClick = async (comment: string) => { + if (comment.trim() === '') return; + try { + await GroupAPI.createGroupComment({ bookGroupId, comment }); + } catch (error) { + console.error(error); + } + groupInfoQuery.refetch(); + groupCommentsQuery.refetch(); + }; + + const handleModifyCommentBtnClick = async ( + modifiedComment: string, + commentId: number + ) => { + try { + await GroupAPI.updateGroupComment({ + bookGroupId, + commentId, + comment: modifiedComment, + }); + } catch (error) { + console.error(error); + } + groupCommentsQuery.refetch(); + }; + + const handleDeleteCommentBtnClick = async (commentId: number) => { + try { + await GroupAPI.deleteGroupComment({ bookGroupId, commentId }); + } catch (error) { + console.error(error); + } + groupInfoQuery.refetch(); + groupCommentsQuery.refetch(); + }; + + const handleDeleteGroupBtnClick = async () => { + try { + await GroupAPI.deleteGroup({ bookGroupId }); + } catch (error) { + console.error(error); + } + + router.push('/group'); + }; + + const { isGroupMember, isPublic } = groupInfoQuery.data; + const { bookGroupComments, isEmpty } = groupCommentsQuery.data; + + return ( + <Flex direction="column" justify="center"> + <GroupInfo + groupInfoData={groupInfoQuery.data} + handleParticipateBtnClick={handleParticipateBtnClick} + handleDeleteGroupBtnClick={handleDeleteGroupBtnClick} + /> + <CommentInputBox + isPartInUser={isGroupMember} + handleCreateCommentBtnClick={handleCreateCommentBtnClick} + /> + <CommentsList + isGroupMember={isGroupMember} + isPublic={isPublic} + isEmpty={isEmpty} + commentsListData={bookGroupComments} + handleDeleteCommentBtnClick={handleDeleteCommentBtnClick} + handleModifyCommentBtnClick={handleModifyCommentBtnClick} + /> + </Flex> + ); +}; + +export default GroupDetail; diff --git a/src/ui/Group/GroupHeader.tsx b/src/ui/Group/GroupHeader.tsx new file mode 100644 index 000000000..0ea005c0e --- /dev/null +++ b/src/ui/Group/GroupHeader.tsx @@ -0,0 +1,57 @@ +import LoginBottomSheet from '@/ui/LoginBottomSheet'; +import { Box, Button, Flex, Text, useDisclosure } from '@chakra-ui/react'; +import Link from 'next/link'; + +import { isAuthed } from '@/utils/helpers'; +import { MouseEvent } from 'react'; + +const GroupHeader = () => { + const { isOpen, onOpen, onClose } = useDisclosure(); + + const onClick = (event: MouseEvent<HTMLAnchorElement>) => { + if (isAuthed()) return; + onOpen(); + event.preventDefault(); + }; + + return ( + <Box width="100%"> + <Flex mb="2rem" justify="space-between"> + <Text + alignSelf="flex-start" + fontSize="2rem" + fontWeight="800" + color="main" + > + Group + </Text> + <Flex align="center"> + <Link href="/group/create" onClick={onClick}> + <Button + fontSize="sm" + borderRadius="0.6rem" + color="white.900" + backgroundColor="main" + border="0.1rem solid" + p="1.4rem 1.5rem" + display="flex" + > + <Text + alignSelf="center" + fontSize="2rem" + fontWeight="medium" + mr="0.4rem" + > + + + </Text> + 모임 + </Button> + </Link> + </Flex> + </Flex> + <LoginBottomSheet isOpen={isOpen} onClose={onClose} /> + </Box> + ); +}; + +export default GroupHeader; diff --git a/src/ui/Group/GroupList/GroupListItem.tsx b/src/ui/Group/GroupList/GroupListItem.tsx new file mode 100644 index 000000000..5c929d8f3 --- /dev/null +++ b/src/ui/Group/GroupList/GroupListItem.tsx @@ -0,0 +1,138 @@ +import { APIGroup } from '@/types/group'; +import { Avatar, Box, Flex, Image, Text } from '@chakra-ui/react'; +import Link from 'next/link'; + +const GroupListItem = ({ + bookGroupId, + title, + isPublic, + introduce, + hasJoinPasswd: _hasJoinPasswd, + startDate, + endDate, + maxMemberCount, + owner, + memberCount, + commentCount, + book, +}: APIGroup) => { + return ( + <Box cursor="pointer" position="relative"> + <Box + as={Link} + position="absolute" + width="full" + height="full" + href={`/group/${bookGroupId}`} + /> + <Flex + m="0.8rem 0" + w="100%" + h="30rem" + direction="column" + justify="space-between" + backgroundColor="white" + borderRadius="1rem" + py="1rem" + px="1.5rem" + _hover={{ bgColor: 'white.800' }} + boxShadow="default" + > + <Flex justify="space-between"> + <Text fontSize="xs" mb="1rem" color="black.600"> + {startDate} ~ {endDate} + </Text> + <Box> + {!isPublic ? ( + <Image src="/icons/lock.svg" alt="잠김" w="1.7rem" /> + ) : ( + <Image src="/icons/unlock.svg" alt="풀림" w="1.7rem" /> + )} + </Box> + </Flex> + <Flex + justify="center" + align="center" + w="100%" + h="2rem" + fontSize="xl" + fontWeight={600} + overflow="hidden" + textOverflow="ellipsis" + whiteSpace="nowrap" + _hover={{ textDecor: 'underLine' }} + > + {title} + </Flex> + <Flex h="80%" w="100%"> + <Flex direction="column" w="70%"> + <Text + h="62%" + w="100%" + mt="1rem" + fontSize="md" + lineHeight="1.7" + overflow="hidden" + _hover={{ textDecor: 'underLine' }} + color="black.900" + > + {introduce} + </Text> + <Box w="100%"> + <Flex direction="column" mt="2rem"> + <Flex w="100%"> + <Flex align="center"> + <Avatar + as={Link} + href={`/profile/${owner.id}`} + src={owner.profileUrl} + loading="lazy" + /> + </Flex> + <Box> + <Flex w="100%" ml="1rem" align="center" fontSize="sm"> + {owner.nickname} + </Flex> + <Flex ml="1rem" w="100%"> + <Flex w="8rem" align="center"> + <Box> + <Image src="/icons/peopleIcon.svg" alt="peopleIcon" /> + </Box> + <Box w="6rem" ml="0.5rem" fontSize="1.2rem"> + {memberCount} + {maxMemberCount ? ` / ${maxMemberCount}` : ''} + </Box> + </Flex> + <Flex w="10rem" align="center" ml="0.5rem"> + <Box> + <Image src="/icons/commentIcon.svg" alt="bookCover" /> + </Box> + <Box w="10rem" ml="0.5rem" fontSize="1.2rem"> + {commentCount} + </Box> + </Flex> + </Flex> + </Box> + </Flex> + </Flex> + </Box> + </Flex> + <Flex w="30%" justify="center" align="start" pl="1rem" pt="1.5rem"> + <Link href={`/book/${book.id}`}> + <Image + src={book.imageUrl} + alt="bookCover" + w="10rem" + objectFit="cover" + boxShadow="default" + borderRadius="0.5rem" + /> + </Link> + </Flex> + </Flex> + </Flex> + </Box> + ); +}; + +export default GroupListItem; diff --git a/src/ui/Group/GroupList/index.tsx b/src/ui/Group/GroupList/index.tsx new file mode 100644 index 000000000..b66b5a17e --- /dev/null +++ b/src/ui/Group/GroupList/index.tsx @@ -0,0 +1,18 @@ +import { Box, List } from '@chakra-ui/react'; + +import { APIGroup } from '@/types/group'; +import GroupListItem from './GroupListItem'; + +const GroupList = ({ bookGroups }: { bookGroups: APIGroup[] }) => { + return ( + <List> + <Box> + {bookGroups.map(bookGroup => ( + <GroupListItem key={bookGroup.bookGroupId} {...bookGroup} /> + ))} + </Box> + </List> + ); +}; + +export default GroupList; diff --git a/src/ui/Group/GroupSearch.tsx b/src/ui/Group/GroupSearch.tsx new file mode 100644 index 000000000..628693d46 --- /dev/null +++ b/src/ui/Group/GroupSearch.tsx @@ -0,0 +1,83 @@ +import { SearchIcon } from '@chakra-ui/icons'; +import { + Input, + Select, + Flex, + InputRightElement, + IconButton, + InputGroup, +} from '@chakra-ui/react'; + +interface SearchValue { + input: string; + select: string; +} +interface GroupSearchProps { + searchValue: SearchValue; + handleChange: (name: string, value: string) => void; + handleSumbit: () => void; +} + +const GroupSearch = ({ + searchValue, + handleChange, + handleSumbit, +}: GroupSearchProps) => { + const { input, select } = searchValue; + + const handleSubmit = (event: React.FormEvent<HTMLDivElement>) => { + event && event.preventDefault(); + handleSumbit(); + }; + + return ( + <Flex + as="form" + m="1rem 0" + w="100%" + onSubmit={handleSubmit} + borderRadius="1rem" + boxShadow="default" + > + <Select + w="14rem" + h="3.5rem" + borderRightRadius="none" + borderLeftRadius="1rem" + borderRight="none" + variant="filled" + onChange={event => handleChange('select', event.target.value)} + value={select} + > + <option value="모임">모임</option> + <option value="책 제목">책 제목</option> + </Select> + <InputGroup> + <Input + borderRightRadius="1rem" + borderLeftRadius="none" + h="3.5rem" + background="white" + border="none" + placeholder="검색어를 입력해 주세요." + onChange={event => handleChange('input', event.target.value)} + value={input} + /> + <InputRightElement> + <IconButton + m="1rem 0.6rem 0 0" + bgColor="white" + borderRightRadius="1rem" + h="3.5rem" + aria-label="Search database" + icon={<SearchIcon />} + type="submit" + size="lg" + /> + </InputRightElement> + </InputGroup> + </Flex> + ); +}; + +export default GroupSearch; diff --git a/src/ui/InteractiveBook/index.tsx b/src/ui/InteractiveBook/index.tsx new file mode 100644 index 000000000..ad4585aac --- /dev/null +++ b/src/ui/InteractiveBook/index.tsx @@ -0,0 +1,86 @@ +import { APIBook } from '@/types/book'; +import { Box, Flex } from '@chakra-ui/react'; +import Image from 'next/image'; +import { useRouter } from 'next/navigation'; +import ColorThief from 'colorthief'; + +import { useState } from 'react'; + +interface InteractiveBookProps { + imageUrl: APIBook['imageUrl']; + bookId: APIBook['bookId'] | null; +} + +const InteractiveBook = ({ imageUrl, bookId }: InteractiveBookProps) => { + const router = useRouter(); + const [bookSpineColor, setBookSpineColor] = useState<string>(); + + const handleOnLoadImage = (image: HTMLImageElement) => { + const colorThief = new ColorThief(); + const colorHex = + '#' + + colorThief + .getPalette(image, 2)[0] + .map(x => { + const hex = x.toString(16); + return hex.length === 1 ? '0' + hex : hex; + }) + .join(''); + setBookSpineColor(colorHex); + }; + + const handleClickBook = () => { + if (!bookId) return; + router.push(`/book/${bookId}`); + }; + + return ( + <Flex + style={{ perspective: '200px' }} + justify="center" + flexGrow={1} + filter={bookId ? 'none' : 'auto'} + blur={bookId ? 'none' : '0.2rem'} + cursor={bookId ? 'pointer' : 'auto'} + > + <Box + w="8.5rem" + h="11rem" + transform="rotateY(30deg) translateX(1rem)" + boxSizing="border-box" + style={{ + perspectiveOrigin: 'center center', + transformStyle: 'preserve-3d', + }} + position="relative" + visibility={!bookSpineColor ? 'hidden' : 'visible'} + onClick={handleClickBook} + > + <Box + w="100%" + h="1rem" + pos="absolute" + bottom={0} + transform={`translateZ(-3rem)`} + boxShadow="1px -4px 20px 3px" + /> + <Image + src={imageUrl} + alt="book cover" + onLoadingComplete={handleOnLoadImage} + fill + sizes="256px" + quality={100} + /> + <Box + w="3rem" + h="100%" + bgColor={bookSpineColor} + transform="rotateY(-90deg) translateX(-1.49rem) translateZ(1.5rem)" + /> + </Box> + </Flex> + ); +}; + +export default InteractiveBook; diff --git a/src/ui/InteractiveBookShelf/InitialBookShelfData.tsx b/src/ui/InteractiveBookShelf/InitialBookShelfData.tsx new file mode 100644 index 000000000..43b8452ce --- /dev/null +++ b/src/ui/InteractiveBookShelf/InitialBookShelfData.tsx @@ -0,0 +1,47 @@ +import { Box, Flex, SimpleGrid } from '@chakra-ui/react'; +import InteractiveBook from '../InteractiveBook'; + +const initialBookImageUrl = [ + '/images/book-cover/book1.jpeg', + '/images/book-cover/book2.jpeg', + '/images/book-cover/book3.jpeg', + '/images/book-cover/book4.jpeg', +] as const; + +const InitialBookShelfData = () => { + return ( + <Flex + w="100%" + direction="column" + position="relative" + height="15.2rem" + justify="flex-end" + gap="2rem" + > + <Box + position="absolute" + width="100%" + bottom="0" + bgColor="white.500" + height="4rem" + borderBottomRadius={10} + /> + <SimpleGrid + columns={4} + width="100%" + height="15.2rem" + shadow="md" + alignItems="center" + borderRadius={10} + boxShadow="inset 0px 0px 20px 2px #9595956e" + px="1rem" + > + {initialBookImageUrl.map((imageUrl, idx) => ( + <InteractiveBook key={idx} bookId={null} imageUrl={imageUrl} /> + ))} + </SimpleGrid> + </Flex> + ); +}; + +export default InitialBookShelfData; diff --git a/src/ui/InteractiveBookShelf/index.tsx b/src/ui/InteractiveBookShelf/index.tsx new file mode 100644 index 000000000..c01b00ae3 --- /dev/null +++ b/src/ui/InteractiveBookShelf/index.tsx @@ -0,0 +1,80 @@ +import { APIBook } from '@/types/book'; +import InteractiveBook from '@/ui//InteractiveBook'; +import { isAuthed } from '@/utils/helpers'; +import { Box, Flex, SimpleGrid } from '@chakra-ui/react'; +import { useCallback, useEffect, useState } from 'react'; + +const BOOKSHELF_BOOK_LIMIT = 4; + +const InteractiveBookShelf = ({ + books, +}: { + books: Pick<APIBook, 'bookId' | 'title' | 'imageUrl'>[]; +}) => { + const [slicedBooks, setSlicedBooks] = useState< + Pick<APIBook, 'bookId' | 'title' | 'imageUrl'>[][] + >([[]]); + + const sliceBooks = useCallback(() => { + const response = []; + + for (let i = 0; i < books.length; i += BOOKSHELF_BOOK_LIMIT) { + response.push(books.slice(i, i + BOOKSHELF_BOOK_LIMIT)); + } + + return response; + }, [books]); + + useEffect(() => { + setSlicedBooks(sliceBooks()); + }, [sliceBooks]); + + return ( + <> + {slicedBooks.map((books, idx) => ( + <Flex + filter="auto" + blur={!isAuthed() && idx === 1 ? '0.3rem' : ''} + key={idx} + w="100%" + direction="column" + position="relative" + height="15.2rem" + justify="flex-end" + gap="2rem" + > + <Box + position="absolute" + width="100%" + bottom="0" + bgColor="white.500" + height="4rem" + borderBottomRadius={10} + /> + <SimpleGrid + columns={4} + key={idx} + width="100%" + height="15.2rem" + shadow="md" + alignItems="center" + borderRadius={10} + boxShadow="inset 0px 0px 20px 2px #9595956e" + px="1rem" + overflow="hidden" + > + {books.map(({ bookId, imageUrl }, index) => ( + <InteractiveBook + key={`${bookId}-${index}`} // API 문제로 중복되는 책이 존재함. 임시 방편용 + bookId={bookId} + imageUrl={imageUrl} + /> + ))} + </SimpleGrid> + </Flex> + ))} + </> + ); +}; + +export default InteractiveBookShelf; diff --git a/src/ui/LoginBottomSheet/CloseButton/index.tsx b/src/ui/LoginBottomSheet/CloseButton/index.tsx new file mode 100644 index 000000000..80ccd00dc --- /dev/null +++ b/src/ui/LoginBottomSheet/CloseButton/index.tsx @@ -0,0 +1,23 @@ +import Image from 'next/image'; +import { Box } from '@chakra-ui/react'; +import { ComponentPropsWithoutRef } from 'react'; + +interface Props extends ComponentPropsWithoutRef<typeof Box> { + onCancel?: () => void; +} + +const CloseButton = ({ width = 24, onCancel, ...props }: Props) => { + const height = width; + return ( + <Box as="button" onClick={onCancel} {...props}> + <Image + src="/icons/close.svg" + alt="취소하기 버튼" + width={width} + height={height} + /> + </Box> + ); +}; + +export default CloseButton; diff --git a/src/ui/LoginBottomSheet/index.tsx b/src/ui/LoginBottomSheet/index.tsx new file mode 100644 index 000000000..08f71ae7d --- /dev/null +++ b/src/ui/LoginBottomSheet/index.tsx @@ -0,0 +1,53 @@ +import Image from 'next/image'; +import { Flex, Text, Highlight } from '@chakra-ui/react'; + +import BottomSheet from '@/ui/common/BottomSheet'; +import Button from '@/ui/common/Button'; +import Logo from '@/ui/common/Logo'; +import Link from 'next/link'; + +interface Props { + isOpen: boolean; + onClose: () => void; +} + +const LoginBottomSheet = ({ isOpen, onClose }: Props) => { + const kakaoUrl = `${process.env.NEXT_PUBLIC_API_URL}/oauth2/authorize/kakao?redirect_uri=${process.env.NEXT_PUBLIC_CLIENT_REDIRECT_URI}`; + + return ( + <BottomSheet isOpen={isOpen} onClose={onClose}> + <Flex direction="column" align="center" gap="3rem" p="3rem 3rem 4rem"> + <Logo /> + <Text fontSize="lg" fontWeight="bold"> + 로그인이 필요한 서비스예요! + </Text> + <Text + color="black.500" + fontSize="sm" + fontWeight="medium" + textAlign="center" + > + 3초만에 카카오로 로그인을 하고, + <br /> + <Highlight query="다독다독" styles={{ color: 'main' }}> + 다독다독의 다양한 서비스를 이용해보세요! + </Highlight> + </Text> + <Link href={kakaoUrl} style={{ width: '100%' }}> + <Button scheme="kakao" fullWidth> + <Image + src="/images/kakao.svg" + alt="카카오 로고" + width={21} + height={19} + priority + /> + 카카오 로그인 + </Button> + </Link> + </Flex> + </BottomSheet> + ); +}; + +export default LoginBottomSheet; diff --git a/src/ui/Profile/ProfileBookshelf/MyProfileBookshelfContainer.tsx b/src/ui/Profile/ProfileBookshelf/MyProfileBookshelfContainer.tsx new file mode 100644 index 000000000..5a0a9ab79 --- /dev/null +++ b/src/ui/Profile/ProfileBookshelf/MyProfileBookshelfContainer.tsx @@ -0,0 +1,14 @@ +import ProfileBookshelfPresenter from './ProfileBookshelfPresenter'; +import useMySummaryBookshlefQuery from '@/queries/bookshelf/useMySummaryBookshelfQuery'; + +const MyProfileBookshelfContainer = () => { + const { isSuccess, data } = useMySummaryBookshlefQuery({ + suspense: true, + }); + + if (!isSuccess) return null; + + return <ProfileBookshelfPresenter {...data}></ProfileBookshelfPresenter>; +}; + +export default MyProfileBookshelfContainer; diff --git a/src/ui/Profile/ProfileBookshelf/ProfileBookshelfPresenter.tsx b/src/ui/Profile/ProfileBookshelf/ProfileBookshelfPresenter.tsx new file mode 100644 index 000000000..1e08d26f4 --- /dev/null +++ b/src/ui/Profile/ProfileBookshelf/ProfileBookshelfPresenter.tsx @@ -0,0 +1,45 @@ +import { APIBookshelf } from '@/types/bookshelf'; +import { LikeCount } from '@/ui/common/BookshelfLike/'; +import { Flex, Text, VStack } from '@chakra-ui/react'; +import Link from 'next/link'; +import IconButton from '../../common/IconButton'; +import InteractiveBookShelf from '../../InteractiveBookShelf'; + +const ProfileBookshelfPresenter = ({ + bookshelfId, + bookshelfName, + books, + likeCount, +}: APIBookshelf) => { + return ( + <VStack align="flex-start" gap="1rem" w="100%"> + <Flex align="center" w="100%" justify="space-between"> + <Text + as={Link} + href={`/bookshelf/${bookshelfId}`} + fontSize="md" + fontWeight="bold" + > + {`${bookshelfName}`} + </Text> + <Flex h="2.4rem" align="center"> + <LikeCount likeCount={likeCount} /> + <IconButton + as={Link} + href={`/bookshelf/${bookshelfId}`} + name="more-circle" + size="1.6rem" + fill + /> + </Flex> + </Flex> + {books.length === 0 ? ( + <Text fontSize="md">책장이 비어있습니다.</Text> + ) : ( + <InteractiveBookShelf books={books} /> + )} + </VStack> + ); +}; + +export default ProfileBookshelfPresenter; diff --git a/src/ui/Profile/ProfileBookshelf/UserProfileBookshelfContainer.tsx b/src/ui/Profile/ProfileBookshelf/UserProfileBookshelfContainer.tsx new file mode 100644 index 000000000..61484091e --- /dev/null +++ b/src/ui/Profile/ProfileBookshelf/UserProfileBookshelfContainer.tsx @@ -0,0 +1,19 @@ +import ProfileBookshelfPresenter from './ProfileBookshelfPresenter'; +import useUserSummaryBookshlefQuery from '@/queries/bookshelf/useUserSummaryBookshelfQuery'; +import type { APIUser } from '@/types/user'; + +const UserProfileBookshelfContainer = ({ + userId, +}: { + userId: APIUser['userId']; +}) => { + const { isSuccess, data } = useUserSummaryBookshlefQuery(userId, { + suspense: true, + }); + + if (!isSuccess) return null; + + return <ProfileBookshelfPresenter {...data}></ProfileBookshelfPresenter>; +}; + +export default UserProfileBookshelfContainer; diff --git a/src/ui/Profile/ProfileBookshelf/index.tsx b/src/ui/Profile/ProfileBookshelf/index.tsx new file mode 100644 index 000000000..1aedcccb5 --- /dev/null +++ b/src/ui/Profile/ProfileBookshelf/index.tsx @@ -0,0 +1,45 @@ +import QueryErrorBounaryFallback from '@/ui/common/QueryErrorBoundaryFallback'; +import { Skeleton } from '@chakra-ui/react'; +import { QueryErrorResetBoundary } from '@tanstack/react-query'; +import { Suspense } from 'react'; +import { ErrorBoundary } from 'react-error-boundary'; +import type { APIUser } from '@/types/user'; +import MyProfileBookshelfContainer from './MyProfileBookshelfContainer'; +import UserProfileBookshelfContainer from './UserProfileBookshelfContainer'; +import useMounted from '@/hooks/useMounted'; + +const ProfileBookShelf = ({ userId }: { userId: 'me' | APIUser['userId'] }) => { + const mounted = useMounted(); + + if (!mounted) return null; + + return ( + <QueryErrorResetBoundary> + {({ reset }) => ( + <ErrorBoundary + onReset={reset} + fallbackRender={({ resetErrorBoundary }) => ( + <QueryErrorBounaryFallback + minH="18rem" + resetErrorBoundary={resetErrorBoundary} + /> + )} + > + <Suspense fallback={<ProfileBookShelfSkelenton />}> + {userId === 'me' ? ( + <MyProfileBookshelfContainer /> + ) : ( + <UserProfileBookshelfContainer userId={userId} /> + )} + </Suspense> + </ErrorBoundary> + )} + </QueryErrorResetBoundary> + ); +}; + +export default ProfileBookShelf; + +const ProfileBookShelfSkelenton = () => { + return <Skeleton w="100%" height="18rem" />; +}; diff --git a/src/ui/Profile/ProfileForm.tsx b/src/ui/Profile/ProfileForm.tsx new file mode 100644 index 000000000..0e27a7661 --- /dev/null +++ b/src/ui/Profile/ProfileForm.tsx @@ -0,0 +1,99 @@ +import { useToast } from '@/hooks/toast'; +import useMyProfileMutation from '@/queries/user/useMyProfileMutation'; +import { APIJobGroup } from '@/types/job'; +import { APIUser } from '@/types/user'; +import { Box, useTheme, VStack } from '@chakra-ui/react'; +import { isAxiosError } from 'axios'; +import { useRouter } from 'next/navigation'; +import { FormProvider, useForm } from 'react-hook-form'; +import FormInput from '../FormInput'; +import FormSelect from '../FormSelect'; + +interface ProfileFormProps { + profile: Pick<APIUser, 'nickname' | 'job'>; + jobGroups: APIJobGroup[]; +} + +const ProfileForm = ({ jobGroups, profile }: ProfileFormProps) => { + const theme = useTheme(); + const myProfileMutation = useMyProfileMutation(); + const router = useRouter(); + + const { showToast } = useToast(); + + const onSubmit: Parameters<typeof methods.handleSubmit>[0] = ({ + nickname, + jobGroup, + job, + }) => { + myProfileMutation.mutateAsync( + { nickname, job: { jobGroup, jobName: job } }, + { + onSuccess: () => { + router.replace('/profile/me'); + }, + onError: error => { + if (isAxiosError(error) && error.response) { + const { message } = error.response.data; + message && showToast({ message }); + } + }, + } + ); + }; + + const methods = useForm({ + mode: 'all', + defaultValues: { + nickname: profile.nickname || '', + jobGroup: profile.job.jobGroupName || '', + job: profile.job.jobName || '', + }, + }); + + return ( + <FormProvider {...methods}> + <Box as="form" w="100%" onSubmit={methods.handleSubmit(onSubmit)}> + <VStack gap="1rem"> + <FormInput label="닉네임" name="nickname" /> + <FormSelect label="직군" name="jobGroup"> + {jobGroups.map(({ name, koreanName }) => ( + <option key={name} value={name}> + {koreanName} + </option> + ))} + </FormSelect> + <FormSelect label="직업" name="job"> + {jobGroups + .find(({ name }) => name === methods.watch('jobGroup')) + ?.jobs.map(({ name, koreanName }) => ( + <option key={name} value={name}> + {koreanName} + </option> + ))} + </FormSelect> + </VStack> + <Box + as="button" + w="100%" + mt="2rem" + px="2rem" + py="1rem" + disabled={methods.formState.isSubmitting} + color={theme.colors.main} + border="1px solid" + borderRadius="5rem" + fontSize="md" + _disabled={{ + color: `${theme.colors.black['500']}`, + border: '1px solid', + }} + > + 저장 + </Box> + </Box> + </FormProvider> + ); +}; + +export default ProfileForm; diff --git a/src/ui/Profile/ProfileGroup/ProfileGroupContainer.tsx b/src/ui/Profile/ProfileGroup/ProfileGroupContainer.tsx new file mode 100644 index 000000000..02843d305 --- /dev/null +++ b/src/ui/Profile/ProfileGroup/ProfileGroupContainer.tsx @@ -0,0 +1,12 @@ +import useMyGroupsQuery from '@/queries/group/useMyGroupsQuery'; +import ProfileGroupPresenter from './ProfileGroupPresenter'; + +const ProfileGroupContainer = () => { + const { isSuccess, data } = useMyGroupsQuery({ suspense: true }); + + if (!isSuccess) return null; + + return <ProfileGroupPresenter {...data} />; +}; + +export default ProfileGroupContainer; diff --git a/src/ui/Profile/ProfileGroup/ProfileGroupPresenter.tsx b/src/ui/Profile/ProfileGroup/ProfileGroupPresenter.tsx new file mode 100644 index 000000000..e83d85e8a --- /dev/null +++ b/src/ui/Profile/ProfileGroup/ProfileGroupPresenter.tsx @@ -0,0 +1,28 @@ +import { APIGroup } from '@/types/group'; +import { Box, Flex, Text, VStack } from '@chakra-ui/react'; +import GroupListItem from '../../Group/GroupList/GroupListItem'; + +interface ProfileGroupPresenterProps { + bookGroups: APIGroup[]; +} + +const ProfileGroupPresenter = ({ bookGroups }: ProfileGroupPresenterProps) => { + return ( + <VStack w="100%"> + <Text alignSelf="flex-start" fontSize="md" fontWeight="bold"> + 내가 참여한 모임 + </Text> + <Box w="100%" overflow="auto"> + <Flex> + {bookGroups.map(group => ( + <Box key={group.bookGroupId} w="95%" flex="1 0 auto" px="0.3rem"> + <GroupListItem {...group} /> + </Box> + ))} + </Flex> + </Box> + </VStack> + ); +}; + +export default ProfileGroupPresenter; diff --git a/src/ui/Profile/ProfileGroup/index.tsx b/src/ui/Profile/ProfileGroup/index.tsx new file mode 100644 index 000000000..f61964884 --- /dev/null +++ b/src/ui/Profile/ProfileGroup/index.tsx @@ -0,0 +1,39 @@ +import useMounted from '@/hooks/useMounted'; +import QueryErrorBounaryFallback from '@/ui/common/QueryErrorBoundaryFallback'; +import { Skeleton } from '@chakra-ui/react'; +import { QueryErrorResetBoundary } from '@tanstack/react-query'; +import { Suspense } from 'react'; +import { ErrorBoundary } from 'react-error-boundary'; +import ProfileGroupContainer from './ProfileGroupContainer'; + +const ProfileGroup = () => { + const mounted = useMounted(); + + if (!mounted) return null; + + return ( + <QueryErrorResetBoundary> + {({ reset }) => ( + <ErrorBoundary + onReset={reset} + fallbackRender={({ resetErrorBoundary }) => ( + <QueryErrorBounaryFallback + minH="34.5rem" + resetErrorBoundary={resetErrorBoundary} + /> + )} + > + <Suspense fallback={<ProfileBookShelfSkelenton />}> + <ProfileGroupContainer /> + </Suspense> + </ErrorBoundary> + )} + </QueryErrorResetBoundary> + ); +}; + +export default ProfileGroup; + +const ProfileBookShelfSkelenton = () => { + return <Skeleton w="100%" height="34.5rem" />; +}; diff --git a/src/components/profile/info/MyProfileInfoContainer.tsx b/src/ui/Profile/ProfileInfo/MyProfileInfoContainer.tsx similarity index 82% rename from src/components/profile/info/MyProfileInfoContainer.tsx rename to src/ui/Profile/ProfileInfo/MyProfileInfoContainer.tsx index fe32ae121..cfef3cdf5 100644 --- a/src/components/profile/info/MyProfileInfoContainer.tsx +++ b/src/ui/Profile/ProfileInfo/MyProfileInfoContainer.tsx @@ -1,9 +1,7 @@ -import { useEffect } from 'react'; -import { usePathname, useRouter } from 'next/navigation'; - import useMyProfileQuery from '@/queries/user/useMyProfileQuery'; - -import ProfileInfoPresenter from '@/components/profile/info/ProfileInfoPresenter'; +import { usePathname, useRouter } from 'next/navigation'; +import { useEffect } from 'react'; +import ProfileInfoPresenter from './ProfileInfoPresenter'; const MyProfileContainer = () => { const { data } = useMyProfileQuery(); @@ -19,7 +17,7 @@ const MyProfileContainer = () => { if (!isSavedAdditionalInfo) replace(`${pathname}/add`); }, [data, pathname, replace]); - return <ProfileInfoPresenter {...data} />; + return <ProfileInfoPresenter {...data}></ProfileInfoPresenter>; }; export default MyProfileContainer; diff --git a/src/ui/Profile/ProfileInfo/ProfileInfoPresenter.tsx b/src/ui/Profile/ProfileInfo/ProfileInfoPresenter.tsx new file mode 100644 index 000000000..6eca059ae --- /dev/null +++ b/src/ui/Profile/ProfileInfo/ProfileInfoPresenter.tsx @@ -0,0 +1,38 @@ +import { Avatar, Flex, HStack, Text, VStack } from '@chakra-ui/react'; +import type { APIUser } from '@/types/user'; +import IconButton from '../../common/IconButton'; + +type ProfileInfoProps = Pick< + APIUser, + 'nickname' | 'oauthNickname' | 'profileImage' | 'email' | 'job' +>; + +const ProfileInfoPresenter = ({ + nickname, + oauthNickname, + profileImage, + email, + job: { jobGroupKoreanName, jobNameKoreanName }, +}: ProfileInfoProps) => { + return ( + <VStack align="flex-start" gap="1rem" w="100%"> + <Flex width="100%" gap="1.5rem"> + <Avatar src={profileImage} w="8rem" h="8rem" /> + <Flex direction="column" justify="center"> + <Text fontSize="xl">{nickname || oauthNickname}</Text> + <Text fontSize="sm">{email}</Text> + </Flex> + </Flex> + <HStack> + <IconButton name="job-card" strokeWidth="0.01px" fill /> + <Text fontSize="md" fontWeight="bold"> + {jobGroupKoreanName && jobNameKoreanName + ? `${jobGroupKoreanName} / ${jobNameKoreanName}` + : '직업이 등록되지 않았습니다.'} + </Text> + </HStack> + </VStack> + ); +}; + +export default ProfileInfoPresenter; diff --git a/src/components/profile/info/UserProfileInfoContainer.tsx b/src/ui/Profile/ProfileInfo/UserProfileInfoContainer.tsx similarity index 69% rename from src/components/profile/info/UserProfileInfoContainer.tsx rename to src/ui/Profile/ProfileInfo/UserProfileInfoContainer.tsx index 79d990089..c92e31310 100644 --- a/src/components/profile/info/UserProfileInfoContainer.tsx +++ b/src/ui/Profile/ProfileInfo/UserProfileInfoContainer.tsx @@ -1,8 +1,7 @@ import useUserProfileQuery from '@/queries/user/useUserProfileQuery'; +import ProfileInfoPresenter from './ProfileInfoPresenter'; import type { APIUser } from '@/types/user'; -import ProfileInfoPresenter from '@/components/profile/info/ProfileInfoPresenter'; - const UserProfileInfoContainer = ({ userId, }: { @@ -10,7 +9,7 @@ const UserProfileInfoContainer = ({ }) => { const { data } = useUserProfileQuery(userId); - return <ProfileInfoPresenter {...data} />; + return <ProfileInfoPresenter {...data}></ProfileInfoPresenter>; }; export default UserProfileInfoContainer; diff --git a/src/ui/Profile/ProfileInfo/index.tsx b/src/ui/Profile/ProfileInfo/index.tsx new file mode 100644 index 000000000..294ca7439 --- /dev/null +++ b/src/ui/Profile/ProfileInfo/index.tsx @@ -0,0 +1,56 @@ +import { ReactNode, Suspense } from 'react'; +import MyProfileContainer from './MyProfileInfoContainer'; +import UserProfileInfoContainer from './UserProfileInfoContainer'; +import { Skeleton, SkeletonCircle, VStack } from '@chakra-ui/react'; +import { QueryErrorResetBoundary } from '@tanstack/react-query'; +import { ErrorBoundary } from 'react-error-boundary'; +import type { APIUser } from '@/types/user'; +import QueryErrorBounaryFallback from '@/ui/common/QueryErrorBoundaryFallback'; +import useMounted from '@/hooks/useMounted'; + +type ProfileInfoProps = { + children?: ReactNode; + userId: 'me' | APIUser['userId']; +}; + +const ProfileInfo = ({ userId, children }: ProfileInfoProps) => { + const mounted = useMounted(); + + if (!mounted) return null; + + return ( + <QueryErrorResetBoundary> + {({ reset }) => ( + <ErrorBoundary + onReset={reset} + fallbackRender={({ resetErrorBoundary }) => ( + <QueryErrorBounaryFallback + minH="12rem" + resetErrorBoundary={resetErrorBoundary} + /> + )} + > + <Suspense fallback={<ProfileInfoSkelenton />}> + {userId === 'me' ? ( + <MyProfileContainer /> + ) : ( + <UserProfileInfoContainer userId={userId} /> + )} + {children && children} + </Suspense> + </ErrorBoundary> + )} + </QueryErrorResetBoundary> + ); +}; + +export default ProfileInfo; + +const ProfileInfoSkelenton = () => { + return ( + <VStack gap="1rem" align="stretch" w="100%"> + <SkeletonCircle size="8rem" /> + <Skeleton w="80%" height="3rem" /> + </VStack> + ); +}; diff --git a/src/ui/Recommended/RecommendedBooks.tsx b/src/ui/Recommended/RecommendedBooks.tsx new file mode 100644 index 000000000..085121215 --- /dev/null +++ b/src/ui/Recommended/RecommendedBooks.tsx @@ -0,0 +1,66 @@ +import { APIBook } from '@/types/book'; +import { APIJobGroup } from '@/types/job'; +import { Flex, Highlight, HStack, Image, Text, VStack } from '@chakra-ui/react'; +import Link from 'next/link'; + +interface RecommendedBooksTypes { + jobGroup: APIJobGroup['koreanName']; + books: APIBook[]; +} + +const RecommendedBooks = ({ jobGroup, books }: RecommendedBooksTypes) => { + return ( + <Flex + width="100%" + direction="column" + gap="1.5rem" + padding="2rem 0" + justify="flex-start" + > + <Text fontWeight="bold" fontSize="md"> + <Highlight + query={jobGroup} + styles={{ + px: '1rem', + py: '0.2rem', + color: 'main', + borderRadius: '3rem', + border: '1px', + borderColor: 'main', + fontSize: 'sm', + verticalAlign: 'text-bottom', + marginRight: '0.2rem', + }} + > + {`${jobGroup} 직군에서 많이 꽂은 책들이에요`} + </Highlight> + </Text> + <HStack width="100%" align="stretch" gap="1rem" overflowX="scroll"> + {books.map(({ bookId, imageUrl, title }) => ( + <VStack key={bookId} as={Link} href={`/book/${bookId}`}> + <Image + src={imageUrl} + alt="bookImage" + width="12rem" + height="15.3rem" + borderRadius="1rem" + /> + <Text + fontSize="sm" + width="12rem" + overflow="hidden" + textOverflow="ellipsis" + noOfLines={2} + lineHeight="1.8rem" + color="black.800" + > + {title} + </Text> + </VStack> + ))} + </HStack> + </Flex> + ); +}; + +export default RecommendedBooks; diff --git a/src/ui/Recommended/RecommendedBookshelf.tsx b/src/ui/Recommended/RecommendedBookshelf.tsx new file mode 100644 index 000000000..f3c86613c --- /dev/null +++ b/src/ui/Recommended/RecommendedBookshelf.tsx @@ -0,0 +1,41 @@ +import { APIBookshelf } from '@/types/bookshelf'; +import IconButton from '@/ui/common/IconButton'; +import { LikeCount } from '@/ui/common/BookshelfLike/'; +import InteractiveBookShelf from '@/ui/InteractiveBookShelf'; +import { Flex, Text, VStack } from '@chakra-ui/react'; +import Link from 'next/link'; + +const RecommendedBookshelf = ({ + bookshelfId, + bookshelfName, + books, + likeCount, +}: APIBookshelf) => { + return ( + <VStack align="flex-start" spacing="2rem"> + <Flex align="center" w="100%" justify="space-between"> + <Text + as={Link} + href={`/bookshelf/${bookshelfId}`} + fontSize="md" + fontWeight="bold" + > + {`${bookshelfName}`} + </Text> + <Flex h="2.4rem" gap="1.6rem" align="center"> + <LikeCount likeCount={likeCount} /> + <IconButton + as={Link} + href={`/bookshelf/${bookshelfId}`} + name="more-circle" + size="1.6rem" + fill + /> + </Flex> + </Flex> + <InteractiveBookShelf books={books} /> + </VStack> + ); +}; + +export default RecommendedBookshelf; diff --git a/src/ui/Recommended/index.tsx b/src/ui/Recommended/index.tsx new file mode 100644 index 000000000..7380a7757 --- /dev/null +++ b/src/ui/Recommended/index.tsx @@ -0,0 +1,2 @@ +export { default as RecommendedBooks } from './RecommendedBooks'; +export { default as RecommendedBookshelf } from './RecommendedBookshelf'; diff --git a/src/ui/UserJobInfoTag/index.tsx b/src/ui/UserJobInfoTag/index.tsx new file mode 100644 index 000000000..ecb04dc94 --- /dev/null +++ b/src/ui/UserJobInfoTag/index.tsx @@ -0,0 +1,23 @@ +import { Flex } from '@chakra-ui/react'; + +type UserTagType = { + tag: string; +}; + +const UserJobInfoTag = ({ tag }: UserTagType) => { + return ( + <Flex + align="center" + h="2.4rem" + padding="0.6rem 1.2rem" + color="main" + fontSize="sm" + border="solid 0.1rem" + borderRadius="1.6rem" + > + {tag} + </Flex> + ); +}; + +export default UserJobInfoTag; diff --git a/src/ui/common/BookshelfLike/LikeButton.tsx b/src/ui/common/BookshelfLike/LikeButton.tsx new file mode 100644 index 000000000..a3d3cde1d --- /dev/null +++ b/src/ui/common/BookshelfLike/LikeButton.tsx @@ -0,0 +1,48 @@ +import { APIBookshelfInfo } from '@/types/bookshelf'; +import IconButton from '@/ui/common/IconButton'; +import { Button, Flex, Text, useTheme } from '@chakra-ui/react'; + +type LikeButtonTypes = { + handleBookshelfLikeButton: () => void; + isLiked: APIBookshelfInfo['isLiked']; + likeCount: APIBookshelfInfo['likeCount']; +}; + +const LikeButton = ({ + handleBookshelfLikeButton, + isLiked, + likeCount, +}: LikeButtonTypes) => { + const theme = useTheme(); + + return ( + <Button + onClick={handleBookshelfLikeButton} + p="0.6rem 0.8rem" + w="5.4rem" + h="2.4rem" + fontSize="xs" + color={isLiked ? theme.colors.white['800'] : theme.colors.red['800']} + bg={isLiked ? theme.colors.red['800'] : theme.colors.white['800']} + border="solid 0.1rem" + borderColor={theme.colors.red['800']} + borderRadius="1.6rem" + > + <Flex w="100%" h="100%" gap="0.2rem" justify="flex-start" align="center"> + <IconButton + as="div" + name="like" + size="1.3rem" + strokeWidth={'0.05rem'} + color={isLiked ? theme.colors.white['800'] : theme.colors.red['800']} + fill={true} + /> + <Text w="2rem" fontWeight="900"> + {likeCount ? likeCount : 0} + </Text> + </Flex> + </Button> + ); +}; + +export default LikeButton; diff --git a/src/ui/common/BookshelfLike/LikeCount.tsx b/src/ui/common/BookshelfLike/LikeCount.tsx new file mode 100644 index 000000000..8b3cdc939 --- /dev/null +++ b/src/ui/common/BookshelfLike/LikeCount.tsx @@ -0,0 +1,37 @@ +import { APIBookshelfInfo } from '@/types/bookshelf'; +import { Flex, Text, useTheme } from '@chakra-ui/react'; +import IconButton from '@/ui/common/IconButton'; + +type LikeCountType = { + likeCount: APIBookshelfInfo['likeCount']; +}; + +const LikeCount = ({ likeCount }: LikeCountType) => { + const theme = useTheme(); + + return ( + <Flex + w="4.2rem" + h="2.4rem" + p="0.2rem 0" + gap="0.2rem" + justify="flex-start" + align="center" + color={theme.colors.red['800']} + > + <IconButton + as="div" + name="like" + size="1.6rem" + strokeWidth={'0.05rem'} + color={theme.colors.red['800']} + fill + /> + <Text fontSize="sm" fontWeight="900"> + {likeCount ? likeCount : 0} + </Text> + </Flex> + ); +}; + +export default LikeCount; diff --git a/src/ui/common/BookshelfLike/index.tsx b/src/ui/common/BookshelfLike/index.tsx new file mode 100644 index 000000000..3e45870c0 --- /dev/null +++ b/src/ui/common/BookshelfLike/index.tsx @@ -0,0 +1,2 @@ +export { default as LikeButton } from './LikeButton'; +export { default as LikeCount } from './LikeCount'; diff --git a/src/ui/common/BottomSheet.tsx b/src/ui/common/BottomSheet.tsx new file mode 100644 index 000000000..9b163fffa --- /dev/null +++ b/src/ui/common/BottomSheet.tsx @@ -0,0 +1,81 @@ +import { Box, Center, Flex } from '@chakra-ui/react'; +import { AnimatePresence, motion } from 'framer-motion'; +import { useEffect } from 'react'; +import IconButton from '@/ui/common/IconButton'; +import type { PropsWithChildren } from 'react'; + +interface DrawerProps { + isOpen: boolean; + onClose: () => void; + onCancel?: () => void; +} + +const Drawer = ({ + isOpen, + onClose, + onCancel, + children, +}: PropsWithChildren<DrawerProps>) => { + const handleClickOverlay = () => { + onCancel && onCancel(); + onClose(); + }; + + useEffect(() => { + document.body.style.overflow = isOpen ? 'hidden' : 'overlay'; + }, [isOpen]); + + return ( + <AnimatePresence> + {isOpen && ( + <Center + position="fixed" + top="0" + left="0" + w="100vw" + height="100dvh" + alignItems="end" + zIndex={10} + > + <Box + as={motion.div} + onClick={handleClickOverlay} + position="absolute" + backgroundColor="black" + width="100%" + height="100%" + initial={{ opacity: 0 }} + animate={{ opacity: 0.5, transition: { duration: 0.2 } }} + exit={{ opacity: 0, transition: { duration: 0.2 } }} + /> + <Flex + as={motion.div} + direction="column" + w="43rem" + p="1rem" + borderTopRadius="xl" + backgroundColor="white" + initial={{ y: '100%', opacity: 1 }} + animate={{ + y: 0, + opacity: 1, + transition: { duration: 0.3, bounce: 0 }, + }} + exit={{ y: '100%', opacity: 0, transition: { duration: 0.2 } }} + > + <IconButton + name="close" + size="2.5rem" + onClick={handleClickOverlay} + alignSelf="end" + m="1rem" + /> + {children} + </Flex> + </Center> + )} + </AnimatePresence> + ); +}; + +export default Drawer; diff --git a/src/ui/common/Button/index.tsx b/src/ui/common/Button/index.tsx new file mode 100644 index 000000000..6f3dcb25e --- /dev/null +++ b/src/ui/common/Button/index.tsx @@ -0,0 +1,40 @@ +import { PropsWithChildren, ComponentProps } from 'react'; +import { useTheme, Flex } from '@chakra-ui/react'; + +import type { ChakraTheme } from '@/styles/theme'; + +type Props = ComponentProps<typeof Flex> & { + size?: keyof ChakraTheme['buttonSizes']; + scheme?: keyof ChakraTheme['scheme']['button']; + fullWidth?: boolean; +}; + +const Button = ({ + size = 'lg', + scheme = 'orange', + fullWidth = false, + children, + ...props +}: PropsWithChildren<Props>) => { + const theme = useTheme(); + + return ( + <Flex + as="button" + justify="center" + align="center" + gap="1rem" + width={fullWidth ? '100%' : 'fit-content'} + fontSize={size} + fontWeight="bold" + borderRadius="1.2rem" + {...theme.buttonSizes[size]} + {...theme.scheme.button[scheme]} + {...props} + > + {children} + </Flex> + ); +}; + +export default Button; diff --git a/src/ui/common/IconButton/index.tsx b/src/ui/common/IconButton/index.tsx new file mode 100644 index 000000000..e82800692 --- /dev/null +++ b/src/ui/common/IconButton/index.tsx @@ -0,0 +1,58 @@ +import dynamic from 'next/dynamic'; +import { ComponentPropsWithoutRef, SVGProps } from 'react'; +import { Center } from '@chakra-ui/react'; + +interface Props extends ComponentPropsWithoutRef<typeof Center> { + name: IconNameType; + size?: number | string; + strokeWidth?: string; + color?: string /** hex */; + fill?: boolean; +} + +const IconButton = ({ + name, + size = '2.4rem', + strokeWidth = '0', + color = '#000', + fill = false, + ...props +}: Props) => { + const Icon = dynamic<SVGProps<SVGSVGElement>>( + () => import(`@/../public/icons/${name}.svg`) + ); + + return ( + <Center + as="button" + width={size} + height={size} + background="transparent" + _hover={{ bg: 'transparent' }} + {...props} + > + <Icon + width="100%" + height="100%" + stroke={color} + strokeWidth={strokeWidth} + fill={fill ? color : 'transparent'} + /> + </Center> + ); +}; + +type IconNameType = + | 'close' + | 'back' + | 'book' + | 'search' + | 'bookmark' + | 'more' + | 'more-circle' + | 'job-card' + | 'plus-circle' + | 'share' + | 'like'; + +export default IconButton; diff --git a/src/ui/common/Layout/index.tsx b/src/ui/common/Layout/index.tsx new file mode 100644 index 000000000..87dc3bb55 --- /dev/null +++ b/src/ui/common/Layout/index.tsx @@ -0,0 +1,44 @@ +import { Box } from '@chakra-ui/react'; +import { motion } from 'framer-motion'; +import { usePathname } from 'next/navigation'; +import { ReactNode } from 'react'; + +import BottomNavigation from '@/ui/BottomNavigation'; +import Toast from '../Toast'; + +const paths = ['/bookarchive', '/book/search', '/group', '/profile/me']; + +const Layout = ({ children }: { children: ReactNode }) => { + const pathname = usePathname(); + const isShowNavigation = pathname && paths.includes(pathname); + + return ( + <Box h={isShowNavigation ? '100%' : '100dvh'}> + <Box + as={motion.div} + key={pathname} + px="2rem" + pt="2rem" + pb={isShowNavigation ? '9rem' : '2rem'} + h="100%" + overflow="auto" + initial="initial" + animate="animate" + variants={{ + initial: { + opacity: 0, + }, + animate: { + opacity: 1, + }, + }} + > + {children} + </Box> + {isShowNavigation && <BottomNavigation />} + <Toast /> + </Box> + ); +}; + +export default Layout; diff --git a/src/ui/common/Logo/index.tsx b/src/ui/common/Logo/index.tsx new file mode 100644 index 000000000..bb5ec5542 --- /dev/null +++ b/src/ui/common/Logo/index.tsx @@ -0,0 +1,16 @@ +import Image from 'next/image'; + +const Logo = ({ width = 61 }: { width?: number }) => { + const height = width * (60 / 61); + return ( + <Image + src="/images/logo.svg" + alt="다독다독 로고" + width={width} + height={height} + priority + /> + ); +}; + +export default Logo; diff --git a/src/ui/common/Menu/Menu.tsx b/src/ui/common/Menu/Menu.tsx new file mode 100644 index 000000000..120b533c9 --- /dev/null +++ b/src/ui/common/Menu/Menu.tsx @@ -0,0 +1,26 @@ +import { + Menu as ChakraMenu, + MenuButton, + MenuList, + IconButton, +} from '@chakra-ui/react'; +import { ReactNode } from 'react'; + +import MoreIcon from '@public/icons/more.svg'; + +const Menu = ({ children }: { children: ReactNode }) => { + return ( + <ChakraMenu> + <MenuButton + as={IconButton} + aria-label="Options" + icon={<MoreIcon />} + background="inherit" + border="none" + /> + <MenuList fontSize="md">{children}</MenuList> + </ChakraMenu> + ); +}; + +export default Menu; diff --git a/src/ui/common/Menu/MenuItem.tsx b/src/ui/common/Menu/MenuItem.tsx new file mode 100644 index 000000000..79161ddbc --- /dev/null +++ b/src/ui/common/Menu/MenuItem.tsx @@ -0,0 +1,20 @@ +import { + forwardRef, + MenuItem as ChakraMenuItem, + MenuItemProps, +} from '@chakra-ui/react'; +import { ReactNode } from 'react'; + +const MenuItem = forwardRef< + MenuItemProps & { text?: string; children?: ReactNode }, + 'button' +>(({ text, children, ...props }, ref) => { + return ( + <ChakraMenuItem ref={ref} {...props}> + {text} + {children} + </ChakraMenuItem> + ); +}); + +export default MenuItem; diff --git a/src/ui/common/Menu/index.ts b/src/ui/common/Menu/index.ts new file mode 100644 index 000000000..0c15fc3e1 --- /dev/null +++ b/src/ui/common/Menu/index.ts @@ -0,0 +1,2 @@ +export { default as Menu } from './Menu'; +export { default as MenuItem } from './MenuItem'; diff --git a/src/ui/common/QueryErrorBoundaryFallback/index.tsx b/src/ui/common/QueryErrorBoundaryFallback/index.tsx new file mode 100644 index 000000000..407ef7716 --- /dev/null +++ b/src/ui/common/QueryErrorBoundaryFallback/index.tsx @@ -0,0 +1,31 @@ +import { Text, VStack } from '@chakra-ui/react'; +import Button from '../Button'; +import type { BorderProps, LayoutProps } from '@chakra-ui/react'; + +const QueryErrorBounaryFallback = ({ + resetErrorBoundary, + minH, + border = '1px solid #dddddd', +}: { + resetErrorBoundary: (...args: unknown[]) => void; + minH?: LayoutProps['minH']; + border?: BorderProps['border']; +}) => { + return ( + <VStack + w="100%" + h="100%" + justify="center" + minH={minH} + border={border} + borderRadius="2xl" + > + <Text fontSize="md">데이터를 불러오는 중 문제가 발생했어요!</Text> + <Button size="md" onClick={() => resetErrorBoundary()}> + 다시 불러오기 + </Button> + </VStack> + ); +}; + +export default QueryErrorBounaryFallback; diff --git a/src/ui/common/Toast/ToastItem.tsx b/src/ui/common/Toast/ToastItem.tsx new file mode 100644 index 000000000..3ae621890 --- /dev/null +++ b/src/ui/common/Toast/ToastItem.tsx @@ -0,0 +1,46 @@ +import { ToastAtom } from '@/hooks/toast/atoms'; +import { Box } from '@chakra-ui/react'; +import { PropsWithChildren, useEffect, useState } from 'react'; + +const ToastItem = ({ + duration, + children, +}: PropsWithChildren<Pick<ToastAtom, 'duration'>>) => { + const [visible, setVisible] = useState(false); + + useEffect(() => { + setTimeout(() => { + setVisible(true); + }, 100); + + const handleSetTimeout = setTimeout(() => { + setVisible(false); + clearTimeout(handleSetTimeout); + }, duration); + }, [duration]); + + return ( + <Box + position="absolute" + maxW="43rem" + px="2rem" + opacity={visible ? '0.95' : '0'} + transition="all 0.5s ease-in-out" + > + <Box + color="white" + borderRadius={15} + textAlign="center" + bg="main" + fontSize="md" + fontWeight="bold" + py="2rem" + px="2rem" + > + {children} + </Box> + </Box> + ); +}; + +export default ToastItem; diff --git a/src/ui/common/Toast/index.tsx b/src/ui/common/Toast/index.tsx new file mode 100644 index 000000000..990d2c60e --- /dev/null +++ b/src/ui/common/Toast/index.tsx @@ -0,0 +1,22 @@ +import { toastsAtom } from '@/hooks/toast/atoms'; +import { Box, Center } from '@chakra-ui/react'; +import { useRecoilValue } from 'recoil'; +import ToastItem from './ToastItem'; + +const Toast = () => { + const toasts = useRecoilValue(toastsAtom); + + return ( + <Box position="fixed" width="100%" bottom="15rem" left={0} zIndex={10000}> + <Center> + {toasts.map(({ id, duration, message }) => ( + <ToastItem key={id} duration={duration}> + {message} + </ToastItem> + ))} + </Center> + </Box> + ); +}; + +export default Toast; diff --git a/src/ui/common/TopNavigation/index.tsx b/src/ui/common/TopNavigation/index.tsx new file mode 100644 index 000000000..203287a50 --- /dev/null +++ b/src/ui/common/TopNavigation/index.tsx @@ -0,0 +1,33 @@ +import { Box, Flex, Text } from '@chakra-ui/react'; +import { useRouter } from 'next/navigation'; +import IconButton from '../IconButton'; + +type PageTitleType = { + pageTitle: string; +}; + +const TopNavigation = ({ pageTitle }: PageTitleType) => { + const router = useRouter(); + + return ( + <Flex + width="100%" + alignItems="center" + justifyContent="space-between" + mb="1rem" + > + <IconButton + name="back" + size="2rem" + onClick={() => router.back()} + cursor="pointer" + /> + <Text fontSize="lg" fontWeight="700"> + {pageTitle} + </Text> + <Box w="2rem"></Box> + </Flex> + ); +}; + +export default TopNavigation; diff --git a/src/utils/assert.ts b/src/utils/assert.ts deleted file mode 100644 index bb312438f..000000000 --- a/src/utils/assert.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const assert = (condition: unknown, error: Error | string) => { - if (!condition) { - if (typeof error === 'string') { - throw new Error(error); - } else { - throw error; - } - } -}; diff --git a/src/utils/date.ts b/src/utils/date.ts deleted file mode 100644 index b4b5ca486..000000000 --- a/src/utils/date.ts +++ /dev/null @@ -1,31 +0,0 @@ -export const toDayFromMillseconds = (value: number) => - Math.ceil(value / (1000 * 60 * 60 * 24)); - -export const getDdayCount = (target: Date) => - toDayFromMillseconds(target.getTime() - new Date().getTime()); - -export const isExpired = (end: string) => { - return getDdayCount(new Date(end)) < 0; -}; - -export const formatDateInputValue = (target: string) => { - const date = new Date(target); - - const year = date.getFullYear(); - const month = ('0' + (date.getMonth() + 1)).slice(-2); - const day = ('0' + date.getDate()).slice(-2); - - const daysOfWeek = ['일', '월', '화', '수', '목', '금', '토']; - const dayOfWeek = daysOfWeek[date.getDay()]; - - const formattedDate = `${year}.${month}.${day} (${dayOfWeek})`; - - return formattedDate; -}; - -export const getTodayDate = () => { - const offset = new Date().getTimezoneOffset() * 60000; - const todayDate = new Date(Date.now() - offset); - - return todayDate.toISOString().slice(0, 10); -}; diff --git a/src/utils/eventListener.ts b/src/utils/eventListener.ts deleted file mode 100644 index 18731f98e..000000000 --- a/src/utils/eventListener.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * 참고 - * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#safely_detecting_option_support - * */ - -type FixedEventListenerOptions = - | (AddEventListenerOptions & EventListenerOptions) - | boolean; - -let passiveSupported = false; - -const emptyListener = () => void {}; - -try { - const options: FixedEventListenerOptions = { - get passive() { - // This function will be called when the browser - // attempts to access the passive property. - passiveSupported = true; - return false; - }, - }; - - window.addEventListener('test', emptyListener, options); - window.removeEventListener('test', emptyListener, options); -} catch { - passiveSupported = false; -} - -export const nonPassive: FixedEventListenerOptions = passiveSupported - ? { passive: false } - : false; diff --git a/src/utils/helpers/auth.ts b/src/utils/helpers/auth.ts index 0c7bc2df3..394f4e59f 100644 --- a/src/utils/helpers/auth.ts +++ b/src/utils/helpers/auth.ts @@ -3,7 +3,7 @@ import webStorage from '@/utils/storage'; const storage = webStorage(ACCESS_TOKEN_STORAGE_KEY); -const checkAuthentication = () => { +const isAuthed = () => { const accessToken = storage.get(); return !!accessToken; }; @@ -16,4 +16,4 @@ const removeAuth = () => { storage.remove(); }; -export { checkAuthentication, setAuth, removeAuth }; +export { isAuthed, setAuth, removeAuth }; diff --git a/src/utils/helpers/axiosHandler.ts b/src/utils/helpers/axiosHandler.ts new file mode 100644 index 000000000..d3e0c185f --- /dev/null +++ b/src/utils/helpers/axiosHandler.ts @@ -0,0 +1,32 @@ +import axios, { InternalAxiosRequestConfig } from 'axios'; + +import { ACCESS_TOKEN_STORAGE_KEY } from '@/constants'; +import webStorage from '@/utils/storage'; + +const updateToken = async () => { + const storage = webStorage(ACCESS_TOKEN_STORAGE_KEY); + + try { + const { + data: { accessToken }, + } = await axios.post<{ accessToken: string }>('/service-api/auth/token'); + + if (!accessToken) { + throw new Error('새로운 accessToken을 받아오지 못했어요.'); + } + + return accessToken; + } catch (error) { + storage.remove(); + return Promise.reject(error); + } +}; + +const setAxiosAuthHeader = ( + config: InternalAxiosRequestConfig, + token: string +) => { + config.headers['Authorization'] = `Bearers ${token}`; +}; + +export { updateToken, setAxiosAuthHeader }; diff --git a/src/utils/helpers/index.ts b/src/utils/helpers/index.ts index 8b7943420..915b8adea 100644 --- a/src/utils/helpers/index.ts +++ b/src/utils/helpers/index.ts @@ -1,2 +1,3 @@ export * from './auth'; +export * from './axiosHandler'; export * from './error'; diff --git a/src/utils/storage.ts b/src/utils/storage.tsx similarity index 100% rename from src/utils/storage.ts rename to src/utils/storage.tsx diff --git a/tailwind.config.js b/tailwind.config.js deleted file mode 100644 index 47c993563..000000000 --- a/tailwind.config.js +++ /dev/null @@ -1,203 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: [ - './src/pages/**/*.{ts,tsx}', - './src/components/**/*.{ts,tsx}', - './src/ui/**/*.{ts,tsx}', - './src/app/**/*.{ts,tsx}', - './src/stories/**/*.{ts,tsx}', - './src/v1/**/*.{ts,tsx}', - './.storybook/**/*.{ts,tsx}', - './src/v1/**/*.{ts,tsx}', - ], - theme: { - extend: { - screens: { - desktop: '430px', - }, - fontSize: { - '2xs': '1.0rem', - xs: '1.2rem', - sm: '1.4rem', - md: '1.6rem', - lg: '1.8rem', - xl: '2.0rem', - '2xl': '2.2rem', - }, - fontWeight: { - thin: 100, - normal: 400, - bold: 700, - }, - colors: { - main: { - 300: '#F5F4EE', - 400: '#FAF0DD', - 500: '#FFDEB6', - 600: '#FFD480', // use with opacity 18% - 700: '#FFC073', - 800: '#F6AD55', - 900: '#FFA436', - brighter: '#FF8B00', - }, - success: { - 500: '#F2FDF5', - 800: '#8FDEA3', - 900: '#70B681', - }, - warning: { - 500: '#FCF2F2', - 600: '#FFA0A0', - 700: '#FF8282', - 800: '#F56565', - 900: '#FF0000', - }, - kakao: { - DEFAULT: '#FEE102', - dark: '#191600', - }, - black: { - 100: '#F4F4F4', - 200: '#E9E9E9', - 300: '#ECECEC', - 400: '#D9D9D9', - 500: '#8D8D8D', - 600: '#4A4A4A', - 700: '#2D2D2D', // MainText Color - 800: '#191600', - 900: '#000000', - DEFAULT: '#000000', - }, - white: '#FFFFFF', - background: '#FCFCFC', - shadow: '#CFCFCF', - placeholder: '#AFAFAF', // ( = description) - overlay: '#494949', // use with opacity 60% - bookshelf: { - light: '#F6F3EC', - dark: '#F2ECDF', - }, - }, - fontFamily: { - lineseed: ['var(--font-lineseed)'], - }, - boxShadow: { - bookcover: - '0px 0px 2px rgba(0, 0, 0, 0.2), 2px 2px 6px rgba(0, 0, 0, 0.1)', - bookcard: '0px 0px 7px 0px rgba(207, 207, 207, 0.5)', - 'bottom-navigation': 'rgba(0, 0, 0, 0.05) 0px 0px 10px 1px', - 'floating-button': - '0px 0px 2px rgba(0, 0, 0, 0.2), 2px 2px 6px rgba(0, 0, 0, 0.1)', - 'bookgroup-card': '0 0 6px rgba(180,180,180,0.25)', - }, - keyframes: { - 'opacity-show': { - from: { opacity: 0 }, - to: { opacity: 1 }, - }, - 'slide-in': { - from: { transform: 'translateY(300%)' }, - to: { transform: 'translateY(0%)' }, - }, - 'slide-out': { - from: { transform: 'translateY(0%)' }, - to: { transform: 'translateY(300%)' }, - }, - 'slide-init': { - from: { transform: 'translateY(300%)' }, - to: { transform: 'translateY(300%)' }, - }, - 'dot-flash': { - '0%,33%,100%': { - opacity: 0.2, - transform: 'translateY(5px)', - }, - '16%': { - opacity: 1, - transform: 'translateY(0px)', - }, - }, - }, - animation: { - 'page-transition': 'opacity-show 0.2s forwards ease-in-out', - 'slide-in': '0.3s forwards slide-in ease-in-out', - 'slide-out': '0.3s forwards slide-out ease-in-out', - 'slide-init': '0.3s forwards slide-init ease-in-out', - 'dot-flash': '2s infinite dot-flash linear', - 'dot-flash-delay-0.5': '2s 0.5s infinite dot-flash linear', - 'dot-flash-delay-1': '2s 1s infinite dot-flash linear', - 'stepper-transition': 'opacity-show 0.2s 0.1s forwards', - }, - content: { - search: 'url("/icons/search.svg")', - check: 'url("/icons/check.svg")', - }, - }, - }, - plugins: [ - ({ addUtilities }) => { - addUtilities({ - '.font-heading-bold': { - fontSize: '2.1rem', - lineHeight: '1.5', - fontWeight: 700, - }, - '.font-heading-regular': { - fontSize: '2.1rem', - lineHeight: '1.5', - fontWeight: 400, - }, - '.font-subheading-bold': { - fontSize: '1.8rem', - lineHeight: '1.5', - fontWeight: 700, - }, - '.font-subheading-regular': { - fontSize: '1.8rem', - lineHeight: '1.5', - fontWeight: 400, - }, - '.font-body1-bold': { - fontSize: '1.6rem', - lineHeight: '2.1rem', - fontWeight: 700, - }, - '.font-body1-regular': { - fontSize: '1.6rem', - lineHeight: '2.1rem', - fontWeight: 400, - }, - '.font-body2-bold': { - fontSize: '1.4rem', - lineHeight: '1.9rem', - fontWeight: 700, - }, - '.font-body2-regular': { - fontSize: '1.4rem', - lineHeight: '1.9rem', - fontWeight: 400, - }, - '.font-caption1-bold': { - fontSize: '1.2rem', - lineHeight: '1.6rem', - fontWeight: 700, - }, - '.font-caption1-regular': { - fontSize: '1.2rem', - lineHeight: '1.6rem', - fontWeight: 400, - }, - '.font-caption2-bold': { - fontSize: '1.1rem', - lineHeight: '1.3rem', - fontWeight: 700, - }, - '.font-caption2-regular': { - fontSize: '1.1rem', - lineHeight: '1.3rem', - fontWeight: 400, - }, - }); - }, - ], -}; diff --git a/yarn.lock b/yarn.lock index a13d17bd3..18ee64ac5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,160 +2,86 @@ # yarn lockfile v1 -"@actions/core@^1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.10.1.tgz#61108e7ac40acae95ee36da074fa5850ca4ced8a" - integrity sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g== - dependencies: - "@actions/http-client" "^2.0.1" - uuid "^8.3.2" - -"@actions/http-client@^2.0.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.2.1.tgz#ed3fe7a5a6d317ac1d39886b0bb999ded229bb38" - integrity sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw== - dependencies: - tunnel "^0.0.6" - undici "^5.25.4" - -"@alloc/quick-lru@^5.2.0": - version "5.2.0" - resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" - integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== - "@ampproject/remapping@^2.2.0": version "2.2.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@aw-web-design/x-default-browser@1.4.88": - version "1.4.88" - resolved "https://registry.npmjs.org/@aw-web-design/x-default-browser/-/x-default-browser-1.4.88.tgz" - integrity sha512-AkEmF0wcwYC2QkhK703Y83fxWARttIWXDmQN8+cof8FmFZ5BRhnNXGymeb1S73bOCLfWjYELxtujL56idCN/XA== - dependencies: - default-browser-id "3.0.0" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" + "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5", "@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.23.2" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz" - integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== - -"@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.19.6", "@babel/core@^7.20.2", "@babel/core@^7.22.8", "@babel/core@^7.7.5": - version "7.23.2" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz" - integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.0" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== -"@babel/core@~7.21.0": - version "7.21.8" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz" - integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== +"@babel/core@^7.19.6": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" + integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-compilation-targets" "^7.21.5" - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helpers" "^7.21.5" - "@babel/parser" "^7.21.8" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.0" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.0" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.0" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.12.11", "@babel/generator@^7.21.5", "@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== - dependencies: - "@babel/types" "^7.23.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/generator@~7.21.1": - version "7.21.9" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.9.tgz" - integrity sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg== +"@babel/generator@^7.21.0", "@babel/generator@^7.21.1": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" + integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== dependencies: - "@babel/types" "^7.21.5" + "@babel/types" "^7.21.0" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== - dependencies: - "@babel/types" "^7.22.5" - "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== dependencies: "@babel/helper-explode-assignable-expression" "^7.18.6" "@babel/types" "^7.18.9" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz" - integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.5", "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" lru-cache "^5.1.1" - semver "^6.3.1" + semver "^6.3.0" "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz#64f49ecb0020532f19b1d014b03bccaa1ab85fb9" integrity sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -167,41 +93,17 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" -"@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz" - integrity sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@nicolo-ribaudo/semver-v6" "^6.3.3" - "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz#53ff78472e5ce10a52664272a239787107603ebb" integrity sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" regexpu-core "^5.3.1" -"@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.6.tgz" - integrity sha512-nBookhLKxAWo/TUCmhnaEJyLz2dekjQvv5SRpE9epWQBcpedWLKt8aZdsuT9XV5ovzR3fENLjRXVT0GsSlGGhA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" - regexpu-core "^5.3.1" - "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== dependencies: "@babel/helper-compilation-targets" "^7.17.7" @@ -211,110 +113,76 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-define-polyfill-provider@^0.4.1": - version "0.4.1" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz" - integrity sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A== - dependencies: - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-plugin-utils" "^7.22.5" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.21.5", "@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0", "@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - "@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== dependencies: "@babel/types" "^7.21.0" -"@babel/helper-member-expression-to-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz" - integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== dependencies: - "@babel/types" "^7.22.15" + "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2", "@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.0", "@babel/helper-module-transforms@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-optimise-call-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" - integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== - dependencies: - "@babel/types" "^7.22.5" - "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.20.2" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== -"@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -322,19 +190,9 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-remap-async-to-generator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz" - integrity sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-wrap-function" "^7.22.5" - "@babel/types" "^7.22.5" - "@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": version "7.20.7" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== dependencies: "@babel/helper-environment-visitor" "^7.18.9" @@ -344,78 +202,45 @@ "@babel/traverse" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/helper-replace-supers@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz" - integrity sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" - "@babel/helper-simple-access@^7.20.2": version "7.20.2" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: "@babel/types" "^7.20.2" -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== dependencies: "@babel/types" "^7.20.0" -"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" - integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== - dependencies: - "@babel/types" "^7.22.5" - "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.21.5", "@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== -"@babel/helper-validator-identifier@^7.19.1", "@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.22.5": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0", "@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.22.5": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== +"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== "@babel/helper-wrap-function@^7.18.9": version "7.20.5" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== dependencies: "@babel/helper-function-name" "^7.19.0" @@ -423,84 +248,48 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" -"@babel/helper-wrap-function@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz" - integrity sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw== - dependencies: - "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helpers@^7.21.5", "@babel/helpers@^7.23.2": - version "7.23.2" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz" - integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.8", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== - -"@babel/parser@^7.21.5": - version "7.22.7" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz" - integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== - -"@babel/parser@~7.21.2": - version "7.21.9" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz" - integrity sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g== +"@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" + integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz" - integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-proposal-optional-chaining" "^7.20.7" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz" - integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.5" - -"@babel/plugin-proposal-async-generator-functions@^7.20.1", "@babel/plugin-proposal-async-generator-functions@^7.20.7": +"@babel/plugin-proposal-async-generator-functions@^7.20.1": version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" @@ -508,17 +297,17 @@ "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.6": +"@babel/plugin-proposal-class-properties@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.18.6", "@babel/plugin-proposal-class-static-block@^7.21.0": +"@babel/plugin-proposal-class-static-block@^7.18.6": version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== dependencies: "@babel/helper-create-class-features-plugin" "^7.21.0" @@ -527,7 +316,7 @@ "@babel/plugin-proposal-dynamic-import@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -535,7 +324,7 @@ "@babel/plugin-proposal-export-namespace-from@^7.18.9": version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== dependencies: "@babel/helper-plugin-utils" "^7.18.9" @@ -543,23 +332,23 @@ "@babel/plugin-proposal-json-strings@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9", "@babel/plugin-proposal-logical-assignment-operators@^7.20.7": +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -567,15 +356,15 @@ "@babel/plugin-proposal-numeric-separator@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.20.2", "@babel/plugin-proposal-object-rest-spread@^7.20.7": +"@babel/plugin-proposal-object-rest-spread@^7.20.2": version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== dependencies: "@babel/compat-data" "^7.20.5" @@ -586,15 +375,15 @@ "@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0": +"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -603,20 +392,15 @@ "@babel/plugin-proposal-private-methods@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== dependencies: "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": - version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" - integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== - "@babel/plugin-proposal-private-property-in-object@^7.18.6": version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -624,19 +408,9 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-private-property-in-object@^7.21.0": - version "7.21.11" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz" - integrity sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -644,270 +418,156 @@ "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz" - integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-import-assertions@^7.20.0": version "7.20.0" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== dependencies: "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-syntax-import-assertions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz" - integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-import-attributes@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz" - integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-syntax-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.20.0": version "7.20.0" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== dependencies: "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-syntax-typescript@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-transform-arrow-functions@^7.18.6": version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-arrow-functions@^7.21.5", "@babel/plugin-transform-arrow-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz" - integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-async-generator-functions@^7.22.7": - version "7.22.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz" - integrity sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-transform-async-to-generator@^7.18.6": version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== dependencies: "@babel/helper-module-imports" "^7.18.6" "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-remap-async-to-generator" "^7.18.9" -"@babel/plugin-transform-async-to-generator@^7.20.7", "@babel/plugin-transform-async-to-generator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz" - integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== - dependencies: - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" - "@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoped-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz" - integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-block-scoping@^7.20.2": version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-block-scoping@^7.21.0", "@babel/plugin-transform-block-scoping@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz" - integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-class-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz" - integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-class-static-block@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz" - integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-transform-classes@^7.20.2": version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -920,225 +580,85 @@ "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.21.0", "@babel/plugin-transform-classes@^7.22.6": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz" - integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - globals "^11.1.0" - "@babel/plugin-transform-computed-properties@^7.18.9": version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/template" "^7.20.7" -"@babel/plugin-transform-computed-properties@^7.21.5", "@babel/plugin-transform-computed-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz" - integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/plugin-transform-destructuring@^7.20.2": version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-destructuring@^7.21.3", "@babel/plugin-transform-destructuring@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz" - integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-dotall-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz" - integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-duplicate-keys@^7.18.9": version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-duplicate-keys@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz" - integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-dynamic-import@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz" - integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-exponentiation-operator@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-exponentiation-operator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz" - integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-export-namespace-from@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz" - integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-transform-flow-strip-types@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz" - integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-flow" "^7.22.5" - "@babel/plugin-transform-for-of@^7.18.8": version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-for-of@^7.21.5", "@babel/plugin-transform-for-of@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz" - integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== dependencies: "@babel/helper-compilation-targets" "^7.18.9" "@babel/helper-function-name" "^7.18.9" "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz" - integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== - dependencies: - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-json-strings@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz" - integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-transform-literals@^7.18.9": version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz" - integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-logical-assignment-operators@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz" - integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-transform-member-expression-literals@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-member-expression-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz" - integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-modules-amd@^7.19.6": version "7.20.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== dependencies: "@babel/helper-module-transforms" "^7.20.11" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-modules-amd@^7.20.11", "@babel/plugin-transform-modules-amd@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz" - integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== - dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.21.5", "@babel/plugin-transform-modules-commonjs@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz" - integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== - dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - "@babel/plugin-transform-modules-commonjs@^7.19.6": version "7.21.2" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== dependencies: "@babel/helper-module-transforms" "^7.21.2" @@ -1147,7 +667,7 @@ "@babel/plugin-transform-modules-systemjs@^7.19.6": version "7.20.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== dependencies: "@babel/helper-hoist-variables" "^7.18.6" @@ -1155,192 +675,75 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-validator-identifier" "^7.19.1" -"@babel/plugin-transform-modules-systemjs@^7.20.11", "@babel/plugin-transform-modules-systemjs@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz" - integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== - dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - "@babel/plugin-transform-modules-umd@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== dependencies: "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-umd@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz" - integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== - dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": version "7.20.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.20.5" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-named-capturing-groups-regex@^7.20.5", "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" - integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-new-target@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-new-target@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz" - integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz" - integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-transform-numeric-separator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz" - integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-transform-object-rest-spread@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz" - integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== - dependencies: - "@babel/compat-data" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.5" - "@babel/plugin-transform-object-super@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-object-super@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz" - integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" - -"@babel/plugin-transform-optional-catch-binding@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz" - integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-transform-optional-chaining@^7.22.5", "@babel/plugin-transform-optional-chaining@^7.22.6": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz" - integrity sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-parameters@^7.21.3", "@babel/plugin-transform-parameters@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz" - integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-private-methods@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz" - integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-private-property-in-object@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz" - integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-property-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz" - integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-react-constant-elements@^7.18.12": version "7.20.2" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz#3f02c784e0b711970d7d8ccc96c4359d64e27ac7" integrity sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-react-display-name@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-jsx-development@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== dependencies: "@babel/plugin-transform-react-jsx" "^7.18.6" "@babel/plugin-transform-react-jsx@^7.18.6": version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz#656b42c2fdea0a6d8762075d58ef9d4e3c4ab8a2" integrity sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -1349,20 +752,9 @@ "@babel/plugin-syntax-jsx" "^7.18.6" "@babel/types" "^7.21.0" -"@babel/plugin-transform-react-jsx@^7.19.0": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz" - integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/types" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -1370,186 +762,82 @@ "@babel/plugin-transform-regenerator@^7.18.6": version "7.20.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" regenerator-transform "^0.15.1" -"@babel/plugin-transform-regenerator@^7.21.5", "@babel/plugin-transform-regenerator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz" - integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - regenerator-transform "^0.15.1" - "@babel/plugin-transform-reserved-words@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-reserved-words@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz" - integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-runtime@^7.21.0": - version "7.22.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.7.tgz" - integrity sha512-o02xM7iY7mSPI+TvaYDH0aYl+lg3+KT7qrD705JlsB/GrZSNaYO/4i+aDFKPiJ7ubq3hgv8NNLCdyB5MFxT8mg== - dependencies: - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" - babel-plugin-polyfill-corejs2 "^0.4.4" - babel-plugin-polyfill-corejs3 "^0.8.2" - babel-plugin-polyfill-regenerator "^0.5.1" - "@babel/plugin-transform-shorthand-properties@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-shorthand-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz" - integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-spread@^7.19.0": version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" -"@babel/plugin-transform-spread@^7.20.7", "@babel/plugin-transform-spread@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz" - integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-sticky-regex@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-sticky-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz" - integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-template-literals@^7.18.9": version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-template-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz" - integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-typeof-symbol@^7.18.9": version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typeof-symbol@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz" - integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-typescript@^7.21.0": version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz#f0956a153679e3b377ae5b7f0143427151e4c848" integrity sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg== dependencies: "@babel/helper-create-class-features-plugin" "^7.21.0" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-typescript" "^7.20.0" -"@babel/plugin-transform-typescript@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz" - integrity sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-typescript" "^7.22.5" - "@babel/plugin-transform-unicode-escapes@^7.18.10": version "7.18.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-unicode-escapes@^7.21.5", "@babel/plugin-transform-unicode-escapes@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz" - integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-unicode-property-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz" - integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-unicode-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz" - integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-unicode-sets-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz" - integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/preset-env@^7.19.4": version "7.20.2" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== dependencies: "@babel/compat-data" "^7.20.1" @@ -1628,186 +916,9 @@ core-js-compat "^3.25.1" semver "^6.3.0" -"@babel/preset-env@^7.20.2": - version "7.22.7" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.7.tgz" - integrity sha512-1whfDtW+CzhETuzYXfcgZAh8/GFMeEbz0V5dVgya8YeJyCU6Y/P2Gnx4Qb3MylK68Zu9UiwUvbPMPTpFAOJ+sQ== - dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.22.5" - "@babel/plugin-syntax-import-attributes" "^7.22.5" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.22.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.7" - "@babel/plugin-transform-async-to-generator" "^7.22.5" - "@babel/plugin-transform-block-scoped-functions" "^7.22.5" - "@babel/plugin-transform-block-scoping" "^7.22.5" - "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-class-static-block" "^7.22.5" - "@babel/plugin-transform-classes" "^7.22.6" - "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.22.5" - "@babel/plugin-transform-dotall-regex" "^7.22.5" - "@babel/plugin-transform-duplicate-keys" "^7.22.5" - "@babel/plugin-transform-dynamic-import" "^7.22.5" - "@babel/plugin-transform-exponentiation-operator" "^7.22.5" - "@babel/plugin-transform-export-namespace-from" "^7.22.5" - "@babel/plugin-transform-for-of" "^7.22.5" - "@babel/plugin-transform-function-name" "^7.22.5" - "@babel/plugin-transform-json-strings" "^7.22.5" - "@babel/plugin-transform-literals" "^7.22.5" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" - "@babel/plugin-transform-member-expression-literals" "^7.22.5" - "@babel/plugin-transform-modules-amd" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.5" - "@babel/plugin-transform-modules-systemjs" "^7.22.5" - "@babel/plugin-transform-modules-umd" "^7.22.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.22.5" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" - "@babel/plugin-transform-numeric-separator" "^7.22.5" - "@babel/plugin-transform-object-rest-spread" "^7.22.5" - "@babel/plugin-transform-object-super" "^7.22.5" - "@babel/plugin-transform-optional-catch-binding" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.22.6" - "@babel/plugin-transform-parameters" "^7.22.5" - "@babel/plugin-transform-private-methods" "^7.22.5" - "@babel/plugin-transform-private-property-in-object" "^7.22.5" - "@babel/plugin-transform-property-literals" "^7.22.5" - "@babel/plugin-transform-regenerator" "^7.22.5" - "@babel/plugin-transform-reserved-words" "^7.22.5" - "@babel/plugin-transform-shorthand-properties" "^7.22.5" - "@babel/plugin-transform-spread" "^7.22.5" - "@babel/plugin-transform-sticky-regex" "^7.22.5" - "@babel/plugin-transform-template-literals" "^7.22.5" - "@babel/plugin-transform-typeof-symbol" "^7.22.5" - "@babel/plugin-transform-unicode-escapes" "^7.22.5" - "@babel/plugin-transform-unicode-property-regex" "^7.22.5" - "@babel/plugin-transform-unicode-regex" "^7.22.5" - "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.22.5" - "@nicolo-ribaudo/semver-v6" "^6.3.3" - babel-plugin-polyfill-corejs2 "^0.4.4" - babel-plugin-polyfill-corejs3 "^0.8.2" - babel-plugin-polyfill-regenerator "^0.5.1" - core-js-compat "^3.31.0" - -"@babel/preset-env@~7.21.0": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz" - integrity sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg== - dependencies: - "@babel/compat-data" "^7.21.5" - "@babel/helper-compilation-targets" "^7.21.5" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7" - "@babel/plugin-proposal-async-generator-functions" "^7.20.7" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.21.0" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.20.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.21.0" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.21.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.21.5" - "@babel/plugin-transform-async-to-generator" "^7.20.7" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.21.0" - "@babel/plugin-transform-classes" "^7.21.0" - "@babel/plugin-transform-computed-properties" "^7.21.5" - "@babel/plugin-transform-destructuring" "^7.21.3" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.21.5" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.20.11" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-modules-systemjs" "^7.20.11" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.21.3" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.21.5" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.20.7" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.21.5" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.21.5" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" - -"@babel/preset-flow@^7.13.13", "@babel/preset-flow@^7.18.6": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.22.5.tgz" - integrity sha512-ta2qZ+LSiGCrP5pgcGt8xMnnkXQrq8Sa4Ulhy06BOlF5QbLw9q5hIx7bn5MrsvyTGAfh6kTOo07Q+Pfld/8Y5Q== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - "@babel/plugin-transform-flow-strip-types" "^7.22.5" - "@babel/preset-modules@^0.1.5": version "0.1.5" - resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -1818,7 +929,7 @@ "@babel/preset-react@^7.18.6": version "7.18.6" - resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -1828,260 +939,979 @@ "@babel/plugin-transform-react-jsx-development" "^7.18.6" "@babel/plugin-transform-react-pure-annotations" "^7.18.6" -"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.21.0": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz" - integrity sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.5" - "@babel/plugin-transform-typescript" "^7.22.5" - "@babel/preset-typescript@^7.18.6": version "7.21.0" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz#bcbbca513e8213691fe5d4b23d9251e01f00ebff" integrity sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-validator-option" "^7.21.0" "@babel/plugin-transform-typescript" "^7.21.0" -"@babel/register@^7.13.16": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/register/-/register-7.22.5.tgz" - integrity sha512-vV6pm/4CijSQ8Y47RH5SopXzursN35RQINfGJkmOlcpAtGuf94miFvIPhCKGQN7WGIcsgG1BHEX2KVdTYwTwUQ== - dependencies: - clone-deep "^4.0.1" - find-cache-dir "^2.0.0" - make-dir "^2.1.0" - pirates "^4.0.5" - source-map-support "^0.5.16" - "@babel/regjsgen@^0.8.0": version "0.8.0" - resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.12.5", "@babel/runtime@^7.20.7", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.7", "@babel/runtime@^7.8.4": version "7.21.0" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== dependencies: regenerator-runtime "^0.13.11" -"@babel/runtime@^7.17.8", "@babel/runtime@^7.21.0", "@babel/runtime@^7.7.6": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz" - integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== +"@babel/template@^7.18.10", "@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.22.15", "@babel/template@^7.22.5": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/traverse@^7.1.6", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.5", "@babel/traverse@^7.22.5", "@babel/traverse@^7.23.2": - version "7.23.2" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" - globals "^11.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" -"@babel/traverse@~7.21.2": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz" - integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== +"@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" + integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-environment-visitor" "^7.21.5" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.1" + "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.21.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/parser" "^7.21.2" + "@babel/types" "^7.21.2" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.2.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.5", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4": - version "7.23.0" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== +"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.4.4": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" + integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@babel/types@~7.21.2": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz" - integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== +"@chakra-ui/accordion@2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@chakra-ui/accordion/-/accordion-2.1.9.tgz#20fa86d94dc034251df2f7c8595ae4dd541a29d9" + integrity sha512-a9CKIAUHezc0f5FR/SQ4GVxnWuIb2HbDTxTEKTp58w/J9pecIbJaNrJ5TUZ0MVbDU9jkgO9RsZ29jkja8PomAw== dependencies: - "@babel/helper-string-parser" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" + "@chakra-ui/descendant" "3.0.13" + "@chakra-ui/icon" "3.0.16" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-use-controllable-state" "2.0.8" + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/transition" "2.0.15" -"@base2/pretty-print-object@1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz" - integrity sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA== +"@chakra-ui/alert@2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@chakra-ui/alert/-/alert-2.0.17.tgz#b129732ec308db6a6a1afa7c06a6595ad853c967" + integrity sha512-0Y5vw+HkeXpwbL1roVpSSNM6luMRmUbwduUSHEA4OnX1ismvsDb1ZBfpi4Vxp6w8euJ2Uj6df3krbd5tbCP6tg== + dependencies: + "@chakra-ui/icon" "3.0.16" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/spinner" "2.0.13" -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@chakra-ui/anatomy@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/anatomy/-/anatomy-2.1.2.tgz#ea66b1841e7195da08ddc862daaa3f3e56e565f5" + integrity sha512-pKfOS/mztc4sUXHNc8ypJ1gPWSolWT770jrgVRfolVbYlki8y5Y+As996zMF6k5lewTu6j9DQequ7Cc9a69IVQ== -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@chakra-ui/avatar@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/avatar/-/avatar-2.2.5.tgz#50eb7cc5a172d394b301fa0abd5f607b7f5d3563" + integrity sha512-TEHXuGE79+fEn61qJ7J/A0Ec+WjyNwobrDTATcLg9Zx2/WEMmZNfrWIAlI5ANQAwVbdSWeGVbyoLAK5mbcrE0A== + dependencies: + "@chakra-ui/image" "2.0.15" + "@chakra-ui/react-children-utils" "2.0.6" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" -"@discoveryjs/json-ext@^0.5.3": - version "0.5.7" - resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== +"@chakra-ui/breadcrumb@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@chakra-ui/breadcrumb/-/breadcrumb-2.1.4.tgz#0d249dc2a92639bd2bf46d097dd5445112bd2367" + integrity sha512-vyBx5TAxPnHhb0b8nyRGfqyjleD//9mySFhk96c9GL+T6YDO4swHw5y/kvDv3Ngc/iRwJ9hdI49PZKwPxLqsEg== + dependencies: + "@chakra-ui/react-children-utils" "2.0.6" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/breakpoint-utils@2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@chakra-ui/breakpoint-utils/-/breakpoint-utils-2.0.8.tgz#750d3712668b69f6e8917b45915cee0e08688eed" + integrity sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA== + dependencies: + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/button@2.0.16": + version "2.0.16" + resolved "https://registry.yarnpkg.com/@chakra-ui/button/-/button-2.0.16.tgz#ff315b57ee47c3511a6507fcfb6f00bb93e2ac7d" + integrity sha512-NjuTKa7gNhnGSUutKuTc8HoAOe9WWIigpciBG7yj3ok67kg8bXtSzPyQFZlgTY6XGdAckWTT+Do4tvhwa5LA+g== + dependencies: + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/spinner" "2.0.13" + +"@chakra-ui/card@2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@chakra-ui/card/-/card-2.1.6.tgz#27176bdee363ecab7d563c4997c4b2fe9e835ecc" + integrity sha512-fFd/WAdRNVY/WOSQv4skpy0WeVhhI0f7dTY1Sm0jVl0KLmuP/GnpsWtKtqWjNcV00K963EXDyhlk6+9oxbP4gw== + dependencies: + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/checkbox@2.2.10": + version "2.2.10" + resolved "https://registry.yarnpkg.com/@chakra-ui/checkbox/-/checkbox-2.2.10.tgz#e4f773e7d2464f1d6e9d18dd88b679290cb33171" + integrity sha512-vzxEjw99qj7loxAdP1WuHNt4EAvj/t6cc8oxyOB2mEvkAzhxI34rLR+3zWDuHWsmhyUO+XEDh4FiWdR+DK5Siw== + dependencies: + "@chakra-ui/form-control" "2.0.17" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-callback-ref" "2.0.7" + "@chakra-ui/react-use-controllable-state" "2.0.8" + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@chakra-ui/react-use-safe-layout-effect" "2.0.5" + "@chakra-ui/react-use-update-effect" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/visually-hidden" "2.0.15" + "@zag-js/focus-visible" "0.2.1" + +"@chakra-ui/clickable@2.0.14": + version "2.0.14" + resolved "https://registry.yarnpkg.com/@chakra-ui/clickable/-/clickable-2.0.14.tgz#88093008672a2a30bdd2a30ff815dcc2c88c01a5" + integrity sha512-jfsM1qaD74ZykLHmvmsKRhDyokLUxEfL8Il1VoZMNX5RBI0xW/56vKpLTFF/v/+vLPLS+Te2cZdD4+2O+G6ulA== + dependencies: + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/close-button@2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@chakra-ui/close-button/-/close-button-2.0.17.tgz#d43d3a2ea1f08250f8d0da7704baf0e1fbd91b4b" + integrity sha512-05YPXk456t1Xa3KpqTrvm+7smx+95dmaPiwjiBN3p7LHUQVHJd8ZXSDB0V+WKi419k3cVQeJUdU/azDO2f40sw== + dependencies: + "@chakra-ui/icon" "3.0.16" + +"@chakra-ui/color-mode@2.1.12": + version "2.1.12" + resolved "https://registry.yarnpkg.com/@chakra-ui/color-mode/-/color-mode-2.1.12.tgz#c0caeadd5f87fadbeefc6826beabac6c4a88d8f5" + integrity sha512-sYyfJGDoJSLYO+V2hxV9r033qhte5Nw/wAn5yRGGZnEEN1dKPEdWQ3XZvglWSDTNd0w9zkoH2w6vP4FBBYb/iw== + dependencies: + "@chakra-ui/react-use-safe-layout-effect" "2.0.5" + +"@chakra-ui/control-box@2.0.13": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@chakra-ui/control-box/-/control-box-2.0.13.tgz#ffe9634d0c3aecb8e1eb7da19e64fb3d2b181d03" + integrity sha512-FEyrU4crxati80KUF/+1Z1CU3eZK6Sa0Yv7Z/ydtz9/tvGblXW9NFanoomXAOvcIFLbaLQPPATm9Gmpr7VG05A== + +"@chakra-ui/counter@2.0.14": + version "2.0.14" + resolved "https://registry.yarnpkg.com/@chakra-ui/counter/-/counter-2.0.14.tgz#6e37a863afd2e87d7c94208245e81777640e76e2" + integrity sha512-KxcSRfUbb94dP77xTip2myoE7P2HQQN4V5fRJmNAGbzcyLciJ+aDylUU/UxgNcEjawUp6Q242NbWb1TSbKoqog== + dependencies: + "@chakra-ui/number-utils" "2.0.7" + "@chakra-ui/react-use-callback-ref" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/css-reset@2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@chakra-ui/css-reset/-/css-reset-2.0.12.tgz#6eebcbe9e971facd215e174e063ace29f647a045" + integrity sha512-Q5OYIMvqTl2vZ947kIYxcS5DhQXeStB84BzzBd6C10wOx1gFUu9pL+jLpOnHR3hhpWRMdX5o7eT+gMJWIYUZ0Q== + +"@chakra-ui/descendant@3.0.13": + version "3.0.13" + resolved "https://registry.yarnpkg.com/@chakra-ui/descendant/-/descendant-3.0.13.tgz#e883a2233ee07fe1ae6c014567824c0f79df11cf" + integrity sha512-9nzxZVxUSMc4xPL5fSaRkEOQjDQWUGjGvrZI7VzWk9eq63cojOtIxtWMSW383G9148PzWJjJYt30Eud5tdZzlg== + dependencies: + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-use-merge-refs" "2.0.7" + +"@chakra-ui/dom-utils@2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@chakra-ui/dom-utils/-/dom-utils-2.0.6.tgz#68f49f3b4a0bdebd5e416d6fd2c012c9ad64b76a" + integrity sha512-PVtDkPrDD5b8aoL6Atg7SLjkwhWb7BwMcLOF1L449L3nZN+DAO3nyAh6iUhZVJyunELj9d0r65CDlnMREyJZmA== + +"@chakra-ui/editable@2.0.19": + version "2.0.19" + resolved "https://registry.yarnpkg.com/@chakra-ui/editable/-/editable-2.0.19.tgz#1af2fe3c215111f61f7872fb5f599f4d8da24e7d" + integrity sha512-YxRJsJ2JQd42zfPBgTKzIhg1HugT+gfQz1ZosmUN+IZT9YZXL2yodHTUz6Lee04Vc/CdEqgBFLuREXEUNBfGtA== + dependencies: + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-callback-ref" "2.0.7" + "@chakra-ui/react-use-controllable-state" "2.0.8" + "@chakra-ui/react-use-focus-on-pointer-down" "2.0.6" + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@chakra-ui/react-use-safe-layout-effect" "2.0.5" + "@chakra-ui/react-use-update-effect" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/event-utils@2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@chakra-ui/event-utils/-/event-utils-2.0.8.tgz#e6439ba200825a2f15d8f1973d267d1c00a6d1b4" + integrity sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw== + +"@chakra-ui/focus-lock@2.0.16": + version "2.0.16" + resolved "https://registry.yarnpkg.com/@chakra-ui/focus-lock/-/focus-lock-2.0.16.tgz#bfb705b565d70b2f908d7c7a27f40426ac48dff8" + integrity sha512-UuAdGCPVrCa1lecoAvpOQD7JFT7a9RdmhKWhFt5ioIcekSLJcerdLHuuL3w0qz//8kd1/SOt7oP0aJqdAJQrCw== + dependencies: + "@chakra-ui/dom-utils" "2.0.6" + react-focus-lock "^2.9.2" + +"@chakra-ui/form-control@2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@chakra-ui/form-control/-/form-control-2.0.17.tgz#2f710325e77ce35067337616d440f903b137bdd5" + integrity sha512-34ptCaJ2LNvQNOlB6MAKsmH1AkT1xo7E+3Vw10Urr81yTOjDTM/iU6vG3JKPfRDMyXeowPjXmutlnuk72SSjRg== + dependencies: + "@chakra-ui/icon" "3.0.16" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/hooks@2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@chakra-ui/hooks/-/hooks-2.1.6.tgz#4d829535868148912ef7a4ff274e03b8d1cf7c72" + integrity sha512-oMSOeoOF6/UpwTVlDFHSROAA4hPY8WgJ0erdHs1ZkuwAwHv7UzjDkvrb6xYzAAH9qHoFzc5RIBm6jVoh3LCc+Q== + dependencies: + "@chakra-ui/react-utils" "2.0.12" + "@chakra-ui/utils" "2.0.15" + compute-scroll-into-view "1.0.20" + copy-to-clipboard "3.3.3" + +"@chakra-ui/icon@3.0.16": + version "3.0.16" + resolved "https://registry.yarnpkg.com/@chakra-ui/icon/-/icon-3.0.16.tgz#6413ec637c0c3acc204301485f05451b5bcd6ba4" + integrity sha512-RpA1X5Ptz8Mt39HSyEIW1wxAz2AXyf9H0JJ5HVx/dBdMZaGMDJ0HyyPBVci0m4RCoJuyG1HHG/DXJaVfUTVAeg== + dependencies: + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/icons@^2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@chakra-ui/icons/-/icons-2.0.17.tgz#625a46d169707aad36d65c04a4626a422f92e5ae" + integrity sha512-HMJP0WrJgAmFR9+Xh/CBH0nVnGMsJ4ZC8MK6tMgxPKd9/muvn0I4hsicHqdPlLpmB0TlxlhkBAKaVMtOdz6F0w== + dependencies: + "@chakra-ui/icon" "3.0.16" + +"@chakra-ui/image@2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@chakra-ui/image/-/image-2.0.15.tgz#7f275f8f3edbb420e0613afd5023ad9cf442d09d" + integrity sha512-w2rElXtI3FHXuGpMCsSklus+pO1Pl2LWDwsCGdpBQUvGFbnHfl7MftQgTlaGHeD5OS95Pxva39hKrA2VklKHiQ== + dependencies: + "@chakra-ui/react-use-safe-layout-effect" "2.0.5" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/input@2.0.20": + version "2.0.20" + resolved "https://registry.yarnpkg.com/@chakra-ui/input/-/input-2.0.20.tgz#8db3ec46b52be901c94599b3659a9003bdb2dd07" + integrity sha512-ypmsy4n4uNBVgn6Gd24Zrpi+qRf/T9WEzWkysuYC9Qfxo+i7yuf3snp7XmBy8KSGVSiXE11eO8ZN5oCg6Xg0jg== + dependencies: + "@chakra-ui/form-control" "2.0.17" + "@chakra-ui/object-utils" "2.0.8" + "@chakra-ui/react-children-utils" "2.0.6" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/layout@2.1.16": + version "2.1.16" + resolved "https://registry.yarnpkg.com/@chakra-ui/layout/-/layout-2.1.16.tgz#9d90f25cf9f0537d19cd36a417f7ddc1461e8591" + integrity sha512-QFS3feozIGsvB0H74lUocev55aRF26eNrdmhfJifwikZAiq+zzZAMdBdNU9UJhHClnMOU8/iGZ0MF7ti4zQS1A== + dependencies: + "@chakra-ui/breakpoint-utils" "2.0.8" + "@chakra-ui/icon" "3.0.16" + "@chakra-ui/object-utils" "2.0.8" + "@chakra-ui/react-children-utils" "2.0.6" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/lazy-utils@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/lazy-utils/-/lazy-utils-2.0.5.tgz#363c3fa1d421362790b416ffa595acb835e1ae5b" + integrity sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg== + +"@chakra-ui/live-region@2.0.13": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@chakra-ui/live-region/-/live-region-2.0.13.tgz#1d00a637b74372d1ee0b215c649ebd4a33893e58" + integrity sha512-Ja+Slk6ZkxSA5oJzU2VuGU7TpZpbMb/4P4OUhIf2D30ctmIeXkxTWw1Bs1nGJAVtAPcGS5sKA+zb89i8g+0cTQ== + +"@chakra-ui/media-query@3.2.12": + version "3.2.12" + resolved "https://registry.yarnpkg.com/@chakra-ui/media-query/-/media-query-3.2.12.tgz#75e31f3c88818e687a4d90a2993286c2c3ca2453" + integrity sha512-8pSLDf3oxxhFrhd40rs7vSeIBfvOmIKHA7DJlGUC/y+9irD24ZwgmCtFnn+y3gI47hTJsopbSX+wb8nr7XPswA== + dependencies: + "@chakra-ui/breakpoint-utils" "2.0.8" + "@chakra-ui/react-env" "3.0.0" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/menu@2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@chakra-ui/menu/-/menu-2.1.9.tgz#2f3239a9b2855fd77fc317d9e6b904c1ad50d7c6" + integrity sha512-ue5nD4QJcl3H3UwN0zZNJmH89XUebnvEdW6THAUL41hDjJ0J/Fjpg9Sgzwug2aBbBXBNbVMsUuhcCj6x91d+IQ== + dependencies: + "@chakra-ui/clickable" "2.0.14" + "@chakra-ui/descendant" "3.0.13" + "@chakra-ui/lazy-utils" "2.0.5" + "@chakra-ui/popper" "3.0.13" + "@chakra-ui/react-children-utils" "2.0.6" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-use-animation-state" "2.0.8" + "@chakra-ui/react-use-controllable-state" "2.0.8" + "@chakra-ui/react-use-disclosure" "2.0.8" + "@chakra-ui/react-use-focus-effect" "2.0.9" + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@chakra-ui/react-use-outside-click" "2.0.7" + "@chakra-ui/react-use-update-effect" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/transition" "2.0.15" + +"@chakra-ui/modal@2.2.9": + version "2.2.9" + resolved "https://registry.yarnpkg.com/@chakra-ui/modal/-/modal-2.2.9.tgz#aad65a2c60aa974e023f8b3facc0e79eb742e006" + integrity sha512-nTfNp7XsVwn5+xJOtstoFA8j0kq/9sJj7KesyYzjEDaMKvCZvIOntRYowoydho43jb4+YC7ebKhp0KOIINS0gg== + dependencies: + "@chakra-ui/close-button" "2.0.17" + "@chakra-ui/focus-lock" "2.0.16" + "@chakra-ui/portal" "2.0.15" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/transition" "2.0.15" + aria-hidden "^1.2.2" + react-remove-scroll "^2.5.5" + +"@chakra-ui/number-input@2.0.18": + version "2.0.18" + resolved "https://registry.yarnpkg.com/@chakra-ui/number-input/-/number-input-2.0.18.tgz#072a00ef869ebafa4960cfdee8caae8208864289" + integrity sha512-cPkyAFFHHzeFBselrT1BtjlzMkJ6TKrTDUnHFlzqXy6aqeXuhrjFhMfXucjedSpOqedsP9ZbKFTdIAhu9DdL/A== + dependencies: + "@chakra-ui/counter" "2.0.14" + "@chakra-ui/form-control" "2.0.17" + "@chakra-ui/icon" "3.0.16" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-callback-ref" "2.0.7" + "@chakra-ui/react-use-event-listener" "2.0.7" + "@chakra-ui/react-use-interval" "2.0.5" + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@chakra-ui/react-use-safe-layout-effect" "2.0.5" + "@chakra-ui/react-use-update-effect" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/number-utils@2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@chakra-ui/number-utils/-/number-utils-2.0.7.tgz#aaee979ca2fb1923a0373a91619473811315db11" + integrity sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg== + +"@chakra-ui/object-utils@2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@chakra-ui/object-utils/-/object-utils-2.0.8.tgz#307f927f6434f99feb32ba92bdf451a6b59a6199" + integrity sha512-2upjT2JgRuiupdrtBWklKBS6tqeGMA77Nh6Q0JaoQuH/8yq+15CGckqn3IUWkWoGI0Fg3bK9LDlbbD+9DLw95Q== + +"@chakra-ui/pin-input@2.0.19": + version "2.0.19" + resolved "https://registry.yarnpkg.com/@chakra-ui/pin-input/-/pin-input-2.0.19.tgz#f9b196174f0518feec5c1ee3fcaf2134c301148a" + integrity sha512-6O7s4vWz4cqQ6zvMov9sYj6ZqWAsTxR/MNGe3DNgu1zWQg8veNCYtj1rNGhNS3eZNUMAa8uM2dXIphGTP53Xow== + dependencies: + "@chakra-ui/descendant" "3.0.13" + "@chakra-ui/react-children-utils" "2.0.6" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-use-controllable-state" "2.0.8" + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/popover@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@chakra-ui/popover/-/popover-2.1.8.tgz#e906ce0533693d735b6e13a3a6ffe16d8e0a9ab4" + integrity sha512-ob7fAz+WWmXIq7iGHVB3wDKzZTj+T+noYBT/U1Q+jIf+jMr2WOpJLTfb0HTZcfhvn4EBFlfBg7Wk5qbXNaOn7g== + dependencies: + "@chakra-ui/close-button" "2.0.17" + "@chakra-ui/lazy-utils" "2.0.5" + "@chakra-ui/popper" "3.0.13" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-animation-state" "2.0.8" + "@chakra-ui/react-use-disclosure" "2.0.8" + "@chakra-ui/react-use-focus-effect" "2.0.9" + "@chakra-ui/react-use-focus-on-pointer-down" "2.0.6" + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/popper@3.0.13": + version "3.0.13" + resolved "https://registry.yarnpkg.com/@chakra-ui/popper/-/popper-3.0.13.tgz#914a90e9ae2b83d39a0f40a5454267f1266a2cb6" + integrity sha512-FwtmYz80Ju8oK3Z1HQfisUE7JIMmDsCQsRBu6XuJ3TFQnBHit73yjZmxKjuRJ4JgyT4WBnZoTF3ATbRKSagBeg== + dependencies: + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@popperjs/core" "^2.9.3" + +"@chakra-ui/portal@2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@chakra-ui/portal/-/portal-2.0.15.tgz#21e1f97c4407fc15df8c365cb5cf799dac73ce41" + integrity sha512-z8v7K3j1/nMuBzp2+wRIIw7s/eipVtnXLdjK5yqbMxMRa44E8Mu5VNJLz3aQFLHXEUST+ifqrjImQeli9do6LQ== + dependencies: + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-use-safe-layout-effect" "2.0.5" + +"@chakra-ui/progress@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/progress/-/progress-2.1.5.tgz#eb6a47adf2bff93971262d163461d390782a04ff" + integrity sha512-jj5Vp4lxUchuwp4RPCepM0yAyKi344bgsOd3Apd+ldxclDcewPc82fbwDu7g/Xv27LqJkT+7E/SlQy04wGrk0g== + dependencies: + "@chakra-ui/react-context" "2.0.7" + +"@chakra-ui/provider@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@chakra-ui/provider/-/provider-2.1.2.tgz#b025cb718826b003b3c9535b6961e8f3be70ebd5" + integrity sha512-4lLlz8QuJv00BhfyKzWpzfoti9MDOdJ/MqXixJV/EZ02RMBOdE9qy9bSz/WckPC2MVhtRUuwMkxH+0QY21PXuw== + dependencies: + "@chakra-ui/css-reset" "2.0.12" + "@chakra-ui/portal" "2.0.15" + "@chakra-ui/react-env" "3.0.0" + "@chakra-ui/system" "2.5.1" + "@chakra-ui/utils" "2.0.15" + +"@chakra-ui/radio@2.0.19": + version "2.0.19" + resolved "https://registry.yarnpkg.com/@chakra-ui/radio/-/radio-2.0.19.tgz#8d5c02eae8eddbced4476b1b50921ade62f0a744" + integrity sha512-PlJiV59eGSmeKP4v/4+ccQUWGRd0cjPKkj/p3L+UbOf8pl9dWm8y9kIeL5TYbghQSDv0nzkrH4+yMnnDTZjdMQ== + dependencies: + "@chakra-ui/form-control" "2.0.17" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + "@zag-js/focus-visible" "0.2.1" + +"@chakra-ui/react-children-utils@2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-children-utils/-/react-children-utils-2.0.6.tgz#6c480c6a60678fcb75cb7d57107c7a79e5179b92" + integrity sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA== + +"@chakra-ui/react-context@2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-context/-/react-context-2.0.7.tgz#f79a2b072d04d4280ec8799dc03a8a1af521ca2e" + integrity sha512-i7EGmSU+h2GB30cwrKB4t1R5BMHyGoJM5L2Zz7b+ZUX4aAqyPcfe97wPiQB6Rgr1ImGXrUeov4CDVrRZ2FPgLQ== + +"@chakra-ui/react-env@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-env/-/react-env-3.0.0.tgz#2c3c9dc0e529b9b474a386a2b24988317b2a0811" + integrity sha512-tfMRO2v508HQWAqSADFrwZgR9oU10qC97oV6zGbjHh9ALP0/IcFR+Bi71KRTveDTm85fMeAzZYGj57P3Dsipkw== + dependencies: + "@chakra-ui/react-use-safe-layout-effect" "2.0.5" + +"@chakra-ui/react-types@2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-types/-/react-types-2.0.7.tgz#799c166a44882b23059c8f510eac9bd5d0869ac4" + integrity sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ== + +"@chakra-ui/react-use-animation-state@2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.0.8.tgz#544ef3007498d4a0629b9d1916056ddaf59aa286" + integrity sha512-xv9zSF2Rd1mHWQ+m5DLBWeh4atF8qrNvsOs3MNrvxKYBS3f79N3pqcQGrWAEvirXWXfiCeje2VAkEggqFRIo+Q== + dependencies: + "@chakra-ui/dom-utils" "2.0.6" + "@chakra-ui/react-use-event-listener" "2.0.7" + +"@chakra-ui/react-use-callback-ref@2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.0.7.tgz#9b844a81037d0ecaaa8031979fa050165635e211" + integrity sha512-YjT76nTpfHAK5NxplAlZsQwNju5KmQExnqsWNPFeOR6vvbC34+iPSTr+r91i1Hdy7gBSbevsOsd5Wm6RN3GuMw== + +"@chakra-ui/react-use-controllable-state@2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.0.8.tgz#6b71187e03be632c244dde9f16ed685428087ec9" + integrity sha512-F7rdCbLEmRjwwODqWZ3y+mKgSSHPcLQxeUygwk1BkZPXbKkJJKymOIjIynil2cbH7ku3hcSIWRvuhpCcfQWJ7Q== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.7" + +"@chakra-ui/react-use-disclosure@2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.0.8.tgz#e0e0445afc6d6d96bb262b99751e675034c31497" + integrity sha512-2ir/mHe1YND40e+FyLHnDsnDsBQPwzKDLzfe9GZri7y31oU83JSbHdlAXAhp3bpjohslwavtRCp+S/zRxfO9aQ== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.7" + +"@chakra-ui/react-use-event-listener@2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.0.7.tgz#ed08164164e79183d876eeb71e12c6bfaca3ad17" + integrity sha512-4wvpx4yudIO3B31pOrXuTHDErawmwiXnvAN7gLEOVREi16+YGNcFnRJ5X5nRrmB7j2MDUtsEDpRBFfw5Z9xQ5g== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.7" + +"@chakra-ui/react-use-focus-effect@2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.0.9.tgz#9f94c0cb54e6e14ac9f048ca4d32a1fdcea067c1" + integrity sha512-20nfNkpbVwyb41q9wxp8c4jmVp6TUGAPE3uFTDpiGcIOyPW5aecQtPmTXPMJH+2aa8Nu1wyoT1btxO+UYiQM3g== + dependencies: + "@chakra-ui/dom-utils" "2.0.6" + "@chakra-ui/react-use-event-listener" "2.0.7" + "@chakra-ui/react-use-safe-layout-effect" "2.0.5" + "@chakra-ui/react-use-update-effect" "2.0.7" + +"@chakra-ui/react-use-focus-on-pointer-down@2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.0.6.tgz#13330eb518c17e591c908cb8f4a30d43a978e3f2" + integrity sha512-OigXiLRVySn3tyVqJ/rn57WGuukW8TQe8fJYiLwXbcNyAMuYYounvRxvCy2b53sQ7QIZamza0N0jhirbH5FNoQ== + dependencies: + "@chakra-ui/react-use-event-listener" "2.0.7" + +"@chakra-ui/react-use-interval@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-interval/-/react-use-interval-2.0.5.tgz#c1a0043bf188b19b790a27668f4e860391335a60" + integrity sha512-1nbdwMi2K87V6p5f5AseOKif2CkldLaJlq1TOqaPRwb7v3aU9rltBtYdf+fIyuHSToNJUV6wd9budCFdLCl3Fg== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.7" + +"@chakra-ui/react-use-latest-ref@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.0.5.tgz#b61dc4dadda340f7b14df0ec1d50ab2e507b3b3e" + integrity sha512-3mIuFzMyIo3Ok/D8uhV9voVg7KkrYVO/pwVvNPJOHsDQqCA6DpYE4WDsrIx+fVcwad3Ta7SupexR5PoI+kq6QQ== + +"@chakra-ui/react-use-merge-refs@2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.0.7.tgz#1a1fe800fb5501ec3da4088fbac78c03bbad13a7" + integrity sha512-zds4Uhsc+AMzdH8JDDkLVet9baUBgtOjPbhC5r3A0ZXjZvGhCztFAVE3aExYiVoMPoHLKbLcqvCWE6ioFKz1lw== + +"@chakra-ui/react-use-outside-click@2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.0.7.tgz#56c668f020fbc6331db4c3b61c8b845a68c4a134" + integrity sha512-MsAuGLkwYNxNJ5rb8lYNvXApXxYMnJ3MzqBpQj1kh5qP/+JSla9XMjE/P94ub4fSEttmNSqs43SmPPrmPuihsQ== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.7" + +"@chakra-ui/react-use-pan-event@2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.0.9.tgz#0ff33a285e75a692d1ed52dbb9f3046a593b8004" + integrity sha512-xu35QXkiyrgsHUOnctl+SwNcwf9Rl62uYE5y8soKOZdBm8E+FvZIt2hxUzK1EoekbJCMzEZ0Yv1ZQCssVkSLaQ== + dependencies: + "@chakra-ui/event-utils" "2.0.8" + "@chakra-ui/react-use-latest-ref" "2.0.5" + framesync "6.1.2" + +"@chakra-ui/react-use-previous@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-previous/-/react-use-previous-2.0.5.tgz#65836cc81e3a1bf4252cd08a71094f1be827b56c" + integrity sha512-BIZgjycPE4Xr+MkhKe0h67uHXzQQkBX/u5rYPd65iMGdX1bCkbE0oorZNfOHLKdTmnEb4oVsNvfN6Rfr+Mnbxw== + +"@chakra-ui/react-use-safe-layout-effect@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.0.5.tgz#6cf388c37fd2a42b5295a292e149b32f860a00a7" + integrity sha512-MwAQBz3VxoeFLaesaSEN87reVNVbjcQBDex2WGexAg6hUB6n4gc1OWYH/iXp4tzp4kuggBNhEHkk9BMYXWfhJQ== + +"@chakra-ui/react-use-size@2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-size/-/react-use-size-2.0.9.tgz#00717867b98a24c3bdcfaa0c3e70732404193486" + integrity sha512-Jce7QmO1jlQZq+Y77VKckWzroRnajChzUQ8xhLQZO6VbYvrpg3cu+X2QCz3G+MZzB+1/hnvvAqmZ+uJLd8rEJg== + dependencies: + "@zag-js/element-size" "0.3.1" + +"@chakra-ui/react-use-timeout@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-timeout/-/react-use-timeout-2.0.5.tgz#13c4e48e48d4b84ce1e062f0f1c9ec401ece78c9" + integrity sha512-QqmB+jVphh3h/CS60PieorpY7UqSPkrQCB7f7F+i9vwwIjtP8fxVHMmkb64K7VlzQiMPzv12nlID5dqkzlv0mw== + dependencies: + "@chakra-ui/react-use-callback-ref" "2.0.7" + +"@chakra-ui/react-use-update-effect@2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.0.7.tgz#f94b7975ebb150c03d410e754b54f0e9dd263134" + integrity sha512-vBM2bmmM83ZdDtasWv3PXPznpTUd+FvqBC8J8rxoRmvdMEfrxTiQRBJhiGHLpS9BPLLPQlosN6KdFU97csB6zg== + +"@chakra-ui/react-utils@2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@chakra-ui/react-utils/-/react-utils-2.0.12.tgz#d6b773b9a5b2e51dce61f51ac8a0e9a0f534f479" + integrity sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw== + dependencies: + "@chakra-ui/utils" "2.0.15" + +"@chakra-ui/react@^2.4.9": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@chakra-ui/react/-/react-2.5.1.tgz#05414db2b512bd4402e42eecc6b915d85102c576" + integrity sha512-ugkaqfcNMb9L4TkalWiF3rnqfr0TlUUD46JZaDIZiORVisaSwXTZTQrVfG40VghhaJT28rnC5WtiE8kd567ZBQ== + dependencies: + "@chakra-ui/accordion" "2.1.9" + "@chakra-ui/alert" "2.0.17" + "@chakra-ui/avatar" "2.2.5" + "@chakra-ui/breadcrumb" "2.1.4" + "@chakra-ui/button" "2.0.16" + "@chakra-ui/card" "2.1.6" + "@chakra-ui/checkbox" "2.2.10" + "@chakra-ui/close-button" "2.0.17" + "@chakra-ui/control-box" "2.0.13" + "@chakra-ui/counter" "2.0.14" + "@chakra-ui/css-reset" "2.0.12" + "@chakra-ui/editable" "2.0.19" + "@chakra-ui/focus-lock" "2.0.16" + "@chakra-ui/form-control" "2.0.17" + "@chakra-ui/hooks" "2.1.6" + "@chakra-ui/icon" "3.0.16" + "@chakra-ui/image" "2.0.15" + "@chakra-ui/input" "2.0.20" + "@chakra-ui/layout" "2.1.16" + "@chakra-ui/live-region" "2.0.13" + "@chakra-ui/media-query" "3.2.12" + "@chakra-ui/menu" "2.1.9" + "@chakra-ui/modal" "2.2.9" + "@chakra-ui/number-input" "2.0.18" + "@chakra-ui/pin-input" "2.0.19" + "@chakra-ui/popover" "2.1.8" + "@chakra-ui/popper" "3.0.13" + "@chakra-ui/portal" "2.0.15" + "@chakra-ui/progress" "2.1.5" + "@chakra-ui/provider" "2.1.2" + "@chakra-ui/radio" "2.0.19" + "@chakra-ui/react-env" "3.0.0" + "@chakra-ui/select" "2.0.18" + "@chakra-ui/skeleton" "2.0.24" + "@chakra-ui/slider" "2.0.21" + "@chakra-ui/spinner" "2.0.13" + "@chakra-ui/stat" "2.0.17" + "@chakra-ui/styled-system" "2.6.1" + "@chakra-ui/switch" "2.0.22" + "@chakra-ui/system" "2.5.1" + "@chakra-ui/table" "2.0.16" + "@chakra-ui/tabs" "2.1.8" + "@chakra-ui/tag" "2.0.17" + "@chakra-ui/textarea" "2.0.18" + "@chakra-ui/theme" "2.2.5" + "@chakra-ui/theme-utils" "2.0.11" + "@chakra-ui/toast" "6.0.1" + "@chakra-ui/tooltip" "2.2.6" + "@chakra-ui/transition" "2.0.15" + "@chakra-ui/utils" "2.0.15" + "@chakra-ui/visually-hidden" "2.0.15" + +"@chakra-ui/select@2.0.18": + version "2.0.18" + resolved "https://registry.yarnpkg.com/@chakra-ui/select/-/select-2.0.18.tgz#4eb6092610067c1b4131353fe39b4466e251395b" + integrity sha512-1d2lUT5LM6oOs5x4lzBh4GFDuXX62+lr+sgV7099g951/5UNbb0CS2hSZHsO7yZThLNbr7QTWZvAOAayVcGzdw== + dependencies: + "@chakra-ui/form-control" "2.0.17" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/shared-utils@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/shared-utils/-/shared-utils-2.0.5.tgz#cb2b49705e113853647f1822142619570feba081" + integrity sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q== + +"@chakra-ui/skeleton@2.0.24": + version "2.0.24" + resolved "https://registry.yarnpkg.com/@chakra-ui/skeleton/-/skeleton-2.0.24.tgz#dc9dcca6fc43005544fabfd38a444943b0a29cad" + integrity sha512-1jXtVKcl/jpbrJlc/TyMsFyI651GTXY5ma30kWyTXoby2E+cxbV6OR8GB/NMZdGxbQBax8/VdtYVjI0n+OBqWA== + dependencies: + "@chakra-ui/media-query" "3.2.12" + "@chakra-ui/react-use-previous" "2.0.5" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/slider@2.0.21": + version "2.0.21" + resolved "https://registry.yarnpkg.com/@chakra-ui/slider/-/slider-2.0.21.tgz#f65b15bf0d5f827699ff9a2d6faee35006e2bfce" + integrity sha512-Mm76yJxEqJl21+3waEcKg3tM8Y4elJ7mcViN6Brj35PTfzUJfSJxeBGo1nLPJ+X5jLj7o/L4kfBmUk3lY4QYEQ== + dependencies: + "@chakra-ui/number-utils" "2.0.7" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-callback-ref" "2.0.7" + "@chakra-ui/react-use-controllable-state" "2.0.8" + "@chakra-ui/react-use-latest-ref" "2.0.5" + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@chakra-ui/react-use-pan-event" "2.0.9" + "@chakra-ui/react-use-size" "2.0.9" + "@chakra-ui/react-use-update-effect" "2.0.7" + +"@chakra-ui/spinner@2.0.13": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@chakra-ui/spinner/-/spinner-2.0.13.tgz#64fe919c18305c653ced046e25d5883ee4c1e7d7" + integrity sha512-T1/aSkVpUIuiYyrjfn1+LsQEG7Onbi1UE9ccS/evgf61Dzy4GgTXQUnDuWFSgpV58owqirqOu6jn/9eCwDlzlg== + dependencies: + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/stat@2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@chakra-ui/stat/-/stat-2.0.17.tgz#2cd712cc7e0d58d9cbd542deea911f1b0925074f" + integrity sha512-PhD+5oVLWjQmGLfeZSmexp3AtLcaggWBwoMZ4z8QMZIQzf/fJJWMk0bMqxlpTv8ORDkfY/4ImuFB/RJHvcqlcA== + dependencies: + "@chakra-ui/icon" "3.0.16" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/styled-system@2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@chakra-ui/styled-system/-/styled-system-2.6.1.tgz#302d496d34c0b7b30c646a7e3c9b113a2f4588da" + integrity sha512-jy/1dVi1LxjoRCm+Eo5mqBgvPy5SCWMlIcz6GbIZBDpkGeKZwtqrZLjekxxLBCy8ORY+kJlUB0FT6AzVR/1tjw== + dependencies: + "@chakra-ui/shared-utils" "2.0.5" + csstype "^3.0.11" + lodash.mergewith "4.6.2" + +"@chakra-ui/switch@2.0.22": + version "2.0.22" + resolved "https://registry.yarnpkg.com/@chakra-ui/switch/-/switch-2.0.22.tgz#7b35e2b10ea4cf91fb49f5175b4335c61dcd25b3" + integrity sha512-+/Yy6y7VFD91uSPruF8ZvePi3tl5D8UNVATtWEQ+QBI92DLSM+PtgJ2F0Y9GMZ9NzMxpZ80DqwY7/kqcPCfLvw== + dependencies: + "@chakra-ui/checkbox" "2.2.10" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/system@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@chakra-ui/system/-/system-2.5.1.tgz#bc03a11ae31e795966c7618280548d5cd866f47e" + integrity sha512-4+86OrcSoq7lGkm5fh+sJ3IWXSTzjz+HOllRbCW2Rtnmcg7ritiXVNV2VygEg2DrCcx5+tNqRHDM764zW+AEug== + dependencies: + "@chakra-ui/color-mode" "2.1.12" + "@chakra-ui/object-utils" "2.0.8" + "@chakra-ui/react-utils" "2.0.12" + "@chakra-ui/styled-system" "2.6.1" + "@chakra-ui/theme-utils" "2.0.11" + "@chakra-ui/utils" "2.0.15" + react-fast-compare "3.2.0" + +"@chakra-ui/table@2.0.16": + version "2.0.16" + resolved "https://registry.yarnpkg.com/@chakra-ui/table/-/table-2.0.16.tgz#e69736cba5cfb218c5e40592ad9280c6e32f6fe7" + integrity sha512-vWDXZ6Ad3Aj66curp1tZBHvCfQHX2FJ4ijLiqGgQszWFIchfhJ5vMgEBJaFMZ+BN1draAjuRTZqaQefOApzvRg== + dependencies: + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/tabs@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@chakra-ui/tabs/-/tabs-2.1.8.tgz#e83071380f9a3633810308d45de51be7a74f5eb9" + integrity sha512-B7LeFN04Ny2jsSy5TFOQxnbZ6ITxGxLxsB2PE0vvQjMSblBrUryOxdjw80HZhfiw6od0ikK9CeKQOIt9QCguSw== + dependencies: + "@chakra-ui/clickable" "2.0.14" + "@chakra-ui/descendant" "3.0.13" + "@chakra-ui/lazy-utils" "2.0.5" + "@chakra-ui/react-children-utils" "2.0.6" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-use-controllable-state" "2.0.8" + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@chakra-ui/react-use-safe-layout-effect" "2.0.5" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/tag@2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@chakra-ui/tag/-/tag-2.0.17.tgz#97adb86db190ddb3526060b78c590392e0ac8b4c" + integrity sha512-A47zE9Ft9qxOJ+5r1cUseKRCoEdqCRzFm0pOtZgRcckqavglk75Xjgz8HbBpUO2zqqd49MlqdOwR8o87fXS1vg== + dependencies: + "@chakra-ui/icon" "3.0.16" + "@chakra-ui/react-context" "2.0.7" + +"@chakra-ui/textarea@2.0.18": + version "2.0.18" + resolved "https://registry.yarnpkg.com/@chakra-ui/textarea/-/textarea-2.0.18.tgz#da6d629b465f65bbc7b48039c2e48a4ae1d853b4" + integrity sha512-aGHHb29vVifO0OtcK/k8cMykzjOKo/coDTU0NJqz7OOLAWIMNV2eGenvmO1n9tTZbmbqHiX+Sa1nPRX+pd14lg== + dependencies: + "@chakra-ui/form-control" "2.0.17" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/theme-tools@2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@chakra-ui/theme-tools/-/theme-tools-2.0.17.tgz#9496094336c9480f950c8d7ab6e05f1c19caa955" + integrity sha512-Auu38hnihlJZQcPok6itRDBbwof3TpXGYtDPnOvrq4Xp7jnab36HLt7KEXSDPXbtOk3ZqU99pvI1en5LbDrdjg== + dependencies: + "@chakra-ui/anatomy" "2.1.2" + "@chakra-ui/shared-utils" "2.0.5" + color2k "^2.0.0" + +"@chakra-ui/theme-utils@2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@chakra-ui/theme-utils/-/theme-utils-2.0.11.tgz#c01b1d14fdd63326d1ad11fd8f0872921ea43872" + integrity sha512-lBAay6Sq3/fl7exd3mFxWAbzgdQowytor0fnlHrpNStn1HgFjXukwsf6356XQOie2Vd8qaMM7qZtMh4AiC0dcg== + dependencies: + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/styled-system" "2.6.1" + "@chakra-ui/theme" "2.2.5" + lodash.mergewith "4.6.2" + +"@chakra-ui/theme@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@chakra-ui/theme/-/theme-2.2.5.tgz#18ed1755ff27c1ff1f1a77083ffc546c361c926e" + integrity sha512-hYASZMwu0NqEv6PPydu+F3I+kMNd44yR4TwjR/lXBz/LEh64L6UPY6kQjebCfgdVtsGdl3HKg+eLlfa7SvfRgw== + dependencies: + "@chakra-ui/anatomy" "2.1.2" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/theme-tools" "2.0.17" + +"@chakra-ui/toast@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@chakra-ui/toast/-/toast-6.0.1.tgz#726b67a57cdd592320bb3f450c66d007a2a1d902" + integrity sha512-ej2kJXvu/d2h6qnXU5D8XTyw0qpsfmbiU7hUffo/sPxkz89AUOQ08RUuUmB1ssW/FZcQvNMJ5WgzCTKHGBxtxw== + dependencies: + "@chakra-ui/alert" "2.0.17" + "@chakra-ui/close-button" "2.0.17" + "@chakra-ui/portal" "2.0.15" + "@chakra-ui/react-context" "2.0.7" + "@chakra-ui/react-use-timeout" "2.0.5" + "@chakra-ui/react-use-update-effect" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + "@chakra-ui/styled-system" "2.6.1" + "@chakra-ui/theme" "2.2.5" + +"@chakra-ui/tooltip@2.2.6": + version "2.2.6" + resolved "https://registry.yarnpkg.com/@chakra-ui/tooltip/-/tooltip-2.2.6.tgz#a38f9ff2dd8a574c8cf49526c3846533455f8ddd" + integrity sha512-4cbneidZ5+HCWge3OZzewRQieIvhDjSsl+scrl4Scx7E0z3OmqlTIESU5nGIZDBLYqKn/UirEZhqaQ33FOS2fw== + dependencies: + "@chakra-ui/popper" "3.0.13" + "@chakra-ui/portal" "2.0.15" + "@chakra-ui/react-types" "2.0.7" + "@chakra-ui/react-use-disclosure" "2.0.8" + "@chakra-ui/react-use-event-listener" "2.0.7" + "@chakra-ui/react-use-merge-refs" "2.0.7" + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/transition@2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@chakra-ui/transition/-/transition-2.0.15.tgz#c640df2ea82f5ad58c55a6e1a7c338f377cb96d8" + integrity sha512-o9LBK/llQfUDHF/Ty3cQ6nShpekKTqHUoJlUOzNKhoTsNpoRerr9v0jwojrX1YI02KtVjfhFU6PiqXlDfREoNw== + dependencies: + "@chakra-ui/shared-utils" "2.0.5" + +"@chakra-ui/utils@2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@chakra-ui/utils/-/utils-2.0.15.tgz#bd800b1cff30eb5a5e8c36fa039f49984b4c5e4a" + integrity sha512-El4+jL0WSaYYs+rJbuYFDbjmfCcfGDmRY95GO4xwzit6YAPZBLcR65rOEwLps+XWluZTy1xdMrusg/hW0c1aAA== + dependencies: + "@types/lodash.mergewith" "4.6.7" + css-box-model "1.2.1" + framesync "6.1.2" + lodash.mergewith "4.6.2" + +"@chakra-ui/visually-hidden@2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@chakra-ui/visually-hidden/-/visually-hidden-2.0.15.tgz#60df64e0ab97d95fee4e6c61ccabd15fd5ace398" + integrity sha512-WWULIiucYRBIewHKFA7BssQ2ABLHLVd9lrUo3N3SZgR0u4ZRDDVEUNOy+r+9ruDze8+36dGbN9wsN1IdELtdOw== + +"@emotion/babel-plugin@^11.10.6": + version "11.10.6" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead" + integrity sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/serialize" "^1.1.1" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.1.3" + +"@emotion/cache@^11.10.5": + version "11.10.5" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12" + integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== + dependencies: + "@emotion/memoize" "^0.8.0" + "@emotion/sheet" "^1.2.1" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + stylis "4.1.3" + +"@emotion/hash@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" + integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== + +"@emotion/is-prop-valid@^0.8.2": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/is-prop-valid@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" + integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== + dependencies: + "@emotion/memoize" "^0.8.0" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + +"@emotion/memoize@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== + +"@emotion/react@^11.10.5": + version "11.10.6" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11" + integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.6" + "@emotion/cache" "^11.10.5" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" + integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== + dependencies: + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/unitless" "^0.8.0" + "@emotion/utils" "^1.2.0" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" + integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== + +"@emotion/styled@^11.10.5": + version "11.10.6" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.10.6.tgz#d886afdc51ef4d66c787ebde848f3cc8b117ebba" + integrity sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.6" + "@emotion/is-prop-valid" "^1.2.0" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + +"@emotion/unitless@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== "@emotion/use-insertion-effect-with-fallbacks@^1.0.0": version "1.0.0" - resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== -"@esbuild/android-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" - integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== - -"@esbuild/android-arm@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" - integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== - -"@esbuild/android-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" - integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== - -"@esbuild/darwin-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz" - integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== - -"@esbuild/darwin-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" - integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== - -"@esbuild/freebsd-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" - integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== - -"@esbuild/freebsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" - integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== - -"@esbuild/linux-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" - integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== - -"@esbuild/linux-arm@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" - integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== - -"@esbuild/linux-ia32@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" - integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== - -"@esbuild/linux-loong64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" - integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== - -"@esbuild/linux-mips64el@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" - integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== - -"@esbuild/linux-ppc64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" - integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== - -"@esbuild/linux-riscv64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" - integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== - -"@esbuild/linux-s390x@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" - integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== - -"@esbuild/linux-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" - integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== - -"@esbuild/netbsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" - integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== - -"@esbuild/openbsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" - integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== - -"@esbuild/sunos-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" - integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== - -"@esbuild/win32-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" - integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== - -"@esbuild/win32-ia32@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" - integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== - -"@esbuild/win32-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" - integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" +"@emotion/utils@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" + integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== + +"@emotion/weak-memoize@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" + integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== "@eslint/eslintrc@^2.0.0": version "2.0.0" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.0.tgz#943309d8697c52fc82c076e90c1c74fbbe69dbff" integrity sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A== dependencies: ajv "^6.12.4" @@ -2096,29 +1926,12 @@ "@eslint/js@8.35.0": version "8.35.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.35.0.tgz#b7569632b0b788a0ca0e438235154e45d42813a7" integrity sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw== -"@fal-works/esbuild-plugin-global-externals@^2.1.2": - version "2.1.2" - resolved "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz" - integrity sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ== - -"@fastify/busboy@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" - integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== - -"@headlessui/react@^1.7.15": - version "1.7.15" - resolved "https://registry.npmjs.org/@headlessui/react/-/react-1.7.15.tgz" - integrity sha512-OTO0XtoRQ6JPB1cKNFYBZv2Q0JMqMGNhYP1CjPvcJvjz8YGokz8oAj89HIYZGN0gZzn/4kk9iUpmMF4Q21Gsqw== - dependencies: - client-only "^0.0.1" - "@humanwhocodes/config-array@^0.11.8": version "0.11.8" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== dependencies: "@humanwhocodes/object-schema" "^1.2.1" @@ -2127,101 +1940,25 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": - version "0.1.3" - resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/schemas@^29.6.0": - version "29.6.0" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz" - integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/transform@^29.3.1": - version "29.6.1" - resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz" - integrity sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.1" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.6.1" - jest-regex-util "^29.4.3" - jest-util "^29.6.1" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - -"@jest/types@^29.6.1": - version "29.6.1" - resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz" - integrity sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw== - dependencies: - "@jest/schemas" "^29.6.0" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== dependencies: "@jridgewell/set-array" "^1.0.0" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.3" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: "@jridgewell/set-array" "^1.0.1" @@ -2230,107 +1967,47 @@ "@jridgewell/resolve-uri@3.1.0": version "3.1.0" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18": - version "0.3.18" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@juggle/resize-observer@^3.3.1": - version "3.4.0" - resolved "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz" - integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA== - "@lokesh.dhakar/quantize@^1.3.0": version "1.3.0" - resolved "https://registry.npmjs.org/@lokesh.dhakar/quantize/-/quantize-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/@lokesh.dhakar/quantize/-/quantize-1.3.0.tgz#04476889953aca94614fbc79e9a43adc7979179a" integrity sha512-4KBSyaMj65d8A+2vnzLxtHFu4OmBU4IKO0yLxZ171Itdf9jGV4w+WbG7VsKts2jUdRkFSzsZqpZOz6hTB3qGAw== -"@mdx-js/react@^2.1.5": - version "2.3.0" - resolved "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz" - integrity sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g== - dependencies: - "@types/mdx" "^2.0.0" - "@types/react" ">=16" - -"@mswjs/cookies@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-0.2.2.tgz#b4e207bf6989e5d5427539c2443380a33ebb922b" - integrity sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g== - dependencies: - "@types/set-cookie-parser" "^2.4.0" - set-cookie-parser "^2.4.6" - -"@mswjs/interceptors@^0.17.10": - version "0.17.10" - resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.17.10.tgz#857b41f30e2b92345ed9a4e2b1d0a08b8b6fcad4" - integrity sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw== - dependencies: - "@open-draft/until" "^1.0.3" - "@types/debug" "^4.1.7" - "@xmldom/xmldom" "^0.8.3" - debug "^4.3.3" - headers-polyfill "3.2.5" - outvariant "^1.2.1" - strict-event-emitter "^0.2.4" - web-encoding "^1.1.5" - -"@ndelangen/get-tarball@^3.0.7": - version "3.0.9" - resolved "https://registry.npmjs.org/@ndelangen/get-tarball/-/get-tarball-3.0.9.tgz" - integrity sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA== - dependencies: - gunzip-maybe "^1.4.2" - pump "^3.0.0" - tar-fs "^2.1.1" - "@next/env@13.4.7": version "13.4.7" - resolved "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz" + resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.7.tgz#ca12d341edb128ca70384635bd2794125ffb1c01" integrity sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw== "@next/eslint-plugin-next@13.2.1": version "13.2.1" - resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.2.1.tgz" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.2.1.tgz#58dea4d53c0adfc59c10195f51eb8d3575fce414" integrity sha512-r0i5rcO6SMAZtqiGarUVMr3k256X0R0j6pEkKg4PxqUW+hG0qgMxRVAJsuoRG5OBFkCOlSfWZJ0mP9fQdCcyNg== dependencies: glob "7.1.7" "@next/swc-darwin-arm64@13.4.7": version "13.4.7" - resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz#5e36c26dda5b0bc0ea15d8555d0abd71a1ef4b5d" integrity sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w== "@next/swc-darwin-x64@13.4.7": @@ -2373,14 +2050,9 @@ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz#5137780f58d7f0230adc293a0429821bfa7d8c21" integrity sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA== -"@nicolo-ribaudo/semver-v6@^6.3.3": - version "6.3.3" - resolved "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz" - integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -2388,25 +2060,20 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@open-draft/until@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-1.0.3.tgz#db9cc719191a62e7d9200f6e7bab21c5b848adca" - integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== - "@pkgr/utils@^2.3.1": version "2.3.1" - resolved "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03" integrity sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw== dependencies: cross-spawn "^7.0.3" @@ -2416,945 +2083,59 @@ tiny-glob "^0.2.9" tslib "^2.4.0" -"@pmmmwh/react-refresh-webpack-plugin@^0.5.5": - version "0.5.10" - resolved "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz" - integrity sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA== - dependencies: - ansi-html-community "^0.0.8" - common-path-prefix "^3.0.0" - core-js-pure "^3.23.3" - error-stack-parser "^2.0.6" - find-up "^5.0.0" - html-entities "^2.1.0" - loader-utils "^2.0.4" - schema-utils "^3.0.0" - source-map "^0.7.3" +"@popperjs/core@^2.9.3": + version "2.11.6" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" + integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== "@rushstack/eslint-patch@^1.1.3": version "1.2.0" - resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@storybook/addon-actions@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.0.26.tgz" - integrity sha512-vVoqE0Zw0g1PPnGfho8vRwjpXhQCpRNBQ/2U83/CSodHWL/MBYENG0XMby90TC72M26gNmEh0dn1YCUXvLdiew== - dependencies: - "@storybook/client-logger" "7.0.26" - "@storybook/components" "7.0.26" - "@storybook/core-events" "7.0.26" - "@storybook/global" "^5.0.0" - "@storybook/manager-api" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/theming" "7.0.26" - "@storybook/types" "7.0.26" - dequal "^2.0.2" - lodash "^4.17.21" - polished "^4.2.2" - prop-types "^15.7.2" - react-inspector "^6.0.0" - telejson "^7.0.3" - ts-dedent "^2.0.0" - uuid "^9.0.0" - -"@storybook/addon-backgrounds@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.0.26.tgz" - integrity sha512-sjTkOnSsVBBl1GruVVsNKWEuLCbKjkNun1mzIklfYAiHz9hTZIhe9MA2SGZoDozMUDIXQqSoMDEc3rnDtfqsnQ== - dependencies: - "@storybook/client-logger" "7.0.26" - "@storybook/components" "7.0.26" - "@storybook/core-events" "7.0.26" - "@storybook/global" "^5.0.0" - "@storybook/manager-api" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/theming" "7.0.26" - "@storybook/types" "7.0.26" - memoizerific "^1.11.3" - ts-dedent "^2.0.0" - -"@storybook/addon-controls@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.0.26.tgz" - integrity sha512-mp1WuOYCPvR33orHn0XPABY5roF9Le8HnZwTpvfkrRMeMqLnYLnkCTZqY3JN/IOVlyQuYdqodP5CPDHNDLmvVg== - dependencies: - "@storybook/blocks" "7.0.26" - "@storybook/client-logger" "7.0.26" - "@storybook/components" "7.0.26" - "@storybook/core-common" "7.0.26" - "@storybook/manager-api" "7.0.26" - "@storybook/node-logger" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/theming" "7.0.26" - "@storybook/types" "7.0.26" - lodash "^4.17.21" - ts-dedent "^2.0.0" - -"@storybook/addon-docs@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.0.26.tgz" - integrity sha512-C8DOwfmPBWDUS1IJbyJxykgVVHVzSSL+JFh3FwtF0hsqwjlNW4OvGDFbz0oAxyxs4V46xVcvh4E95e3GkW36BQ== - dependencies: - "@babel/core" "^7.20.2" - "@babel/plugin-transform-react-jsx" "^7.19.0" - "@jest/transform" "^29.3.1" - "@mdx-js/react" "^2.1.5" - "@storybook/blocks" "7.0.26" - "@storybook/client-logger" "7.0.26" - "@storybook/components" "7.0.26" - "@storybook/csf-plugin" "7.0.26" - "@storybook/csf-tools" "7.0.26" - "@storybook/global" "^5.0.0" - "@storybook/mdx2-csf" "^1.0.0" - "@storybook/node-logger" "7.0.26" - "@storybook/postinstall" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/react-dom-shim" "7.0.26" - "@storybook/theming" "7.0.26" - "@storybook/types" "7.0.26" - fs-extra "^11.1.0" - remark-external-links "^8.0.0" - remark-slug "^6.0.0" - ts-dedent "^2.0.0" - -"@storybook/addon-essentials@^7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.0.26.tgz" - integrity sha512-r+IOtxbIqlCKO8fDgLppubYm+GEW3ZDxjPwXMQdDGem9ENpz0QLKb49r89+UYqnnaYjuYKjDNUOqy0gX2HfUXQ== - dependencies: - "@storybook/addon-actions" "7.0.26" - "@storybook/addon-backgrounds" "7.0.26" - "@storybook/addon-controls" "7.0.26" - "@storybook/addon-docs" "7.0.26" - "@storybook/addon-highlight" "7.0.26" - "@storybook/addon-measure" "7.0.26" - "@storybook/addon-outline" "7.0.26" - "@storybook/addon-toolbars" "7.0.26" - "@storybook/addon-viewport" "7.0.26" - "@storybook/core-common" "7.0.26" - "@storybook/manager-api" "7.0.26" - "@storybook/node-logger" "7.0.26" - "@storybook/preview-api" "7.0.26" - ts-dedent "^2.0.0" - -"@storybook/addon-highlight@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.0.26.tgz" - integrity sha512-+I+MoM7yXCA3YR2FwTSxSs6/IBpcc3Ey88WboGthR23ERmsgZOtum1S7KZ6cffNCOq4U0LzPkjKX2bICytFrIQ== - dependencies: - "@storybook/core-events" "7.0.26" - "@storybook/global" "^5.0.0" - "@storybook/preview-api" "7.0.26" - -"@storybook/addon-interactions@^7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-7.0.26.tgz" - integrity sha512-trIbPFLdxF6XgGORhx8eSGmGZ/4/AekJyFluf2lgutGi4TPL5Xzrx3o1kTFPVdLAPplBuDIlVI4HSGHHH2zeTw== - dependencies: - "@storybook/client-logger" "7.0.26" - "@storybook/components" "7.0.26" - "@storybook/core-common" "7.0.26" - "@storybook/core-events" "7.0.26" - "@storybook/global" "^5.0.0" - "@storybook/instrumenter" "7.0.26" - "@storybook/manager-api" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/theming" "7.0.26" - "@storybook/types" "7.0.26" - jest-mock "^27.0.6" - polished "^4.2.2" - ts-dedent "^2.2.0" - -"@storybook/addon-links@^7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.0.26.tgz" - integrity sha512-og+8AUAUpHsT+MVjhdQmRNJw9RUkHn5FFoou003b9V4UlPPNDYTo/tNEqOhUXn2l/ESAROJlR/q/8Qjdes24pA== - dependencies: - "@storybook/client-logger" "7.0.26" - "@storybook/core-events" "7.0.26" - "@storybook/csf" "^0.1.0" - "@storybook/global" "^5.0.0" - "@storybook/manager-api" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/router" "7.0.26" - "@storybook/types" "7.0.26" - prop-types "^15.7.2" - ts-dedent "^2.0.0" - -"@storybook/addon-measure@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.0.26.tgz" - integrity sha512-iAnI6q3GB8uSydK+S4m4ANpy0GpMpHhmU0oBtu6OmyyzHUH1RJ7/fGfBnzx6YT+rIOlqSFocxYGn74ylsp33Wg== - dependencies: - "@storybook/client-logger" "7.0.26" - "@storybook/components" "7.0.26" - "@storybook/core-events" "7.0.26" - "@storybook/global" "^5.0.0" - "@storybook/manager-api" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/types" "7.0.26" - -"@storybook/addon-outline@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.0.26.tgz" - integrity sha512-oL7D0IWO0M6hMw5cWEC6JdKXlGadlVIdhIrVN+0gdFxuxCHTGpebQ02DCvyfls29UssEOxPaO1XMdu9tDlctbg== - dependencies: - "@storybook/client-logger" "7.0.26" - "@storybook/components" "7.0.26" - "@storybook/core-events" "7.0.26" - "@storybook/global" "^5.0.0" - "@storybook/manager-api" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/types" "7.0.26" - ts-dedent "^2.0.0" - -"@storybook/addon-styling@^1.3.2": - version "1.3.2" - resolved "https://registry.npmjs.org/@storybook/addon-styling/-/addon-styling-1.3.2.tgz" - integrity sha512-pxc2ncCH3jlOjsJFOmUECxIFvC4jmUxd0noeEC4shGfKvGhsssHpxcVtA36+s3JhDdx+Yhrk/0KeYoMe+35/qg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.5" - "@storybook/api" "^7.0.12" - "@storybook/components" "^7.0.12" - "@storybook/core-common" "^7.0.12" - "@storybook/core-events" "^7.0.12" - "@storybook/manager-api" "^7.0.12" - "@storybook/node-logger" "^7.0.12" - "@storybook/preview-api" "^7.0.12" - "@storybook/theming" "^7.0.12" - "@storybook/types" "^7.0.12" - css-loader "^6.7.3" - less-loader "^11.1.0" - postcss-loader "^7.2.4" - resolve-url-loader "^5.0.0" - sass-loader "^13.2.2" - style-loader "^3.3.2" - -"@storybook/addon-toolbars@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.0.26.tgz" - integrity sha512-DrwqcWuCLjaTNFtAYUxO2VaLrr2ibhB3ZQwW7J6a4YFCJaV49wempGPq3BzTWvrPUtMxGp7J3ZusdH9jBgCzjA== - dependencies: - "@storybook/client-logger" "7.0.26" - "@storybook/components" "7.0.26" - "@storybook/manager-api" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/theming" "7.0.26" - -"@storybook/addon-viewport@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.0.26.tgz" - integrity sha512-veAYxnR11sojXC7tlnBZ/USiafhWCsZNvjxmywl/XCh3MeDGFFDb2NN1s/7irAYXfNMOhgPGZED19BN9cQ8QRQ== - dependencies: - "@storybook/client-logger" "7.0.26" - "@storybook/components" "7.0.26" - "@storybook/core-events" "7.0.26" - "@storybook/global" "^5.0.0" - "@storybook/manager-api" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/theming" "7.0.26" - memoizerific "^1.11.3" - prop-types "^15.7.2" - -"@storybook/addons@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/addons/-/addons-7.0.26.tgz" - integrity sha512-zn7vdgXkQ4DpCJaawJsNPnh0NzXVXd2qfVtzYWWKT4eyj43VXxoVX2Z4woAD8h6G57JJg67+7hChRebUmd284A== - dependencies: - "@storybook/manager-api" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/types" "7.0.26" - -"@storybook/api@7.0.26", "@storybook/api@^7.0.12": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/api/-/api-7.0.26.tgz" - integrity sha512-czS5iWE3Px3e0sXjgt1T+LDiT6Tl4gXYPmHIaWpKGDCh4W2zrGolOvB0WqDt3IKhDGnXxaJF5jn705OGBQOptw== - dependencies: - "@storybook/client-logger" "7.0.26" - "@storybook/manager-api" "7.0.26" - -"@storybook/blocks@7.0.26", "@storybook/blocks@^7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.0.26.tgz" - integrity sha512-VNYB6Y1Ocja8HVg4Bm1w7LvqRSEc9aLVD8BnI8BInHvekvxhaxTkfpA18qds7d8+RmerrJqAUhGx0jkIB/cvwA== - dependencies: - "@storybook/channels" "7.0.26" - "@storybook/client-logger" "7.0.26" - "@storybook/components" "7.0.26" - "@storybook/core-events" "7.0.26" - "@storybook/csf" "^0.1.0" - "@storybook/docs-tools" "7.0.26" - "@storybook/global" "^5.0.0" - "@storybook/manager-api" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/theming" "7.0.26" - "@storybook/types" "7.0.26" - "@types/lodash" "^4.14.167" - color-convert "^2.0.1" - dequal "^2.0.2" - lodash "^4.17.21" - markdown-to-jsx "^7.1.8" - memoizerific "^1.11.3" - polished "^4.2.2" - react-colorful "^5.1.2" - telejson "^7.0.3" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - -"@storybook/builder-manager@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.0.26.tgz" - integrity sha512-1Uk3dL3Yu5AuimfHAghBHs11wf7B+a+277astqLx7HSeh3L49zcDZS4NhGHKmtQjsEorbvmtty3s16q2k+fM8A== - dependencies: - "@fal-works/esbuild-plugin-global-externals" "^2.1.2" - "@storybook/core-common" "7.0.26" - "@storybook/manager" "7.0.26" - "@storybook/node-logger" "7.0.26" - "@types/ejs" "^3.1.1" - "@types/find-cache-dir" "^3.2.1" - "@yarnpkg/esbuild-plugin-pnp" "^3.0.0-rc.10" - browser-assert "^1.2.1" - ejs "^3.1.8" - esbuild "^0.17.0" - esbuild-plugin-alias "^0.2.1" - express "^4.17.3" - find-cache-dir "^3.0.0" - fs-extra "^11.1.0" - process "^0.11.10" - util "^0.12.4" - -"@storybook/builder-webpack5@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.0.26.tgz" - integrity sha512-LfntlZKm0PB6hrgXd7IlzjuCLzjQezYHt3GQfZRxzu7MAu/bgu7xtr7lMaIJOQd2ckpvEN7xhJ89t2mvdk5y0A== - dependencies: - "@babel/core" "^7.12.10" - "@storybook/addons" "7.0.26" - "@storybook/api" "7.0.26" - "@storybook/channel-postmessage" "7.0.26" - "@storybook/channel-websocket" "7.0.26" - "@storybook/channels" "7.0.26" - "@storybook/client-api" "7.0.26" - "@storybook/client-logger" "7.0.26" - "@storybook/components" "7.0.26" - "@storybook/core-common" "7.0.26" - "@storybook/core-events" "7.0.26" - "@storybook/core-webpack" "7.0.26" - "@storybook/global" "^5.0.0" - "@storybook/manager-api" "7.0.26" - "@storybook/node-logger" "7.0.26" - "@storybook/preview" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/router" "7.0.26" - "@storybook/store" "7.0.26" - "@storybook/theming" "7.0.26" - "@types/node" "^16.0.0" - "@types/semver" "^7.3.4" - babel-loader "^9.0.0" - babel-plugin-named-exports-order "^0.0.2" - browser-assert "^1.2.1" - case-sensitive-paths-webpack-plugin "^2.4.0" - css-loader "^6.7.1" - express "^4.17.3" - fork-ts-checker-webpack-plugin "^7.2.8" - fs-extra "^11.1.0" - html-webpack-plugin "^5.5.0" - path-browserify "^1.0.1" - process "^0.11.10" - semver "^7.3.7" - style-loader "^3.3.1" - terser-webpack-plugin "^5.3.1" - ts-dedent "^2.0.0" - util "^0.12.4" - util-deprecate "^1.0.2" - webpack "5" - webpack-dev-middleware "^5.3.1" - webpack-hot-middleware "^2.25.1" - webpack-virtual-modules "^0.4.3" - -"@storybook/channel-postmessage@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-7.0.26.tgz" - integrity sha512-ZvFLr/tUD9dWIjQtIn1JXHjqrbOP/uEEOqzwpKSVj0Cl4Vgc12s8hecbzBufkOF7fwLsFvfieSi7ENOmjoncdQ== - dependencies: - "@storybook/channels" "7.0.26" - "@storybook/client-logger" "7.0.26" - "@storybook/core-events" "7.0.26" - "@storybook/global" "^5.0.0" - qs "^6.10.0" - telejson "^7.0.3" - -"@storybook/channel-websocket@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-7.0.26.tgz" - integrity sha512-c+0VcZf78RGnT/pWrH85yydt0azRKAHZF3SHWKM4+W8qOFr0Mk0+jqhPh1uoUoPDpBZDTKS/nzXY8cwUVwF/eA== - dependencies: - "@storybook/channels" "7.0.26" - "@storybook/client-logger" "7.0.26" - "@storybook/global" "^5.0.0" - telejson "^7.0.3" - -"@storybook/channels@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/channels/-/channels-7.0.26.tgz" - integrity sha512-Br3XILhrtuL5Sdp91I04kKjJzSqU/N8gGL6B6nIfnuaHUvGMDuMCHAB+g7aoiyH5dnpDZ6yBVGNwtYAyJA+0Og== - -"@storybook/cli@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/cli/-/cli-7.0.26.tgz" - integrity sha512-sZ136wRUYTdhhm/thegFoI47wOzl2X+K9eaiTTp0ARwnIUhXAPDQ0MKOD36hKbCX5T/pBE7r++7WoEReIbUDqQ== - dependencies: - "@babel/core" "^7.20.2" - "@babel/preset-env" "^7.20.2" - "@ndelangen/get-tarball" "^3.0.7" - "@storybook/codemod" "7.0.26" - "@storybook/core-common" "7.0.26" - "@storybook/core-server" "7.0.26" - "@storybook/csf-tools" "7.0.26" - "@storybook/node-logger" "7.0.26" - "@storybook/telemetry" "7.0.26" - "@storybook/types" "7.0.26" - "@types/semver" "^7.3.4" - chalk "^4.1.0" - commander "^6.2.1" - cross-spawn "^7.0.3" - detect-indent "^6.1.0" - envinfo "^7.7.3" - execa "^5.0.0" - express "^4.17.3" - find-up "^5.0.0" - fs-extra "^11.1.0" - get-npm-tarball-url "^2.0.3" - get-port "^5.1.1" - giget "^1.0.0" - globby "^11.0.2" - jscodeshift "^0.14.0" - leven "^3.1.0" - ora "^5.4.1" - prettier "^2.8.0" - prompts "^2.4.0" - puppeteer-core "^2.1.1" - read-pkg-up "^7.0.1" - semver "^7.3.7" - shelljs "^0.8.5" - simple-update-notifier "^1.0.0" - strip-json-comments "^3.0.1" - tempy "^1.0.1" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - -"@storybook/client-api@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/client-api/-/client-api-7.0.26.tgz" - integrity sha512-55Oy5Es8ACABWT01iddUJHt8oT4VnuCvec/FUC4iN7ITiOGjk7YzZB3NftmD6C5+pVQC99buspuwg7IFxmj+Aw== - dependencies: - "@storybook/client-logger" "7.0.26" - "@storybook/preview-api" "7.0.26" - -"@storybook/client-logger@7.0.26", "@storybook/client-logger@^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.0.26.tgz" - integrity sha512-OMVLbgceoeuM8sWOfTX/9a4zCrH78G32hg7x8yXLZnRJ9OLaHJHzUM0Onc4MLudqVUdaKH0c8ejpBXUyIr1rJQ== - dependencies: - "@storybook/global" "^5.0.0" - -"@storybook/codemod@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.0.26.tgz" - integrity sha512-H9sV59FfGrGzGM+UZQclNglnc4cOkQvvF3EOWlR3BfDhx+STSB9VbCR308ygjUYw2TXZ2s5seCvHtVvA2yhILA== - dependencies: - "@babel/core" "~7.21.0" - "@babel/preset-env" "~7.21.0" - "@babel/types" "~7.21.2" - "@storybook/csf" "^0.1.0" - "@storybook/csf-tools" "7.0.26" - "@storybook/node-logger" "7.0.26" - "@storybook/types" "7.0.26" - cross-spawn "^7.0.3" - globby "^11.0.2" - jscodeshift "^0.14.0" - lodash "^4.17.21" - prettier "^2.8.0" - recast "^0.23.1" - -"@storybook/components@7.0.26", "@storybook/components@^7.0.12": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/components/-/components-7.0.26.tgz" - integrity sha512-n0TVWEF4Bc9JAyEIaN0PqwglbaYYRcPVG7ka+5wgGmBiuDlWI1SXd4EXxv2u0mVibHvtkHvOn6/GaZ1vG45p6g== - dependencies: - "@storybook/client-logger" "7.0.26" - "@storybook/csf" "^0.1.0" - "@storybook/global" "^5.0.0" - "@storybook/theming" "7.0.26" - "@storybook/types" "7.0.26" - memoizerific "^1.11.3" - use-resize-observer "^9.1.0" - util-deprecate "^1.0.2" - -"@storybook/core-client@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.0.26.tgz" - integrity sha512-1DA8mLnr0f6EuL74859IDK99a7CGNgMIN0/cAVNgYxq0WA4j+9ajsJ+/RIAgnS2NLVLR9kbezUtBEx4/H88IRA== - dependencies: - "@storybook/client-logger" "7.0.26" - "@storybook/preview-api" "7.0.26" - -"@storybook/core-common@7.0.26", "@storybook/core-common@^7.0.12": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.0.26.tgz" - integrity sha512-rojZblzB0egNXX0bZ7R3TuPDiBSIhxpZCrorrDMHOZ8F+zuBxyTiZ0yMxEDn7i46T2n1vX+hUHhwZVxZrLn/ZQ== - dependencies: - "@storybook/node-logger" "7.0.26" - "@storybook/types" "7.0.26" - "@types/node" "^16.0.0" - "@types/node-fetch" "^2.6.4" - "@types/pretty-hrtime" "^1.0.0" - chalk "^4.1.0" - esbuild "^0.17.0" - esbuild-register "^3.4.0" - file-system-cache "2.3.0" - find-up "^5.0.0" - fs-extra "^11.1.0" - glob "^8.1.0" - glob-promise "^6.0.2" - handlebars "^4.7.7" - lazy-universal-dotenv "^4.0.0" - node-fetch "^2.0.0" - picomatch "^2.3.0" - pkg-dir "^5.0.0" - pretty-hrtime "^1.0.3" - resolve-from "^5.0.0" - ts-dedent "^2.0.0" - -"@storybook/core-events@7.0.26", "@storybook/core-events@^7.0.12": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.0.26.tgz" - integrity sha512-ckZszphEAYs9wp8tPVhayEMzk8JxCiQfzbq0S45sbdqdTrl40PmsOjv5iPNaUYElI/Stfz+v4gDCEUfOsxyC+w== - -"@storybook/core-server@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.0.26.tgz" - integrity sha512-QieqH19jBPZafxJVmCVK6GTYkRN/CJ8RQUvyRH2KNhqXP0tHYfL51FlU70ldo/vHX6Ax4Cje5hx/Nln9+DOMNg== - dependencies: - "@aw-web-design/x-default-browser" "1.4.88" - "@discoveryjs/json-ext" "^0.5.3" - "@storybook/builder-manager" "7.0.26" - "@storybook/core-common" "7.0.26" - "@storybook/core-events" "7.0.26" - "@storybook/csf" "^0.1.0" - "@storybook/csf-tools" "7.0.26" - "@storybook/docs-mdx" "^0.1.0" - "@storybook/global" "^5.0.0" - "@storybook/manager" "7.0.26" - "@storybook/node-logger" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/telemetry" "7.0.26" - "@storybook/types" "7.0.26" - "@types/detect-port" "^1.3.0" - "@types/node" "^16.0.0" - "@types/node-fetch" "^2.5.7" - "@types/pretty-hrtime" "^1.0.0" - "@types/semver" "^7.3.4" - better-opn "^2.1.1" - chalk "^4.1.0" - cli-table3 "^0.6.1" - compression "^1.7.4" - detect-port "^1.3.0" - express "^4.17.3" - fs-extra "^11.1.0" - globby "^11.0.2" - ip "^2.0.0" - lodash "^4.17.21" - node-fetch "^2.6.7" - open "^8.4.0" - pretty-hrtime "^1.0.3" - prompts "^2.4.0" - read-pkg-up "^7.0.1" - semver "^7.3.7" - serve-favicon "^2.5.0" - telejson "^7.0.3" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - watchpack "^2.2.0" - ws "^8.2.3" - -"@storybook/core-webpack@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.0.26.tgz" - integrity sha512-mIi+D+15sGRh8CWE7mMgvxX8KRfrACcR+AuEDi9rfQBB2PX0Okkrh6GAxPWjjeFFG7DF4RXdkusgC8/seYCTXg== - dependencies: - "@storybook/core-common" "7.0.26" - "@storybook/node-logger" "7.0.26" - "@storybook/types" "7.0.26" - "@types/node" "^16.0.0" - ts-dedent "^2.0.0" - -"@storybook/csf-plugin@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.0.26.tgz" - integrity sha512-D+wZvKlFxI/Vur8SRvkwKujOdV8ZL6xKiCX/07nFJXhhZoaeM+E78xPCL613Hj15GloujMkAnv7CT2rCiFJYow== - dependencies: - "@storybook/csf-tools" "7.0.26" - unplugin "^0.10.2" - -"@storybook/csf-tools@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.0.26.tgz" - integrity sha512-O8WJNOkvgrGV6gS/5ERkgqiXOxoXMuHtzdJpIM9DHPhzkSxB1Inl3WrX/dRRDNtmiHf87hBUuzhgo7YR7z4tuQ== - dependencies: - "@babel/generator" "~7.21.1" - "@babel/parser" "~7.21.2" - "@babel/traverse" "~7.21.2" - "@babel/types" "~7.21.2" - "@storybook/csf" "^0.1.0" - "@storybook/types" "7.0.26" - fs-extra "^11.1.0" - recast "^0.23.1" - ts-dedent "^2.0.0" - -"@storybook/csf@^0.0.1": - version "0.0.1" - resolved "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz" - integrity sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw== - dependencies: - lodash "^4.17.15" - -"@storybook/csf@^0.1.0": - version "0.1.1" - resolved "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.1.tgz" - integrity sha512-4hE3AlNVxR60Wc5KSC68ASYzUobjPqtSKyhV6G+ge0FIXU55N5nTY7dXGRZHQGDBPq+XqchMkIdlkHPRs8nTHg== - dependencies: - type-fest "^2.19.0" - -"@storybook/docs-mdx@^0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz" - integrity sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg== - -"@storybook/docs-tools@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.0.26.tgz" - integrity sha512-Ibpm/OTR2XmJgix5w+wMYbDwN0zp5e/pcqSHy36OvkBOG588IKSSzYdBjGdTLPHWBoehp2Kyndw/5dL/09ftXA== - dependencies: - "@babel/core" "^7.12.10" - "@storybook/core-common" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/types" "7.0.26" - "@types/doctrine" "^0.0.3" - doctrine "^3.0.0" - lodash "^4.17.21" - -"@storybook/global@^5.0.0": - version "5.0.0" - resolved "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz" - integrity sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ== - -"@storybook/instrumenter@7.0.26", "@storybook/instrumenter@^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-7.0.26.tgz" - integrity sha512-7Ty0LTslgkm5RyH6CqTAKhWz/cF6wq/sNdMYKwvVZHWNZ2LKMtXD0RWM2caCPruAGOQ9+52H+3s4TZGKaPSSWQ== - dependencies: - "@storybook/channels" "7.0.26" - "@storybook/client-logger" "7.0.26" - "@storybook/core-events" "7.0.26" - "@storybook/global" "^5.0.0" - "@storybook/preview-api" "7.0.26" - -"@storybook/manager-api@7.0.26", "@storybook/manager-api@^7.0.12": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.0.26.tgz" - integrity sha512-/2p6lU7r30qMXob/UnzRL9yq7XjoE+YQXv1KhrcePfMBARbelYw9RYhYT/AkXGtb9/Fa95uG3lNvoDLC1IQfMQ== - dependencies: - "@storybook/channels" "7.0.26" - "@storybook/client-logger" "7.0.26" - "@storybook/core-events" "7.0.26" - "@storybook/csf" "^0.1.0" - "@storybook/global" "^5.0.0" - "@storybook/router" "7.0.26" - "@storybook/theming" "7.0.26" - "@storybook/types" "7.0.26" - dequal "^2.0.2" - lodash "^4.17.21" - memoizerific "^1.11.3" - semver "^7.3.7" - store2 "^2.14.2" - telejson "^7.0.3" - ts-dedent "^2.0.0" - -"@storybook/manager@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/manager/-/manager-7.0.26.tgz" - integrity sha512-mxjU/pmHr8xL96HCipqazvZWQkxBPCbpZ2+YsJuJoLFN4m7RoOK21VK0euBW24NlSg7Vp57XGQcrJCv6xUTKMg== - -"@storybook/mdx2-csf@^1.0.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@storybook/mdx2-csf/-/mdx2-csf-1.1.0.tgz" - integrity sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw== - -"@storybook/nextjs@^7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/nextjs/-/nextjs-7.0.26.tgz" - integrity sha512-G7A0WGvh4DnESM1S+UIFbi7HgxrOwq2UhdBo8Cd0VyM6qwHomagGPCq3MNHHlmXLiObBezxEqBrbAm2l8klBTQ== - dependencies: - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.7" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/plugin-transform-runtime" "^7.21.0" - "@babel/preset-env" "^7.20.2" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.21.0" - "@babel/runtime" "^7.21.0" - "@storybook/addon-actions" "7.0.26" - "@storybook/builder-webpack5" "7.0.26" - "@storybook/core-common" "7.0.26" - "@storybook/node-logger" "7.0.26" - "@storybook/preset-react-webpack" "7.0.26" - "@storybook/preview-api" "7.0.26" - "@storybook/react" "7.0.26" - "@types/node" "^16.0.0" - css-loader "^6.7.3" - find-up "^5.0.0" - fs-extra "^11.1.0" - image-size "^1.0.0" - loader-utils "^3.2.0" - node-polyfill-webpack-plugin "^2.0.1" - pnp-webpack-plugin "^1.7.0" - postcss "^8.4.21" - postcss-loader "^7.0.2" - resolve-url-loader "^5.0.0" - sass-loader "^12.4.0" - semver "^7.3.5" - style-loader "^3.3.1" - styled-jsx "5.1.1" - ts-dedent "^2.0.0" - tsconfig-paths "^4.0.0" - tsconfig-paths-webpack-plugin "^3.5.2" - -"@storybook/node-logger@7.0.26", "@storybook/node-logger@^7.0.12": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.0.26.tgz" - integrity sha512-3Jqv3fRb8+Mn/aNl4IztgUAS/pvouVzpfHDc8+6KYAoFMeDXwHVlfF/+gRCpd/fbYaTHGrycIs5G48bC190Dgg== - dependencies: - "@types/npmlog" "^4.1.2" - chalk "^4.1.0" - npmlog "^5.0.1" - pretty-hrtime "^1.0.3" - -"@storybook/postinstall@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.0.26.tgz" - integrity sha512-NhJBpQ+49RWF63UkdwrEwBLJBjAZeTlruPWfXGUb343iaGNNTsD3jajbToFHncibewH83yk6MeGfiyUva60oJw== - -"@storybook/preset-react-webpack@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-7.0.26.tgz" - integrity sha512-uJTW7of4eF8upoP2W0N5FVi1DG2f6CXkkI5qX4WmYFAmCtShor75EZTcv50QF4GOKJs9NlHDgC2+i6gT24u1rg== - dependencies: - "@babel/preset-flow" "^7.18.6" - "@babel/preset-react" "^7.18.6" - "@pmmmwh/react-refresh-webpack-plugin" "^0.5.5" - "@storybook/core-webpack" "7.0.26" - "@storybook/docs-tools" "7.0.26" - "@storybook/node-logger" "7.0.26" - "@storybook/react" "7.0.26" - "@storybook/react-docgen-typescript-plugin" "1.0.6--canary.9.0c3f3b7.0" - "@types/node" "^16.0.0" - "@types/semver" "^7.3.4" - babel-plugin-add-react-displayname "^0.0.5" - babel-plugin-react-docgen "^4.2.1" - fs-extra "^11.1.0" - react-refresh "^0.11.0" - semver "^7.3.7" - webpack "5" - -"@storybook/preview-api@7.0.26", "@storybook/preview-api@^7.0.12": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.0.26.tgz" - integrity sha512-uJwA4errBOZOoDF2T7Z2oLqjAYvvjMr31sTsOoT0niJtWr29RQp8yS6VoSrsuh+y3FAVqBEl5pS+DX3IGLjvxw== - dependencies: - "@storybook/channel-postmessage" "7.0.26" - "@storybook/channels" "7.0.26" - "@storybook/client-logger" "7.0.26" - "@storybook/core-events" "7.0.26" - "@storybook/csf" "^0.1.0" - "@storybook/global" "^5.0.0" - "@storybook/types" "7.0.26" - "@types/qs" "^6.9.5" - dequal "^2.0.2" - lodash "^4.17.21" - memoizerific "^1.11.3" - qs "^6.10.0" - synchronous-promise "^2.0.15" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - -"@storybook/preview@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/preview/-/preview-7.0.26.tgz" - integrity sha512-9Uaxl/MEMYqjLlKAeAF2ATuaM0yQagXUfu2bEOpuor2ys9XoisDkvB7jfsCVqMZHeQ+mCdYyBICHhgqzxcO2Zg== - -"@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0": - version "1.0.6--canary.9.0c3f3b7.0" - resolved "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.6--canary.9.0c3f3b7.0.tgz" - integrity sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q== - dependencies: - debug "^4.1.1" - endent "^2.0.1" - find-cache-dir "^3.3.1" - flat-cache "^3.0.4" - micromatch "^4.0.2" - react-docgen-typescript "^2.2.2" - tslib "^2.0.0" - -"@storybook/react-dom-shim@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.0.26.tgz" - integrity sha512-heobG4IovYAD9fo7qmUHylCSQjDd1eXDCOaTiy+XVKobHAJgkz1gKqbaFSP6KLkPE4cKyScku2K9mY0tcKIhMw== - -"@storybook/react@7.0.26", "@storybook/react@^7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/react/-/react-7.0.26.tgz" - integrity sha512-+YK/1vF2Pd/PX7Ss5yPCIh9hee7iMVbu86gdjV9n9r6G244jQ7HLtdA01JKfq92/UgoysSWUjUECrxrUvcsh5w== - dependencies: - "@storybook/client-logger" "7.0.26" - "@storybook/core-client" "7.0.26" - "@storybook/docs-tools" "7.0.26" - "@storybook/global" "^5.0.0" - "@storybook/preview-api" "7.0.26" - "@storybook/react-dom-shim" "7.0.26" - "@storybook/types" "7.0.26" - "@types/escodegen" "^0.0.6" - "@types/estree" "^0.0.51" - "@types/node" "^16.0.0" - acorn "^7.4.1" - acorn-jsx "^5.3.1" - acorn-walk "^7.2.0" - escodegen "^2.0.0" - html-tags "^3.1.0" - lodash "^4.17.21" - prop-types "^15.7.2" - react-element-to-jsx-string "^15.0.0" - ts-dedent "^2.0.0" - type-fest "^2.19.0" - util-deprecate "^1.0.2" - -"@storybook/router@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/router/-/router-7.0.26.tgz" - integrity sha512-OfLittKxdahsgKsmQFoBX9q5tN/aqKMhhc/WbW88UPAQCUcEuazB0CwM+LI9YXY+n5L+vpLI4lGlgaqvPy4hHw== - dependencies: - "@storybook/client-logger" "7.0.26" - memoizerific "^1.11.3" - qs "^6.10.0" - -"@storybook/store@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/store/-/store-7.0.26.tgz" - integrity sha512-gJ9LDv8Mos8kPHj7SDEpBxQVL756j+15XUqBeBjgK+/TihnzIFeeX9QaTLo+As8bhgF/P2MVR+v0Qv9Zlm9MgQ== - dependencies: - "@storybook/client-logger" "7.0.26" - "@storybook/preview-api" "7.0.26" - -"@storybook/telemetry@7.0.26": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.0.26.tgz" - integrity sha512-TgvtARAiD+SNyWJJfQdPiWW5JQkbX1UdHKEqEhoJXsGDkEi2Zpb+1tdeP1qZ3Gfbd1K0/LDpXGcqLv6/deSEdg== - dependencies: - "@storybook/client-logger" "7.0.26" - "@storybook/core-common" "7.0.26" - chalk "^4.1.0" - detect-package-manager "^2.0.1" - fetch-retry "^5.0.2" - fs-extra "^11.1.0" - isomorphic-unfetch "^3.1.0" - nanoid "^3.3.1" - read-pkg-up "^7.0.1" - -"@storybook/testing-library@^0.0.14-next.2": - version "0.0.14-next.2" - resolved "https://registry.npmjs.org/@storybook/testing-library/-/testing-library-0.0.14-next.2.tgz" - integrity sha512-i/SLSGm0o978ELok/SB4Qg1sZ3zr+KuuCkzyFqcCD0r/yf+bG35aQGkFqqxfSAdDxuQom0NO02FE+qys5Eapdg== - dependencies: - "@storybook/client-logger" "^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0" - "@storybook/instrumenter" "^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0" - "@testing-library/dom" "^8.3.0" - "@testing-library/user-event" "^13.2.1" - ts-dedent "^2.2.0" - -"@storybook/theming@7.0.26", "@storybook/theming@^7.0.12": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/theming/-/theming-7.0.26.tgz" - integrity sha512-7hxpT2yq+xZonSsEZHOF+HDHx6GE0qlys3EQ63K9XCJ8VeBnq9M5zHvMK9iXl90093ufxpvWsfDWgtja2zvmTw== - dependencies: - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" - "@storybook/client-logger" "7.0.26" - "@storybook/global" "^5.0.0" - memoizerific "^1.11.3" - -"@storybook/types@7.0.26", "@storybook/types@^7.0.12": - version "7.0.26" - resolved "https://registry.npmjs.org/@storybook/types/-/types-7.0.26.tgz" - integrity sha512-5RBi6agtDglNXdffmw4+Fyv2dUdlIdeOdUj0O5+JRYajTxfHdurZd9r/42z4OstN+ORDkLA/svt8Q9JyRpIb6Q== - dependencies: - "@storybook/channels" "7.0.26" - "@types/babel__core" "^7.0.0" - "@types/express" "^4.7.0" - file-system-cache "2.3.0" - "@svgr/babel-plugin-add-jsx-attribute@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz" + resolved "https://registry.yarnpkg.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.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz" + resolved "https://registry.yarnpkg.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.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz" + resolved "https://registry.yarnpkg.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.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz" + resolved "https://registry.yarnpkg.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.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz" + resolved "https://registry.yarnpkg.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.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz" + resolved "https://registry.yarnpkg.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.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz" + resolved "https://registry.yarnpkg.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.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz" + resolved "https://registry.yarnpkg.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.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz" + resolved "https://registry.yarnpkg.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" @@ -3368,7 +2149,7 @@ "@svgr/core@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== dependencies: "@babel/core" "^7.19.6" @@ -3379,7 +2160,7 @@ "@svgr/hast-util-to-babel-ast@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz" + resolved "https://registry.yarnpkg.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" @@ -3387,7 +2168,7 @@ "@svgr/plugin-jsx@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== dependencies: "@babel/core" "^7.19.6" @@ -3397,7 +2178,7 @@ "@svgr/plugin-svgo@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== dependencies: cosmiconfig "^7.0.1" @@ -3406,7 +2187,7 @@ "@svgr/webpack@^6.5.1": version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.5.1.tgz#ecf027814fc1cb2decc29dc92f39c3cf691e40e8" integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== dependencies: "@babel/core" "^7.19.6" @@ -3420,26 +2201,26 @@ "@swc/helpers@0.5.1": version "0.5.1" - resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.1.tgz#e9031491aa3f26bfcc974a67f48bd456c8a5357a" integrity sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg== dependencies: tslib "^2.4.0" "@tanstack/match-sorter-utils@^8.7.0": version "8.7.6" - resolved "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.7.6.tgz" + resolved "https://registry.yarnpkg.com/@tanstack/match-sorter-utils/-/match-sorter-utils-8.7.6.tgz#ccf54a37447770e0cf0fe49a579c595fd2655b16" integrity sha512-2AMpRiA6QivHOUiBpQAVxjiHAA68Ei23ZUMNaRJrN6omWiSFLoYrxGcT6BXtuzp0Jw4h6HZCmGGIM/gbwebO2A== dependencies: remove-accents "0.4.2" "@tanstack/query-core@4.24.10": version "4.24.10" - resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.24.10.tgz" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.24.10.tgz#758e1f5b2d7faf7316d299facd272a9f64c26299" integrity sha512-2QywqXEAGBIUoTdgn1lAB4/C8QEqwXHj2jrCLeYTk2xVGtLiPEUD8jcMoeB2noclbiW2mMt4+Fq7fZStuz3wAQ== "@tanstack/react-query-devtools@^4.24.12": version "4.24.12" - resolved "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-4.24.12.tgz" + resolved "https://registry.yarnpkg.com/@tanstack/react-query-devtools/-/react-query-devtools-4.24.12.tgz#0157a732c82171c814d2df447640558f2431b811" integrity sha512-FxSIQk84vn5SpK6xQ2AxL63eis/qQ5foJ1LEjTzaU7cMcfvN4vNZ3mtUCeW/txI8aBpZ5gbVmGLEAtoi8ub4kQ== dependencies: "@tanstack/match-sorter-utils" "^8.7.0" @@ -3448,422 +2229,83 @@ "@tanstack/react-query@^4.24.4": version "4.24.10" - resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.24.10.tgz" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.24.10.tgz#2e1004bb1d1f55198961a21e875e2c65ec865130" integrity sha512-FY1DixytOcNNCydPQXLxuKEV7VSST32CAuJ55BjhDNqASnMLZn+6c30yQBMrODjmWMNwzfjMZnq0Vw7C62Fwow== dependencies: "@tanstack/query-core" "4.24.10" use-sync-external-store "^1.2.0" -"@testing-library/dom@^8.3.0": - version "8.20.1" - resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz" - integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.12.5" - "@types/aria-query" "^5.0.1" - aria-query "5.1.3" - chalk "^4.1.0" - dom-accessibility-api "^0.5.9" - lz-string "^1.5.0" - pretty-format "^27.0.2" - -"@testing-library/user-event@^13.2.1": - version "13.5.0" - resolved "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz" - integrity sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg== - dependencies: - "@babel/runtime" "^7.12.5" - "@trysound/sax@0.2.0": version "0.2.0" - resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== -"@types/aria-query@^5.0.1": - version "5.0.1" - resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz" - integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== - -"@types/babel__core@^7.0.0": - version "7.20.1" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz" - integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*": - version "7.20.1" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz" - integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== - dependencies: - "@babel/types" "^7.20.7" - -"@types/body-parser@*": - version "1.19.2" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - -"@types/debug@^4.1.7": - version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" - integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== - dependencies: - "@types/ms" "*" - -"@types/detect-port@^1.3.0": - version "1.3.3" - resolved "https://registry.npmjs.org/@types/detect-port/-/detect-port-1.3.3.tgz" - integrity sha512-bV/jQlAJ/nPY3XqSatkGpu+nGzou+uSwrH1cROhn+jBFg47yaNH+blW4C7p9KhopC7QxCv/6M86s37k8dMk0Yg== - -"@types/doctrine@^0.0.3": - version "0.0.3" - resolved "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz" - integrity sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA== - -"@types/ejs@^3.1.1": - version "3.1.2" - resolved "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.2.tgz" - integrity sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g== - -"@types/escodegen@^0.0.6": - version "0.0.6" - resolved "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.6.tgz" - integrity sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig== - -"@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.44.0" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz" - integrity sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^1.0.0": - version "1.0.1" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== - -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== - -"@types/express-serve-static-core@^4.17.33": - version "4.17.35" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz" - integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@^4.7.0": - version "4.17.17" - resolved "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/find-cache-dir@^3.2.1": - version "3.2.1" - resolved "https://registry.npmjs.org/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz" - integrity sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw== - -"@types/glob@^8.0.0": - version "8.1.0" - resolved "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz" - integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== - dependencies: - "@types/minimatch" "^5.1.2" - "@types/node" "*" - -"@types/graceful-fs@^4.1.3": - version "4.1.6" - resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== - dependencies: - "@types/node" "*" - -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - -"@types/http-errors@*": - version "2.0.1" - resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz" - integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/js-levenshtein@^1.1.1": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@types/js-levenshtein/-/js-levenshtein-1.1.3.tgz#a6fd0bdc8255b274e5438e0bfb25f154492d1106" - integrity sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ== - -"@types/json-schema@*", "@types/json-schema@^7.0.8": - version "7.0.12" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== - "@types/json-schema@^7.0.9": version "7.0.11" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/lodash@^4.14.167": - version "4.14.195" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz" - integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== - -"@types/mdx@^2.0.0": - version "2.0.5" - resolved "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.5.tgz" - integrity sha512-76CqzuD6Q7LC+AtbPqrvD9AqsN0k8bsYo2bM2J8pmNldP1aIPAbzUQ7QbobyXL4eLr1wK5x8FZFe8eF/ubRuBg== - -"@types/mime-types@^2.1.0": - version "2.1.1" - resolved "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.1.tgz" - integrity sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw== - -"@types/mime@*": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== - -"@types/mime@^1": - version "1.3.2" - resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== - -"@types/minimatch@^5.1.2": - version "5.1.2" - resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - -"@types/ms@*": - version "0.7.34" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" - integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== - -"@types/node-fetch@^2.5.7", "@types/node-fetch@^2.6.4": - version "2.6.4" - resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz" - integrity sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg== +"@types/lodash.mergewith@4.6.7": + version "4.6.7" + resolved "https://registry.yarnpkg.com/@types/lodash.mergewith/-/lodash.mergewith-4.6.7.tgz#eaa65aa5872abdd282f271eae447b115b2757212" + integrity sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A== dependencies: - "@types/node" "*" - form-data "^3.0.0" + "@types/lodash" "*" -"@types/node@*": - version "20.4.1" - resolved "https://registry.npmjs.org/@types/node/-/node-20.4.1.tgz" - integrity sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg== +"@types/lodash@*": + version "4.14.191" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" + integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== "@types/node@18.13.0": version "18.13.0" - resolved "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850" integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg== -"@types/node@^16.0.0": - version "16.18.38" - resolved "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz" - integrity sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== - -"@types/npmlog@^4.1.2": - version "4.1.4" - resolved "https://registry.npmjs.org/@types/npmlog/-/npmlog-4.1.4.tgz" - integrity sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ== - "@types/parse-json@^4.0.0": version "4.0.0" - resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/pretty-hrtime@^1.0.0": - version "1.0.1" - resolved "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz" - integrity sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ== - "@types/prop-types@*": version "15.7.5" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== -"@types/qs@*", "@types/qs@^6.9.5": - version "6.9.7" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - "@types/react-dom@18.0.10": version "18.0.10" - resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.10.tgz#3b66dec56aa0f16a6cc26da9e9ca96c35c0b4352" integrity sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg== dependencies: "@types/react" "*" "@types/react@*", "@types/react@18.0.28": version "18.0.28" - resolved "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065" integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@>=16": - version "18.2.14" - resolved "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz" - integrity sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - "@types/scheduler@*": version "0.16.2" - resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== "@types/semver@^7.3.12": version "7.3.13" - resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== -"@types/semver@^7.3.4": - version "7.5.0" - resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== - -"@types/send@*": - version "0.17.1" - resolved "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz" - integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@*": - version "1.15.2" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz" - integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== - dependencies: - "@types/http-errors" "*" - "@types/mime" "*" - "@types/node" "*" - -"@types/set-cookie-parser@^2.4.0": - version "2.4.7" - resolved "https://registry.yarnpkg.com/@types/set-cookie-parser/-/set-cookie-parser-2.4.7.tgz#4a341ed1d3a922573ee54db70b6f0a6d818290e7" - integrity sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg== - dependencies: - "@types/node" "*" - -"@types/unist@^2.0.0": - version "2.0.6" - resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^16.0.0": - version "16.0.5" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz" - integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== - dependencies: - "@types/yargs-parser" "*" - "@typescript-eslint/eslint-plugin@^5.52.0": version "5.53.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz#24b8b4a952f3c615fe070e3c461dd852b5056734" integrity sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw== dependencies: "@typescript-eslint/scope-manager" "5.53.0" @@ -3879,7 +2321,7 @@ "@typescript-eslint/parser@^5.42.0": version "5.53.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.53.0.tgz#a1f2b9ae73b83181098747e96683f1b249ecab52" integrity sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ== dependencies: "@typescript-eslint/scope-manager" "5.53.0" @@ -3887,35 +2329,17 @@ "@typescript-eslint/typescript-estree" "5.53.0" debug "^4.3.4" -"@typescript-eslint/parser@^5.61.0": - version "5.61.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.61.0.tgz" - integrity sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg== - dependencies: - "@typescript-eslint/scope-manager" "5.61.0" - "@typescript-eslint/types" "5.61.0" - "@typescript-eslint/typescript-estree" "5.61.0" - debug "^4.3.4" - "@typescript-eslint/scope-manager@5.53.0": version "5.53.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz#42b54f280e33c82939275a42649701024f3fafef" integrity sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w== dependencies: "@typescript-eslint/types" "5.53.0" "@typescript-eslint/visitor-keys" "5.53.0" -"@typescript-eslint/scope-manager@5.61.0": - version "5.61.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz" - integrity sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw== - dependencies: - "@typescript-eslint/types" "5.61.0" - "@typescript-eslint/visitor-keys" "5.61.0" - "@typescript-eslint/type-utils@5.53.0": version "5.53.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz#41665449935ba9b4e6a1ba6e2a3f4b2c31d6cf97" integrity sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw== dependencies: "@typescript-eslint/typescript-estree" "5.53.0" @@ -3925,17 +2349,12 @@ "@typescript-eslint/types@5.53.0": version "5.53.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.53.0.tgz#f79eca62b97e518ee124086a21a24f3be267026f" integrity sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A== -"@typescript-eslint/types@5.61.0": - version "5.61.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.61.0.tgz" - integrity sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ== - "@typescript-eslint/typescript-estree@5.53.0": version "5.53.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz#bc651dc28cf18ab248ecd18a4c886c744aebd690" integrity sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w== dependencies: "@typescript-eslint/types" "5.53.0" @@ -3946,22 +2365,9 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.61.0": - version "5.61.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz" - integrity sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw== - dependencies: - "@typescript-eslint/types" "5.61.0" - "@typescript-eslint/visitor-keys" "5.61.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - "@typescript-eslint/utils@5.53.0": version "5.53.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.53.0.tgz#e55eaad9d6fffa120575ffaa530c7e802f13bce8" integrity sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g== dependencies: "@types/json-schema" "^7.0.9" @@ -3973,284 +2379,45 @@ eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/utils@^5.45.0": - version "5.61.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz" - integrity sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.61.0" - "@typescript-eslint/types" "5.61.0" - "@typescript-eslint/typescript-estree" "5.61.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - "@typescript-eslint/visitor-keys@5.53.0": version "5.53.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz#8a5126623937cdd909c30d8fa72f79fa56cc1a9f" integrity sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w== dependencies: "@typescript-eslint/types" "5.53.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@5.61.0": - version "5.61.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz" - integrity sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg== - dependencies: - "@typescript-eslint/types" "5.61.0" - eslint-visitor-keys "^3.3.0" - -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== - -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== - -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== - -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== - -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== - -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" - -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@xtuc/long" "4.2.2" - -"@xmldom/xmldom@^0.8.3": - version "0.8.10" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" - integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -"@yarnpkg/esbuild-plugin-pnp@^3.0.0-rc.10": - version "3.0.0-rc.15" - resolved "https://registry.npmjs.org/@yarnpkg/esbuild-plugin-pnp/-/esbuild-plugin-pnp-3.0.0-rc.15.tgz" - integrity sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA== - dependencies: - tslib "^2.4.0" - -"@yarnpkg/lockfile@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - -"@zxing/text-encoding@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" - integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" +"@zag-js/element-size@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@zag-js/element-size/-/element-size-0.3.1.tgz#f9f6ae98355e2250d18d0f6e2f1134a0ae4c6a2f" + integrity sha512-jR5j4G//bRzcxwAACWi9EfITnwjNmn10LxF4NmALrdZU7/PNWP3uUCdhCxd/0SCyeiJXUl0yvD57rWAbKPs1nw== -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== +"@zag-js/focus-visible@0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@zag-js/focus-visible/-/focus-visible-0.2.1.tgz#bf4f1009f4fd35a9728dfaa9214d8cb318fe8b1e" + integrity sha512-19uTjoZGP4/Ax7kSNhhay9JA83BirKzpqLkeEAilrpdI1hE5xuq6q+tzJOsrMOOqJrm7LkmZp5lbsTQzvK2pYg== -acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: +acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^7.4.1: - version "7.4.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.2: - version "8.11.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== - -address@^1.0.1: - version "1.2.2" - resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== - -adjust-sourcemap-loader@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz" - integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== - dependencies: - loader-utils "^2.0.0" - regex-parser "^2.2.11" - -agent-base@5: - version "5.1.1" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz" - integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== - -agent-base@6: - version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" +acorn@^8.8.0: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -4258,125 +2425,64 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.9.0: - version "8.12.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: +ansi-escapes@^4.3.0: version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" -ansi-html-community@0.0.8, ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - ansi-styles@^6.0.0: version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -app-root-dir@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz" - integrity sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g== - -"aproba@^1.0.3 || ^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== - -are-we-there-yet@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz" - integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - argparse@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@5.1.3, aria-query@^5.1.3: +aria-hidden@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.2.tgz#8c4f7cc88d73ca42114106fdf6f47e68d31475b8" + integrity sha512-6y/ogyDTk/7YAe91T3E2PR1ALVKyM2QbTio5HwM+N1Q6CMlCKhvClyIjkckBswa0f2xJhjsfzIGa1yVSe1UMVA== + dependencies: + tslib "^2.0.0" + +aria-query@^5.1.3: version "5.1.3" - resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: deep-equal "^2.0.5" -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - array-includes@^3.1.5, array-includes@^3.1.6: version "3.1.6" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" @@ -4387,12 +2493,12 @@ array-includes@^3.1.5, array-includes@^3.1.6: array-union@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.flat@^1.3.1: version "1.3.1" - resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" @@ -4402,7 +2508,7 @@ array.prototype.flat@^1.3.1: array.prototype.flatmap@^1.3.1: version "1.3.1" - resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== dependencies: call-bind "^1.0.2" @@ -4412,7 +2518,7 @@ array.prototype.flatmap@^1.3.1: array.prototype.tosorted@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== dependencies: call-bind "^1.0.2" @@ -4421,124 +2527,56 @@ array.prototype.tosorted@^1.1.1: es-shim-unscopables "^1.0.0" get-intrinsic "^1.1.3" -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - asn1@~0.2.3: version "0.2.6" - resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== -assert@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz" - integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== - dependencies: - es6-object-assign "^1.1.0" - is-nan "^1.2.1" - object-is "^1.0.1" - util "^0.12.0" - ast-types-flow@^0.0.7: version "0.0.7" - resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== -ast-types@0.15.2: - version "0.15.2" - resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz" - integrity sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg== - dependencies: - tslib "^2.0.1" - -ast-types@^0.14.2: - version "0.14.2" - resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz" - integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== - dependencies: - tslib "^2.0.1" - -ast-types@^0.16.1: - version "0.16.1" - resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz" - integrity sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg== - dependencies: - tslib "^2.0.1" - astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -async@^3.2.3: - version "3.2.4" - resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -autoprefixer@^10.4.14: - version "10.4.14" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== - dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - available-typed-arrays@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== aws-sign2@~0.7.0: version "0.7.0" - resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: version "1.12.0" - resolved "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== axe-core@^4.6.2: version "4.6.3" - resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.3.tgz#fc0db6fdb65cc7a80ccf85286d91d64ababa3ece" integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== axios@^1.3.4: version "1.3.4" - resolved "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== dependencies: follow-redirects "^1.15.0" @@ -4547,303 +2585,79 @@ axios@^1.3.4: axobject-query@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== dependencies: deep-equal "^2.0.5" -babel-core@^7.0.0-bridge.0: - version "7.0.0-bridge.0" - resolved "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz" - integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== - -babel-loader@^9.0.0: - version "9.1.3" - resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz" - integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== - dependencies: - find-cache-dir "^4.0.0" - schema-utils "^4.0.0" - -babel-plugin-add-react-displayname@^0.0.5: - version "0.0.5" - resolved "https://registry.npmjs.org/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz" - integrity sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw== - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-named-exports-order@^0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/babel-plugin-named-exports-order/-/babel-plugin-named-exports-order-0.0.2.tgz" - integrity sha512-OgOYHOLoRK+/mvXU9imKHlG6GkPLYrUCvFXG/CM93R/aNNO8pOOF4aS+S8CCHMDQoNSeiOYEZb/G6RwL95Jktw== + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" babel-plugin-polyfill-corejs2@^0.3.3: version "0.3.3" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== dependencies: "@babel/compat-data" "^7.17.7" "@babel/helper-define-polyfill-provider" "^0.3.3" semver "^6.1.1" -babel-plugin-polyfill-corejs2@^0.4.4: - version "0.4.4" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz" - integrity sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA== - dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.1" - "@nicolo-ribaudo/semver-v6" "^6.3.3" - babel-plugin-polyfill-corejs3@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" core-js-compat "^3.25.1" -babel-plugin-polyfill-corejs3@^0.8.2: - version "0.8.2" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz" - integrity sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.1" - core-js-compat "^3.31.0" - babel-plugin-polyfill-regenerator@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" -babel-plugin-polyfill-regenerator@^0.5.1: - version "0.5.1" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz" - integrity sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.1" - -babel-plugin-react-docgen@^4.2.1: - version "4.2.1" - resolved "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.1.tgz" - integrity sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ== - dependencies: - ast-types "^0.14.2" - lodash "^4.17.15" - react-docgen "^5.0.0" - balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" -better-opn@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/better-opn/-/better-opn-2.1.1.tgz" - integrity sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA== - dependencies: - open "^7.0.3" - -big-integer@^1.6.44: - version "1.6.51" - resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bl@^4.0.3, bl@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.1" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - boolbase@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== -bplist-parser@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz" - integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== - dependencies: - big-integer "^1.6.44" - brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: +braces@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browser-assert@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz" - integrity sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ== - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz" - integrity sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ== - dependencies: - pako "~0.2.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@^4.14.5, browserslist@^4.21.9: - version "4.21.9" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz" - integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== - dependencies: - caniuse-lite "^1.0.30001503" - electron-to-chromium "^1.4.431" - node-releases "^2.0.12" - update-browserslist-db "^1.0.11" - -browserslist@^4.21.5: +browserslist@^4.21.3, browserslist@^4.21.5: version "4.21.5" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: caniuse-lite "^1.0.30001449" @@ -4851,262 +2665,73 @@ browserslist@^4.21.5: node-releases "^2.0.8" update-browserslist-db "^1.0.10" -bser@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" - integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz" - integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== - busboy@1.6.0: version "1.6.0" - resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -c8@^7.6.0: - version "7.14.0" - resolved "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz" - integrity sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@istanbuljs/schema" "^0.1.3" - find-up "^5.0.0" - foreground-child "^2.0.0" - istanbul-lib-coverage "^3.2.0" - istanbul-lib-report "^3.0.0" - istanbul-reports "^3.1.4" - rimraf "^3.0.2" - test-exclude "^6.0.0" - v8-to-istanbul "^9.0.0" - yargs "^16.2.0" - yargs-parser "^20.2.9" - call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" get-intrinsic "^1.0.2" -call-bind@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - callsites@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001449: version "1.0.30001458" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz#871e35866b4654a7d25eccca86864f411825540c" integrity sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w== -caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001503: - version "1.0.30001514" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz" - integrity sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ== - -case-sensitive-paths-webpack-plugin@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz" - integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== - caseless@~0.12.0: version "0.12.0" - resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -chalk@^2.4.2: +chalk@^2.0.0: version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chokidar@^3.4.2, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -chromatic@^6.19.9: - version "6.19.9" - resolved "https://registry.npmjs.org/chromatic/-/chromatic-6.19.9.tgz" - integrity sha512-UHrPbPoLnJwd063cRSO0U865VhcATykpMiHsAnNFz5EFRsBvM9wefqyS2Z6W8Ti9J7Fjrf4MV4PA+Q5k2lhFfQ== - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -ci-info@^3.7.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" -clean-css@^5.2.2: - version "5.3.2" - resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: - source-map "~0.6.0" + ansi-styles "^4.1.0" + supports-color "^7.1.0" clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" -cli-spinners@^2.5.0: - version "2.9.0" - resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz" - integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== - -cli-table3@^0.6.1: - version "0.6.3" - resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - cli-truncate@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: slice-ansi "^3.0.0" @@ -5114,96 +2739,54 @@ cli-truncate@^2.1.0: cli-truncate@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== dependencies: slice-ansi "^5.0.0" string-width "^5.0.0" -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -client-only@0.0.1, client-only@^0.0.1: +client-only@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.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" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-support@^1.1.2: - version "1.1.3" - resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - -colorette@^2.0.10: - version "2.0.20" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== +color2k@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/color2k/-/color2k-2.0.2.tgz#ac2b4aea11c822a6bcb70c768b5a289f4fffcebb" + integrity sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w== colorette@^2.0.19: version "2.0.19" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== colorthief@^2.4.0: version "2.4.0" - resolved "https://registry.npmjs.org/colorthief/-/colorthief-2.4.0.tgz" + resolved "https://registry.yarnpkg.com/colorthief/-/colorthief-2.4.0.tgz#74e6edd142695655bd5f52c7f8116b125ea2b2bd" integrity sha512-0U48RGNRo5fVO+yusBwgp+d3augWSorXabnqXUu9SabEhCpCgZJEUjUTTI41OOBBYuMMxawa3177POT6qLfLeQ== dependencies: "@lokesh.dhakar/quantize" "^1.3.0" @@ -5211,184 +2794,65 @@ colorthief@^2.4.0: combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" -commander@^2.19.0, commander@^2.20.0: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -commander@^6.2.1: - version "6.2.1" - resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== - commander@^7.2.0: version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - commander@^9.4.1: version "9.5.0" - resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== -common-path-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz" - integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" +compute-scroll-into-view@1.0.20: + version "1.0.20" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz#1768b5522d1172754f5d0c9b02de3af6be506a43" + integrity sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concat-stream@^1.6.2: - version "1.6.2" - resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -console-browserify@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -console-control-strings@^1.0.0, console-control-strings@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" - integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.5.0, convert-source-map@^1.7.0: version "1.9.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cookie@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - -copy-anything@^2.0.1: - version "2.0.6" - resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz" - integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== - dependencies: - is-what "^3.14.1" - copy-anything@^3.0.2: version "3.0.3" - resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-3.0.3.tgz#206767156f08da0e02efd392f71abcdf79643559" integrity sha512-fpW2W/BqEzqPp29QS+MwwfisHCQZtiduTe/m8idFo0xbti9fIZ2WVhAsCv4ggFVH3AgCkVdpoOCtQC6gBrdhjw== dependencies: is-what "^4.1.8" +copy-to-clipboard@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== + dependencies: + toggle-selection "^1.0.6" + core-js-compat@^3.25.1: version "3.28.0" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.28.0.tgz" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.28.0.tgz#c08456d854608a7264530a2afa281fadf20ecee6" integrity sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg== dependencies: browserslist "^4.21.5" -core-js-compat@^3.31.0: - version "3.31.1" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz" - integrity sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA== - dependencies: - browserslist "^4.21.9" - -core-js-pure@^3.23.3: - version "3.31.1" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.31.1.tgz" - integrity sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw== - core-util-is@1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@^7.0.1: +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.1.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" @@ -5397,95 +2861,25 @@ cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" -cosmiconfig@^8.2.0: - version "8.2.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz" - integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== - dependencies: - import-fresh "^3.2.1" - js-yaml "^4.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" -crypto-browserify@^3.12.0: - version "3.12.0" - resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -css-loader@^6.7.1, css-loader@^6.7.3: - version "6.8.1" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz" - integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.21" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.3" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.3.8" +css-box-model@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" + integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== + dependencies: + tiny-invariant "^1.0.6" css-select@^4.1.3: version "4.3.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" @@ -5496,7 +2890,7 @@ css-select@^4.1.3: css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: mdn-data "2.0.14" @@ -5504,79 +2898,62 @@ css-tree@^1.1.2, css-tree@^1.1.3: css-what@^6.0.1: version "6.1.0" - resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - csso@^4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: css-tree "^1.1.2" -csstype@^3.0.2: +csstype@^3.0.11, csstype@^3.0.2: version "3.1.1" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== cwise-compiler@^1.1.2: version "1.1.3" - resolved "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/cwise-compiler/-/cwise-compiler-1.1.3.tgz#f4d667410e850d3a313a7d2db7b1e505bb034cc5" integrity sha512-WXlK/m+Di8DMMcCjcWr4i+XzcQra9eCdXIJrgh4TUgh0pIS/yJduLxS9JgefsHJ/YVLdgPtXm9r62W92MvanEQ== dependencies: uniq "^1.0.0" damerau-levenshtein@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== dashdash@^1.12.0: version "1.14.1" - resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" data-uri-to-buffer@0.0.3: version "0.0.3" - resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-0.0.3.tgz" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-0.0.3.tgz#18ae979a6a0ca994b0625853916d2662bbae0b1a" integrity sha512-Cp+jOa8QJef5nXS5hU7M1DWzXPEIoVR3kbV0dQuVGwROZg8bGf1DcCnkmajBTnvghTtSNMUdRrPjgaT6ZQucbw== -debug@2.6.9, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: - ms "2.0.0" + ms "^2.1.1" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^3.2.6, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - deep-equal@^2.0.5: version "2.2.0" - resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== dependencies: call-bind "^1.0.2" @@ -5599,377 +2976,144 @@ deep-equal@^2.0.5: deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.3.0" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== -default-browser-id@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz" - integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== - dependencies: - bplist-parser "^0.2.0" - untildify "^4.0.0" - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - define-lazy-prop@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + resolved "https://registry.yarnpkg.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: version "1.2.0" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -defu@^6.1.2: - version "6.1.2" - resolved "https://registry.npmjs.org/defu/-/defu-6.1.2.tgz" - integrity sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ== - -del@^6.0.0: - version "6.1.1" - resolved "https://registry.npmjs.org/del/-/del-6.1.1.tgz" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -dequal@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -des.js@^1.0.0: +detect-node-es@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz" - integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-indent@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - -detect-package-manager@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz" - integrity sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A== - dependencies: - execa "^5.1.1" - -detect-port@^1.3.0: - version "1.5.1" - resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz" - integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== - dependencies: - address "^1.0.1" - debug "4" - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" + resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" -dom-accessibility-api@^0.5.9: - version "0.5.16" - resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" - integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - dom-serializer@^1.0.1: version "1.4.1" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" domhandler "^4.2.0" entities "^2.0.0" -domain-browser@^4.22.0: - version "4.22.0" - resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz" - integrity sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw== - domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.3.0" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: +domhandler@^4.2.0, domhandler@^4.3.1: version "4.3.1" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" -domutils@^2.5.2, domutils@^2.8.0: +domutils@^2.8.0: version "2.8.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" domelementtype "^2.2.0" domhandler "^4.2.0" -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dotenv-expand@^10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz" - integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== - -dotenv@^16.0.0: - version "16.3.1" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz" - integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== - -duplexify@^3.5.0, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== ecc-jsbn@~0.1.1: version "0.1.2" - resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -ejs@^3.1.8: - version "3.1.9" - resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz" - integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== - dependencies: - jake "^10.8.5" - electron-to-chromium@^1.4.284: version "1.4.311" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.311.tgz" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.311.tgz#953bc9a4767f5ce8ec125f9a1ad8e00e8f67e479" integrity sha512-RoDlZufvrtr2Nx3Yx5MB8jX3aHIxm8nRWPJm3yVvyHmyKaRvn90RjzB6hNnt0AkhS3IInJdyRfQb4mWhPvUjVw== -electron-to-chromium@^1.4.431: - version "1.4.454" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz" - integrity sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ== - -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -endent@^2.0.1: - version "2.1.0" - resolved "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz" - integrity sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w== - dependencies: - dedent "^0.7.0" - fast-json-parse "^1.0.3" - objectorarray "^1.0.5" - enhanced-resolve@^5.10.0: version "5.12.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enhanced-resolve@^5.15.0, enhanced-resolve@^5.7.0: - version "5.15.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - entities@^2.0.0: version "2.2.0" - resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== entities@^4.4.0: version "4.4.0" - resolved "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== -envinfo@^7.7.3: - version "7.10.0" - resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz" - integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== - -errno@^0.1.1: - version "0.1.8" - resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -error-stack-parser@^2.0.6: - version "2.1.4" - resolved "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz" - integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== - dependencies: - stackframe "^1.3.4" - es-abstract@^1.19.0, es-abstract@^1.20.4: version "1.21.1" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== dependencies: available-typed-arrays "^1.0.5" @@ -6006,21 +3150,9 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: unbox-primitive "^1.0.2" which-typed-array "^1.1.9" -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - es-get-iterator@^1.1.2: version "1.1.3" - resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== dependencies: call-bind "^1.0.2" @@ -6033,14 +3165,9 @@ es-get-iterator@^1.1.2: isarray "^2.0.5" stop-iteration-iterator "^1.0.0" -es-module-lexer@^1.2.1: - version "1.3.0" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz" - integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== - es-set-tostringtag@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== dependencies: get-intrinsic "^1.1.3" @@ -6049,99 +3176,38 @@ es-set-tostringtag@^2.0.1: es-shim-unscopables@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== dependencies: has "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-object-assign@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz" - integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw== - -esbuild-plugin-alias@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz" - integrity sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ== - -esbuild-register@^3.4.0: - version "3.4.2" - resolved "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.4.2.tgz" - integrity sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q== - dependencies: - debug "^4.3.4" - -esbuild@^0.17.0: - version "0.17.19" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz" - integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== - optionalDependencies: - "@esbuild/android-arm" "0.17.19" - "@esbuild/android-arm64" "0.17.19" - "@esbuild/android-x64" "0.17.19" - "@esbuild/darwin-arm64" "0.17.19" - "@esbuild/darwin-x64" "0.17.19" - "@esbuild/freebsd-arm64" "0.17.19" - "@esbuild/freebsd-x64" "0.17.19" - "@esbuild/linux-arm" "0.17.19" - "@esbuild/linux-arm64" "0.17.19" - "@esbuild/linux-ia32" "0.17.19" - "@esbuild/linux-loong64" "0.17.19" - "@esbuild/linux-mips64el" "0.17.19" - "@esbuild/linux-ppc64" "0.17.19" - "@esbuild/linux-riscv64" "0.17.19" - "@esbuild/linux-s390x" "0.17.19" - "@esbuild/linux-x64" "0.17.19" - "@esbuild/netbsd-x64" "0.17.19" - "@esbuild/openbsd-x64" "0.17.19" - "@esbuild/sunos-x64" "0.17.19" - "@esbuild/win32-arm64" "0.17.19" - "@esbuild/win32-ia32" "0.17.19" - "@esbuild/win32-x64" "0.17.19" - escalade@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" - integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionalDependencies: - source-map "~0.6.1" - eslint-config-next@^13.1.6: version "13.2.1" - resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.2.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.2.1.tgz#644fb3496b832bc1e32f2c57cce1ec3eeb7bb7a1" integrity sha512-2GAx7EjSiCzJN6H2L/v1kbYrNiwQxzkyjy6eWSjuhAKt+P6d3nVNHGy9mON8ZcYd72w/M8kyMjm4UB9cvijgrw== dependencies: "@next/eslint-plugin-next" "13.2.1" @@ -6156,7 +3222,7 @@ eslint-config-next@^13.1.6: eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: version "0.3.7" - resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== dependencies: debug "^3.2.7" @@ -6165,7 +3231,7 @@ eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: eslint-import-resolver-typescript@^3.5.2: version "3.5.3" - resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.3.tgz" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.3.tgz#db5ed9e906651b7a59dd84870aaef0e78c663a05" integrity sha512-njRcKYBc3isE42LaTcJNVANR3R99H9bAxBDMNDr2W7yq5gYPxbU3MkdhsQukxZ/Xg9C2vcyLlDsbKfRDg0QvCQ== dependencies: debug "^4.3.4" @@ -6178,14 +3244,14 @@ eslint-import-resolver-typescript@^3.5.2: eslint-module-utils@^2.7.4: version "2.7.4" - resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== dependencies: debug "^3.2.7" eslint-plugin-import@^2.26.0: version "2.27.5" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== dependencies: array-includes "^3.1.6" @@ -6206,7 +3272,7 @@ eslint-plugin-import@^2.26.0: eslint-plugin-jsx-a11y@^6.5.1: version "6.7.1" - resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== dependencies: "@babel/runtime" "^7.20.7" @@ -6228,12 +3294,12 @@ eslint-plugin-jsx-a11y@^6.5.1: eslint-plugin-react-hooks@^4.5.0: version "4.6.0" - resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.31.7: version "7.32.2" - resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== dependencies: array-includes "^3.1.6" @@ -6252,19 +3318,9 @@ eslint-plugin-react@^7.31.7: semver "^6.3.0" string.prototype.matchall "^4.0.8" -eslint-plugin-storybook@^0.6.12: - version "0.6.12" - resolved "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.6.12.tgz" - integrity sha512-XbIvrq6hNVG6rpdBr+eBw63QhOMLpZneQVSooEDow8aQCWGCk/5vqtap1yxpVydNfSxi3S/3mBBRLQqKUqQRww== - dependencies: - "@storybook/csf" "^0.0.1" - "@typescript-eslint/utils" "^5.45.0" - requireindex "^1.1.0" - ts-dedent "^2.2.0" - -eslint-scope@5.1.1, eslint-scope@^5.1.1: +eslint-scope@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -6272,7 +3328,7 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: eslint-scope@^7.1.1: version "7.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: esrecurse "^4.3.0" @@ -6280,24 +3336,24 @@ eslint-scope@^7.1.1: eslint-utils@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== dependencies: eslint-visitor-keys "^2.0.0" eslint-visitor-keys@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint-visitor-keys@^3.3.0: version "3.3.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== eslint@^8.34.0: version "8.35.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.35.0.tgz#fffad7c7e326bae606f0e8f436a6158566d42323" integrity sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw== dependencies: "@eslint/eslintrc" "^2.0.0" @@ -6343,97 +3399,45 @@ eslint@^8.34.0: espree@^9.4.0: version "9.4.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== dependencies: acorn "^8.8.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" -esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - esquery@^1.4.2: version "1.4.2" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.2.tgz#c6d3fee05dd665808e2ad870631f221f5617b1d1" integrity sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== -estree-to-babel@^3.1.0: - version "3.2.1" - resolved "https://registry.npmjs.org/estree-to-babel/-/estree-to-babel-3.2.1.tgz" - integrity sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg== - dependencies: - "@babel/traverse" "^7.1.6" - "@babel/types" "^7.2.0" - c8 "^7.6.0" - esutils@^2.0.2: version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -events@^3.2.0, events@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^5.0.0, execa@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - execa@^6.1.0: version "6.1.0" - resolved "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== dependencies: cross-spawn "^7.0.3" @@ -6446,85 +3450,29 @@ execa@^6.1.0: signal-exit "^3.0.7" strip-final-newline "^3.0.0" -express@^4.17.3: - version "4.18.2" - resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend@^3.0.0, extend@~3.0.2: +extend@~3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extract-zip@^1.6.6: - version "1.7.0" - resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz" - integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== - dependencies: - concat-stream "^1.6.2" - debug "^2.6.9" - mkdirp "^0.5.4" - yauzl "^2.10.0" - extsprintf@1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== extsprintf@^1.2.0: version "1.4.1" - resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.11, fast-glob@^3.2.9: version "3.2.12" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -6533,179 +3481,53 @@ fast-glob@^3.2.11, fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^3.2.12: - version "3.3.0" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz" - integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-parse@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz" - integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw== - -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.15.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" - integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== - dependencies: - pend "~1.2.0" - -fetch-retry@^5.0.2: - version "5.0.6" - resolved "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.6.tgz" - integrity sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ== - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" -file-system-cache@2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.3.0.tgz" - integrity sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ== - dependencies: - fs-extra "11.1.1" - ramda "0.29.0" - -filelist@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" - integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== - dependencies: - minimatch "^5.0.1" - fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" -filter-obj@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz" - integrity sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg== - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-cache-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-cache-dir@^3.0.0, find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-cache-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz" - integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== - dependencies: - common-path-prefix "^3.0.0" - pkg-dir "^7.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== find-up@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" path-exists "^4.0.0" -find-up@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz" - integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== - dependencies: - locate-path "^7.1.0" - path-exists "^5.0.0" - -find-yarn-workspace-root@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" - integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== - dependencies: - micromatch "^4.0.2" - flat-cache@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: flatted "^3.1.0" @@ -6713,69 +3535,36 @@ flat-cache@^3.0.4: flatted@^3.1.0: version "3.2.7" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -flow-parser@0.*: - version "0.211.1" - resolved "https://registry.npmjs.org/flow-parser/-/flow-parser-0.211.1.tgz" - integrity sha512-TjUjPTe22yM1DYKDqsmnUblJ0Vs5WJWP3FeaXU8L1gGKGrAQBdxRvs0CRj6NXYF8gugej4JyRWGBbaiVunC9uw== +focus-lock@^0.11.6: + version "0.11.6" + resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.11.6.tgz#e8821e21d218f03e100f7dc27b733f9c4f61e683" + integrity sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg== + dependencies: + tslib "^2.0.3" follow-redirects@^1.15.0: version "1.15.2" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== for-each@^0.3.3: version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" -foreground-child@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz" - integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^3.0.2" - forever-agent@~0.6.1: version "0.6.1" - resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== -fork-ts-checker-webpack-plugin@^7.2.8: - version "7.3.0" - resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz" - integrity sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA== - dependencies: - "@babel/code-frame" "^7.16.7" - chalk "^4.1.2" - chokidar "^3.5.3" - cosmiconfig "^7.0.1" - deepmerge "^4.2.2" - fs-extra "^10.0.0" - memfs "^3.4.1" - minimatch "^3.0.4" - node-abort-controller "^3.0.1" - schema-utils "^3.1.1" - semver "^7.3.5" - tapable "^2.2.1" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - form-data@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -6784,96 +3573,42 @@ form-data@^4.0.0: form-data@~2.3.2: version "2.3.3" - resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" combined-stream "^1.0.6" mime-types "^2.1.12" -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" - integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@11.1.1, fs-extra@^11.1.0: - version "11.1.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz" - integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== +framer-motion@^9.0.2: + version "9.1.7" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-9.1.7.tgz#1dc7dbd5bca086c90d09847c3fcaec3ecb7906af" + integrity sha512-nKxBkIO4IPkMEqcBbbATxsVjwPYShKl051yhBv9628iAH6JLeHD0siBHxkL62oQzMC1+GNX73XtPjgP753ufuw== dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" + tslib "^2.4.0" + optionalDependencies: + "@emotion/is-prop-valid" "^0.8.2" -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== +framesync@6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/framesync/-/framesync-6.1.2.tgz#755eff2fb5b8f3b4d2b266dd18121b300aefea27" + integrity sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g== dependencies: - minipass "^3.0.0" - -fs-monkey@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz" - integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== + tslib "2.4.0" fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - function.prototype.name@^1.1.5: version "1.1.5" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== dependencies: call-bind "^1.0.2" @@ -6883,67 +3618,31 @@ function.prototype.name@^1.1.5: functions-have-names@^1.2.2: version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -gauge@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz" - integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.2" - console-control-strings "^1.0.0" - has-unicode "^2.0.1" - object-assign "^4.1.1" - signal-exit "^3.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.2" - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== dependencies: function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.3" -get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-npm-tarball-url@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/get-npm-tarball-url/-/get-npm-tarball-url-2.0.3.tgz" - integrity sha512-R/PW6RqyaBQNWYaSyfrh54/qtcnOp22FHCCiRhSSZj0FP3KQWCsxxt0DzIdVTbwTqe9CtQfvl/FPD4UIPt4pqw== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== get-pixels@^3.3.2: version "3.3.3" - resolved "https://registry.npmjs.org/get-pixels/-/get-pixels-3.3.3.tgz" + resolved "https://registry.yarnpkg.com/get-pixels/-/get-pixels-3.3.3.tgz#71e2dfd4befb810b5478a61c6354800976ce01c7" integrity sha512-5kyGBn90i9tSMUVHTqkgCHsoWoR+/lGbl4yC83Gefyr0HLIhgSWEx/2F/3YgsZ7UpYNuM6pDhDK7zebrUJ5nXg== dependencies: data-uri-to-buffer "0.0.3" @@ -6958,19 +3657,14 @@ get-pixels@^3.3.2: request "^2.44.0" through "^2.3.4" -get-port@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz" - integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== - -get-stream@^6.0.0, get-stream@^6.0.1: +get-stream@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-symbol-description@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: call-bind "^1.0.2" @@ -6978,75 +3672,38 @@ get-symbol-description@^1.0.0: get-tsconfig@^4.2.0: version "4.4.0" - resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.4.0.tgz" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.4.0.tgz#64eee64596668a81b8fce18403f94f245ee0d4e5" integrity sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ== getpass@^0.1.1: version "0.1.7" - resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" -giget@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/giget/-/giget-1.1.2.tgz" - integrity sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A== - dependencies: - colorette "^2.0.19" - defu "^6.1.2" - https-proxy-agent "^5.0.1" - mri "^1.2.0" - node-fetch-native "^1.0.2" - pathe "^1.1.0" - tar "^6.1.13" - -github-slugger@^1.0.0: - version "1.5.0" - resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz" - integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== - -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" -glob-promise@^6.0.2: - version "6.0.3" - resolved "https://registry.npmjs.org/glob-promise/-/glob-promise-6.0.3.tgz" - integrity sha512-m+kxywR5j/2Z2V9zvHKfwwL5Gp7gIFEBX+deTB9w2lJB+wSuw9kcS43VfvTAMk8TXL5JCl/cCjsR+tgNVspGyA== - dependencies: - "@types/glob" "^8.0.0" - glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@7.1.7: version "7.1.7" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" @@ -7056,9 +3713,9 @@ glob@7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.3, glob@^7.1.4: +glob@^7.1.3: version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -7068,44 +3725,33 @@ glob@^7.0.0, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - globals@^11.1.0: version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: version "13.20.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" globalthis@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== dependencies: define-properties "^1.1.3" globalyzer@0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== -globby@^11.0.1, globby@^11.0.2, globby@^11.1.0: +globby@^11.1.0: version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -7117,7 +3763,7 @@ globby@^11.0.1, globby@^11.0.2, globby@^11.1.0: globby@^13.1.2: version "13.1.3" - resolved "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.3.tgz#f62baf5720bcb2c1330c8d4ef222ee12318563ff" integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== dependencies: dir-glob "^3.0.1" @@ -7128,68 +3774,44 @@ globby@^13.1.2: globrex@^0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== gopd@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: +graceful-fs@^4.1.2: version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graceful-fs@^4.2.4: version "4.2.10" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== grapheme-splitter@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== -graphql@^16.8.1: - version "16.8.1" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" - integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== - -gunzip-maybe@^1.4.2: - version "1.4.2" - resolved "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz" - integrity sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw== - dependencies: - browserify-zlib "^0.1.4" - is-deflate "^1.0.0" - is-gzip "^1.0.0" - peek-stream "^1.1.0" - pumpify "^1.3.3" - through2 "^2.0.3" - -handlebars@^4.7.7: - version "4.7.7" - resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" +hamt_plus@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/hamt_plus/-/hamt_plus-1.0.2.tgz#e21c252968c7e33b20f6a1b094cd85787a265601" + integrity sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA== har-schema@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== har-validator@~5.1.3: version "5.1.5" - resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: ajv "^6.12.3" @@ -7197,259 +3819,84 @@ har-validator@~5.1.3: has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: get-intrinsic "^1.1.1" -has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - has-proto@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: has-symbols "^1.0.2" -has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== - has@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hasown@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -headers-polyfill@3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.2.5.tgz#6e67d392c9d113d37448fe45014e0afdd168faed" - integrity sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-entities@^2.1.0: - version "2.4.0" - resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz" - integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -html-minifier-terser@^6.0.2: - version "6.1.0" - resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-tags@^3.1.0: - version "3.3.1" - resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz" - integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== - -html-webpack-plugin@^5.5.0: - version "5.5.3" - resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz" - integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== +hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" + react-is "^16.7.0" http-signature@~1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" sshpk "^1.7.0" -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" - integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== - -https-proxy-agent@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz" - integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== - dependencies: - agent-base "5" - debug "4" - -https-proxy-agent@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - human-signals@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== husky@^8.0.3: version "8.0.3" - resolved "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== -iconv-lite@0.4.24, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ignore@^5.2.0: version "5.2.4" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -image-size@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz" - integrity sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg== - dependencies: - queue "6.0.2" - -image-size@~0.5.0: - version "0.5.5" - resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz" - integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== - import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -7457,85 +3904,51 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: +inherits@2: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inquirer@^8.2.0: - version "8.2.6" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" - integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - wrap-ansi "^6.0.1" - internal-slot@^1.0.3, internal-slot@^1.0.4: version "1.0.5" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" iota-array@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/iota-array/-/iota-array-1.0.0.tgz#81ef57fe5d05814cd58c2483632a99c30a0e8087" integrity sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA== -ip@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-absolute-url@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz" - integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== - -is-arguments@^1.0.4, is-arguments@^1.1.1: +is-arguments@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: call-bind "^1.0.2" @@ -7543,7 +3956,7 @@ is-arguments@^1.0.4, is-arguments@^1.1.1: is-array-buffer@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== dependencies: call-bind "^1.0.2" @@ -7552,26 +3965,19 @@ is-array-buffer@^3.0.1: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" @@ -7579,137 +3985,85 @@ is-boolean-object@^1.1.0: is-buffer@^1.0.2: version "1.1.6" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.10.0, is-core-module@^2.11.0, is-core-module@^2.9.0: version "2.11.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" -is-deflate@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz" - integrity sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ== - is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-fullwidth-code-point@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-gzip@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz" - integrity sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ== - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== -is-nan@^1.2.1: - version "1.3.2" - resolved "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz" - integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - is-negative-zero@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== -is-node-process@^1.0.1, is-node-process@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-node-process/-/is-node-process-1.2.0.tgz#ea02a1b90ddb3934a19aea414e88edef7e11d134" - integrity sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw== - is-number-object@^1.0.4: version "1.0.7" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2, is-path-inside@^3.0.3: +is-path-inside@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-object@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - is-regex@^1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -7717,43 +4071,38 @@ is-regex@^1.1.4: is-set@^2.0.1, is-set@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== is-shared-array-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== dependencies: call-bind "^1.0.2" -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - is-stream@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.9: version "1.1.10" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== dependencies: available-typed-arrays "^1.0.5" @@ -7764,339 +4113,133 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: is-typedarray@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - is-weakmap@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" is-weakset@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== dependencies: call-bind "^1.0.2" get-intrinsic "^1.1.1" -is-what@^3.14.1: - version "3.14.1" - resolved "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz" - integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== - is-what@^4.1.8: - version "4.1.8" - resolved "https://registry.npmjs.org/is-what/-/is-what-4.1.8.tgz" - integrity sha512-yq8gMao5upkPoGEU9LsB2P+K3Kt8Q3fQFCGyNCWOAnJAMzEXVV9drYb0TXr42TTliLLhKIBvulgAXgtLLnwzGA== - -is-wsl@^2.1.1, is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -isomorphic-unfetch@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz" - integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== - dependencies: - node-fetch "^2.6.1" - unfetch "^4.2.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-reports@^3.1.4: - version "3.1.5" - resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jake@^10.8.5: - version "10.8.7" - resolved "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz" - integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== - dependencies: - async "^3.2.3" - chalk "^4.0.2" - filelist "^1.0.4" - minimatch "^3.1.2" - -jest-haste-map@^29.6.1: - version "29.6.1" - resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz" - integrity sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig== - dependencies: - "@jest/types" "^29.6.1" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.4.3" - jest-util "^29.6.1" - jest-worker "^29.6.1" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-mock@^27.0.6: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz" - integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - -jest-regex-util@^29.4.3: - version "29.4.3" - resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz" - integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== + version "4.1.8" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.8.tgz#0e2a8807fda30980ddb2571c79db3d209b14cbe4" + integrity sha512-yq8gMao5upkPoGEU9LsB2P+K3Kt8Q3fQFCGyNCWOAnJAMzEXVV9drYb0TXr42TTliLLhKIBvulgAXgtLLnwzGA== -jest-util@^29.6.1: - version "29.6.1" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz" - integrity sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg== +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: - "@jest/types" "^29.6.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" + is-docker "^2.0.0" -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== -jest-worker@^29.6.1: - version "29.6.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz" - integrity sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA== - dependencies: - "@types/node" "*" - jest-util "^29.6.1" - merge-stream "^2.0.0" - supports-color "^8.0.0" +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -jiti@^1.18.2: - version "1.19.1" - resolved "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz" - integrity sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg== +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== jpeg-js@^0.4.1: version "0.4.4" - resolved "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.4.tgz#a9f1c6f1f9f0fa80cdb3484ed9635054d28936aa" integrity sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg== -js-levenshtein@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - js-sdsl@^4.1.4: version "4.3.0" - resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsbn@~0.1.0: version "0.1.1" - resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jscodeshift@^0.14.0: - version "0.14.0" - resolved "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz" - integrity sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA== - dependencies: - "@babel/core" "^7.13.16" - "@babel/parser" "^7.13.16" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" - "@babel/plugin-transform-modules-commonjs" "^7.13.8" - "@babel/preset-flow" "^7.13.13" - "@babel/preset-typescript" "^7.13.0" - "@babel/register" "^7.13.16" - babel-core "^7.0.0-bridge.0" - chalk "^4.1.2" - flow-parser "0.*" - graceful-fs "^4.2.4" - micromatch "^4.0.4" - neo-async "^2.5.0" - node-dir "^0.1.17" - recast "^0.21.0" - temp "^0.8.4" - write-file-atomic "^2.3.0" - jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: +json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - json-schema@0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stable-stringify@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454" - integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== - dependencies: - call-bind "^1.0.5" - isarray "^2.0.5" - jsonify "^0.0.1" - object-keys "^1.1.1" - json-stringify-safe@~5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== json5@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: +json5@^2.2.2: version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== - jsprim@^1.2.2: version "1.4.2" - resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" @@ -8106,85 +4249,27 @@ jsprim@^1.2.2: "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: version "3.3.3" - resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== dependencies: array-includes "^3.1.5" object.assign "^4.1.3" -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klaw-sync@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" - integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== - dependencies: - graceful-fs "^4.1.11" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -klona@^2.0.4: - version "2.0.6" - resolved "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - language-subtag-registry@~0.3.2: version "0.3.22" - resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== language-tags@=1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== dependencies: language-subtag-registry "~0.3.2" -lazy-universal-dotenv@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-4.0.0.tgz" - integrity sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg== - dependencies: - app-root-dir "^1.0.2" - dotenv "^16.0.0" - dotenv-expand "^10.0.0" - -less-loader@^11.1.0, less-loader@^11.1.3: - version "11.1.3" - resolved "https://registry.npmjs.org/less-loader/-/less-loader-11.1.3.tgz" - integrity sha512-A5b7O8dH9xpxvkosNrP0dFp2i/dISOJa9WwGF3WJflfqIERE2ybxh1BFDj5CovC2+jCE4M354mk90hN6ziXlVw== - -less@^4.1.3: - version "4.1.3" - resolved "https://registry.npmjs.org/less/-/less-4.1.3.tgz" - integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== - dependencies: - copy-anything "^2.0.1" - parse-node-version "^1.0.1" - tslib "^2.3.0" - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - make-dir "^2.1.0" - mime "^1.4.1" - needle "^3.1.0" - source-map "~0.6.0" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - levn@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -8192,22 +4277,17 @@ levn@^0.4.1: lilconfig@2.0.6: version "2.0.6" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== -lilconfig@^2.0.5, lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lint-staged@^13.1.1: version "13.1.2" - resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-13.1.2.tgz" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.1.2.tgz#443636a0cfd834d5518d57d228130dc04c83d6fb" integrity sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w== dependencies: cli-truncate "^3.1.0" @@ -8226,7 +4306,7 @@ lint-staged@^13.1.1: listr2@^5.0.5: version "5.0.7" - resolved "https://registry.npmjs.org/listr2/-/listr2-5.0.7.tgz" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.7.tgz#de69ccc4caf6bea7da03c74f7a2ffecf3904bd53" integrity sha512-MD+qXHPmtivrHIDRwPYdfNkrzqDiuaKU/rfBcec3WMyMF3xylQj3jMq344OtvQxz7zaCFViRAeqlr2AFhPvXHw== dependencies: cli-truncate "^2.1.0" @@ -8238,80 +4318,31 @@ listr2@^5.0.5: through "^2.3.8" wrap-ansi "^7.0.0" -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -loader-utils@^2.0.0, loader-utils@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" -locate-path@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz" - integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== - dependencies: - p-locate "^6.0.0" - lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" +lodash.mergewith@4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== log-update@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== dependencies: ansi-escapes "^4.3.0" @@ -8319,349 +4350,112 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" -loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" -lz-string@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" - integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== - -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.0, make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -map-or-similar@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz" - integrity sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg== - -markdown-to-jsx@^7.1.8: - version "7.2.1" - resolved "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.2.1.tgz" - integrity sha512-9HrdzBAo0+sFz9ZYAGT5fB8ilzTW+q6lPocRxrIesMO+aB40V9MgFfbfMXxlGjf22OpRy+IXlvVaQenicdpgbg== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== - dependencies: - unist-util-visit "^2.0.0" - -mdast-util-to-string@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz" - integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A== - mdn-data@2.0.14: version "2.0.14" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memfs@^3.4.1, memfs@^3.4.3: - version "3.6.0" - resolved "https://registry.npmjs.org/memfs/-/memfs-3.6.0.tgz" - integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== - dependencies: - fs-monkey "^1.0.4" - -memoizerific@^1.11.3: - version "1.11.3" - resolved "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz" - integrity sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog== - dependencies: - map-or-similar "^1.5.0" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: +micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" picomatch "^2.3.1" -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.0.1, mime-types@^2.1.12, mime-types@^2.1.25, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.0.1, mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mime@1.6.0, mime@^1.4.1: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.0.3: - version "2.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mimic-fn@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minipass@^3.0.0: - version "3.3.6" - resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== - dependencies: - yallist "^4.0.0" - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp-classic@^0.5.2: - version "0.5.3" - resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -mkdirp@^0.5.4: - version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mri@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - ms@2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: +ms@^2.1.1: version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -msw-storybook-addon@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/msw-storybook-addon/-/msw-storybook-addon-1.10.0.tgz#8855cb0171ed2ac0649b1ce386e0e0d67420cfd4" - integrity sha512-soCTMTf7DnLeaMnFHPrtVgbyeFTJALVvnDHpzzXpJad+HOzJgQdwU4EAzVfDs1q+X5cVEgxOdAhSMC7ljvnSXg== - dependencies: - is-node-process "^1.0.1" - -msw@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/msw/-/msw-1.3.2.tgz#35e0271293e893fc3c55116e90aad5d955c66899" - integrity sha512-wKLhFPR+NitYTkQl5047pia0reNGgf0P6a1eTnA5aNlripmiz0sabMvvHcicE8kQ3/gZcI0YiPFWmYfowfm3lA== - dependencies: - "@mswjs/cookies" "^0.2.2" - "@mswjs/interceptors" "^0.17.10" - "@open-draft/until" "^1.0.3" - "@types/cookie" "^0.4.1" - "@types/js-levenshtein" "^1.1.1" - chalk "^4.1.1" - chokidar "^3.4.2" - cookie "^0.4.2" - graphql "^16.8.1" - headers-polyfill "3.2.5" - inquirer "^8.2.0" - is-node-process "^1.2.0" - js-levenshtein "^1.1.6" - node-fetch "^2.6.7" - outvariant "^1.4.0" - path-to-regexp "^6.2.0" - strict-event-emitter "^0.4.3" - type-fest "^2.19.0" - yargs "^17.3.1" - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.1, nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - nanoid@^3.3.4: version "3.3.4" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== natural-compare-lite@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== ndarray-pack@^1.1.1: version "1.2.1" - resolved "https://registry.npmjs.org/ndarray-pack/-/ndarray-pack-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/ndarray-pack/-/ndarray-pack-1.2.1.tgz#8caebeaaa24d5ecf70ff86020637977da8ee585a" integrity sha512-51cECUJMT0rUZNQa09EoKsnFeDL4x2dHRT0VR5U2H5ZgEcm95ZDWcMA5JShroXjHOejmAD/fg8+H+OvUnVXz2g== dependencies: cwise-compiler "^1.1.2" @@ -8669,34 +4463,15 @@ ndarray-pack@^1.1.1: ndarray@^1.0.13: version "1.0.19" - resolved "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz" + resolved "https://registry.yarnpkg.com/ndarray/-/ndarray-1.0.19.tgz#6785b5f5dfa58b83e31ae5b2a058cfd1ab3f694e" integrity sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ== dependencies: iota-array "^1.0.0" is-buffer "^1.0.2" -needle@^3.1.0: - version "3.2.0" - resolved "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz" - integrity sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ== - dependencies: - debug "^3.2.6" - iconv-lite "^0.6.3" - sax "^1.2.4" - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - next@13.4.7: version "13.4.7" - resolved "https://registry.npmjs.org/next/-/next-13.4.7.tgz" + resolved "https://registry.yarnpkg.com/next/-/next-13.4.7.tgz#2ab20e6fada2e25cb81bd17f68956705ffd9824e" integrity sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ== dependencies: "@next/env" "13.4.7" @@ -8718,163 +4493,53 @@ next@13.4.7: "@next/swc-win32-ia32-msvc" "13.4.7" "@next/swc-win32-x64-msvc" "13.4.7" -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-abort-controller@^3.0.1: - version "3.1.1" - resolved "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz" - integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== - node-bitmap@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/node-bitmap/-/node-bitmap-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/node-bitmap/-/node-bitmap-0.0.1.tgz#180eac7003e0c707618ef31368f62f84b2a69091" integrity sha512-Jx5lPaaLdIaOsj2mVLWMWulXF6GQVdyLvNSxmiYCvZ8Ma2hfKX0POoR2kgKOqz+oFsRreq0yYZjQ2wjE9VNzCA== -node-dir@^0.1.10, node-dir@^0.1.17: - version "0.1.17" - resolved "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz" - integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== - dependencies: - minimatch "^3.0.2" - -node-fetch-native@^1.0.2: - version "1.2.0" - resolved "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.2.0.tgz" - integrity sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ== - -node-fetch@^2.0.0, node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.12" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz" - integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-polyfill-webpack-plugin@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz" - integrity sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A== - dependencies: - assert "^2.0.0" - browserify-zlib "^0.2.0" - buffer "^6.0.3" - console-browserify "^1.2.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.12.0" - domain-browser "^4.22.0" - events "^3.3.0" - filter-obj "^2.0.2" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "^1.0.1" - process "^0.11.10" - punycode "^2.1.1" - querystring-es3 "^0.2.1" - readable-stream "^4.0.0" - stream-browserify "^3.0.0" - stream-http "^3.2.0" - string_decoder "^1.3.0" - timers-browserify "^2.0.12" - tty-browserify "^0.0.1" - type-fest "^2.14.0" - url "^0.11.0" - util "^0.12.4" - vm-browserify "^1.1.2" - -node-releases@^2.0.12: - version "2.0.13" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== - node-releases@^2.0.8: version "2.0.10" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: +normalize-path@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - npm-run-path@^5.1.0: version "5.1.0" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== dependencies: path-key "^4.0.0" -npmlog@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz" - integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== - dependencies: - are-we-there-yet "^2.0.0" - console-control-strings "^1.1.0" - gauge "^3.0.0" - set-blocking "^2.0.0" - nth-check@^2.0.1: version "2.1.1" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" oauth-sign@~0.9.0: version "0.9.0" - resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1, object-assign@^4.1.1: +object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - object-inspect@^1.12.2, object-inspect@^1.9.0: version "1.12.3" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -object-is@^1.0.1, object-is@^1.1.5: +object-is@^1.1.5: version "1.1.5" - resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== dependencies: call-bind "^1.0.2" @@ -8882,12 +4547,12 @@ object-is@^1.0.1, object-is@^1.1.5: object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.3, object.assign@^4.1.4: version "4.1.4" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: call-bind "^1.0.2" @@ -8897,7 +4562,7 @@ object.assign@^4.1.3, object.assign@^4.1.4: object.entries@^1.1.6: version "1.1.6" - resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== dependencies: call-bind "^1.0.2" @@ -8906,7 +4571,7 @@ object.entries@^1.1.6: object.fromentries@^2.0.6: version "2.0.6" - resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== dependencies: call-bind "^1.0.2" @@ -8915,7 +4580,7 @@ object.fromentries@^2.0.6: object.hasown@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== dependencies: define-properties "^1.1.4" @@ -8923,67 +4588,42 @@ object.hasown@^1.1.2: object.values@^1.1.6: version "1.1.6" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" es-abstract "^1.20.4" -objectorarray@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz" - integrity sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg== - omggif@^1.0.5: version "1.0.10" - resolved "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz" + resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0: version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^5.1.0, onetime@^5.1.2: +onetime@^5.1.0: version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" onetime@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== dependencies: mimic-fn "^4.0.0" -open@^7.0.3, open@^7.4.2: - version "7.4.2" - resolved "https://registry.npmjs.org/open/-/open-7.4.2.tgz" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - open@^8.4.0: version "8.4.2" - resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: define-lazy-prop "^2.0.0" @@ -8992,7 +4632,7 @@ open@^8.4.0: optionator@^0.9.1: version "0.9.1" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: deep-is "^0.1.3" @@ -9002,143 +4642,44 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ora@^5.4.1: - version "5.4.1" - resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" - integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -outvariant@^1.2.1, outvariant@^1.4.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.2.tgz#f54f19240eeb7f15b28263d5147405752d8e2066" - integrity sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ== - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" -p-limit@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz" - integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== - dependencies: - yocto-queue "^1.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" -p-locate@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz" - integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== - dependencies: - p-limit "^4.0.0" - p-map@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pako@~0.2.0: - version "0.2.9" - resolved "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz" - integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - parse-data-uri@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/parse-data-uri/-/parse-data-uri-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/parse-data-uri/-/parse-data-uri-0.2.0.tgz#bf04d851dd5c87b0ab238e5d01ace494b604b4c9" integrity sha512-uOtts8NqDcaCt1rIsO3VFDRsAfgE4c6osG4d9z3l4dCBlxYFzni6Di/oNU270SDrjkfZuUvLZx1rxMyqh46Y9w== dependencies: data-uri-to-buffer "0.0.3" parse-json@^5.0.0: version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -9146,765 +4687,237 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-node-version@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -patch-package@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" - integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^4.1.2" - ci-info "^3.7.0" - cross-spawn "^7.0.3" - find-yarn-workspace-root "^2.0.0" - fs-extra "^9.0.0" - json-stable-stringify "^1.0.2" - klaw-sync "^6.0.0" - minimist "^1.2.6" - open "^7.4.2" - rimraf "^2.6.3" - semver "^7.5.3" - slash "^2.0.0" - tmp "^0.0.33" - yaml "^2.2.2" - -path-browserify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-exists@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz" - integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== - path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^3.0.0, path-key@^3.1.0: +path-key@^3.1.0: version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-key@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-to-regexp@^6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" - integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pathe@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz" - integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== - -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -peek-stream@^1.1.0: - version "1.1.3" - resolved "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz" - integrity sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA== - dependencies: - buffer-from "^1.0.0" - duplexify "^3.5.0" - through2 "^2.0.3" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" - integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== - performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: +picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pidtree@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pirates@^4.0.1, pirates@^4.0.4, pirates@^4.0.5: - version "4.0.6" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-dir@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz" - integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== - dependencies: - find-up "^5.0.0" - -pkg-dir@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz" - integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== - dependencies: - find-up "^6.3.0" - pngjs@^3.3.3: version "3.4.0" - resolved "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== -pnp-webpack-plugin@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz" - integrity sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg== - dependencies: - ts-pnp "^1.1.6" - -polished@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz" - integrity sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ== - dependencies: - "@babel/runtime" "^7.17.8" - -postcss-import@^15.1.0: - version "15.1.0" - resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" - integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-js@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" - integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== - dependencies: - camelcase-css "^2.0.1" - -postcss-load-config@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz" - integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== - dependencies: - lilconfig "^2.0.5" - yaml "^2.1.1" - -postcss-loader@^7.0.2, postcss-loader@^7.2.4: - version "7.3.3" - resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz" - integrity sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA== - dependencies: - cosmiconfig "^8.2.0" - jiti "^1.18.2" - semver "^7.3.8" - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz" - integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== - dependencies: - postcss-selector-parser "^6.0.11" - -postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.13" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - postcss@8.4.14: version "8.4.14" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.25: - version "8.4.25" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz" - integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postinstall-postinstall@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" - integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== - prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier-plugin-tailwindcss@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.3.0.tgz" - integrity sha512-009/Xqdy7UmkcTBpwlq7jsViDqXAYSOMLDrHAdTMlVZOrKfM2o9Ci7EMWTMZ7SkKBFTG04UM9F9iM2+4i6boDA== - -prettier@^2.8.0: - version "2.8.8" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - prettier@^2.8.4: version "2.8.4" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -pretty-format@^27.0.2: - version "27.5.1" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -pretty-hrtime@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz" - integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -progress@^2.0.1: - version "2.0.3" - resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -prompts@^2.4.0: - version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" object-assign "^4.1.1" react-is "^16.13.1" -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: +proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - psl@^1.1.28: version "1.9.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -puppeteer-core@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-2.1.1.tgz" - integrity sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w== - dependencies: - "@types/mime-types" "^2.1.0" - debug "^4.1.0" - extract-zip "^1.6.6" - https-proxy-agent "^4.0.0" - mime "^2.0.3" - mime-types "^2.1.25" - progress "^2.0.1" - proxy-from-env "^1.0.0" - rimraf "^2.6.1" - ws "^6.1.0" - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -qs@^6.10.0, qs@^6.11.0: - version "6.11.2" - resolved "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== - dependencies: - side-channel "^1.0.4" - qs@~6.5.2: version "6.5.3" - resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== -querystring-es3@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" - integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== - queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -queue@6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz" - integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== - dependencies: - inherits "~2.0.3" - -ramda@0.29.0: - version "0.29.0" - resolved "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz" - integrity sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA== - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== +react-clientside-effect@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz#29f9b14e944a376b03fb650eed2a754dd128ea3a" + integrity sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg== dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -react-colorful@^5.1.2: - version "5.6.1" - resolved "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz" - integrity sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw== - -react-docgen-typescript@^2.2.2: - version "2.2.2" - resolved "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz" - integrity sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg== - -react-docgen@^5.0.0: - version "5.4.3" - resolved "https://registry.npmjs.org/react-docgen/-/react-docgen-5.4.3.tgz" - integrity sha512-xlLJyOlnfr8lLEEeaDZ+X2J/KJoe6Nr9AzxnkdQWush5hz2ZSu66w6iLMOScMmxoSHWpWMn+k3v5ZiyCfcWsOA== - dependencies: - "@babel/core" "^7.7.5" - "@babel/generator" "^7.12.11" - "@babel/runtime" "^7.7.6" - ast-types "^0.14.2" - commander "^2.19.0" - doctrine "^3.0.0" - estree-to-babel "^3.1.0" - neo-async "^2.6.1" - node-dir "^0.1.10" - strip-indent "^3.0.0" + "@babel/runtime" "^7.12.13" react-dom@18.2.0: version "18.2.0" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" scheduler "^0.23.0" -react-element-to-jsx-string@^15.0.0: - version "15.0.0" - resolved "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz" - integrity sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ== - dependencies: - "@base2/pretty-print-object" "1.0.1" - is-plain-object "5.0.0" - react-is "18.1.0" - react-error-boundary@^3.1.4: version "3.1.4" - resolved "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz" + resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.1.4.tgz#255db92b23197108757a888b01e5b729919abde0" integrity sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA== dependencies: "@babel/runtime" "^7.12.5" +react-fast-compare@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + +react-focus-lock@^2.9.2: + version "2.9.4" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.9.4.tgz#4753f6dcd167c39050c9d84f9c63c71b3ff8462e" + integrity sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg== + dependencies: + "@babel/runtime" "^7.0.0" + focus-lock "^0.11.6" + prop-types "^15.6.2" + react-clientside-effect "^1.2.6" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + react-hook-form@^7.43.2: version "7.43.2" - resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.43.2.tgz" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.43.2.tgz#d8ff71956dc3de258dce19d4b1c7e1c6a0188e67" integrity sha512-NvD3Oe2Y9hhqo2R4I4iJigDzSLpdMnzUpNMxlnzTbdiT7NT3BW0GxWCzEtwPudZMUPbZhNcSy1EcGAygyhDORg== -react-inspector@^6.0.0: - version "6.0.2" - resolved "https://registry.npmjs.org/react-inspector/-/react-inspector-6.0.2.tgz" - integrity sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ== - react-intersection-observer@^9.4.3: version "9.4.3" - resolved "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.4.3.tgz" + resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-9.4.3.tgz#ec84ce0c25cad548075130ea045ac5c7adf908f3" integrity sha512-WNRqMQvKpupr6MzecAQI0Pj0+JQong307knLP4g/nBex7kYfIaZsPpXaIhKHR+oV8z+goUbH9e10j6lGRnTzlQ== -react-is@18.1.0: - version "18.1.0" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz" - integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== - -react-is@^16.13.1: +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-remove-scroll-bar@^2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" + integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@^2.5.5: + version "2.5.5" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" + integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== + dependencies: + react-remove-scroll-bar "^2.3.3" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" -react-refresh@^0.11.0: - version "0.11.0" - resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz" - integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" react@18.2.0: version "18.2.0" - resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== +recoil@^0.7.7: + version "0.7.7" + resolved "https://registry.yarnpkg.com/recoil/-/recoil-0.7.7.tgz#c5f2c843224384c9c09e4a62c060fb4c1454dc8e" + integrity sha512-8Og5KPQW9LwC577Vc7Ug2P0vQshkv1y3zG3tSSkWMqkWSwHmE+by06L8JtnGocjW6gcCvfwB3YtrJG6/tWivNQ== dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@^2.0.0, readable-stream@^2.2.2, readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^4.0.0: - version "4.4.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz" - integrity sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA== - dependencies: - abort-controller "^3.0.0" - buffer "^6.0.3" - events "^3.3.0" - process "^0.11.10" - string_decoder "^1.3.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -recast@^0.21.0: - version "0.21.5" - resolved "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz" - integrity sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg== - dependencies: - ast-types "0.15.2" - esprima "~4.0.0" - source-map "~0.6.1" - tslib "^2.0.1" - -recast@^0.23.1: - version "0.23.2" - resolved "https://registry.npmjs.org/recast/-/recast-0.23.2.tgz" - integrity sha512-Qv6cPfVZyMOtPszK6PgW70pUgm7gPlFitAPf0Q69rlOA0zLw2XdDcNmPbVGYicFGT9O8I7TZ/0ryJD+6COvIPw== - dependencies: - assert "^2.0.0" - ast-types "^0.16.1" - esprima "~4.0.0" - source-map "~0.6.1" - tslib "^2.0.1" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" + hamt_plus "1.0.2" regenerate-unicode-properties@^10.1.0: version "10.1.0" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== dependencies: regenerate "^1.4.2" regenerate@^1.4.2: version "1.4.2" - resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.11: version "0.13.11" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regenerator-transform@^0.15.1: version "0.15.1" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== dependencies: "@babel/runtime" "^7.8.4" -regex-parser@^2.2.11: - version "2.2.11" - resolved "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz" - integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== - regexp.prototype.flags@^1.4.3: version "1.4.3" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== dependencies: call-bind "^1.0.2" @@ -9913,12 +4926,12 @@ regexp.prototype.flags@^1.4.3: regexpp@^3.2.0: version "3.2.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regexpu-core@^5.3.1: version "5.3.1" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.1.tgz" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.1.tgz#66900860f88def39a5cb79ebd9490e84f17bcdfb" integrity sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ== dependencies: "@babel/regjsgen" "^0.8.0" @@ -9930,55 +4943,19 @@ regexpu-core@^5.3.1: regjsparser@^0.9.1: version "0.9.1" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -remark-external-links@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz" - integrity sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA== - dependencies: - extend "^3.0.0" - is-absolute-url "^3.0.0" - mdast-util-definitions "^4.0.0" - space-separated-tokens "^1.0.0" - unist-util-visit "^2.0.0" - -remark-slug@^6.0.0: - version "6.1.0" - resolved "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz" - integrity sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ== - dependencies: - github-slugger "^1.0.0" - mdast-util-to-string "^1.0.0" - unist-util-visit "^2.0.0" - remove-accents@0.4.2: version "0.4.2" - resolved "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz" + resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - request@^2.44.0: version "2.88.2" - resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: aws-sign2 "~0.7.0" @@ -10002,54 +4979,14 @@ request@^2.44.0: tunnel-agent "^0.6.0" uuid "^3.3.2" -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requireindex@^1.1.0: - version "1.2.0" - resolved "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz" - integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== - resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-url-loader@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz" - integrity sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg== - dependencies: - adjust-sourcemap-loader "^4.0.0" - convert-source-map "^1.7.0" - loader-utils "^2.0.0" - postcss "^8.2.14" - source-map "0.6.1" - -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.22.2: - version "1.22.2" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.14.2, resolve@^1.22.1: +resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.1: version "1.22.1" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: is-core-module "^2.9.0" @@ -10058,7 +4995,7 @@ resolve@^1.14.2, resolve@^1.22.1: resolve@^2.0.0-next.4: version "2.0.0-next.4" - resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== dependencies: is-core-module "^2.9.0" @@ -10067,7 +5004,7 @@ resolve@^2.0.0-next.4: restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" @@ -10075,339 +5012,112 @@ restore-cursor@^3.1.0: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rfdc@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.6.1, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" -rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" -rxjs@^7.5.5: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - rxjs@^7.8.0: version "7.8.0" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== dependencies: tslib "^2.1.0" -safe-buffer@5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" - integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.2: version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex-test@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== dependencies: call-bind "^1.0.2" get-intrinsic "^1.1.3" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass-loader@^12.4.0: - version "12.6.0" - resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz" - integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== - dependencies: - klona "^2.0.4" - neo-async "^2.6.2" - -sass-loader@^13.2.2: - version "13.3.2" - resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz" - integrity sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg== - dependencies: - neo-async "^2.6.2" - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.2.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz" - integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -"semver@2 || 3 || 4 || 5", semver@^5.6.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.5, semver@^7.3.8: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.7: - version "7.3.8" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -semver@^7.5.3: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -semver@~7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -send@0.18.0: - version "0.18.0" - resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== - dependencies: - randombytes "^2.1.0" - -serve-favicon@^2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz" - integrity sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA== - dependencies: - etag "~1.8.1" - fresh "0.5.2" - ms "2.1.1" - parseurl "~1.3.2" - safe-buffer "5.1.1" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -set-cookie-parser@^2.4.6: - version "2.6.0" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" - integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + loose-envify "^1.1.0" -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== +semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.7: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: - kind-of "^6.0.2" + lru-cache "^6.0.0" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@^3.0.2, signal-exit@^3.0.7: version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -simple-update-notifier@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz" - integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== - dependencies: - semver "~7.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - slash@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slash@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== slice-ansi@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: ansi-styles "^4.0.0" @@ -10416,7 +5126,7 @@ slice-ansi@^3.0.0: slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -10425,7 +5135,7 @@ slice-ansi@^4.0.0: slice-ansi@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: ansi-styles "^6.0.0" @@ -10433,66 +5143,22 @@ slice-ansi@^5.0.0: source-map-js@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-support@^0.5.16, source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: +source-map@^0.6.1: version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - sshpk@^1.7.0: version "1.17.0" - resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" @@ -10507,86 +5173,29 @@ sshpk@^1.7.0: stable@^0.1.8: version "0.1.8" - resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== -stackframe@^1.3.4: - version "1.3.4" - resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz" - integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - stop-iteration-iterator@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== dependencies: internal-slot "^1.0.4" -store2@^2.14.2: - version "2.14.2" - resolved "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz" - integrity sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w== - -storybook@^7.0.26: - version "7.0.26" - resolved "https://registry.npmjs.org/storybook/-/storybook-7.0.26.tgz" - integrity sha512-N6+/QBIahTnOJ3mQFNh+PIimjw+yUUoBlnMq8kE1Rg6QFi8ErEK8xte6uppiTh+7ShpqeLhp9ipuDV6DwJ9Aqg== - dependencies: - "@storybook/cli" "7.0.26" - -stream-browserify@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz" - integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== - dependencies: - inherits "~2.0.4" - readable-stream "^3.5.0" - -stream-http@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz" - integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.4" - readable-stream "^3.6.0" - xtend "^4.0.2" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -strict-event-emitter@^0.2.4: - version "0.2.8" - resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz#b4e768927c67273c14c13d20e19d5e6c934b47ca" - integrity sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A== - dependencies: - events "^3.3.0" - -strict-event-emitter@^0.4.3: - version "0.4.6" - resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz#ff347c8162b3e931e3ff5f02cfce6772c3b07eb3" - integrity sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg== - string-argv@^0.3.1: version "0.3.1" - resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -10595,7 +5204,7 @@ string-argv@^0.3.1: string-width@^5.0.0: version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -10604,7 +5213,7 @@ string-width@^5.0.0: string.prototype.matchall@^4.0.8: version "4.0.8" - resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== dependencies: call-bind "^1.0.2" @@ -10618,7 +5227,7 @@ string.prototype.matchall@^4.0.8: string.prototype.trimend@^1.0.6: version "1.0.6" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" @@ -10627,134 +5236,88 @@ string.prototype.trimend@^1.0.6: string.prototype.trimstart@^1.0.6: version "1.0.6" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" es-abstract "^1.20.4" -string_decoder@^1.1.1, string_decoder@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== dependencies: ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - strip-final-newline@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.0.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-loader@^3.3.1, style-loader@^3.3.2: - version "3.3.3" - resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz" - integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== - styled-jsx@5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== dependencies: client-only "0.0.1" -sucrase@^3.32.0: - version "3.32.0" - resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz" - integrity sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "7.1.6" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" +stylis@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" + integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== superjson@^1.10.0: version "1.12.2" - resolved "https://registry.npmjs.org/superjson/-/superjson-1.12.2.tgz" + resolved "https://registry.yarnpkg.com/superjson/-/superjson-1.12.2.tgz#072471f1e6add2d95a38b77fef8c7a199d82103a" integrity sha512-ugvUo9/WmvWOjstornQhsN/sR9mnGtWGYeTxFuqLb4AiT4QdUavjGFRALCPKWWnAiUJ4HTpytj5e0t5HoMRkXg== dependencies: copy-anything "^3.0.2" supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svg-parser@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== svgo@^2.8.0: version "2.8.0" - resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== dependencies: "@trysound/sax" "0.2.0" @@ -10765,262 +5328,70 @@ svgo@^2.8.0: picocolors "^1.0.0" stable "^0.1.8" -synchronous-promise@^2.0.15: - version "2.0.17" - resolved "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.17.tgz" - integrity sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g== - synckit@^0.8.4: version "0.8.5" - resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== dependencies: "@pkgr/utils" "^2.3.1" tslib "^2.5.0" -tailwindcss@^3.3.2: - version "3.3.2" - resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz" - integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w== - dependencies: - "@alloc/quick-lru" "^5.2.0" - arg "^5.0.2" - chokidar "^3.5.3" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.2.12" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.18.2" - lilconfig "^2.1.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" - postcss-import "^15.1.0" - postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - postcss-value-parser "^4.2.0" - resolve "^1.22.2" - sucrase "^3.32.0" - -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: +tapable@^2.2.0: version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar-fs@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -tar@^6.1.13: - version "6.1.15" - resolved "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz" - integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -telejson@^7.0.3: - version "7.1.0" - resolved "https://registry.npmjs.org/telejson/-/telejson-7.1.0.tgz" - integrity sha512-jFJO4P5gPebZAERPkJsqMAQ0IMA1Hi0AoSfxpnUaV6j6R2SZqlpkbS20U6dEUtA3RUYt2Ak/mTlkQzHH9Rv/hA== - dependencies: - memoizerific "^1.11.3" - -temp-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" - integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== - -temp@^0.8.4: - version "0.8.4" - resolved "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz" - integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== - dependencies: - rimraf "~2.6.2" - -tempy@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz" - integrity sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w== - dependencies: - del "^6.0.0" - is-stream "^2.0.0" - temp-dir "^2.0.0" - type-fest "^0.16.0" - unique-string "^2.0.0" - -terser-webpack-plugin@^5.3.1, terser-webpack-plugin@^5.3.7: - version "5.3.9" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" - integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.17" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.16.8" - -terser@^5.10.0, terser@^5.16.8: - version "5.18.2" - resolved "https://registry.npmjs.org/terser/-/terser-5.18.2.tgz" - integrity sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - text-table@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -through2@^2.0.3: - version "2.0.5" - resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@^2.3.4, through@^2.3.6, through@^2.3.8: +through@^2.3.4, through@^2.3.8: version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -timers-browserify@^2.0.12: - version "2.0.12" - resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - tiny-glob@^0.2.9: version "0.2.9" - resolved "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz" + resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== dependencies: globalyzer "0.1.0" globrex "^0.1.2" -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== +tiny-invariant@^1.0.6: + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== tough-cookie@~2.5.0: version "2.5.0" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== dependencies: psl "^1.1.28" punycode "^2.1.1" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts-dedent@^2.0.0, ts-dedent@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz" - integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -ts-pnp@^1.1.6: - version "1.2.0" - resolved "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz" - integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== - -tsconfig-paths-webpack-plugin@^3.5.2: - version "3.5.2" - resolved "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz" - integrity sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw== - dependencies: - chalk "^4.1.0" - enhanced-resolve "^5.7.0" - tsconfig-paths "^3.9.0" - -tsconfig-paths@^3.14.1, tsconfig-paths@^3.9.0: +tsconfig-paths@^3.14.1: version "3.14.2" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== dependencies: "@types/json5" "^0.0.29" @@ -11028,131 +5399,74 @@ tsconfig-paths@^3.14.1, tsconfig-paths@^3.9.0: minimist "^1.2.6" strip-bom "^3.0.0" -tsconfig-paths@^4.0.0: - version "4.2.0" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz" - integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== - dependencies: - json5 "^2.2.2" - minimist "^1.2.6" - strip-bom "^3.0.0" +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== tslib@^1.8.1: version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0: version "2.5.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== -tslib@^2.0.1, tslib@^2.3.0: - version "2.6.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz" - integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== - tsutils@^3.21.0: version "3.21.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" -tty-browserify@^0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz" - integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== - tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" -tunnel@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" - integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== - tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" - resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" -type-fest@^0.16.0: - version "0.16.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz" - integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== - type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-fest@^2.14.0, type-fest@^2.19.0: - version "2.19.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - typed-array-length@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== dependencies: call-bind "^1.0.2" for-each "^0.3.3" is-typed-array "^1.1.9" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - typescript@^4.9.5: version "4.9.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== -uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== - unbox-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: call-bind "^1.0.2" @@ -11160,26 +5474,14 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici@^5.25.4: - version "5.28.4" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" - integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== - dependencies: - "@fastify/busboy" "^2.0.0" - -unfetch@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz" - integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== - unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" @@ -11187,300 +5489,79 @@ unicode-match-property-ecmascript@^2.0.0: unicode-match-property-value-ecmascript@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== uniq@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -unplugin@^0.10.2: - version "0.10.2" - resolved "https://registry.npmjs.org/unplugin/-/unplugin-0.10.2.tgz" - integrity sha512-6rk7GUa4ICYjae5PrAllvcDeuT8pA9+j5J5EkxbMFaV+SalHhxZ7X2dohMzu6C3XzsMT+6jwR/+pwPNR3uK9MA== - dependencies: - acorn "^8.8.0" - chokidar "^3.5.3" - webpack-sources "^3.2.3" - webpack-virtual-modules "^0.4.5" - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - update-browserslist-db@^1.0.10: version "1.0.10" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== dependencies: escalade "^3.1.1" picocolors "^1.0.0" -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" -url@^0.11.0: - version "0.11.1" - resolved "https://registry.npmjs.org/url/-/url-0.11.1.tgz" - integrity sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA== +use-callback-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" + integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== dependencies: - punycode "^1.4.1" - qs "^6.11.0" + tslib "^2.0.0" -use-resize-observer@^9.1.0: - version "9.1.0" - resolved "https://registry.npmjs.org/use-resize-observer/-/use-resize-observer-9.1.0.tgz" - integrity sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow== +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== dependencies: - "@juggle/resize-observer" "^3.3.1" + detect-node-es "^1.1.0" + tslib "^2.0.0" use-sync-external-store@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util@^0.12.0, util@^0.12.3, util@^0.12.4: - version "0.12.5" - resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - -utila@~0.4: - version "0.4.0" - resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" - integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - uuid@^3.3.2: version "3.4.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -uuid@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz" - integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== - -v8-to-istanbul@^9.0.0: - version "9.1.0" - resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz" - integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - verror@1.10.0: version "1.10.0" - resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" -vm-browserify@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -watchpack@2.4.0, watchpack@^2.2.0, watchpack@^2.4.0: +watchpack@2.4.0: version "2.4.0" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -web-encoding@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" - integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== - dependencies: - util "^0.12.3" - optionalDependencies: - "@zxing/text-encoding" "0.9.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-hot-middleware@^2.25.1: - version "2.25.4" - resolved "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.4.tgz" - integrity sha512-IRmTspuHM06aZh98OhBJtqLpeWFM8FXJS5UYpKYxCJzyFoyWj1w6VGFfomZU7OPA55dMLrQK0pRT1eQ3PACr4w== - dependencies: - ansi-html-community "0.0.8" - html-entities "^2.1.0" - strip-ansi "^6.0.0" - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack-virtual-modules@^0.4.3, webpack-virtual-modules@^0.4.5: - version "0.4.6" - resolved "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz" - integrity sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA== - -webpack@5, webpack@^5.88.1: - version "5.88.1" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz" - integrity sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" - acorn "^8.7.1" - acorn-import-assertions "^1.9.0" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.15.0" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.2.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -11491,7 +5572,7 @@ which-boxed-primitive@^1.0.2: which-collection@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== dependencies: is-map "^2.0.1" @@ -11499,9 +5580,9 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" -which-typed-array@^1.1.2, which-typed-array@^1.1.9: +which-typed-array@^1.1.9: version "1.1.9" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== dependencies: available-typed-arrays "^1.0.5" @@ -11513,31 +5594,19 @@ which-typed-array@^1.1.2, which-typed-array@^1.1.9: which@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wide-align@^1.1.2: - version "1.1.5" - resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - word-wrap@^1.2.3: version "1.2.3" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: +wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -11546,7 +5615,7 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -11555,133 +5624,35 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^2.3.0: - version "2.4.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@^6.1.0: - version "6.2.2" - resolved "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" - -ws@^8.2.3: - version "8.13.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== - -xtend@^4.0.2, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - yallist@^3.0.2: version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.10.0: version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yaml@^2.1.1: - version "2.3.1" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== - yaml@^2.1.3: version "2.2.1" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4" integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== -yaml@^2.2.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.2.tgz#7a2b30f2243a5fc299e1f14ca58d475ed4bc5362" - integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== - -yargs-parser@^20.2.2, yargs-parser@^20.2.9: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - 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" - -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" - integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== - zod@3.21.4: version "3.21.4" - resolved "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==