From b648c33f173285d7cedb5ad92995fbc24bd97dbc Mon Sep 17 00:00:00 2001 From: chenyueban Date: Fri, 7 Jul 2023 15:08:06 +0800 Subject: [PATCH 01/23] chore: update deps and update mock page --- package.json | 30 +- packages/server/package.json | 14 +- .../[projectId]/mock/{ => frame}/Ajax.tsx | 0 .../[projectId]/mock/{ => frame}/Config.tsx | 0 .../mock/{ => frame}/CustomReport.tsx | 2 +- .../[projectId]/mock/{ => frame}/Error.tsx | 0 .../mock/{ => frame}/HashChange.tsx | 0 .../[projectId]/mock/{ => frame}/History.tsx | 0 .../mock/{ => frame}/InsertRes.tsx | 0 .../mock/{ => frame}/PromiseError.tsx | 0 .../[locale]/[projectId]/mock/frame/index.tsx | 65 + .../app/[locale]/[projectId]/mock/mock.tsx | 48 +- packages/web/components/issueDetailTitle.tsx | 18 +- packages/web/components/issueList.tsx | 18 +- packages/web/package.json | 20 +- pnpm-lock.yaml | 1317 +++++++++-------- 16 files changed, 852 insertions(+), 680 deletions(-) rename packages/web/app/[locale]/[projectId]/mock/{ => frame}/Ajax.tsx (100%) rename packages/web/app/[locale]/[projectId]/mock/{ => frame}/Config.tsx (100%) rename packages/web/app/[locale]/[projectId]/mock/{ => frame}/CustomReport.tsx (95%) rename packages/web/app/[locale]/[projectId]/mock/{ => frame}/Error.tsx (100%) rename packages/web/app/[locale]/[projectId]/mock/{ => frame}/HashChange.tsx (100%) rename packages/web/app/[locale]/[projectId]/mock/{ => frame}/History.tsx (100%) rename packages/web/app/[locale]/[projectId]/mock/{ => frame}/InsertRes.tsx (100%) rename packages/web/app/[locale]/[projectId]/mock/{ => frame}/PromiseError.tsx (100%) create mode 100644 packages/web/app/[locale]/[projectId]/mock/frame/index.tsx diff --git a/package.json b/package.json index 80f3987..84a0aa1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ohbug-dashboard", "version": "0.11.0", - "packageManager": "pnpm@8.6.5", + "packageManager": "pnpm@8.6.6", "homepage": "https://github.com/ohbug-org/ohbug-dashboard#readme", "bugs": { "url": "https://github.com/ohbug-org/ohbug-dashboard/issues" @@ -38,20 +38,20 @@ }, "dependencies": { "@chenyueban/tsconfig": "^2.1.0", - "@ohbug/browser": "^2.4.2", - "@ohbug/core": "^2.1.1", - "@ohbug/react": "^2.0.7", - "@ohbug/types": "^2.1.1", - "@ohbug/vue": "^2.0.8", - "@prisma/client": "^4.16.1", + "@ohbug/browser": "^2.5.1", + "@ohbug/core": "^2.2.1", + "@ohbug/react": "^2.0.9", + "@ohbug/types": "^2.2.1", + "@ohbug/vue": "^2.0.10", + "@prisma/client": "^4.16.2", "@types/js-yaml": "^4.0.5", - "@types/node": "^20.3.2", + "@types/node": "^20.4.0", "@types/ramda": "^0.29.3", "cross-env": "^7.0.3", - "dayjs": "^1.11.8", + "dayjs": "^1.11.9", "js-yaml": "^4.1.0", "nodemailer": "^6.9.3", - "prisma": "^4.16.1", + "prisma": "^4.16.2", "ramda": "^0.29.0", "rimraf": "^5.0.1", "source-map-trace": "^0.2.6", @@ -64,16 +64,16 @@ "@babel/types": "^7.22.5", "@chenyueban/eslint-config": "^1.1.0", "@commitlint/cli": "^17.6.6", - "@release-it/conventional-changelog": "^5.1.1", + "@release-it/conventional-changelog": "^6.0.0", "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.67", + "@swc/core": "^1.3.68", "commitizen": "^4.3.0", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.43.0", + "eslint": "^8.44.0", "husky": "^8.0.3", "lint-staged": "^13.2.3", - "release-it": "^15.11.0", - "taze": "^0.11.0" + "release-it": "^16.0.0", + "taze": "^0.11.2" }, "prisma": { "seed": "npx tsx prisma/seed.ts" diff --git a/packages/server/package.json b/packages/server/package.json index 32a57ca..1e7bf71 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -13,15 +13,15 @@ }, "dependencies": { "@nestjs/axios": "^3.0.0", - "@nestjs/bull": "^10.0.0", - "@nestjs/cli": "^10.0.5", - "@nestjs/common": "^10.0.4", - "@nestjs/core": "^10.0.4", + "@nestjs/bull": "^10.0.1", + "@nestjs/cli": "^10.1.7", + "@nestjs/common": "^10.0.5", + "@nestjs/core": "^10.0.5", "@nestjs/mapped-types": "^2.0.2", - "@nestjs/platform-fastify": "^10.0.4", + "@nestjs/platform-fastify": "^10.0.5", "@nestjs/schedule": "^3.0.1", "@nestjs/schematics": "^10.0.1", - "@nestjs/swagger": "^7.0.12", + "@nestjs/swagger": "^7.1.1", "@types/bull": "^4.10.0", "@types/cron": "^2.0.1", "@types/express": "^4.17.17", @@ -40,7 +40,7 @@ "nestjs-pino": "^3.3.0", "pino": "^8.14.1", "pino-http": "^8.3.3", - "pino-pretty": "^10.0.0", + "pino-pretty": "^10.0.1", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1" }, diff --git a/packages/web/app/[locale]/[projectId]/mock/Ajax.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/Ajax.tsx similarity index 100% rename from packages/web/app/[locale]/[projectId]/mock/Ajax.tsx rename to packages/web/app/[locale]/[projectId]/mock/frame/Ajax.tsx diff --git a/packages/web/app/[locale]/[projectId]/mock/Config.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx similarity index 100% rename from packages/web/app/[locale]/[projectId]/mock/Config.tsx rename to packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx diff --git a/packages/web/app/[locale]/[projectId]/mock/CustomReport.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx similarity index 95% rename from packages/web/app/[locale]/[projectId]/mock/CustomReport.tsx rename to packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx index 7b58769..2a756b8 100644 --- a/packages/web/app/[locale]/[projectId]/mock/CustomReport.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx @@ -1,7 +1,7 @@ 'use client' import { Button, HStack } from '@chakra-ui/react' -import { client } from './mock' +import { client } from './index' import Card from '~/components/card' function CustomReport() { diff --git a/packages/web/app/[locale]/[projectId]/mock/Error.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx similarity index 100% rename from packages/web/app/[locale]/[projectId]/mock/Error.tsx rename to packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx diff --git a/packages/web/app/[locale]/[projectId]/mock/HashChange.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx similarity index 100% rename from packages/web/app/[locale]/[projectId]/mock/HashChange.tsx rename to packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx diff --git a/packages/web/app/[locale]/[projectId]/mock/History.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx similarity index 100% rename from packages/web/app/[locale]/[projectId]/mock/History.tsx rename to packages/web/app/[locale]/[projectId]/mock/frame/History.tsx diff --git a/packages/web/app/[locale]/[projectId]/mock/InsertRes.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx similarity index 100% rename from packages/web/app/[locale]/[projectId]/mock/InsertRes.tsx rename to packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx diff --git a/packages/web/app/[locale]/[projectId]/mock/PromiseError.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx similarity index 100% rename from packages/web/app/[locale]/[projectId]/mock/PromiseError.tsx rename to packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/index.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/index.tsx new file mode 100644 index 0000000..50d4405 --- /dev/null +++ b/packages/web/app/[locale]/[projectId]/mock/frame/index.tsx @@ -0,0 +1,65 @@ +import { Box, Wrap } from '@chakra-ui/react' +import Ohbug from '@ohbug/browser' +import OhbugExtensionFeedback from '@ohbug/extension-feedback' +import { useMemo, useRef } from 'react' +import type { OhbugClient, OhbugConfig } from '@ohbug/types' +import { useLocalStorage, useMount } from 'react-use' +import type { Project } from '@prisma/client' +import Config from './Config' +import Ajax from './Ajax' +import Error from './Error' +import HashChange from './HashChange' +import History from './History' +import InsertRes from './InsertRes' +import CustomReport from './CustomReport' +import PromiseError from './PromiseError' + +interface Props { + project: Project +} + +// eslint-disable-next-line import/no-mutable-exports +export let client: OhbugClient + +export default function Frame({ project }: Props) { + const defaultConfig = useMemo(() => { + const location = typeof window !== 'undefined' ? window.location : {} as any + return { + apiKey: project.apiKey, + appVersion: '0.0.1', + appType: 'react', + endpoint: `${location.protocol}//${location.host.split(':')[0]}:6660`, + releaseStage: 'mock', + maxActions: 10, + } + }, [project]) + const [value] = useLocalStorage('MOCK_CONFIG', defaultConfig) + const config = useMemo(() => ({ + ...defaultConfig, + ...value, + }), [defaultConfig, value]) + const feedbackRef = useRef(null) + useMount(() => { + client = Ohbug.setup(config) + client.use(OhbugExtensionFeedback(feedbackRef.current!)) + return () => { + client.destroy() + } + }) + + return ( + + + + + + + + + + + + + + ) +} diff --git a/packages/web/app/[locale]/[projectId]/mock/mock.tsx b/packages/web/app/[locale]/[projectId]/mock/mock.tsx index 7d11026..1c92345 100644 --- a/packages/web/app/[locale]/[projectId]/mock/mock.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/mock.tsx @@ -1,19 +1,7 @@ 'use client' -import Ohbug from '@ohbug/browser' -import type { OhbugClient, OhbugConfig } from '@ohbug/types' -import { Wrap } from '@chakra-ui/react' -import { useLocalStorage, useMount } from 'react-use' import type { Project } from '@prisma/client' -import { useMemo } from 'react' -import Config from './Config' -import Ajax from './Ajax' -import Error from './Error' -import HashChange from './HashChange' -import History from './History' -import InsertRes from './InsertRes' -import CustomReport from './CustomReport' -import PromiseError from './PromiseError' +import Frame from './frame' import Wrapper from '~/components/wrapper' import ThemeBox from '~/components/themeBox' @@ -21,43 +9,11 @@ interface Props { project: Project } -// eslint-disable-next-line import/no-mutable-exports -export let client: OhbugClient - export default function Mock({ project }: Props) { - const defaultConfig = useMemo(() => { - const location = typeof window !== 'undefined' ? window.location : {} as any - return { - apiKey: project.apiKey, - appVersion: '0.0.1', - appType: 'react', - endpoint: `${location.protocol}://${location.hostname}:6660`, - releaseStage: 'mock', - maxActions: 10, - } - }, [project]) - const [value] = useLocalStorage('MOCK_CONFIG', defaultConfig) - const config = useMemo(() => ({ - ...defaultConfig, - ...value, - }), [defaultConfig, value]) - useMount(() => { - client = Ohbug.setup(config) - }) - return ( - - - - - - - - - - + ) diff --git a/packages/web/components/issueDetailTitle.tsx b/packages/web/components/issueDetailTitle.tsx index b308631..8903c73 100644 --- a/packages/web/components/issueDetailTitle.tsx +++ b/packages/web/components/issueDetailTitle.tsx @@ -44,7 +44,7 @@ const IssueDetailTitle: FC = ({ issue, event }) => { = ({ issue, event }) => { > {issue.type} + { + issue.releaseStage === 'mock' && ( + + Mock + + ) + } {renderStringOrJson(metadata.filename ?? metadata.others)} - { - issue.releaseStage === 'mock' && ( - Mock - ) - } = ({ empty }) => { display="flex" href={`/${projectId}/issues/${issue.id}`} justifyContent="space-between" - noOfLines={1} + noOfLines={2} w="full" > {/* title */} @@ -280,19 +280,23 @@ const IssueList: FC = ({ empty }) => { > {issue.type} + { + issue.releaseStage === 'mock' && ( + + Mock + + ) + } {/* second description */} {renderStringOrJson(metadata.filename ?? metadata.others)} - { - issue.releaseStage === 'mock' && ( - Mock - ) - } {/* message */} =0.10.0'} + dev: true + /@angular-devkit/core@16.1.0(chokidar@3.5.3): resolution: {integrity: sha512-mrWpuDvttmhrCGcLc68RIXKtTzUhkBTsE5ZZFZNO1+FSC+vO/ZpyCpPd6C+6coM68NfXYjHlms5XF6KbxeGn/Q==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} @@ -369,13 +392,30 @@ packages: source-map: 0.7.4 dev: false - /@angular-devkit/schematics-cli@16.1.0(chokidar@3.5.3): - resolution: {integrity: sha512-siBpRDmMMV7NB+NvaDHeJ4doHoSkFwIywwFj8GXnBCtobyxrBl1EyG1cKK+FHRydYtyYIk8FEoOpJA9oE9S2hg==} + /@angular-devkit/core@16.1.3(chokidar@3.5.3): + resolution: {integrity: sha512-cFhNdJHumNMZGD3NYxOtNuMGRQXeDnKbwvK+IJmKAttXt8na6EvURR/ZxZOI7rl/YRVX+vcNSdtXz3hE6g+Isw==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + chokidar: 3.5.3 + jsonc-parser: 3.2.0 + rxjs: 7.8.1 + source-map: 0.7.4 + dev: false + + /@angular-devkit/schematics-cli@16.1.3(chokidar@3.5.3): + resolution: {integrity: sha512-uZAi5xrvZLgQkqVsR0wxbUZgiMHVNstOnNm446Bs69iadbLymvWvdg95hYPL3IWAlYrNiwwGNSjyp6JS0Qn06Q==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) + '@angular-devkit/core': 16.1.3(chokidar@3.5.3) + '@angular-devkit/schematics': 16.1.3(chokidar@3.5.3) ansi-colors: 4.1.3 inquirer: 8.2.4 symbol-observable: 4.0.0 @@ -397,6 +437,19 @@ packages: - chokidar dev: false + /@angular-devkit/schematics@16.1.3(chokidar@3.5.3): + resolution: {integrity: sha512-hWEuQnfQOgcSs4YX6iF4QR/34ROeSPaMi7lQOYg33hStg+pnk/JDdIU0f2nrIIz3t0jqAj+5VXVLBJvOCd84vg==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + dependencies: + '@angular-devkit/core': 16.1.3(chokidar@3.5.3) + jsonc-parser: 3.2.0 + magic-string: 0.30.0 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + dev: false + /@antfu/ni@0.21.4: resolution: {integrity: sha512-O0Uv9LbLDSoEg26fnMDdDRiPwFJnQSoD4WnrflDwKCJm8Cx/0mV4cGxwBLXan5mGIrpK4Dd7vizf4rQm0QCEAA==} hasBin: true @@ -485,7 +538,7 @@ packages: '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 - /@chakra-ui/accordion@2.2.0(@chakra-ui/system@2.5.8)(framer-motion@10.12.17)(react@18.2.0): + /@chakra-ui/accordion@2.2.0(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0): resolution: {integrity: sha512-2IK1iLzTZ22u8GKPPPn65mqJdZidn4AvkgAbv17ISdKA07VHJ8jSd4QF1T5iCXjKfZ0XaXozmhP4kDhjwF2IbQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -499,8 +552,8 @@ packages: '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/transition': 2.0.16(framer-motion@10.12.17)(react@18.2.0) - framer-motion: 10.12.17(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/transition': 2.0.16(framer-motion@10.12.18)(react@18.2.0) + framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false @@ -817,7 +870,7 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/menu@2.1.15(@chakra-ui/system@2.5.8)(framer-motion@10.12.17)(react@18.2.0): + /@chakra-ui/menu@2.1.15(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0): resolution: {integrity: sha512-+1fh7KBKZyhy8wi7Q6nQAzrvjM6xggyhGMnSna0rt6FJVA2jlfkjb5FozyIVPnkfJKjkKd8THVhrs9E7pHNV/w==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -839,12 +892,12 @@ packages: '@chakra-ui/react-use-update-effect': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/transition': 2.0.16(framer-motion@10.12.17)(react@18.2.0) - framer-motion: 10.12.17(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/transition': 2.0.16(framer-motion@10.12.18)(react@18.2.0) + framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/modal@2.2.12(@chakra-ui/system@2.5.8)(@types/react@18.2.14)(framer-motion@10.12.17)(react-dom@18.2.0)(react@18.2.0): + /@chakra-ui/modal@2.2.12(@chakra-ui/system@2.5.8)(@types/react@18.2.14)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-F1nNmYGvyqlmxidbwaBM3y57NhZ/Qeyc8BE9tb1FL1v9nxQhkfrPvMQ9miK0O1syPN6aZ5MMj+uD3AsRFE+/tA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -860,9 +913,9 @@ packages: '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/transition': 2.0.16(framer-motion@10.12.17)(react@18.2.0) + '@chakra-ui/transition': 2.0.16(framer-motion@10.12.18)(react@18.2.0) aria-hidden: 1.2.3 - framer-motion: 10.12.17(react-dom@18.2.0)(react@18.2.0) + framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-remove-scroll: 2.5.5(@types/react@18.2.14)(react@18.2.0) @@ -870,7 +923,7 @@ packages: - '@types/react' dev: false - /@chakra-ui/next-js@2.1.4(@chakra-ui/react@2.7.1)(@emotion/react@11.11.1)(next@13.4.7)(react@18.2.0): + /@chakra-ui/next-js@2.1.4(@chakra-ui/react@2.7.1)(@emotion/react@11.11.1)(next@13.4.9)(react@18.2.0): resolution: {integrity: sha512-qPmpZSA6ONozcD8gC8fyuEPqweZqk1Y4ar/hbfUDLMdCCRsU+aigN6ay2HBBn3kPzzMOE6BUlkgvij8uB8smxQ==} peerDependencies: '@chakra-ui/react': '>=2.4.0' @@ -878,10 +931,10 @@ packages: next: '>=13' react: '>=18' dependencies: - '@chakra-ui/react': 2.7.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.14)(framer-motion@10.12.17)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react': 2.7.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.14)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0) '@emotion/cache': 11.11.0 '@emotion/react': 11.11.1(@types/react@18.2.14)(react@18.2.0) - next: 13.4.7(react-dom@18.2.0)(react@18.2.0) + next: 13.4.9(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false @@ -931,7 +984,7 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/popover@2.1.12(@chakra-ui/system@2.5.8)(framer-motion@10.12.17)(react@18.2.0): + /@chakra-ui/popover@2.1.12(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0): resolution: {integrity: sha512-Corh8trA1f3ydcMQqomgSvYNNhAlpxiBpMY2sglwYazOJcueHA8CI05cJVD0T/wwoTob7BShabhCGFZThn61Ng==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -950,7 +1003,7 @@ packages: '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - framer-motion: 10.12.17(react-dom@18.2.0)(react@18.2.0) + framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1218,7 +1271,7 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react@2.7.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.14)(framer-motion@10.12.17)(react-dom@18.2.0)(react@18.2.0): + /@chakra-ui/react@2.7.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.14)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-uIYIAg+gnUoRbgdCfSEVvQnrEz0oWWXATGGSQpxmuJovNVyZKnX/Xug7NkWQfBUJPYRSG+VB69ZmsAFpyLSMtA==} peerDependencies: '@emotion/react': ^11.0.0 @@ -1227,7 +1280,7 @@ packages: react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/accordion': 2.2.0(@chakra-ui/system@2.5.8)(framer-motion@10.12.17)(react@18.2.0) + '@chakra-ui/accordion': 2.2.0(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0) '@chakra-ui/alert': 2.1.0(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/avatar': 2.2.11(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/breadcrumb': 2.1.5(@chakra-ui/system@2.5.8)(react@18.2.0) @@ -1248,11 +1301,11 @@ packages: '@chakra-ui/layout': 2.2.0(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/live-region': 2.0.13(react@18.2.0) '@chakra-ui/media-query': 3.2.12(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/menu': 2.1.15(@chakra-ui/system@2.5.8)(framer-motion@10.12.17)(react@18.2.0) - '@chakra-ui/modal': 2.2.12(@chakra-ui/system@2.5.8)(@types/react@18.2.14)(framer-motion@10.12.17)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/menu': 2.1.15(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0) + '@chakra-ui/modal': 2.2.12(@chakra-ui/system@2.5.8)(@types/react@18.2.14)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0) '@chakra-ui/number-input': 2.0.19(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/pin-input': 2.0.20(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/popover': 2.1.12(@chakra-ui/system@2.5.8)(framer-motion@10.12.17)(react@18.2.0) + '@chakra-ui/popover': 2.1.12(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0) '@chakra-ui/popper': 3.0.14(react@18.2.0) '@chakra-ui/portal': 2.0.16(react-dom@18.2.0)(react@18.2.0) '@chakra-ui/progress': 2.1.6(@chakra-ui/system@2.5.8)(react@18.2.0) @@ -1267,7 +1320,7 @@ packages: '@chakra-ui/stat': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/stepper': 2.2.0(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/switch': 2.0.27(@chakra-ui/system@2.5.8)(framer-motion@10.12.17)(react@18.2.0) + '@chakra-ui/switch': 2.0.27(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0) '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) '@chakra-ui/table': 2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/tabs': 2.1.9(@chakra-ui/system@2.5.8)(react@18.2.0) @@ -1275,14 +1328,14 @@ packages: '@chakra-ui/textarea': 2.0.19(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/theme': 3.1.2(@chakra-ui/styled-system@2.9.1) '@chakra-ui/theme-utils': 2.0.18 - '@chakra-ui/toast': 6.1.4(@chakra-ui/system@2.5.8)(framer-motion@10.12.17)(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/tooltip': 2.2.9(@chakra-ui/system@2.5.8)(framer-motion@10.12.17)(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/transition': 2.0.16(framer-motion@10.12.17)(react@18.2.0) + '@chakra-ui/toast': 6.1.4(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/tooltip': 2.2.9(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/transition': 2.0.16(framer-motion@10.12.18)(react@18.2.0) '@chakra-ui/utils': 2.0.15 '@chakra-ui/visually-hidden': 2.0.15(@chakra-ui/system@2.5.8)(react@18.2.0) '@emotion/react': 11.11.1(@types/react@18.2.14)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.14)(react@18.2.0) - framer-motion: 10.12.17(react-dom@18.2.0)(react@18.2.0) + framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -1393,7 +1446,7 @@ packages: lodash.mergewith: 4.6.2 dev: false - /@chakra-ui/switch@2.0.27(@chakra-ui/system@2.5.8)(framer-motion@10.12.17)(react@18.2.0): + /@chakra-ui/switch@2.0.27(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0): resolution: {integrity: sha512-z76y2fxwMlvRBrC5W8xsZvo3gP+zAEbT3Nqy5P8uh/IPd5OvDsGeac90t5cgnQTyxMOpznUNNK+1eUZqtLxWnQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -1403,7 +1456,7 @@ packages: '@chakra-ui/checkbox': 2.2.15(@chakra-ui/system@2.5.8)(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - framer-motion: 10.12.17(react-dom@18.2.0)(react@18.2.0) + framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1512,7 +1565,7 @@ packages: '@chakra-ui/theme-tools': 2.0.18(@chakra-ui/styled-system@2.9.1) dev: false - /@chakra-ui/toast@6.1.4(@chakra-ui/system@2.5.8)(framer-motion@10.12.17)(react-dom@18.2.0)(react@18.2.0): + /@chakra-ui/toast@6.1.4(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-wAcPHq/N/ar4jQxkUGhnsbp+lx2eKOpHxn1KaWdHXUkqCNUA1z09fvBsoMyzObSiiwbDuQPZG5RxsOhzfPZX4Q==} peerDependencies: '@chakra-ui/system': 2.5.8 @@ -1530,12 +1583,12 @@ packages: '@chakra-ui/styled-system': 2.9.1 '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) '@chakra-ui/theme': 3.1.2(@chakra-ui/styled-system@2.9.1) - framer-motion: 10.12.17(react-dom@18.2.0)(react@18.2.0) + framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@chakra-ui/tooltip@2.2.9(@chakra-ui/system@2.5.8)(framer-motion@10.12.17)(react-dom@18.2.0)(react@18.2.0): + /@chakra-ui/tooltip@2.2.9(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-ZoksllanqXRUyMDaiogvUVJ+RdFXwZrfrwx3RV22fejYZIQ602hZ3QHtHLB5ZnKFLbvXKMZKM23HxFTSb0Ytqg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -1552,19 +1605,19 @@ packages: '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - framer-motion: 10.12.17(react-dom@18.2.0)(react@18.2.0) + framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@chakra-ui/transition@2.0.16(framer-motion@10.12.17)(react@18.2.0): + /@chakra-ui/transition@2.0.16(framer-motion@10.12.18)(react@18.2.0): resolution: {integrity: sha512-E+RkwlPc3H7P1crEXmXwDXMB2lqY2LLia2P5siQ4IEnRWIgZXlIw+8Em+NtHNgusel2N+9yuB0wT9SeZZeZ3CQ==} peerDependencies: framer-motion: '>=4.0.0' react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - framer-motion: 10.12.17(react-dom@18.2.0)(react@18.2.0) + framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1596,28 +1649,28 @@ packages: react: 18.2.0 dev: false - /@chenyueban/eslint-config@1.1.0(eslint@8.43.0)(typescript@5.1.6): + /@chenyueban/eslint-config@1.1.0(eslint@8.44.0)(typescript@5.1.6): resolution: {integrity: sha512-9PRBA1LIiWM6a4kYLRZUFBzKVFBlndtePy9AynQb+GG1/fyfFVhb57K8wrMFpVhJtgwtcpvOiv2q5J0/nQOiHQ==} engines: {node: '>=16', npm: '>=7'} peerDependencies: eslint: ^8.0.0 dependencies: - '@typescript-eslint/eslint-plugin': 5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.43.0)(typescript@5.1.6) - '@typescript-eslint/parser': 5.60.1(eslint@8.43.0)(typescript@5.1.6) - eslint: 8.43.0 - eslint-config-standard: 17.1.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@16.0.1)(eslint-plugin-promise@6.1.1)(eslint@8.43.0) - eslint-plugin-eslint-comments: 3.2.0(eslint@8.43.0) + '@typescript-eslint/eslint-plugin': 5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/parser': 5.60.1(eslint@8.44.0)(typescript@5.1.6) + eslint: 8.44.0 + eslint-config-standard: 17.1.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@16.0.1)(eslint-plugin-promise@6.1.1)(eslint@8.44.0) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.44.0) eslint-plugin-html: 7.1.0 - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.1)(eslint@8.43.0) - eslint-plugin-jsonc: 2.9.0(eslint@8.43.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.1)(eslint@8.44.0) + eslint-plugin-jsonc: 2.9.0(eslint@8.44.0) eslint-plugin-jsx: 0.1.0 - eslint-plugin-markdown: 3.0.0(eslint@8.43.0) - eslint-plugin-n: 16.0.1(eslint@8.43.0) - eslint-plugin-promise: 6.1.1(eslint@8.43.0) - eslint-plugin-react: 7.32.2(eslint@8.43.0) - eslint-plugin-unicorn: 47.0.0(eslint@8.43.0) - eslint-plugin-vue: 9.15.1(eslint@8.43.0) - eslint-plugin-yml: 1.8.0(eslint@8.43.0) + eslint-plugin-markdown: 3.0.0(eslint@8.44.0) + eslint-plugin-n: 16.0.1(eslint@8.44.0) + eslint-plugin-promise: 6.1.1(eslint@8.44.0) + eslint-plugin-react: 7.32.2(eslint@8.44.0) + eslint-plugin-unicorn: 47.0.0(eslint@8.44.0) + eslint-plugin-vue: 9.15.1(eslint@8.44.0) + eslint-plugin-yml: 1.8.0(eslint@8.44.0) jsonc-eslint-parser: 2.3.0 yaml-eslint-parser: 1.2.2 transitivePeerDependencies: @@ -1643,14 +1696,14 @@ packages: dev: false optional: true - /@commitlint/cli@17.6.6(@swc/core@1.3.67): + /@commitlint/cli@17.6.6(@swc/core@1.3.68): resolution: {integrity: sha512-sTKpr2i/Fjs9OmhU+beBxjPavpnLSqZaO6CzwKVq2Tc4UYVTMFgpKOslDhUBVlfAUBfjVO8ParxC/MXkIOevEA==} engines: {node: '>=v14'} hasBin: true dependencies: '@commitlint/format': 17.4.4 '@commitlint/lint': 17.6.6 - '@commitlint/load': 17.5.0(@swc/core@1.3.67) + '@commitlint/load': 17.5.0(@swc/core@1.3.68) '@commitlint/read': 17.5.1 '@commitlint/types': 17.4.4 execa: 5.1.1 @@ -1714,7 +1767,7 @@ packages: '@commitlint/types': 17.4.4 dev: true - /@commitlint/load@17.5.0(@swc/core@1.3.67): + /@commitlint/load@17.5.0(@swc/core@1.3.68): resolution: {integrity: sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==} engines: {node: '>=v14'} dependencies: @@ -1722,15 +1775,15 @@ packages: '@commitlint/execute-rule': 17.4.0 '@commitlint/resolve-extends': 17.4.4 '@commitlint/types': 17.4.4 - '@types/node': 20.3.2 + '@types/node': 20.4.0 chalk: 4.1.2 cosmiconfig: 8.1.3 - cosmiconfig-typescript-loader: 4.2.0(@types/node@20.3.2)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.1.6) + cosmiconfig-typescript-loader: 4.2.0(@types/node@20.4.0)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.1.6) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@swc/core@1.3.67)(@types/node@20.3.2)(typescript@5.1.6) + ts-node: 10.9.1(@swc/core@1.3.68)(@types/node@20.4.0)(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - '@swc/core' @@ -2154,13 +2207,13 @@ packages: requiresBuild: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.43.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.44.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.43.0 + eslint: 8.44.0 eslint-visitor-keys: 3.4.1 dev: true @@ -2169,13 +2222,13 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@2.0.3: - resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} + /@eslint/eslintrc@2.1.0: + resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.5.2 + espree: 9.6.0 globals: 13.20.0 ignore: 5.2.4 import-fresh: 3.3.0 @@ -2186,8 +2239,8 @@ packages: - supports-color dev: true - /@eslint/js@8.43.0: - resolution: {integrity: sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==} + /@eslint/js@8.44.0: + resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -2443,7 +2496,7 @@ packages: dev: false optional: true - /@nestjs/axios@3.0.0(@nestjs/common@10.0.4)(axios@1.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + /@nestjs/axios@3.0.0(@nestjs/common@10.0.5)(axios@1.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): resolution: {integrity: sha512-ULdH03jDWkS5dy9X69XbUVbhC+0pVnrRcj7bIK/ytTZ76w7CgvTZDJqsIyisg3kNOiljRW/4NIjSf3j6YGvl+g==} peerDependencies: '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -2451,39 +2504,39 @@ packages: reflect-metadata: ^0.1.12 rxjs: ^6.0.0 || ^7.0.0 dependencies: - '@nestjs/common': 10.0.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) axios: 1.4.0 reflect-metadata: 0.1.13 rxjs: 7.8.1 dev: false - /@nestjs/bull-shared@10.0.0(@nestjs/common@10.0.4)(@nestjs/core@10.0.4): - resolution: {integrity: sha512-eejy+Us25q/8xab4hUwyi/nO83gGpobTHCoYnXPjR9tlrT03EK+tvB+Fy0Vlka1PpVnu5408R3ThgZu9Mp6F3A==} + /@nestjs/bull-shared@10.0.1(@nestjs/common@10.0.5)(@nestjs/core@10.0.5): + resolution: {integrity: sha512-8Td36l2i5x9+iQWjPB5Bd5+6u5Eangb5DclNcwrdwKqvd28xE92MSW97P4JV52C2kxrTjZwx8ck/wObAwtpQPw==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 dependencies: - '@nestjs/common': 10.0.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.4(@nestjs/common@10.0.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) - tslib: 2.5.3 + '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) + tslib: 2.6.0 dev: false - /@nestjs/bull@10.0.0(@nestjs/common@10.0.4)(@nestjs/core@10.0.4)(bull@4.10.4): - resolution: {integrity: sha512-u5dNOQu3SezolZvyFoJp3mURQxA1Y2QT6Ib1IHp7/Z6ujomu1ZJHsOWcvZ+tiSV1HTBMpUZfY1gKI5TeXEzcDw==} + /@nestjs/bull@10.0.1(@nestjs/common@10.0.5)(@nestjs/core@10.0.5)(bull@4.10.4): + resolution: {integrity: sha512-1GcJ8BkHDgQdBMZ7SqAqgUHiFnISXmpGvewFeTc8wf87JLk2PweiKv9j9/KQKU+NI237pCe82XB0bXzTnsdxSw==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 bull: ^3.3 || ^4.0.0 dependencies: - '@nestjs/bull-shared': 10.0.0(@nestjs/common@10.0.4)(@nestjs/core@10.0.4) - '@nestjs/common': 10.0.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.4(@nestjs/common@10.0.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/bull-shared': 10.0.1(@nestjs/common@10.0.5)(@nestjs/core@10.0.5) + '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) bull: 4.10.4 - tslib: 2.5.3 + tslib: 2.6.0 dev: false - /@nestjs/cli@10.0.5(@swc/cli@0.1.62)(@swc/core@1.3.67)(esbuild@0.18.10): - resolution: {integrity: sha512-Btc1lzAkm4j+af9YA0Kv+6N2x7vDneEhsozzEp87kHZrONYNS8zg/SBFTRx5b/e6g0MJshv6vP56PVrdNZy3kA==} + /@nestjs/cli@10.1.7(@swc/cli@0.1.62)(@swc/core@1.3.68)(esbuild@0.18.10): + resolution: {integrity: sha512-YybaBuZpVhdT/ouVNnVUdpoPiuZ108GhY5eMuQJmMpA8FWLvLhyho0cSL36JCmqguyoQUMjZ+BeqaOAUgBRVuA==} engines: {node: '>= 16'} hasBin: true peerDependencies: @@ -2495,17 +2548,17 @@ packages: '@swc/core': optional: true dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) - '@angular-devkit/schematics-cli': 16.1.0(chokidar@3.5.3) - '@nestjs/schematics': 10.0.1(chokidar@3.5.3)(typescript@5.1.3) - '@swc/cli': 0.1.62(@swc/core@1.3.67) - '@swc/core': 1.3.67 + '@angular-devkit/core': 16.1.3(chokidar@3.5.3) + '@angular-devkit/schematics': 16.1.3(chokidar@3.5.3) + '@angular-devkit/schematics-cli': 16.1.3(chokidar@3.5.3) + '@nestjs/schematics': 10.0.1(chokidar@3.5.3)(typescript@5.1.6) + '@swc/cli': 0.1.62(@swc/core@1.3.68) + '@swc/core': 1.3.68 chalk: 4.1.2 chokidar: 3.5.3 cli-table3: 0.6.3 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.1.3)(webpack@5.87.0) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.1.6)(webpack@5.88.1) inquirer: 8.2.5 node-emoji: 1.11.0 ora: 5.4.1 @@ -2516,8 +2569,8 @@ packages: tree-kill: 1.2.2 tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.0.1 - typescript: 5.1.3 - webpack: 5.87.0(@swc/core@1.3.67)(esbuild@0.18.10) + typescript: 5.1.6 + webpack: 5.88.1(@swc/core@1.3.68)(esbuild@0.18.10) webpack-node-externals: 3.0.0 transitivePeerDependencies: - esbuild @@ -2525,8 +2578,8 @@ packages: - webpack-cli dev: false - /@nestjs/common@10.0.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-p/QG9u5qUAjFlf1DdifPw87KK24hEY3GldignHrM6NgoKzdBXPNA4k8FL0I+HYPqX/hH7pAUEHQCUmjAz5L8bg==} + /@nestjs/common@10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-0E+SBI+SKswXbFG+Nwtnctrei5dvdFJ7b9/fQDL6KzDBtZwsglJpD86S3ooxnc7ek4vRG57oN2iLmMTjrcesMg==} peerDependencies: class-transformer: '*' class-validator: '*' @@ -2547,8 +2600,8 @@ packages: uid: 2.0.2 dev: false - /@nestjs/core@10.0.4(@nestjs/common@10.0.4)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-shYB81/FgxtnlXRYcadzmduewkgjxGtIoTZBVzf9SM2FmLiltVGQJvZFkOdweTss19yA/503H62duZ6/Syev4w==} + /@nestjs/core@10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-9A8nixBfE33TWAmmWvNoxdmHrRmHJY0oO3O4Iue0FVkawWJc0YOhSqdNs87McwvKE4InJMI7GVv01NYMEROdPA==} requiresBuild: true peerDependencies: '@nestjs/common': ^10.0.0 @@ -2565,7 +2618,7 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 10.0.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 @@ -2578,7 +2631,7 @@ packages: - encoding dev: false - /@nestjs/mapped-types@2.0.2(@nestjs/common@10.0.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): + /@nestjs/mapped-types@2.0.2(@nestjs/common@10.0.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): resolution: {integrity: sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -2591,14 +2644,14 @@ packages: class-validator: optional: true dependencies: - '@nestjs/common': 10.0.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) class-transformer: 0.5.1 class-validator: 0.14.0 reflect-metadata: 0.1.13 dev: false - /@nestjs/platform-fastify@10.0.4(@nestjs/common@10.0.4)(@nestjs/core@10.0.4): - resolution: {integrity: sha512-CvAxltupEyTCqgAF9uSX8nzNyu7pm9V0oWpgWWmaXZsKcwF2FUypfIQWCZXmJR6fVuz0CbBczZJG5Gpi9v3EPA==} + /@nestjs/platform-fastify@10.0.5(@nestjs/common@10.0.5)(@nestjs/core@10.0.5): + resolution: {integrity: sha512-kkQetzDuLmDWpC2uw14P+XGxANLfQ2dAxJ6GHoZ+rEN+TYUppV1EzKLX7rXfLlQgm+EM2WSvEvFuScmcw+gHLA==} peerDependencies: '@fastify/static': ^6.0.0 '@fastify/view': ^7.0.0 @@ -2613,9 +2666,9 @@ packages: '@fastify/cors': 8.3.0 '@fastify/formbody': 7.4.0 '@fastify/middie': 8.3.0 - '@nestjs/common': 10.0.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.4(@nestjs/common@10.0.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) - fastify: 4.18.0 + '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) + fastify: 4.19.1 light-my-request: 5.10.0 path-to-regexp: 3.2.0 tslib: 2.6.0 @@ -2623,36 +2676,21 @@ packages: - supports-color dev: false - /@nestjs/schedule@3.0.1(@nestjs/common@10.0.4)(@nestjs/core@10.0.4)(reflect-metadata@0.1.13): + /@nestjs/schedule@3.0.1(@nestjs/common@10.0.5)(@nestjs/core@10.0.5)(reflect-metadata@0.1.13): resolution: {integrity: sha512-4CAFu4rE/QPYnz/icRg3GiuLmY1bXopG8bWTJ9d7bXzaHBaPKIjGvZ20wsK8P+MncrVCkmK0iYhQrNj0cwX9+A==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 reflect-metadata: ^0.1.12 dependencies: - '@nestjs/common': 10.0.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.4(@nestjs/common@10.0.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) cron: 2.3.1 reflect-metadata: 0.1.13 uuid: 9.0.0 dev: false - /@nestjs/schematics@10.0.1(chokidar@3.5.3)(typescript@5.1.3): - resolution: {integrity: sha512-buxpYtSwOmWyf0nUJWJCkCkYITwbOfIEKHTnGS7sDbcfaajrOFXb5pPAGD2E1CUb3C1+NkQIURPKzs0IouZTQg==} - peerDependencies: - typescript: '>=4.8.2' - dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) - comment-json: 4.2.3 - jsonc-parser: 3.2.0 - pluralize: 8.0.0 - typescript: 5.1.3 - transitivePeerDependencies: - - chokidar - dev: false - - /@nestjs/schematics@10.0.1(typescript@5.1.6): + /@nestjs/schematics@10.0.1(chokidar@3.5.3)(typescript@5.1.6): resolution: {integrity: sha512-buxpYtSwOmWyf0nUJWJCkCkYITwbOfIEKHTnGS7sDbcfaajrOFXb5pPAGD2E1CUb3C1+NkQIURPKzs0IouZTQg==} peerDependencies: typescript: '>=4.8.2' @@ -2667,8 +2705,8 @@ packages: - chokidar dev: false - /@nestjs/swagger@7.0.12(@nestjs/common@10.0.4)(@nestjs/core@10.0.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): - resolution: {integrity: sha512-GOUc/WvDVzKyAwPe4P+Mds1xSvw9pxWOlIkOO0udjj2uQsOLizDBfmOVquZt3stTcdfu1CPVJAXxUHXgz51/EA==} + /@nestjs/swagger@7.1.1(@nestjs/common@10.0.5)(@nestjs/core@10.0.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-gIG1aVCegZlIppXZizKHqWkqZvQkvptTBR1C5CzZoDwGoVVKJBmJ2i9FAcsnzzb0j7hncFKhcBuWYOBJOsCvug==} peerDependencies: '@fastify/static': ^6.0.0 '@nestjs/common': ^9.0.0 || ^10.0.0 @@ -2684,9 +2722,9 @@ packages: class-validator: optional: true dependencies: - '@nestjs/common': 10.0.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.4(@nestjs/common@10.0.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/mapped-types': 2.0.2(@nestjs/common@10.0.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/mapped-types': 2.0.2(@nestjs/common@10.0.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) class-transformer: 0.5.1 class-validator: 0.14.0 js-yaml: 4.1.0 @@ -2696,22 +2734,22 @@ packages: swagger-ui-dist: 5.1.0 dev: false - /@next-auth/prisma-adapter@1.0.7(@prisma/client@4.16.1)(next-auth@4.22.1): + /@next-auth/prisma-adapter@1.0.7(@prisma/client@4.16.2)(next-auth@4.22.1): resolution: {integrity: sha512-Cdko4KfcmKjsyHFrWwZ//lfLUbcLqlyFqjd/nYE2m3aZ7tjMNUjpks47iw7NTCnXf+5UWz5Ypyt1dSs1EP5QJw==} peerDependencies: '@prisma/client': '>=2.26.0 || >=3' next-auth: ^4 dependencies: - '@prisma/client': 4.16.1(prisma@4.16.1) - next-auth: 4.22.1(next@13.4.7)(nodemailer@6.9.3)(react-dom@18.2.0)(react@18.2.0) + '@prisma/client': 4.16.2(prisma@4.16.2) + next-auth: 4.22.1(next@13.4.9)(nodemailer@6.9.3)(react-dom@18.2.0)(react@18.2.0) dev: false - /@next/env@13.4.7: - resolution: {integrity: sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==} + /@next/env@13.4.9: + resolution: {integrity: sha512-vuDRK05BOKfmoBYLNi2cujG2jrYbEod/ubSSyqgmEx9n/W3eZaJQdRNhTfumO+qmq/QTzLurW487n/PM/fHOkw==} dev: false - /@next/swc-darwin-arm64@13.4.7: - resolution: {integrity: sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==} + /@next/swc-darwin-arm64@13.4.9: + resolution: {integrity: sha512-TVzGHpZoVBk3iDsTOQA/R6MGmFp0+17SWXMEWd6zG30AfuELmSSMe2SdPqxwXU0gbpWkJL1KgfLzy5ReN0crqQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -2719,8 +2757,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@13.4.7: - resolution: {integrity: sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==} + /@next/swc-darwin-x64@13.4.9: + resolution: {integrity: sha512-aSfF1fhv28N2e7vrDZ6zOQ+IIthocfaxuMWGReB5GDriF0caTqtHttAvzOMgJgXQtQx6XhyaJMozLTSEXeNN+A==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -2728,8 +2766,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@13.4.7: - resolution: {integrity: sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==} + /@next/swc-linux-arm64-gnu@13.4.9: + resolution: {integrity: sha512-JhKoX5ECzYoTVyIy/7KykeO4Z2lVKq7HGQqvAH+Ip9UFn1MOJkOnkPRB7v4nmzqAoY+Je05Aj5wNABR1N18DMg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -2737,8 +2775,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@13.4.7: - resolution: {integrity: sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==} + /@next/swc-linux-arm64-musl@13.4.9: + resolution: {integrity: sha512-OOn6zZBIVkm/4j5gkPdGn4yqQt+gmXaLaSjRSO434WplV8vo2YaBNbSHaTM9wJpZTHVDYyjzuIYVEzy9/5RVZw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -2746,8 +2784,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@13.4.7: - resolution: {integrity: sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==} + /@next/swc-linux-x64-gnu@13.4.9: + resolution: {integrity: sha512-iA+fJXFPpW0SwGmx/pivVU+2t4zQHNOOAr5T378PfxPHY6JtjV6/0s1vlAJUdIHeVpX98CLp9k5VuKgxiRHUpg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -2755,8 +2793,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@13.4.7: - resolution: {integrity: sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==} + /@next/swc-linux-x64-musl@13.4.9: + resolution: {integrity: sha512-rlNf2WUtMM+GAQrZ9gMNdSapkVi3koSW3a+dmBVp42lfugWVvnyzca/xJlN48/7AGx8qu62WyO0ya1ikgOxh6A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -2764,8 +2802,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@13.4.7: - resolution: {integrity: sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==} + /@next/swc-win32-arm64-msvc@13.4.9: + resolution: {integrity: sha512-5T9ybSugXP77nw03vlgKZxD99AFTHaX8eT1ayKYYnGO9nmYhJjRPxcjU5FyYI+TdkQgEpIcH7p/guPLPR0EbKA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -2773,8 +2811,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@13.4.7: - resolution: {integrity: sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==} + /@next/swc-win32-ia32-msvc@13.4.9: + resolution: {integrity: sha512-ojZTCt1lP2ucgpoiFgrFj07uq4CZsq4crVXpLGgQfoFq00jPKRPgesuGPaz8lg1yLfvafkU3Jd1i8snKwYR3LA==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -2782,8 +2820,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@13.4.7: - resolution: {integrity: sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==} + /@next/swc-win32-x64-msvc@13.4.9: + resolution: {integrity: sha512-QbT03FXRNdpuL+e9pLnu+XajZdm/TtIXVYY4lA9t+9l0fLZbHXDYEKitAqxrOj37o3Vx5ufxiRAniaIebYDCgw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3009,8 +3047,8 @@ packages: - encoding dev: true - /@octokit/rest@19.0.11: - resolution: {integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==} + /@octokit/rest@19.0.13: + resolution: {integrity: sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==} engines: {node: '>= 14'} dependencies: '@octokit/core': 4.2.4 @@ -3043,50 +3081,94 @@ packages: '@octokit/openapi-types': 18.0.0 dev: true - /@ohbug/browser@2.4.2: - resolution: {integrity: sha512-sFag3mSfSrtSsS9++NCeVWHwgvT5ReVav+SI4PvEelUz1YMdp2/vA3kSjdqS02eSXvGSFnQn6QZ9xS/OsdDIYA==} + /@ohbug/browser@2.5.1: + resolution: {integrity: sha512-b6XBS7ZXG+7zZmy+S6CVeYYYJphTb/HVt2kfFVD9gC9MXiwTAjHMTkjDKp39jBnqJHv6qMKrUpol7pQAhmcOPA==} dependencies: - '@ohbug/core': 2.1.1 - '@ohbug/types': 2.1.1 - '@ohbug/utils': 2.0.6 + '@ohbug/core': 2.2.1 + '@ohbug/types': 2.2.1 + '@ohbug/utils': 2.0.8 error-stack-parser: 2.1.4 dev: false - /@ohbug/core@2.1.1: - resolution: {integrity: sha512-iW6QMwB5MesHQH9jW0xWalTdUKkbtgxudHHq9KgP1tznLuIv00LE454TpBX7sRudjSI90X7I3MYkRGXybLii+g==} + /@ohbug/core@2.2.1: + resolution: {integrity: sha512-fLQ4nSJ28CLmV642zZIDCvI1XbBcWOLQ7HYG5wQYQskSAtz8nbuu3uA4lxpNfrOAe6qmhQa4MZSh8jalBDwTzQ==} + dependencies: + '@ohbug/types': 2.2.1 + '@ohbug/utils': 2.0.8 + dev: false + + /@ohbug/extension-feedback@0.7.2: + resolution: {integrity: sha512-wSXmeua/rIFON4OhvqFipCVWQAZkdQVJP7muqgGKOvo0pcU6w/ut1dQ6kib1tPyCt16i5ayVC54VJe44NvdMIA==} + dependencies: + '@ohbug/types': 2.2.1 + '@ohbug/utils': 2.0.8 + solid-js: 1.7.7 + dev: false + + /@ohbug/extension-rrweb@1.10.1(rrweb@2.0.0-alpha.4): + resolution: {integrity: sha512-KRq/RqgemR+KDlBNP4ojRYhtcfZVolzGaKSLPVJeG/EJCQg9VMvphskHI7BoQyDmOQTm4Nlj5Yg9JS7U9ooksA==} + peerDependencies: + rrweb: ^2.0.0 + dependencies: + '@ohbug/core': 2.2.1 + '@ohbug/types': 2.2.1 + '@rrweb/types': 2.0.0-alpha.9 + rrweb: 2.0.0-alpha.4 + dev: false + + /@ohbug/extension-uuid@2.1.1: + resolution: {integrity: sha512-dC7khwKnQ8cgpJI62nvF1cBUp0C33ZQp01vizCteG5BIAI2smQL5dWZhd5GZ0DiYxvv1YmZ3I5BVnuFLCWo/gA==} + dependencies: + '@ohbug/types': 2.2.1 + '@ohbug/utils': 2.0.8 + uuid: 9.0.0 + dev: false + + /@ohbug/extension-view@0.1.1: + resolution: {integrity: sha512-mtEzlD29Mld5sjYjxOfbjKwJNlGpPCImeYgLS/7QzrzS5OydX7fz+fKhHJmfFciVRqdB8Spd2bRJ1KUoHAmtnQ==} dependencies: - '@ohbug/types': 2.1.1 - '@ohbug/utils': 2.0.6 + '@ohbug/types': 2.2.1 + '@ohbug/utils': 2.0.8 + dayjs: 1.11.9 dev: false - /@ohbug/react@2.0.7(react@16.14.0): - resolution: {integrity: sha512-HQ0Ai//rZWJSIL6auVSwzSynemo9nam/MAuWuCaacKNKI30H5BW7aYivt6dRNM/XVNpFr6V6XvAlJ/JpeCLW5w==} + /@ohbug/extension-web-vitals@0.2.1(web-vitals@3.3.2): + resolution: {integrity: sha512-1b7f0Q7xoTjCk2y0PxEpjvwutMeuH2GcFmTDnifTkOGQCdXFfdvMteL1wZm5MKL6xk1GH9f79megHujuFlUypQ==} + peerDependencies: + web-vitals: ^2.1.4 + dependencies: + '@ohbug/types': 2.2.1 + web-vitals: 3.3.2 + dev: false + + /@ohbug/react@2.0.9(react@16.14.0): + resolution: {integrity: sha512-UD4i7e7IGd6Qmcwvsm5kKfIojs/wqdcWANt2Wc/WFy9e7ppYyJcIvg1caskj3kmRY7fQS8blemTHQBQMPLN6AA==} peerDependencies: react: ^16.8.6 dependencies: - '@ohbug/core': 2.1.1 - '@ohbug/types': 2.1.1 + '@ohbug/core': 2.2.1 + '@ohbug/types': 2.2.1 react: 16.14.0 dev: false - /@ohbug/types@2.1.1: - resolution: {integrity: sha512-ryT1wiNzqJ4LZG702zeuqogrum9pXWB78tsvNqHcSwRtyM5F8MQVPzIpoVeV8MHjExeu8MZxtzymE2XPSiC5wQ==} + /@ohbug/types@2.2.1: + resolution: {integrity: sha512-ZfY7pW2MPi3Kr+ASrYcBiQe8mAvekwmM2O5mkmiaTU1ggcxrSinqesWsea6BkO+54MSd68UC3vPJH5YkMVTf/Q==} dev: false - /@ohbug/utils@2.0.6: - resolution: {integrity: sha512-roAV7dn3HU/WezF4OQbu1o588d0SmhONosKsWRKvPeN3GFTQAUtBLHq1loC32DjwWWaR+bVYeNRbC4oTNB6oag==} + /@ohbug/utils@2.0.8: + resolution: {integrity: sha512-eAhFr8c+7Q6MtxvkwgEGAg91XZXoZzASIsUzoGQAqt/hlMIPHlsN9CO2Lxr012jBU/I/pnQteopq+sQbZQjKIA==} dependencies: - '@ohbug/types': 2.1.1 - '@types/node': 18.11.9 + '@ohbug/types': 2.2.1 + '@types/node': 20.4.0 dev: false - /@ohbug/vue@2.0.8(vue@3.3.4): - resolution: {integrity: sha512-XCiFJvU7JYVOpjqAnWvQXo5jbSdMKwKwkkK750RFTE6WO2RdQFujthjlV8UKCO6kiL4l+y7lprsXLONRiMh2Ag==} + /@ohbug/vue@2.0.10(vue@3.3.4): + resolution: {integrity: sha512-b/f2OhcwS6mwVhQHhlyQXVVydPeyHNoPcRAYafHWRp85UOxlmUWJdHDLXZxwSfy91JllEYeMSbiSWJV9HzLh5A==} peerDependencies: vue: 2.x || 3.x dependencies: - '@ohbug/core': 2.1.1 - '@ohbug/types': 2.1.1 + '@ohbug/core': 2.2.1 + '@ohbug/types': 2.2.1 vue: 3.3.4 dev: false @@ -3119,8 +3201,8 @@ packages: resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} dev: false - /@prisma/client@4.16.1(prisma@4.16.1): - resolution: {integrity: sha512-CoDHu7Bt+NuDo40ijoeHP79EHtECsPBTy3yte5Yo3op8TqXt/kV0OT5OrsWewKvQGKFMHhYQ+ePed3zzjYdGAw==} + /@prisma/client@4.16.2(prisma@4.16.2): + resolution: {integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==} engines: {node: '>=14.17'} requiresBuild: true peerDependencies: @@ -3129,30 +3211,30 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 4.16.0-66.b20ead4d3ab9e78ac112966e242ded703f4a052c - prisma: 4.16.1 + '@prisma/engines-version': 4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81 + prisma: 4.16.2 dev: false - /@prisma/engines-version@4.16.0-66.b20ead4d3ab9e78ac112966e242ded703f4a052c: - resolution: {integrity: sha512-tMWAF/qF00fbUH1HB4Yjmz6bjh7fzkb7Y3NRoUfMlHu6V+O45MGvqwYxqwBjn1BIUXkl3r04W351D4qdJjrgvA==} + /@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: + resolution: {integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==} dev: false - /@prisma/engines@4.16.1: - resolution: {integrity: sha512-gpZG0kGGxfemgvK/LghHdBIz+crHkZjzszja94xp4oytpsXrgt/Ice82MvPsWMleVIniKuARrowtsIsim0PFJQ==} + /@prisma/engines@4.16.2: + resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} requiresBuild: true dev: false - /@release-it/conventional-changelog@5.1.1(release-it@15.11.0): - resolution: {integrity: sha512-QtbDBe36dQfzexAfDYrbLPvd5Cb5bMWmLcjcGhCOWBss7fe1/gCjoxDULVz+7N7G5Nu2UMeBwHcUp/w8RDh5VQ==} + /@release-it/conventional-changelog@6.0.0(release-it@16.0.0): + resolution: {integrity: sha512-OOiHhDncIFaNVfKJHpNQQkvM1yI5UPvyCtS74d6BDjvqWRu74J4cBGWh8b0owY4k3TTiR2BMKHn1eZ7hrxCnrA==} engines: {node: '>=14'} peerDependencies: release-it: ^15.4.1 dependencies: concat-stream: 2.0.0 - conventional-changelog: 3.1.25 - conventional-recommended-bump: 6.1.0 - release-it: 15.11.0 - semver: 7.3.8 + conventional-changelog: 4.0.0 + conventional-recommended-bump: 7.0.1 + release-it: 16.0.0 + semver: 7.5.1 dev: true /@rrweb/types@2.0.0-alpha.8: @@ -3161,6 +3243,12 @@ packages: rrweb-snapshot: 2.0.0-alpha.8 dev: false + /@rrweb/types@2.0.0-alpha.9: + resolution: {integrity: sha512-yS2KghLSmSSxo6H7tHrJ6u+nWJA9zCXaKFyc79rUSX8RHHSImRqocTqJ8jz794kCIWA90rvaQayRONdHO+vB0Q==} + dependencies: + rrweb-snapshot: 2.0.0-alpha.9 + dev: false + /@sigstore/protobuf-specs@0.1.0: resolution: {integrity: sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -3186,7 +3274,7 @@ packages: engines: {node: '>=14.16'} dev: true - /@swc/cli@0.1.62(@swc/core@1.3.67): + /@swc/cli@0.1.62(@swc/core@1.3.68): resolution: {integrity: sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==} engines: {node: '>= 12.13'} hasBin: true @@ -3198,95 +3286,95 @@ packages: optional: true dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.3.67 + '@swc/core': 1.3.68 commander: 7.2.0 fast-glob: 3.2.12 semver: 7.5.3 slash: 3.0.0 source-map: 0.7.4 - /@swc/core-darwin-arm64@1.3.67: - resolution: {integrity: sha512-zCT2mCkOBVNf5uJDcQ3A9KDoO1OEaGdfjsRTZTo7sejDd9AXLfJg+xgyCBBrK2jNS/uWcT21IvSv3LqKp4K8pA==} + /@swc/core-darwin-arm64@1.3.68: + resolution: {integrity: sha512-Z5pNxeuP2NxpOHTzDQkJs0wAPLnTlglZnR3WjObijwvdwT/kw1Y5EPDKM/BVSIeG40SPMkDLBbI0aj0qyXzrBA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@swc/core-darwin-x64@1.3.67: - resolution: {integrity: sha512-hXTVsfTatPEec5gFVyjGj3NccKZsYj/OXyHn6XA+l3Q76lZzGm2ISHdku//XNwXu8OmJ0HhS7LPsC4XXwxXQhg==} + /@swc/core-darwin-x64@1.3.68: + resolution: {integrity: sha512-ZHl42g6yXhfX4PzAQ0BNvBXpt/OcbAHfubWRN6eXELK3fiNnxL7QBW1if7iizlq6iA+Mj1pwHyyUit1pz0+fgA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.67: - resolution: {integrity: sha512-l8AKL0RkDL5FRTeWMmjoz9zvAc37amxC+0rheaNwE+gZya7ObyNjnIYz5FwN+3y+z6JFU7LS2x/5f6iwruv6pg==} + /@swc/core-linux-arm-gnueabihf@1.3.68: + resolution: {integrity: sha512-Mk8f6KCOQ2CNAR4PtWajIjS6XKSSR7ZYDOCf1GXRxhS3qEyQH7V8elWvqWYqHcT4foO60NUmxA/NOM/dQrdO1A==} engines: {node: '>=10'} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-gnu@1.3.67: - resolution: {integrity: sha512-S8zOB1AXEpb7kmtgMaFNeLAj01VOky4B0RNZ+uJWigdrDiFT67FeZzNHUNmNSOU0QM79G+Lie/xD/beqEw0vDg==} + /@swc/core-linux-arm64-gnu@1.3.68: + resolution: {integrity: sha512-RhBllggh9t9sIxaRgRcGrVaS7fDk6KsIqR6b9+dwU5OyDr4ZyHWw1ZaH/1/HAebuXYhNBjoNUiRtca6lKRIPgQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-musl@1.3.67: - resolution: {integrity: sha512-Fex8J8ASrt13pmOr2xWh41tEeKWwXYGk3sV8L/aGHiYtIJEUi2f+RtMx3jp7LIdOD8pQptor7i5WBlfR9jhp8A==} + /@swc/core-linux-arm64-musl@1.3.68: + resolution: {integrity: sha512-8K3zjU+tFgn6yGDEeD343gkKaHU9dhz77NiVkI1VzwRaT/Ag5pwl5eMQ1yStm8koNFzn3zq6rGjHfI5g2yI5Wg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-gnu@1.3.67: - resolution: {integrity: sha512-9bz9/bMphrv5vDg0os/d8ve0QgFpDzJgZgHUaHiGwcmfnlgdOSAaYJLIvWdcGTjZuQeV4L0m+iru357D9TXEzA==} + /@swc/core-linux-x64-gnu@1.3.68: + resolution: {integrity: sha512-4xAnvsBOyeTL0AB8GWlRKDM/hsysJ5jr5qvdKKI3rZfJgnnxl/xSX6TJKPsJ8gygfUJ3BmfCbmUmEyeDZ3YPvA==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-musl@1.3.67: - resolution: {integrity: sha512-ED0H6oLvQmhgo9zs8usmEA/lcZPGTu7K9og9K871b7HhHX0h/R+Xg2pb5KD7S/GyUHpfuopxjVROm+h6X1jMUA==} + /@swc/core-linux-x64-musl@1.3.68: + resolution: {integrity: sha512-RCpaBo1fcpy1EFdjF+I7N4lfzOaHXVV0iMw/ABM+0PD6tp3V/9pxsguaZyeAHyEiUlDA6PZ4TfXv5zfnXEgW4Q==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-win32-arm64-msvc@1.3.67: - resolution: {integrity: sha512-J1yFDLgPFeRtA8t5E159OXX+ww1gbkFg70yr4OP7EsOkOD1uMkuTf9yK/woHfsaVJlUYjJHzw7MkUIEgQBucqQ==} + /@swc/core-win32-arm64-msvc@1.3.68: + resolution: {integrity: sha512-v2WZvXrSslYEpY1nqpItyamL4DyaJinmOkXvM8Bc1LLKU5rGuvmBdjUYg/5Y+o0AUynuiWubpgHNOkBWiCvfqw==} engines: {node: '>=10'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-ia32-msvc@1.3.67: - resolution: {integrity: sha512-bK11/KtasewqHxzkjKUBXRE9MSAidbZCxrgJUd49bItG2N/DHxkwMYu8Xkh5VDHdTYWv/2idYtf/VM9Yi+53qw==} + /@swc/core-win32-ia32-msvc@1.3.68: + resolution: {integrity: sha512-HH5NJrIdzkJs+1xxprie0qSCMBeL9yeEhcC1yZTzYv8bwmabOUSdtKIqS55iYP/2hLWn9CTbvKPmLOIhCopW3Q==} engines: {node: '>=10'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-x64-msvc@1.3.67: - resolution: {integrity: sha512-GxzUU3+NA3cPcYxCxtfSQIS2ySD7Z8IZmKTVaWA9GOUQbKLyCE8H5js31u39+0op/1gNgxOgYFDoj2lUyvLCqw==} + /@swc/core-win32-x64-msvc@1.3.68: + resolution: {integrity: sha512-9HZVtLQUgK8r/yXQdwe0VBexbIcrY6+fBROhs7AAPWdewpaUeLkwQEJk6TbYr9CQuHw26FFGg6SjwAiqXF+kgQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@swc/core@1.3.67: - resolution: {integrity: sha512-9DROjzfAEt0xt0CDkOYsWpkUPyne8fl5ggWGon049678BOM7p0R0dmaalZGAsKatG5vYP1IWSKWsKhJIubDCsQ==} + /@swc/core@1.3.68: + resolution: {integrity: sha512-njGQuJO+Wy06dEayt70cf0c/KI3HGjm4iW9LLViVLBuYNzJ4SSdNfzejludzufu6im+dsDJ0i3QjgWhAIcVHMQ==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -3295,16 +3383,16 @@ packages: '@swc/helpers': optional: true optionalDependencies: - '@swc/core-darwin-arm64': 1.3.67 - '@swc/core-darwin-x64': 1.3.67 - '@swc/core-linux-arm-gnueabihf': 1.3.67 - '@swc/core-linux-arm64-gnu': 1.3.67 - '@swc/core-linux-arm64-musl': 1.3.67 - '@swc/core-linux-x64-gnu': 1.3.67 - '@swc/core-linux-x64-musl': 1.3.67 - '@swc/core-win32-arm64-msvc': 1.3.67 - '@swc/core-win32-ia32-msvc': 1.3.67 - '@swc/core-win32-x64-msvc': 1.3.67 + '@swc/core-darwin-arm64': 1.3.68 + '@swc/core-darwin-x64': 1.3.68 + '@swc/core-linux-arm-gnueabihf': 1.3.68 + '@swc/core-linux-arm64-gnu': 1.3.68 + '@swc/core-linux-arm64-musl': 1.3.68 + '@swc/core-linux-x64-gnu': 1.3.68 + '@swc/core-linux-x64-musl': 1.3.68 + '@swc/core-win32-arm64-msvc': 1.3.68 + '@swc/core-win32-ia32-msvc': 1.3.68 + '@swc/core-win32-x64-msvc': 1.3.68 /@swc/helpers@0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} @@ -3366,7 +3454,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.3.2 + '@types/node': 20.4.0 dev: false /@types/bull@4.10.0: @@ -3383,13 +3471,13 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 20.3.2 + '@types/node': 20.4.0 '@types/responselike': 1.0.0 /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.3.2 + '@types/node': 20.4.0 dev: false /@types/cron@2.0.1: @@ -3425,7 +3513,7 @@ packages: /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 20.3.2 + '@types/node': 20.4.0 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -3461,7 +3549,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.3.2 + '@types/node': 20.4.0 /@types/linkify-it@3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} @@ -3516,12 +3604,12 @@ packages: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/node@18.11.9: - resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} - dev: false - /@types/node@20.3.2: resolution: {integrity: sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw==} + dev: false + + /@types/node@20.4.0: + resolution: {integrity: sha512-jfT7iTf/4kOQ9S7CHV9BIyRaQqHu67mOjsIQBC3BKZvzvUB6zLxEwJ6sBE3ozcvP8kF6Uk5PXN0Q+c0dfhGX0g==} /@types/nodemailer@6.4.8: resolution: {integrity: sha512-oVsJSCkqViCn8/pEu2hfjwVO+Gb3e+eTWjg3PcjeFKRItfKpKwHphQqbYmPQrlMk+op7pNNWPbsJIEthpFN/OQ==} @@ -3576,7 +3664,7 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.3.2 + '@types/node': 20.4.0 /@types/scheduler@0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} @@ -3590,14 +3678,14 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.3.2 + '@types/node': 20.4.0 dev: false /@types/serve-static@1.15.0: resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} dependencies: '@types/mime': 3.0.1 - '@types/node': 20.3.2 + '@types/node': 20.4.0 dev: false /@types/ua-parser-js@0.7.36: @@ -3612,7 +3700,7 @@ packages: resolution: {integrity: sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==} dev: false - /@typescript-eslint/eslint-plugin@5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.43.0)(typescript@5.1.6): + /@typescript-eslint/eslint-plugin@5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.44.0)(typescript@5.1.6): resolution: {integrity: sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3624,12 +3712,12 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.5.1 - '@typescript-eslint/parser': 5.60.1(eslint@8.43.0)(typescript@5.1.6) + '@typescript-eslint/parser': 5.60.1(eslint@8.44.0)(typescript@5.1.6) '@typescript-eslint/scope-manager': 5.60.1 - '@typescript-eslint/type-utils': 5.60.1(eslint@8.43.0)(typescript@5.1.6) - '@typescript-eslint/utils': 5.60.1(eslint@8.43.0)(typescript@5.1.6) + '@typescript-eslint/type-utils': 5.60.1(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/utils': 5.60.1(eslint@8.44.0)(typescript@5.1.6) debug: 4.3.4 - eslint: 8.43.0 + eslint: 8.44.0 grapheme-splitter: 1.0.4 ignore: 5.2.0 natural-compare-lite: 1.4.0 @@ -3640,7 +3728,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@5.60.1(eslint@8.43.0)(typescript@5.1.6): + /@typescript-eslint/parser@5.60.1(eslint@8.44.0)(typescript@5.1.6): resolution: {integrity: sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3654,7 +3742,7 @@ packages: '@typescript-eslint/types': 5.60.1 '@typescript-eslint/typescript-estree': 5.60.1(typescript@5.1.6) debug: 4.3.4 - eslint: 8.43.0 + eslint: 8.44.0 typescript: 5.1.6 transitivePeerDependencies: - supports-color @@ -3668,7 +3756,7 @@ packages: '@typescript-eslint/visitor-keys': 5.60.1 dev: true - /@typescript-eslint/type-utils@5.60.1(eslint@8.43.0)(typescript@5.1.6): + /@typescript-eslint/type-utils@5.60.1(eslint@8.44.0)(typescript@5.1.6): resolution: {integrity: sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3679,9 +3767,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.60.1(typescript@5.1.6) - '@typescript-eslint/utils': 5.60.1(eslint@8.43.0)(typescript@5.1.6) + '@typescript-eslint/utils': 5.60.1(eslint@8.44.0)(typescript@5.1.6) debug: 4.3.4 - eslint: 8.43.0 + eslint: 8.44.0 tsutils: 3.21.0(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: @@ -3714,19 +3802,19 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@5.60.1(eslint@8.43.0)(typescript@5.1.6): + /@typescript-eslint/utils@5.60.1(eslint@8.44.0)(typescript@5.1.6): resolution: {integrity: sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) '@types/json-schema': 7.0.11 '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 5.60.1 '@typescript-eslint/types': 5.60.1 '@typescript-eslint/typescript-estree': 5.60.1(typescript@5.1.6) - eslint: 8.43.0 + eslint: 8.44.0 eslint-scope: 5.1.1 semver: 7.5.3 transitivePeerDependencies: @@ -3769,7 +3857,7 @@ packages: '@vue/shared': 3.3.4 estree-walker: 2.0.2 magic-string: 0.30.0 - postcss: 8.4.24 + postcss: 8.4.25 source-map-js: 1.0.2 dev: false @@ -3916,7 +4004,7 @@ packages: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 - /@webundsoehne/nest-fastify-file-upload@2.1.0(@nestjs/common@10.0.4)(@nestjs/core@10.0.4)(@nestjs/platform-fastify@10.0.4): + /@webundsoehne/nest-fastify-file-upload@2.1.0(@nestjs/common@10.0.5)(@nestjs/core@10.0.5)(@nestjs/platform-fastify@10.0.5): resolution: {integrity: sha512-VtxfqG4WGW3fG1MD///HQRizYQNuY8YByeJdVKroFFZizXmj8XgLNAaTWDO/ff9hx2sPXF3vm6J8erq//DAODg==} engines: {node: '>=12'} peerDependencies: @@ -3924,9 +4012,9 @@ packages: '@nestjs/core': '>= 7 < 10' '@nestjs/platform-fastify': '>= 7 < 10' dependencies: - '@nestjs/common': 10.0.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.4(@nestjs/common@10.0.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/platform-fastify': 10.0.4(@nestjs/common@10.0.4)(@nestjs/core@10.0.4) + '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/platform-fastify': 10.0.5(@nestjs/common@10.0.5)(@nestjs/core@10.0.5) fastify-multer: 2.0.3 dev: false @@ -3980,12 +4068,12 @@ packages: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} dev: false - /acorn-import-assertions@1.9.0(acorn@8.8.1): + /acorn-import-assertions@1.9.0(acorn@8.9.0): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.8.1 + acorn: 8.9.0 /acorn-jsx@5.3.2(acorn@8.8.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -3995,6 +4083,14 @@ packages: acorn: 8.8.1 dev: true + /acorn-jsx@5.3.2(acorn@8.9.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.9.0 + dev: true + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -4008,6 +4104,7 @@ packages: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} hasBin: true + dev: true /acorn@8.9.0: resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} @@ -4283,7 +4380,7 @@ packages: engines: {node: '>=8.0.0'} dev: false - /autoprefixer@10.4.14(postcss@8.4.24): + /autoprefixer@10.4.14(postcss@8.4.25): resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -4295,7 +4392,7 @@ packages: fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.24 + postcss: 8.4.25 postcss-value-parser: 4.2.0 dev: false @@ -4409,7 +4506,7 @@ packages: dependencies: ansi-align: 3.0.1 camelcase: 7.0.0 - chalk: 5.2.0 + chalk: 5.3.0 cli-boxes: 3.0.0 string-width: 5.1.2 type-fest: 2.19.0 @@ -4632,6 +4729,11 @@ packages: engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + /character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} dev: true @@ -4860,13 +4962,13 @@ packages: repeat-string: 1.6.1 dev: false - /commitizen@4.3.0(@swc/core@1.3.67): + /commitizen@4.3.0(@swc/core@1.3.68): resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(@swc/core@1.3.67) + cz-conventional-changelog: 3.3.0(@swc/core@1.3.68) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -4951,130 +5053,117 @@ packages: q: 1.5.1 dev: true - /conventional-changelog-atom@2.0.8: - resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} - engines: {node: '>=10'} + /conventional-changelog-angular@6.0.0: + resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==} + engines: {node: '>=14'} dependencies: - q: 1.5.1 + compare-func: 2.0.0 dev: true - /conventional-changelog-codemirror@2.0.8: - resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} - engines: {node: '>=10'} - dependencies: - q: 1.5.1 + /conventional-changelog-atom@3.0.0: + resolution: {integrity: sha512-pnN5bWpH+iTUWU3FaYdw5lJmfWeqSyrUkG+wyHBI9tC1dLNnHkbAOg1SzTQ7zBqiFrfo55h40VsGXWMdopwc5g==} + engines: {node: '>=14'} dev: true - /conventional-changelog-conventionalcommits@4.6.3: - resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} - engines: {node: '>=10'} + /conventional-changelog-codemirror@3.0.0: + resolution: {integrity: sha512-wzchZt9HEaAZrenZAUUHMCFcuYzGoZ1wG/kTRMICxsnW5AXohYMRxnyecP9ob42Gvn5TilhC0q66AtTPRSNMfw==} + engines: {node: '>=14'} + dev: true + + /conventional-changelog-conventionalcommits@6.1.0: + resolution: {integrity: sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==} + engines: {node: '>=14'} dependencies: compare-func: 2.0.0 - lodash: 4.17.21 - q: 1.5.1 dev: true - /conventional-changelog-core@4.2.4: - resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} - engines: {node: '>=10'} + /conventional-changelog-core@5.0.2: + resolution: {integrity: sha512-RhQOcDweXNWvlRwUDCpaqXzbZemKPKncCWZG50Alth72WITVd6nhVk9MJ6w1k9PFNBcZ3YwkdkChE+8+ZwtUug==} + engines: {node: '>=14'} dependencies: add-stream: 1.0.0 - conventional-changelog-writer: 5.0.1 - conventional-commits-parser: 3.2.4 + conventional-changelog-writer: 6.0.0 + conventional-commits-parser: 4.0.0 dateformat: 3.0.3 get-pkg-repo: 4.2.1 - git-raw-commits: 2.0.11 + git-raw-commits: 3.0.0 git-remote-origin-url: 2.0.0 - git-semver-tags: 4.1.1 - lodash: 4.17.21 + git-semver-tags: 5.0.0 normalize-package-data: 3.0.3 - q: 1.5.1 read-pkg: 3.0.0 read-pkg-up: 3.0.0 - through2: 4.0.2 dev: true - /conventional-changelog-ember@2.0.9: - resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} - engines: {node: '>=10'} - dependencies: - q: 1.5.1 + /conventional-changelog-ember@3.0.0: + resolution: {integrity: sha512-7PYthCoSxIS98vWhVcSphMYM322OxptpKAuHYdVspryI0ooLDehRXWeRWgN+zWSBXKl/pwdgAg8IpLNSM1/61A==} + engines: {node: '>=14'} dev: true - /conventional-changelog-eslint@3.0.9: - resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} - engines: {node: '>=10'} - dependencies: - q: 1.5.1 + /conventional-changelog-eslint@4.0.0: + resolution: {integrity: sha512-nEZ9byP89hIU0dMx37JXQkE1IpMmqKtsaR24X7aM3L6Yy/uAtbb+ogqthuNYJkeO1HyvK7JsX84z8649hvp43Q==} + engines: {node: '>=14'} dev: true - /conventional-changelog-express@2.0.6: - resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} - engines: {node: '>=10'} - dependencies: - q: 1.5.1 + /conventional-changelog-express@3.0.0: + resolution: {integrity: sha512-HqxihpUMfIuxvlPvC6HltA4ZktQEUan/v3XQ77+/zbu8No/fqK3rxSZaYeHYant7zRxQNIIli7S+qLS9tX9zQA==} + engines: {node: '>=14'} dev: true - /conventional-changelog-jquery@3.0.11: - resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} - engines: {node: '>=10'} - dependencies: - q: 1.5.1 + /conventional-changelog-jquery@4.0.0: + resolution: {integrity: sha512-TTIN5CyzRMf8PUwyy4IOLmLV2DFmPtasKN+x7EQKzwSX8086XYwo+NeaeA3VUT8bvKaIy5z/JoWUvi7huUOgaw==} + engines: {node: '>=14'} dev: true - /conventional-changelog-jshint@2.0.9: - resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} - engines: {node: '>=10'} + /conventional-changelog-jshint@3.0.0: + resolution: {integrity: sha512-bQof4byF4q+n+dwFRkJ/jGf9dCNUv4/kCDcjeCizBvfF81TeimPZBB6fT4HYbXgxxfxWXNl/i+J6T0nI4by6DA==} + engines: {node: '>=14'} dependencies: compare-func: 2.0.0 - q: 1.5.1 dev: true - /conventional-changelog-preset-loader@2.3.4: - resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} - engines: {node: '>=10'} + /conventional-changelog-preset-loader@3.0.0: + resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} + engines: {node: '>=14'} dev: true - /conventional-changelog-writer@5.0.1: - resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} - engines: {node: '>=10'} + /conventional-changelog-writer@6.0.0: + resolution: {integrity: sha512-8PyWTnn7zBIt9l4hj4UusFs1TyG+9Ulu1zlOAc72L7Sdv9Hsc8E86ot7htY3HXCVhXHB/NO0pVGvZpwsyJvFfw==} + engines: {node: '>=14'} hasBin: true dependencies: - conventional-commits-filter: 2.0.7 + conventional-commits-filter: 3.0.0 dateformat: 3.0.3 handlebars: 4.7.7 json-stringify-safe: 5.0.1 - lodash: 4.17.21 meow: 8.1.2 semver: 6.3.0 split: 1.0.1 - through2: 4.0.2 dev: true - /conventional-changelog@3.1.25: - resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} - engines: {node: '>=10'} + /conventional-changelog@4.0.0: + resolution: {integrity: sha512-JbZjwE1PzxQCvm+HUTIr+pbSekS8qdOZzMakdFyPtdkEWwFvwEJYONzjgMm0txCb2yBcIcfKDmg8xtCKTdecNQ==} + engines: {node: '>=14'} dependencies: - conventional-changelog-angular: 5.0.13 - conventional-changelog-atom: 2.0.8 - conventional-changelog-codemirror: 2.0.8 - conventional-changelog-conventionalcommits: 4.6.3 - conventional-changelog-core: 4.2.4 - conventional-changelog-ember: 2.0.9 - conventional-changelog-eslint: 3.0.9 - conventional-changelog-express: 2.0.6 - conventional-changelog-jquery: 3.0.11 - conventional-changelog-jshint: 2.0.9 - conventional-changelog-preset-loader: 2.3.4 + conventional-changelog-angular: 6.0.0 + conventional-changelog-atom: 3.0.0 + conventional-changelog-codemirror: 3.0.0 + conventional-changelog-conventionalcommits: 6.1.0 + conventional-changelog-core: 5.0.2 + conventional-changelog-ember: 3.0.0 + conventional-changelog-eslint: 4.0.0 + conventional-changelog-express: 3.0.0 + conventional-changelog-jquery: 4.0.0 + conventional-changelog-jshint: 3.0.0 + conventional-changelog-preset-loader: 3.0.0 dev: true /conventional-commit-types@3.0.0: resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} dev: true - /conventional-commits-filter@2.0.7: - resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} - engines: {node: '>=10'} + /conventional-commits-filter@3.0.0: + resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} + engines: {node: '>=14'} dependencies: lodash.ismatch: 4.4.0 modify-values: 1.0.1 @@ -5093,19 +5182,29 @@ packages: through2: 4.0.2 dev: true - /conventional-recommended-bump@6.1.0: - resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} - engines: {node: '>=10'} + /conventional-commits-parser@4.0.0: + resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} + engines: {node: '>=14'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + meow: 8.1.2 + split2: 3.2.2 + dev: true + + /conventional-recommended-bump@7.0.1: + resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} + engines: {node: '>=14'} hasBin: true dependencies: concat-stream: 2.0.0 - conventional-changelog-preset-loader: 2.3.4 - conventional-commits-filter: 2.0.7 - conventional-commits-parser: 3.2.4 - git-raw-commits: 2.0.11 - git-semver-tags: 4.1.1 + conventional-changelog-preset-loader: 3.0.0 + conventional-commits-filter: 3.0.0 + conventional-commits-parser: 4.0.0 + git-raw-commits: 3.0.0 + git-semver-tags: 5.0.0 meow: 8.1.2 - q: 1.5.1 dev: true /convert-source-map@1.9.0: @@ -5126,7 +5225,7 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - /cosmiconfig-typescript-loader@4.2.0(@types/node@20.3.2)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.1.6): + /cosmiconfig-typescript-loader@4.2.0(@types/node@20.4.0)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.1.6): resolution: {integrity: sha512-NkANeMnaHrlaSSlpKGyvn2R4rqUDeE/9E5YHx+b4nwo0R8dZyAqcih8/gxpCZvqWP9Vf6xuLpMSzSgdVEIM78g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -5135,9 +5234,9 @@ packages: ts-node: '>=10' typescript: '>=3' dependencies: - '@types/node': 20.3.2 + '@types/node': 20.4.0 cosmiconfig: 8.1.3 - ts-node: 10.9.1(@swc/core@1.3.67)(@types/node@20.3.2)(typescript@5.1.6) + ts-node: 10.9.1(@swc/core@1.3.68)(@types/node@20.4.0)(typescript@5.1.6) typescript: 5.1.6 dev: true @@ -5162,6 +5261,16 @@ packages: path-type: 4.0.0 dev: true + /cosmiconfig@8.2.0: + resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -5251,18 +5360,18 @@ packages: resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} dev: false - /cz-conventional-changelog@3.3.0(@swc/core@1.3.67): + /cz-conventional-changelog@3.3.0(@swc/core@1.3.68): resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.3.0(@swc/core@1.3.67) + commitizen: 4.3.0(@swc/core@1.3.68) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.3 optionalDependencies: - '@commitlint/load': 17.5.0(@swc/core@1.3.67) + '@commitlint/load': 17.5.0(@swc/core@1.3.68) transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -5291,8 +5400,8 @@ packages: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: false - /dayjs@1.11.8: - resolution: {integrity: sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==} + /dayjs@1.11.9: + resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==} dev: false /debug@3.2.7: @@ -5572,6 +5681,7 @@ packages: dependencies: graceful-fs: 4.2.10 tapable: 2.2.1 + dev: true /enhanced-resolve@5.15.0: resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} @@ -5948,7 +6058,7 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-standard@17.1.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@16.0.1)(eslint-plugin-promise@6.1.1)(eslint@8.43.0): + /eslint-config-standard@17.1.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@16.0.1)(eslint-plugin-promise@6.1.1)(eslint@8.44.0): resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} engines: {node: '>=12.0.0'} peerDependencies: @@ -5957,10 +6067,10 @@ packages: eslint-plugin-n: '^15.0.0 || ^16.0.0 ' eslint-plugin-promise: ^6.0.0 dependencies: - eslint: 8.43.0 - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.1)(eslint@8.43.0) - eslint-plugin-n: 16.0.1(eslint@8.43.0) - eslint-plugin-promise: 6.1.1(eslint@8.43.0) + eslint: 8.44.0 + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.1)(eslint@8.44.0) + eslint-plugin-n: 16.0.1(eslint@8.44.0) + eslint-plugin-promise: 6.1.1(eslint@8.44.0) dev: true /eslint-import-resolver-node@0.3.7: @@ -5973,7 +6083,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint@8.43.0): + /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint@8.44.0): resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -5994,33 +6104,33 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.60.1(eslint@8.43.0)(typescript@5.1.6) + '@typescript-eslint/parser': 5.60.1(eslint@8.44.0)(typescript@5.1.6) debug: 3.2.7 - eslint: 8.43.0 + eslint: 8.44.0 eslint-import-resolver-node: 0.3.7 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-es-x@7.1.0(eslint@8.43.0): + /eslint-plugin-es-x@7.1.0(eslint@8.44.0): resolution: {integrity: sha512-AhiaF31syh4CCQ+C5ccJA0VG6+kJK8+5mXKKE7Qs1xcPRg02CDPOj3mWlQxuWS/AYtg7kxrDNgW9YW3vc0Q+Mw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) '@eslint-community/regexpp': 4.5.1 - eslint: 8.43.0 + eslint: 8.44.0 dev: true - /eslint-plugin-eslint-comments@3.2.0(eslint@8.43.0): + /eslint-plugin-eslint-comments@3.2.0(eslint@8.44.0): resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} peerDependencies: eslint: '>=4.19.1' dependencies: escape-string-regexp: 1.0.5 - eslint: 8.43.0 + eslint: 8.44.0 ignore: 5.2.0 dev: true @@ -6030,7 +6140,7 @@ packages: htmlparser2: 8.0.2 dev: true - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.60.1)(eslint@8.43.0): + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.60.1)(eslint@8.44.0): resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -6040,15 +6150,15 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.60.1(eslint@8.43.0)(typescript@5.1.6) + '@typescript-eslint/parser': 5.60.1(eslint@8.44.0)(typescript@5.1.6) array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.43.0 + eslint: 8.44.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint@8.43.0) + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint@8.44.0) has: 1.0.3 is-core-module: 2.12.1 is-glob: 4.0.3 @@ -6063,14 +6173,14 @@ packages: - supports-color dev: true - /eslint-plugin-jsonc@2.9.0(eslint@8.43.0): + /eslint-plugin-jsonc@2.9.0(eslint@8.44.0): resolution: {integrity: sha512-RK+LeONVukbLwT2+t7/OY54NJRccTXh/QbnXzPuTLpFMVZhPuq1C9E07+qWenGx7rrQl0kAalAWl7EmB+RjpGA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) - eslint: 8.43.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) + eslint: 8.44.0 jsonc-eslint-parser: 2.3.0 natural-compare: 1.4.0 dev: true @@ -6083,28 +6193,28 @@ packages: svg-tags: 1.0.0 dev: true - /eslint-plugin-markdown@3.0.0(eslint@8.43.0): + /eslint-plugin-markdown@3.0.0(eslint@8.44.0): resolution: {integrity: sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.43.0 + eslint: 8.44.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-n@16.0.1(eslint@8.43.0): + /eslint-plugin-n@16.0.1(eslint@8.44.0): resolution: {integrity: sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==} engines: {node: '>=16.0.0'} peerDependencies: eslint: '>=7.0.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) builtins: 5.0.1 - eslint: 8.43.0 - eslint-plugin-es-x: 7.1.0(eslint@8.43.0) + eslint: 8.44.0 + eslint-plugin-es-x: 7.1.0(eslint@8.44.0) ignore: 5.2.4 is-core-module: 2.12.1 minimatch: 3.1.2 @@ -6112,20 +6222,20 @@ packages: semver: 7.5.3 dev: true - /eslint-plugin-promise@6.1.1(eslint@8.43.0): + /eslint-plugin-promise@6.1.1(eslint@8.44.0): resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.43.0 + eslint: 8.44.0 dev: true /eslint-plugin-react@3.4.2: resolution: {integrity: sha512-rIhweRuQMLxNOOHHl9pEkQR+6QiKt9wUHpBvjSefSzUg5qdhC08jc2rxsSm1TAXii9rxabhzK5MUu+YBJxn6sA==} dev: true - /eslint-plugin-react@7.32.2(eslint@8.43.0): + /eslint-plugin-react@7.32.2(eslint@8.44.0): resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} engines: {node: '>=4'} peerDependencies: @@ -6135,7 +6245,7 @@ packages: array.prototype.flatmap: 1.3.1 array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 - eslint: 8.43.0 + eslint: 8.44.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.3 minimatch: 3.1.2 @@ -6149,17 +6259,17 @@ packages: string.prototype.matchall: 4.0.8 dev: true - /eslint-plugin-unicorn@47.0.0(eslint@8.43.0): + /eslint-plugin-unicorn@47.0.0(eslint@8.44.0): resolution: {integrity: sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==} engines: {node: '>=16'} peerDependencies: eslint: '>=8.38.0' dependencies: '@babel/helper-validator-identifier': 7.22.5 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) ci-info: 3.8.0 clean-regexp: 1.0.0 - eslint: 8.43.0 + eslint: 8.44.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -6174,32 +6284,32 @@ packages: strip-indent: 3.0.0 dev: true - /eslint-plugin-vue@9.15.1(eslint@8.43.0): + /eslint-plugin-vue@9.15.1(eslint@8.44.0): resolution: {integrity: sha512-CJE/oZOslvmAR9hf8SClTdQ9JLweghT6JCBQNrT2Iel1uVw0W0OLJxzvPd6CxmABKCvLrtyDnqGV37O7KQv6+A==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) - eslint: 8.43.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) + eslint: 8.44.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.0.10 semver: 7.5.3 - vue-eslint-parser: 9.3.1(eslint@8.43.0) + vue-eslint-parser: 9.3.1(eslint@8.44.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-yml@1.8.0(eslint@8.43.0): + /eslint-plugin-yml@1.8.0(eslint@8.44.0): resolution: {integrity: sha512-fgBiJvXD0P2IN7SARDJ2J7mx8t0bLdG6Zcig4ufOqW5hOvSiFxeUyc2g5I1uIm8AExbo26NNYCcTGZT0MXTsyg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 - eslint: 8.43.0 + eslint: 8.44.0 lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.2 @@ -6227,15 +6337,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.43.0: - resolution: {integrity: sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==} + /eslint@8.44.0: + resolution: {integrity: sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) '@eslint-community/regexpp': 4.5.1 - '@eslint/eslintrc': 2.0.3 - '@eslint/js': 8.43.0 + '@eslint/eslintrc': 2.1.0 + '@eslint/js': 8.44.0 '@humanwhocodes/config-array': 0.11.10 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -6247,7 +6357,7 @@ packages: escape-string-regexp: 4.0.0 eslint-scope: 7.2.0 eslint-visitor-keys: 3.4.1 - espree: 9.5.2 + espree: 9.6.0 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -6256,7 +6366,7 @@ packages: glob-parent: 6.0.2 globals: 13.20.0 graphemer: 1.4.0 - ignore: 5.2.0 + ignore: 5.2.4 import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 @@ -6267,7 +6377,7 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 + optionator: 0.9.3 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 text-table: 0.2.0 @@ -6284,6 +6394,15 @@ packages: eslint-visitor-keys: 3.4.1 dev: true + /espree@9.6.0: + resolution: {integrity: sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.9.0 + acorn-jsx: 5.3.2(acorn@8.9.0) + eslint-visitor-keys: 3.4.1 + dev: true + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -6516,8 +6635,8 @@ packages: resolution: {integrity: sha512-M3+i368lV0OYTJ5TfClIoPKEKSOF7112iiPdwgfSR0gN98BjA1Nk+c6oBHtfcVt9KiMxl+EQKHC1QNWo3ZOpYQ==} dev: false - /fastify@4.18.0: - resolution: {integrity: sha512-L5o/2GEkBastQ3HV0dtKo7SUZ497Z1+q4fcqAoPyq6JCQ/8zdk1JQEoTQwnBWCp+EmA7AQa6mxNqSAEhzP0RwQ==} + /fastify@4.19.1: + resolution: {integrity: sha512-99r7xae02BUWI1H8exJidkFJXi/SUZpO18YIJ6SSWIB1bb5CN659ga0iB85oLD+C4D9LeTOKplOJ1/YcFsK7oQ==} dependencies: '@fastify/ajv-compiler': 3.5.0 '@fastify/error': 3.3.0 @@ -6735,7 +6854,7 @@ packages: cross-spawn: 7.0.3 signal-exit: 4.0.2 - /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.1.3)(webpack@5.87.0): + /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.1.6)(webpack@5.88.1): resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} engines: {node: '>=12.13.0', yarn: '>=1.0.0'} peerDependencies: @@ -6751,11 +6870,11 @@ packages: memfs: 3.4.9 minimatch: 3.1.2 node-abort-controller: 3.0.1 - schema-utils: 3.1.1 + schema-utils: 3.3.0 semver: 7.5.3 tapable: 2.2.1 - typescript: 5.1.3 - webpack: 5.87.0(@swc/core@1.3.67)(esbuild@0.18.10) + typescript: 5.1.6 + webpack: 5.88.1(@swc/core@1.3.68)(esbuild@0.18.10) dev: false /form-data-encoder@2.1.3: @@ -6788,8 +6907,8 @@ packages: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: false - /framer-motion@10.12.17(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-IR+aAYntsyu6ofyxqQV4QYotmOqzcuKxhqNpfc3DXJjNWOPpOeSyH0A+In3IEBu49Yx/+PNht+YMeZSdCNaYbw==} + /framer-motion@10.12.18(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cfhiUpPbj+0eEWKjuD+5cz5cMqH71xOtMxGiS/cSGfHn2OlHIEAqFnFyzEMENw5PxWR9bMVhatzzpD6lexmHZQ==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 @@ -6801,7 +6920,7 @@ packages: dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - tslib: 2.5.3 + tslib: 2.6.0 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 dev: false @@ -7002,6 +7121,16 @@ packages: through2: 4.0.2 dev: true + /git-raw-commits@3.0.0: + resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} + engines: {node: '>=14'} + hasBin: true + dependencies: + dargs: 7.0.0 + meow: 8.1.2 + split2: 3.2.2 + dev: true + /git-remote-origin-url@2.0.0: resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} engines: {node: '>=4'} @@ -7010,9 +7139,9 @@ packages: pify: 2.3.0 dev: true - /git-semver-tags@4.1.1: - resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} - engines: {node: '>=10'} + /git-semver-tags@5.0.0: + resolution: {integrity: sha512-fZ+tmZ1O5aXW/T5nLzZLbxWAHdQTLLXalOECMNAmhoEQSfqZjtaeMjpsXH4C5qVhrICTkVQeQFujB1lKzIHljA==} + engines: {node: '>=14'} hasBin: true dependencies: meow: 8.1.2 @@ -7159,13 +7288,13 @@ packages: merge2: 1.4.1 slash: 3.0.0 - /globby@13.1.4: - resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} + /globby@13.2.1: + resolution: {integrity: sha512-DPCBxctI7dN4EeIqjW2KGqgdcUMbrhJ9AzON+PlxCtvppWhubTLD4+a0GFxiym14ZvacUydTPjLPc2DlKz7EIg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 fast-glob: 3.2.12 - ignore: 5.2.0 + ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 dev: true @@ -7203,6 +7332,23 @@ packages: responselike: 3.0.0 dev: true + /got@13.0.0: + resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} + engines: {node: '>=16'} + dependencies: + '@sindresorhus/is': 5.3.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.12 + decompress-response: 6.0.0 + form-data-encoder: 2.1.3 + get-stream: 6.0.1 + http2-wrapper: 2.1.11 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: true + /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} @@ -7562,12 +7708,12 @@ packages: through: 2.3.8 wrap-ansi: 7.0.0 - /inquirer@9.2.6: - resolution: {integrity: sha512-y71l237eJJKS4rl7sQcEUiMhrR0pB/ZnRMMTxLpjJhWL4hdWCT03a6jJnC1w6qIPSRZWEozuieGt3v7XaEJYFw==} + /inquirer@9.2.7: + resolution: {integrity: sha512-Bf52lnfvNxGPJPltiNO2tLBp3zC339KNlGMqOkW+dsvNikBhcVDK5kqU2lVX2FTPzuXUFX5WJDlsw//w3ZwoTw==} engines: {node: '>=14.18.0'} dependencies: ansi-escapes: 4.3.2 - chalk: 5.2.0 + chalk: 5.3.0 cli-cursor: 3.1.0 cli-width: 4.0.0 external-editor: 3.1.0 @@ -7703,12 +7849,6 @@ packages: ci-info: 3.8.0 dev: true - /is-core-module@2.10.0: - resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} - dependencies: - has: 1.0.3 - dev: true - /is-core-module@2.12.1: resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} dependencies: @@ -7986,7 +8126,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.3.2 + '@types/node': 20.4.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -7999,8 +8139,8 @@ packages: resolution: {integrity: sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==} dev: false - /jotai@2.2.1(react@18.2.0): - resolution: {integrity: sha512-Gz4tpbRQy9OiFgBwF9F7TieDn0UTE3C0IFSDuxHjOIvgn2tACH30UKz6p/wIlfoZROXSTCIxEvYEa7Y25WM+8g==} + /jotai@2.2.2(react@18.2.0): + resolution: {integrity: sha512-Cn8hnBg1sc5ppFwEgVGTfMR5WSM0hbAasd/bdAwIwTaum0j3OUPqBSC4tyk3jtB95vicML+RRWgKFOn6gtfN0A==} engines: {node: '>=12.20.0'} peerDependencies: react: '>=17.0.0' @@ -8365,7 +8505,7 @@ packages: resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} engines: {node: '>=12'} dependencies: - chalk: 5.2.0 + chalk: 5.3.0 is-unicode-supported: 1.3.0 dev: true @@ -8827,7 +8967,7 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - /nestjs-pino@3.3.0(@nestjs/common@10.0.4)(pino-http@8.3.3): + /nestjs-pino@3.3.0(@nestjs/common@10.0.5)(pino-http@8.3.3): resolution: {integrity: sha512-FVMbzz0wi7YKqtrifnAjcQejGmhIfxXY2q+jdW1bK7RxN9640UJ7pDeQa/FOQMSu1Ud0L0/eqI3Ha9NejJxIjQ==} engines: {node: '>= 14'} requiresBuild: true @@ -8835,7 +8975,7 @@ packages: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 dependencies: - '@nestjs/common': 10.0.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) pino-http: 8.3.3 dev: false @@ -8851,7 +8991,7 @@ packages: type-fest: 2.19.0 dev: true - /next-auth@4.22.1(next@13.4.7)(nodemailer@6.9.3)(react-dom@18.2.0)(react@18.2.0): + /next-auth@4.22.1(next@13.4.9)(nodemailer@6.9.3)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-NTR3f6W7/AWXKw8GSsgSyQcDW6jkslZLH8AiZa5PQ09w1kR8uHtR9rez/E9gAq/o17+p0JYHE8QjF3RoniiObA==} peerDependencies: next: ^12.2.5 || ^13 @@ -8866,7 +9006,7 @@ packages: '@panva/hkdf': 1.0.2 cookie: 0.5.0 jose: 4.14.4 - next: 13.4.7(react-dom@18.2.0)(react@18.2.0) + next: 13.4.9(react-dom@18.2.0)(react@18.2.0) nodemailer: 6.9.3 oauth: 0.9.15 openid-client: 5.4.2 @@ -8877,8 +9017,8 @@ packages: uuid: 8.3.2 dev: false - /next-intl@2.17.0(next@13.4.7)(react@18.2.0): - resolution: {integrity: sha512-rx/um5aGhcexa3TusHb/ilgPXuZ0k3GXLI7RGZ02xC1ooQgcqn9C4ctHe2GR00XW313t3ZnfuHhumk7xlPq85g==} + /next-intl@2.17.4(next@13.4.9)(react@18.2.0): + resolution: {integrity: sha512-GlB7mBC/+wsuvEuRqyMxmQi8PBGMSfHUz/RDdqazl8BOFuaNXijJ6btpZ4FAlonJcXMOroONmP/L0/c6zqYZOQ==} engines: {node: '>=10'} peerDependencies: next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 @@ -8886,13 +9026,13 @@ packages: dependencies: '@formatjs/intl-localematcher': 0.2.32 negotiator: 0.6.3 - next: 13.4.7(react-dom@18.2.0)(react@18.2.0) + next: 13.4.9(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 - use-intl: 2.17.0(react@18.2.0) + use-intl: 2.17.4(react@18.2.0) dev: false - /next@13.4.7(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==} + /next@13.4.9(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vtefFm/BWIi/eWOqf1GsmKG3cjKw1k3LjuefKRcL3iiLl3zWzFdPG3as6xtxrGO6gwTzzaO1ktL4oiHt/uvTjA==} engines: {node: '>=16.8.0'} hasBin: true peerDependencies: @@ -8909,7 +9049,7 @@ packages: sass: optional: true dependencies: - '@next/env': 13.4.7 + '@next/env': 13.4.9 '@swc/helpers': 0.5.1 busboy: 1.6.0 caniuse-lite: 1.0.30001509 @@ -8920,15 +9060,15 @@ packages: watchpack: 2.4.0 zod: 3.21.4 optionalDependencies: - '@next/swc-darwin-arm64': 13.4.7 - '@next/swc-darwin-x64': 13.4.7 - '@next/swc-linux-arm64-gnu': 13.4.7 - '@next/swc-linux-arm64-musl': 13.4.7 - '@next/swc-linux-x64-gnu': 13.4.7 - '@next/swc-linux-x64-musl': 13.4.7 - '@next/swc-win32-arm64-msvc': 13.4.7 - '@next/swc-win32-ia32-msvc': 13.4.7 - '@next/swc-win32-x64-msvc': 13.4.7 + '@next/swc-darwin-arm64': 13.4.9 + '@next/swc-darwin-x64': 13.4.9 + '@next/swc-linux-arm64-gnu': 13.4.9 + '@next/swc-linux-arm64-musl': 13.4.9 + '@next/swc-linux-x64-gnu': 13.4.9 + '@next/swc-linux-x64-musl': 13.4.9 + '@next/swc-win32-arm64-msvc': 13.4.9 + '@next/swc-win32-ia32-msvc': 13.4.9 + '@next/swc-win32-x64-msvc': 13.4.9 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -9023,7 +9163,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.1 + resolve: 1.22.2 semver: 5.7.1 validate-npm-package-license: 3.0.4 dev: true @@ -9033,7 +9173,7 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.10.0 + is-core-module: 2.12.1 semver: 7.5.3 validate-npm-package-license: 3.0.4 dev: true @@ -9301,16 +9441,16 @@ packages: word-wrap: 1.2.3 dev: true - /optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.3 dev: true /ora@5.4.1: @@ -9331,7 +9471,7 @@ packages: resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - chalk: 5.2.0 + chalk: 5.3.0 cli-cursor: 4.0.0 cli-spinners: 2.7.0 is-interactive: 2.0.0 @@ -9651,8 +9791,8 @@ packages: process-warning: 2.0.0 dev: false - /pino-pretty@10.0.0: - resolution: {integrity: sha512-zKFjYXBzLaLTEAN1ayKpHXtL5UeRQC7R3lvhKe7fWs7hIVEjKGG/qIXwQt9HmeUp71ogUd/YcW+LmMwRp4KT6Q==} + /pino-pretty@10.0.1: + resolution: {integrity: sha512-yrn00+jNpkvZX/NrPVCPIVHAfTDy3ahF0PND9tKqZk4j9s+loK8dpzrJj4dGb7i+WLuR50ussuTAiWoMWU+qeA==} hasBin: true dependencies: colorette: 2.0.19 @@ -9714,7 +9854,7 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - ts-node: 10.9.1(@swc/core@1.3.67)(@types/node@20.3.2)(typescript@5.1.6) + ts-node: 10.9.1(@swc/core@1.3.68)(@types/node@20.4.0)(typescript@5.1.6) yaml: 2.3.1 dev: false @@ -9739,8 +9879,8 @@ packages: source-map-js: 1.0.2 dev: false - /postcss@8.4.24: - resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} + /postcss@8.4.25: + resolution: {integrity: sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 @@ -9775,13 +9915,13 @@ packages: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} dev: false - /prisma@4.16.1: - resolution: {integrity: sha512-C2Xm7yxHxjFjjscBEW4tmoraPHH/Vyu/A0XABdbaFtoiOZARsxvOM7rwc2iZ0qVxbh0bGBGBWZUSXO/52/nHBQ==} + /prisma@4.16.2: + resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==} engines: {node: '>=14.17'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 4.16.1 + '@prisma/engines': 4.16.2 dev: false /proc-log@3.0.0: @@ -10342,21 +10482,21 @@ packages: jsesc: 0.5.0 dev: true - /release-it@15.11.0: - resolution: {integrity: sha512-lZwoGEnKYKwGnfxxlA7vtR7vvozPrOSsIgQaHO4bgQ5ARbG3IA6Dmo0IVusv6nR1KmnjH70QIeNAgsWs6Ji/tw==} - engines: {node: '>=14.9'} + /release-it@16.0.0: + resolution: {integrity: sha512-TRZ0gxHyA10666UypV8bMBT06+lj/RXZBqDnBPh4hmnTtZwPVxb7pK3QycV9XfxHKhaCh7XkJSmltG/OZ2+ksQ==} + engines: {node: '>=16'} hasBin: true dependencies: '@iarna/toml': 2.2.5 - '@octokit/rest': 19.0.11 + '@octokit/rest': 19.0.13 async-retry: 1.3.3 - chalk: 5.2.0 - cosmiconfig: 8.1.3 + chalk: 5.3.0 + cosmiconfig: 8.2.0 execa: 7.1.1 git-url-parse: 13.1.0 - globby: 13.1.4 - got: 12.6.1 - inquirer: 9.2.6 + globby: 13.2.1 + got: 13.0.0 + inquirer: 9.2.7 is-ci: 3.0.1 issue-parser: 6.0.0 lodash: 4.17.21 @@ -10368,7 +10508,7 @@ packages: os-name: 5.1.0 promise.allsettled: 1.0.6 proxy-agent: 6.2.1 - semver: 7.5.1 + semver: 7.5.3 shelljs: 0.8.5 update-notifier: 6.0.2 url-join: 5.0.0 @@ -10554,6 +10694,10 @@ packages: resolution: {integrity: sha512-3Rb7c+mnDEADQ8N9qn9SDH5PzCyHlZ1cwZC932qRyt9O8kJWLM11JLYqqEyQCa2FZVQbzH2iAaCgnyM7A32p7A==} dev: false + /rrweb-snapshot@2.0.0-alpha.9: + resolution: {integrity: sha512-mHg1uUE2iUf0MXLE//4r5cMynkbduwmaOEis4gC7EuqkUAC1pYoLpcYYVt9lD6dgYIF6BmK6dgLLzMpD/tTyyA==} + dev: false + /rrweb@2.0.0-alpha.4: resolution: {integrity: sha512-wEHUILbxDPcNwkM3m4qgPgXAiBJyqCbbOHyVoNEVBJzHszWEFYyTbrZqUdeb1EfmTRC2PsumCIkVcomJ/xcOzA==} dependencies: @@ -10640,15 +10784,6 @@ packages: loose-envify: 1.4.0 dev: false - /schema-utils@3.1.1: - resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/json-schema': 7.0.11 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: false - /schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -10701,14 +10836,6 @@ packages: lru-cache: 6.0.0 dev: false - /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - /semver@7.5.1: resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==} engines: {node: '>=10'} @@ -10737,6 +10864,11 @@ packages: dependencies: randombytes: 2.1.0 + /seroval@0.5.1: + resolution: {integrity: sha512-ZfhQVB59hmIauJG5Ydynupy8KHyr5imGNtdDhbZG68Ufh1Ynkv9KOYOAABf71oVbQxJ8VkWnMHAjEHE7fWkH5g==} + engines: {node: '>=10'} + dev: false + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true @@ -10885,6 +11017,13 @@ packages: smart-buffer: 4.2.0 dev: true + /solid-js@1.7.7: + resolution: {integrity: sha512-SPdYVke/Z6Za24PBTbULyQYPrhGO1ZbPany76atO2zF2dmYn2pCotbsw1JtlgWnr9dK2JbwPGnA3ODTGPLhZNw==} + dependencies: + csstype: 3.1.1 + seroval: 0.5.1 + dev: false + /sonic-boom@3.2.0: resolution: {integrity: sha512-SbbZ+Kqj/XIunvIAgUZRlqd6CGQYq71tRRbXR92Za8J/R3Yh4Av+TWENiSiEgnlwckYLyP0YZQWVfyNC0dzLaA==} dependencies: @@ -11250,8 +11389,8 @@ packages: yallist: 4.0.0 dev: true - /taze@0.11.0: - resolution: {integrity: sha512-+YLdW1oe4ii8iRenbWJVd2o1pBcdDDjIxfhv8OmUcWLW14X88BMfvG7g3Rw+Bg3/QYdE/+Qyx/AbDnnVNUNSnA==} + /taze@0.11.2: + resolution: {integrity: sha512-HM4chXXDaHCAl1AFbSlyHUFjoaEKTewVE0j6ni5S5mRdPdJdva4AfcmXgBZYnRBiJagl6QuVtsqLjqHUiiO20A==} hasBin: true dependencies: '@antfu/ni': 0.21.4 @@ -11268,7 +11407,7 @@ packages: - supports-color dev: true - /terser-webpack-plugin@5.3.9(@swc/core@1.3.67)(esbuild@0.18.10)(webpack@5.87.0): + /terser-webpack-plugin@5.3.9(@swc/core@1.3.68)(esbuild@0.18.10)(webpack@5.88.1): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -11285,13 +11424,13 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.17 - '@swc/core': 1.3.67 + '@swc/core': 1.3.68 esbuild: 0.18.10 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.18.2 - webpack: 5.87.0(@swc/core@1.3.67)(esbuild@0.18.10) + webpack: 5.88.1(@swc/core@1.3.68)(esbuild@0.18.10) /terser@5.18.2: resolution: {integrity: sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==} @@ -11430,7 +11569,7 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: false - /ts-loader@9.4.4(typescript@5.1.6)(webpack@5.87.0): + /ts-loader@9.4.4(typescript@5.1.6)(webpack@5.88.1): resolution: {integrity: sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==} engines: {node: '>=12.0.0'} peerDependencies: @@ -11442,10 +11581,10 @@ packages: micromatch: 4.0.5 semver: 7.5.3 typescript: 5.1.6 - webpack: 5.87.0(@swc/core@1.3.67)(esbuild@0.18.10) + webpack: 5.88.1(@swc/core@1.3.68)(esbuild@0.18.10) dev: true - /ts-node@10.9.1(@swc/core@1.3.67)(@types/node@20.3.2)(typescript@5.1.6): + /ts-node@10.9.1(@swc/core@1.3.68)(@types/node@20.4.0)(typescript@5.1.6): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -11460,12 +11599,12 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.3.67 + '@swc/core': 1.3.68 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 20.3.2 + '@types/node': 20.4.0 acorn: 8.8.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -11485,7 +11624,7 @@ packages: engines: {node: '>=10.13.0'} dependencies: chalk: 4.1.2 - enhanced-resolve: 5.10.0 + enhanced-resolve: 5.15.0 tsconfig-paths: 4.2.0 dev: false @@ -11521,7 +11660,7 @@ packages: /tslib@2.6.0: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} - /tsup@7.1.0(@swc/core@1.3.67)(ts-node@10.9.1)(typescript@5.1.6): + /tsup@7.1.0(@swc/core@1.3.68)(ts-node@10.9.1)(typescript@5.1.6): resolution: {integrity: sha512-mazl/GRAk70j8S43/AbSYXGgvRP54oQeX8Un4iZxzATHt0roW0t6HYDVZIXMw0ZQIpvr1nFMniIVnN5186lW7w==} engines: {node: '>=16.14'} hasBin: true @@ -11537,7 +11676,7 @@ packages: typescript: optional: true dependencies: - '@swc/core': 1.3.67 + '@swc/core': 1.3.68 bundle-require: 4.0.1(esbuild@0.18.10) cac: 6.7.14 chokidar: 3.5.3 @@ -11661,12 +11800,6 @@ packages: ts-toolbelt: 9.6.0 dev: false - /typescript@5.1.3: - resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} - engines: {node: '>=14.17'} - hasBin: true - dev: false - /typescript@5.1.6: resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} engines: {node: '>=14.17'} @@ -11776,7 +11909,7 @@ packages: engines: {node: '>=14.16'} dependencies: boxen: 7.0.0 - chalk: 5.2.0 + chalk: 5.3.0 configstore: 6.0.0 has-yarn: 3.0.0 import-lazy: 4.0.0 @@ -11824,8 +11957,8 @@ packages: react: 18.2.0 dev: false - /use-intl@2.17.0(react@18.2.0): - resolution: {integrity: sha512-vnLZeWyAZU2BoTQ6DeXfOBy5gxU/Fz6SSid0wJneDjlmCeT8BaVeHzzN+4Qj6mM9p8AH5I1zwjzU9rPYkmznIw==} + /use-intl@2.17.4(react@18.2.0): + resolution: {integrity: sha512-iaMdznvvagqo6ubBSKRgaLdHKjXBv7979pQMotOic63kNXEQECwyBqECeuKqEUtM40WdROxpAnbxw/ctWmVxGw==} engines: {node: '>=10'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -11930,14 +12063,14 @@ packages: acorn-walk: 8.2.0 dev: true - /vue-eslint-parser@9.3.1(eslint@8.43.0): + /vue-eslint-parser@9.3.1(eslint@8.44.0): resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 - eslint: 8.43.0 + eslint: 8.44.0 eslint-scope: 7.2.0 eslint-visitor-keys: 3.4.1 espree: 9.5.2 @@ -11979,6 +12112,10 @@ packages: engines: {node: '>= 8'} dev: true + /web-vitals@3.3.2: + resolution: {integrity: sha512-qRkpmSeKfEWAzNhtX541xA8gCJ+pqCqBmUlDVkVDSCSYUvfvNqF+k9g8I+uyreRcDBdfiJrd0/aLbTy5ydo49Q==} + dev: false + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -11995,8 +12132,8 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack@5.87.0(@swc/core@1.3.67)(esbuild@0.18.10): - resolution: {integrity: sha512-GOu1tNbQ7p1bDEoFRs2YPcfyGs8xq52yyPBZ3m2VGnXGtV9MxjrkABHm4V9Ia280OefsSLzvbVoXcfLxjKY/Iw==} + /webpack@5.88.1(@swc/core@1.3.68)(esbuild@0.18.10): + resolution: {integrity: sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -12010,8 +12147,8 @@ packages: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.8.1 - acorn-import-assertions: 1.9.0(acorn@8.8.1) + acorn: 8.9.0 + acorn-import-assertions: 1.9.0(acorn@8.9.0) browserslist: 4.21.9 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 @@ -12026,7 +12163,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(@swc/core@1.3.67)(esbuild@0.18.10)(webpack@5.87.0) + terser-webpack-plugin: 5.3.9(@swc/core@1.3.68)(esbuild@0.18.10)(webpack@5.88.1) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -12247,8 +12384,8 @@ packages: resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} dev: false - /zustand@4.3.8(react@18.2.0): - resolution: {integrity: sha512-4h28KCkHg5ii/wcFFJ5Fp+k1J3gJoasaIbppdgZFO4BPJnsNxL0mQXBSFgOgAdCdBj35aDTPvdAJReTMntFPGg==} + /zustand@4.3.9(react@18.2.0): + resolution: {integrity: sha512-Tat5r8jOMG1Vcsj8uldMyqYKC5IZvQif8zetmLHs9WoZlntTHmIoNM8TpLRY31ExncuUvUOXehd0kvahkuHjDw==} engines: {node: '>=12.7.0'} peerDependencies: immer: '>=9.0' From f2c68c7d36494834facaacffbdc28a9dd5a0a82d Mon Sep 17 00:00:00 2001 From: chenyueban Date: Fri, 7 Jul 2023 15:22:29 +0800 Subject: [PATCH 02/23] feat: Add 'INP' metric type and functionality --- packages/common/src/interfaces/metric.ts | 2 +- .../server/src/api/report/report.processor.ts | 1 + .../app/[locale]/[projectId]/metrics/page.tsx | 27 +++++++++++++++++++ packages/web/messages/en.json | 1 + packages/web/messages/zh.json | 1 + packages/web/services/metrics.ts | 2 +- .../migrations/20230707071355_/migration.sql | 2 ++ prisma/schema.prisma | 1 + 8 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 prisma/migrations/20230707071355_/migration.sql diff --git a/packages/common/src/interfaces/metric.ts b/packages/common/src/interfaces/metric.ts index a8d2163..b81e647 100644 --- a/packages/common/src/interfaces/metric.ts +++ b/packages/common/src/interfaces/metric.ts @@ -1 +1 @@ -export type MetricType = 'CLS' | 'FCP' | 'FID' | 'LCP' | 'TTFB' +export type MetricType = 'CLS' | 'FCP' | 'FID' | 'LCP' | 'TTFB' | 'INP' diff --git a/packages/server/src/api/report/report.processor.ts b/packages/server/src/api/report/report.processor.ts index 67e8b6f..86aeed0 100644 --- a/packages/server/src/api/report/report.processor.ts +++ b/packages/server/src/api/report/report.processor.ts @@ -127,6 +127,7 @@ export class ReportProcessor { FID: metric.detail.FID, LCP: metric.detail.LCP, TTFB: metric.detail.TTFB, + INP: metric.detail.INP, user: { connectOrCreate: { where: { id: userIntro }, diff --git a/packages/web/app/[locale]/[projectId]/metrics/page.tsx b/packages/web/app/[locale]/[projectId]/metrics/page.tsx index 9664bd1..3cfa703 100644 --- a/packages/web/app/[locale]/[projectId]/metrics/page.tsx +++ b/packages/web/app/[locale]/[projectId]/metrics/page.tsx @@ -17,6 +17,7 @@ const CLS_THRESHOLD = [0.1, 0.25] const FID_THRESHOLD = [100, 300] const LCP_THRESHOLD = [2500, 4000] const FCP_THRESHOLD = [1800, 3000] +const INP_THRESHOLD = [200, 500] const TTFB_THRESHOLD = [800, 1800] export default function MetricsPage() { @@ -47,6 +48,14 @@ export default function MetricsPage() { }), { enabled: projectId !== undefined }, ) + const { data: INPData } = useQuery( + () => serviceGetMetricsTrends({ + projectId: projectId!, + type: '14d', + metric: 'INP', + }), + { enabled: projectId !== undefined }, + ) const { data: FCPData } = useQuery( () => serviceGetMetricsTrends({ projectId: projectId!, @@ -153,6 +162,24 @@ export default function MetricsPage() { /> + v.value) ?? [])} + > + + + Date: Wed, 12 Jul 2023 15:51:09 +0800 Subject: [PATCH 03/23] chore: update deps use prisma 5 --- package.json | 12 +- packages/server/package.json | 2 +- .../src/common/database/prisma.service.ts | 2 +- packages/web/package.json | 6 +- pnpm-lock.yaml | 207 +++++++----------- 5 files changed, 92 insertions(+), 137 deletions(-) diff --git a/package.json b/package.json index 84a0aa1..ae3705a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ohbug-dashboard", "version": "0.11.0", - "packageManager": "pnpm@8.6.6", + "packageManager": "pnpm@8.6.7", "homepage": "https://github.com/ohbug-org/ohbug-dashboard#readme", "bugs": { "url": "https://github.com/ohbug-org/ohbug-dashboard/issues" @@ -43,15 +43,15 @@ "@ohbug/react": "^2.0.9", "@ohbug/types": "^2.2.1", "@ohbug/vue": "^2.0.10", - "@prisma/client": "^4.16.2", + "@prisma/client": "^5.0.0", "@types/js-yaml": "^4.0.5", - "@types/node": "^20.4.0", + "@types/node": "^20.4.1", "@types/ramda": "^0.29.3", "cross-env": "^7.0.3", "dayjs": "^1.11.9", "js-yaml": "^4.1.0", "nodemailer": "^6.9.3", - "prisma": "^4.16.2", + "prisma": "^5.0.0", "ramda": "^0.29.0", "rimraf": "^5.0.1", "source-map-trace": "^0.2.6", @@ -64,7 +64,7 @@ "@babel/types": "^7.22.5", "@chenyueban/eslint-config": "^1.1.0", "@commitlint/cli": "^17.6.6", - "@release-it/conventional-changelog": "^6.0.0", + "@release-it/conventional-changelog": "^7.0.0", "@swc/cli": "^0.1.62", "@swc/core": "^1.3.68", "commitizen": "^4.3.0", @@ -72,7 +72,7 @@ "eslint": "^8.44.0", "husky": "^8.0.3", "lint-staged": "^13.2.3", - "release-it": "^16.0.0", + "release-it": "^16.1.0", "taze": "^0.11.2" }, "prisma": { diff --git a/packages/server/package.json b/packages/server/package.json index 1e7bf71..6c5c3cc 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -14,7 +14,7 @@ "dependencies": { "@nestjs/axios": "^3.0.0", "@nestjs/bull": "^10.0.1", - "@nestjs/cli": "^10.1.7", + "@nestjs/cli": "^10.1.8", "@nestjs/common": "^10.0.5", "@nestjs/core": "^10.0.5", "@nestjs/mapped-types": "^2.0.2", diff --git a/packages/server/src/common/database/prisma.service.ts b/packages/server/src/common/database/prisma.service.ts index 7746da6..73c19f5 100644 --- a/packages/server/src/common/database/prisma.service.ts +++ b/packages/server/src/common/database/prisma.service.ts @@ -8,7 +8,7 @@ export class PrismaService extends PrismaClient implements OnModuleInit { } async enableShutdownHooks(app: INestApplication) { - this.$on('beforeExit', async() => { + process.on('beforeExit', async() => { await app.close() }) } diff --git a/packages/web/package.json b/packages/web/package.json index a4c60ca..e9e365c 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -20,7 +20,7 @@ "@ohbug/extension-uuid": "^2.1.1", "@ohbug/extension-view": "^0.1.1", "@ohbug/extension-web-vitals": "^0.2.1", - "@types/node": "^20.4.0", + "@types/node": "^20.4.1", "@types/nprogress": "^0.2.0", "@types/react": "^18.2.14", "@types/react-dom": "^18.2.6", @@ -37,7 +37,7 @@ "jotai": "^2.2.2", "next": "^13.4.9", "next-auth": "^4.22.1", - "next-intl": "^2.17.4", + "next-intl": "^2.17.5", "nprogress": "^0.2.0", "postcss": "^8.4.25", "react": "^18.2.0", @@ -50,7 +50,7 @@ "rrweb-player": "^1.0.0-alpha.4", "source-map-trace": "^0.2.6", "ua-parser-js": "^1.0.35", - "web-vitals": "^3.3.2", + "web-vitals": "^3.4.0", "zustand": "^4.3.9" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d43b2bc..3037e25 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,14 +27,14 @@ importers: specifier: ^2.0.10 version: 2.0.10(vue@3.3.4) '@prisma/client': - specifier: ^4.16.2 - version: 4.16.2(prisma@4.16.2) + specifier: ^5.0.0 + version: 5.0.0(prisma@5.0.0) '@types/js-yaml': specifier: ^4.0.5 version: 4.0.5 '@types/node': - specifier: ^20.4.0 - version: 20.4.0 + specifier: ^20.4.1 + version: 20.4.1 '@types/ramda': specifier: ^0.29.3 version: 0.29.3 @@ -51,8 +51,8 @@ importers: specifier: ^6.9.3 version: 6.9.3 prisma: - specifier: ^4.16.2 - version: 4.16.2 + specifier: ^5.0.0 + version: 5.0.0 ramda: specifier: ^0.29.0 version: 0.29.0 @@ -85,8 +85,8 @@ importers: specifier: ^17.6.6 version: 17.6.6(@swc/core@1.3.68) '@release-it/conventional-changelog': - specifier: ^6.0.0 - version: 6.0.0(release-it@16.0.0) + specifier: ^7.0.0 + version: 7.0.0(release-it@16.1.0) '@swc/cli': specifier: ^0.1.62 version: 0.1.62(@swc/core@1.3.68) @@ -109,8 +109,8 @@ importers: specifier: ^13.2.3 version: 13.2.3 release-it: - specifier: ^16.0.0 - version: 16.0.0 + specifier: ^16.1.0 + version: 16.1.0 taze: specifier: ^0.11.2 version: 0.11.2 @@ -136,8 +136,8 @@ importers: specifier: ^10.0.1 version: 10.0.1(@nestjs/common@10.0.5)(@nestjs/core@10.0.5)(bull@4.10.4) '@nestjs/cli': - specifier: ^10.1.7 - version: 10.1.7(@swc/cli@0.1.62)(@swc/core@1.3.68)(esbuild@0.18.10) + specifier: ^10.1.8 + version: 10.1.8(@swc/cli@0.1.62)(@swc/core@1.3.68)(esbuild@0.18.10) '@nestjs/common': specifier: ^10.0.5 version: 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) @@ -231,7 +231,7 @@ importers: version: 9.4.4(typescript@5.1.6)(webpack@5.88.1) ts-node: specifier: ^10.9.1 - version: 10.9.1(@swc/core@1.3.68)(@types/node@20.4.0)(typescript@5.1.6) + version: 10.9.1(@swc/core@1.3.68)(@types/node@20.4.1)(typescript@5.1.6) packages/web: dependencies: @@ -255,7 +255,7 @@ importers: version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.14)(react@18.2.0) '@next-auth/prisma-adapter': specifier: ^1.0.7 - version: 1.0.7(@prisma/client@4.16.2)(next-auth@4.22.1) + version: 1.0.7(@prisma/client@5.0.0)(next-auth@4.22.1) '@ohbug/extension-feedback': specifier: ^0.7.2 version: 0.7.2 @@ -270,10 +270,10 @@ importers: version: 0.1.1 '@ohbug/extension-web-vitals': specifier: ^0.2.1 - version: 0.2.1(web-vitals@3.3.2) + version: 0.2.1(web-vitals@3.4.0) '@types/node': - specifier: ^20.4.0 - version: 20.4.0 + specifier: ^20.4.1 + version: 20.4.1 '@types/nprogress': specifier: ^0.2.0 version: 0.2.0 @@ -323,8 +323,8 @@ importers: specifier: ^4.22.1 version: 4.22.1(next@13.4.9)(nodemailer@6.9.3)(react-dom@18.2.0)(react@18.2.0) next-intl: - specifier: ^2.17.4 - version: 2.17.4(next@13.4.9)(react@18.2.0) + specifier: ^2.17.5 + version: 2.17.5(next@13.4.9)(react@18.2.0) nprogress: specifier: ^0.2.0 version: 0.2.0 @@ -362,8 +362,8 @@ importers: specifier: ^1.0.35 version: 1.0.35 web-vitals: - specifier: ^3.3.2 - version: 3.3.2 + specifier: ^3.4.0 + version: 3.4.0 zustand: specifier: ^4.3.9 version: 4.3.9(react@18.2.0) @@ -459,18 +459,11 @@ packages: resolution: {integrity: sha512-qe8Nmh9rYI/HIspLSTwtbMFPj6dISG6+dJnOguTlPNXtCvS2uezdxscVBb7/3DrmNbQK49TDqpkSQ1chbRGdpQ==} dev: true - /@babel/code-frame@7.18.6: - resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.18.6 - /@babel/code-frame@7.22.5: resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.22.5 - dev: false /@babel/helper-module-imports@7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} @@ -483,22 +476,10 @@ packages: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.19.1 - chalk: 2.4.2 - js-tokens: 4.0.0 - /@babel/highlight@7.22.5: resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} engines: {node: '>=6.9.0'} @@ -506,7 +487,6 @@ packages: '@babel/helper-validator-identifier': 7.22.5 chalk: 2.4.2 js-tokens: 4.0.0 - dev: false /@babel/parser@7.22.5: resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} @@ -1775,15 +1755,15 @@ packages: '@commitlint/execute-rule': 17.4.0 '@commitlint/resolve-extends': 17.4.4 '@commitlint/types': 17.4.4 - '@types/node': 20.4.0 + '@types/node': 20.4.1 chalk: 4.1.2 - cosmiconfig: 8.1.3 - cosmiconfig-typescript-loader: 4.2.0(@types/node@20.4.0)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.1.6) + cosmiconfig: 8.2.0 + cosmiconfig-typescript-loader: 4.2.0(@types/node@20.4.1)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@swc/core@1.3.68)(@types/node@20.4.0)(typescript@5.1.6) + ts-node: 10.9.1(@swc/core@1.3.68)(@types/node@20.4.1)(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - '@swc/core' @@ -2535,8 +2515,8 @@ packages: tslib: 2.6.0 dev: false - /@nestjs/cli@10.1.7(@swc/cli@0.1.62)(@swc/core@1.3.68)(esbuild@0.18.10): - resolution: {integrity: sha512-YybaBuZpVhdT/ouVNnVUdpoPiuZ108GhY5eMuQJmMpA8FWLvLhyho0cSL36JCmqguyoQUMjZ+BeqaOAUgBRVuA==} + /@nestjs/cli@10.1.8(@swc/cli@0.1.62)(@swc/core@1.3.68)(esbuild@0.18.10): + resolution: {integrity: sha512-ge9NQdnDKc9ANKA+1xEckOWgGe3bnuWhQagpnhrspV0lMi+LZm6a0XF8ptVdJB3Ghclbfdh+1XF5XlieIcbVRw==} engines: {node: '>= 16'} hasBin: true peerDependencies: @@ -2734,13 +2714,13 @@ packages: swagger-ui-dist: 5.1.0 dev: false - /@next-auth/prisma-adapter@1.0.7(@prisma/client@4.16.2)(next-auth@4.22.1): + /@next-auth/prisma-adapter@1.0.7(@prisma/client@5.0.0)(next-auth@4.22.1): resolution: {integrity: sha512-Cdko4KfcmKjsyHFrWwZ//lfLUbcLqlyFqjd/nYE2m3aZ7tjMNUjpks47iw7NTCnXf+5UWz5Ypyt1dSs1EP5QJw==} peerDependencies: '@prisma/client': '>=2.26.0 || >=3' next-auth: ^4 dependencies: - '@prisma/client': 4.16.2(prisma@4.16.2) + '@prisma/client': 5.0.0(prisma@5.0.0) next-auth: 4.22.1(next@13.4.9)(nodemailer@6.9.3)(react-dom@18.2.0)(react@18.2.0) dev: false @@ -3132,13 +3112,13 @@ packages: dayjs: 1.11.9 dev: false - /@ohbug/extension-web-vitals@0.2.1(web-vitals@3.3.2): + /@ohbug/extension-web-vitals@0.2.1(web-vitals@3.4.0): resolution: {integrity: sha512-1b7f0Q7xoTjCk2y0PxEpjvwutMeuH2GcFmTDnifTkOGQCdXFfdvMteL1wZm5MKL6xk1GH9f79megHujuFlUypQ==} peerDependencies: web-vitals: ^2.1.4 dependencies: '@ohbug/types': 2.2.1 - web-vitals: 3.3.2 + web-vitals: 3.4.0 dev: false /@ohbug/react@2.0.9(react@16.14.0): @@ -3159,7 +3139,7 @@ packages: resolution: {integrity: sha512-eAhFr8c+7Q6MtxvkwgEGAg91XZXoZzASIsUzoGQAqt/hlMIPHlsN9CO2Lxr012jBU/I/pnQteopq+sQbZQjKIA==} dependencies: '@ohbug/types': 2.2.1 - '@types/node': 20.4.0 + '@types/node': 20.4.1 dev: false /@ohbug/vue@2.0.10(vue@3.3.4): @@ -3201,9 +3181,9 @@ packages: resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} dev: false - /@prisma/client@4.16.2(prisma@4.16.2): - resolution: {integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==} - engines: {node: '>=14.17'} + /@prisma/client@5.0.0(prisma@5.0.0): + resolution: {integrity: sha512-XlO5ELNAQ7rV4cXIDJUNBEgdLwX3pjtt9Q/RHqDpGf43szpNJx2hJnggfFs7TKNx0cOFsl6KJCSfqr5duEU/bQ==} + engines: {node: '>=16.13'} requiresBuild: true peerDependencies: prisma: '*' @@ -3211,29 +3191,29 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81 - prisma: 4.16.2 + '@prisma/engines-version': 4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584 + prisma: 5.0.0 dev: false - /@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: - resolution: {integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==} + /@prisma/engines-version@4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584: + resolution: {integrity: sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ==} dev: false - /@prisma/engines@4.16.2: - resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} + /@prisma/engines@5.0.0: + resolution: {integrity: sha512-kyT/8fd0OpWmhAU5YnY7eP31brW1q1YrTGoblWrhQJDiN/1K+Z8S1kylcmtjqx5wsUGcP1HBWutayA/jtyt+sg==} requiresBuild: true dev: false - /@release-it/conventional-changelog@6.0.0(release-it@16.0.0): - resolution: {integrity: sha512-OOiHhDncIFaNVfKJHpNQQkvM1yI5UPvyCtS74d6BDjvqWRu74J4cBGWh8b0owY4k3TTiR2BMKHn1eZ7hrxCnrA==} - engines: {node: '>=14'} + /@release-it/conventional-changelog@7.0.0(release-it@16.1.0): + resolution: {integrity: sha512-DBzyVS6c4g8w+xomCsygkmLeQBUq41Wvzy0vGgbdCLOxYnwI0cDaF6HOLPkrifH1qLa1uJ9i1pYA+hNyHkNanQ==} + engines: {node: '>=16'} peerDependencies: - release-it: ^15.4.1 + release-it: ^16.0.0 dependencies: concat-stream: 2.0.0 conventional-changelog: 4.0.0 conventional-recommended-bump: 7.0.1 - release-it: 16.0.0 + release-it: 16.1.0 semver: 7.5.1 dev: true @@ -3454,7 +3434,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.4.0 + '@types/node': 20.4.1 dev: false /@types/bull@4.10.0: @@ -3471,13 +3451,13 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 20.4.0 + '@types/node': 20.4.1 '@types/responselike': 1.0.0 /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.4.0 + '@types/node': 20.4.1 dev: false /@types/cron@2.0.1: @@ -3513,7 +3493,7 @@ packages: /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 20.4.0 + '@types/node': 20.4.1 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -3549,7 +3529,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.4.0 + '@types/node': 20.4.1 /@types/linkify-it@3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} @@ -3608,8 +3588,8 @@ packages: resolution: {integrity: sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw==} dev: false - /@types/node@20.4.0: - resolution: {integrity: sha512-jfT7iTf/4kOQ9S7CHV9BIyRaQqHu67mOjsIQBC3BKZvzvUB6zLxEwJ6sBE3ozcvP8kF6Uk5PXN0Q+c0dfhGX0g==} + /@types/node@20.4.1: + resolution: {integrity: sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg==} /@types/nodemailer@6.4.8: resolution: {integrity: sha512-oVsJSCkqViCn8/pEu2hfjwVO+Gb3e+eTWjg3PcjeFKRItfKpKwHphQqbYmPQrlMk+op7pNNWPbsJIEthpFN/OQ==} @@ -3664,7 +3644,7 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.4.0 + '@types/node': 20.4.1 /@types/scheduler@0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} @@ -3678,14 +3658,14 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.4.0 + '@types/node': 20.4.1 dev: false /@types/serve-static@1.15.0: resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} dependencies: '@types/mime': 3.0.1 - '@types/node': 20.4.0 + '@types/node': 20.4.1 dev: false /@types/ua-parser-js@0.7.36: @@ -5225,7 +5205,7 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - /cosmiconfig-typescript-loader@4.2.0(@types/node@20.4.0)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.1.6): + /cosmiconfig-typescript-loader@4.2.0(@types/node@20.4.1)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6): resolution: {integrity: sha512-NkANeMnaHrlaSSlpKGyvn2R4rqUDeE/9E5YHx+b4nwo0R8dZyAqcih8/gxpCZvqWP9Vf6xuLpMSzSgdVEIM78g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -5234,9 +5214,9 @@ packages: ts-node: '>=10' typescript: '>=3' dependencies: - '@types/node': 20.4.0 - cosmiconfig: 8.1.3 - ts-node: 10.9.1(@swc/core@1.3.68)(@types/node@20.4.0)(typescript@5.1.6) + '@types/node': 20.4.1 + cosmiconfig: 8.2.0 + ts-node: 10.9.1(@swc/core@1.3.68)(@types/node@20.4.1)(typescript@5.1.6) typescript: 5.1.6 dev: true @@ -5251,16 +5231,6 @@ packages: yaml: 1.10.2 dev: false - /cosmiconfig@8.1.3: - resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} - engines: {node: '>=14'} - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - dev: true - /cosmiconfig@8.2.0: resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} engines: {node: '>=14'} @@ -6628,7 +6598,7 @@ packages: /fastify-plugin@2.3.4: resolution: {integrity: sha512-I+Oaj6p9oiRozbam30sh39BiuiqBda7yK2nmSPVwDCfIBlKnT8YB3MY+pRQc2Fcd07bf6KPGklHJaQ2Qu81TYQ==} dependencies: - semver: 7.3.7 + semver: 7.5.3 dev: false /fastify-plugin@4.3.0: @@ -7032,14 +7002,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-intrinsic@1.1.2: - resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 - dev: true - /get-intrinsic@1.1.3: resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} dependencies: @@ -8126,7 +8088,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.4.0 + '@types/node': 20.4.1 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -9017,8 +8979,8 @@ packages: uuid: 8.3.2 dev: false - /next-intl@2.17.4(next@13.4.9)(react@18.2.0): - resolution: {integrity: sha512-GlB7mBC/+wsuvEuRqyMxmQi8PBGMSfHUz/RDdqazl8BOFuaNXijJ6btpZ4FAlonJcXMOroONmP/L0/c6zqYZOQ==} + /next-intl@2.17.5(next@13.4.9)(react@18.2.0): + resolution: {integrity: sha512-p/tit4/FN0eHLw6Mjwsx4ktiFZWq9VMcuY9hhkAlYWXCQgKq09PB0lZcMNw5xLvV9eor818BzXxdA+3bSvFMmw==} engines: {node: '>=10'} peerDependencies: next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 @@ -9028,7 +8990,7 @@ packages: negotiator: 0.6.3 next: 13.4.9(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 - use-intl: 2.17.4(react@18.2.0) + use-intl: 2.17.5(react@18.2.0) dev: false /next@13.4.9(react-dom@18.2.0)(react@18.2.0): @@ -9671,7 +9633,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.22.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -9854,7 +9816,7 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - ts-node: 10.9.1(@swc/core@1.3.68)(@types/node@20.4.0)(typescript@5.1.6) + ts-node: 10.9.1(@swc/core@1.3.68)(@types/node@20.4.1)(typescript@5.1.6) yaml: 2.3.1 dev: false @@ -9915,13 +9877,13 @@ packages: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} dev: false - /prisma@4.16.2: - resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==} - engines: {node: '>=14.17'} + /prisma@5.0.0: + resolution: {integrity: sha512-KYWk83Fhi1FH59jSpavAYTt2eoMVW9YKgu8ci0kuUnt6Dup5Qy47pcB4/TLmiPAbhGrxxSz7gsSnJcCmkyPANA==} + engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 4.16.2 + '@prisma/engines': 5.0.0 dev: false /proc-log@3.0.0: @@ -10482,8 +10444,8 @@ packages: jsesc: 0.5.0 dev: true - /release-it@16.0.0: - resolution: {integrity: sha512-TRZ0gxHyA10666UypV8bMBT06+lj/RXZBqDnBPh4hmnTtZwPVxb7pK3QycV9XfxHKhaCh7XkJSmltG/OZ2+ksQ==} + /release-it@16.1.0: + resolution: {integrity: sha512-d2XpGtPAIUoN/v0nJkfdx9GyFkgTXRj+7HATaZRmS+a0IhnE/qRDQ4kMVuDh8UCX1CKV6SRiFdV/vEpKpzZzxA==} engines: {node: '>=16'} hasBin: true dependencies: @@ -10828,14 +10790,6 @@ packages: hasBin: true dev: true - /semver@7.3.7: - resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: false - /semver@7.5.1: resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==} engines: {node: '>=10'} @@ -10919,7 +10873,7 @@ packages: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.2 + get-intrinsic: 1.1.3 object-inspect: 1.12.3 dev: true @@ -11584,7 +11538,7 @@ packages: webpack: 5.88.1(@swc/core@1.3.68)(esbuild@0.18.10) dev: true - /ts-node@10.9.1(@swc/core@1.3.68)(@types/node@20.4.0)(typescript@5.1.6): + /ts-node@10.9.1(@swc/core@1.3.68)(@types/node@20.4.1)(typescript@5.1.6): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -11604,7 +11558,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 20.4.0 + '@types/node': 20.4.1 acorn: 8.8.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -11957,8 +11911,8 @@ packages: react: 18.2.0 dev: false - /use-intl@2.17.4(react@18.2.0): - resolution: {integrity: sha512-iaMdznvvagqo6ubBSKRgaLdHKjXBv7979pQMotOic63kNXEQECwyBqECeuKqEUtM40WdROxpAnbxw/ctWmVxGw==} + /use-intl@2.17.5(react@18.2.0): + resolution: {integrity: sha512-pkTRoGZsOyHImBFgV23z7g/Hzt1auap+cWvsiWzHpc70NK7Rm9R3LNI3wm3FnYEWNF8N3+CZKV+SCTrHwcNK1w==} engines: {node: '>=10'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -12057,6 +12011,7 @@ packages: /vm2@3.9.19: resolution: {integrity: sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==} engines: {node: '>=6.0'} + deprecated: The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm. hasBin: true dependencies: acorn: 8.9.0 @@ -12112,8 +12067,8 @@ packages: engines: {node: '>= 8'} dev: true - /web-vitals@3.3.2: - resolution: {integrity: sha512-qRkpmSeKfEWAzNhtX541xA8gCJ+pqCqBmUlDVkVDSCSYUvfvNqF+k9g8I+uyreRcDBdfiJrd0/aLbTy5ydo49Q==} + /web-vitals@3.4.0: + resolution: {integrity: sha512-n9fZ5/bG1oeDkyxLWyep0eahrNcPDF6bFqoyispt7xkW0xhDzpUBTgyDKqWDi1twT0MgH4HvvqzpUyh0ZxZV4A==} dev: false /webidl-conversions@3.0.1: From 813db9c1172825884ed25ea7a9d05850b2d8c3c2 Mon Sep 17 00:00:00 2001 From: chenyueban Date: Thu, 24 Aug 2023 14:02:18 +0800 Subject: [PATCH 04/23] chore: refactoring the web using shadcn --- .eslintignore | 3 - .eslintrc | 3 - .npmrc | 1 + .vscode/settings.json | 3 +- eslint.config.js | 6 + package.json | 47 +- packages/server/package.json | 30 +- .../[projectId]/alerts/[alertId]/alertId.tsx | 20 +- .../[projectId]/alerts/create/page.tsx | 2 +- .../app/[locale]/[projectId]/alerts/page.tsx | 12 +- .../{feedbackId.tsx => feedback-id.tsx} | 24 +- .../feedbacks/[feedbackId]/page.tsx | 2 +- .../[locale]/[projectId]/feedbacks/page.tsx | 14 +- .../[projectId]/issues/[issueId]/issueId.tsx | 22 +- .../app/[locale]/[projectId]/issues/page.tsx | 10 +- .../web/app/[locale]/[projectId]/layout.tsx | 2 +- .../app/[locale]/[projectId]/metrics/page.tsx | 14 +- .../[projectId]/mock/frame/HashChange.tsx | 2 +- .../app/[locale]/[projectId]/mock/mock.tsx | 8 +- .../app/[locale]/[projectId]/profile/page.tsx | 5 +- .../[locale]/[projectId]/profile/profile.tsx | 197 +- .../[releaseId]/sourceMaps/sourceMaps.tsx | 8 +- .../[locale]/[projectId]/releases/page.tsx | 32 +- .../[locale]/[projectId]/settings/page.tsx | 226 +- .../[projectId]/users/[userId]/userId.tsx | 16 +- .../app/[locale]/[projectId]/users/page.tsx | 59 +- packages/web/app/[locale]/home.tsx | 27 +- packages/web/app/[locale]/layout.tsx | 26 +- packages/web/app/[locale]/providers.tsx | 35 +- packages/web/app/globals.css | 76 + packages/web/app/layout.tsx | 2 +- packages/web/components.json | 16 + packages/web/components/alert-list.tsx | 107 + packages/web/components/alertList.tsx | 121 - packages/web/components/breadcrumbs.tsx | 57 +- .../{cardSection.tsx => card-section.tsx} | 21 +- packages/web/components/card.tsx | 35 +- packages/web/components/copy.tsx | 56 - .../{editAlert.tsx => edit-alert.tsx} | 24 +- .../{emptyIssues.tsx => empty-issues.tsx} | 4 +- ...tailAction.tsx => event-detail-action.tsx} | 18 +- ...ilProfile.tsx => event-detail-profile.tsx} | 12 +- ...DetailStack.tsx => event-detail-stack.tsx} | 15 +- ...DetailTrend.tsx => event-detail-trend.tsx} | 18 +- ...ntDetailUser.tsx => event-detail-user.tsx} | 12 +- packages/web/components/events-list.tsx | 115 + packages/web/components/eventsList.tsx | 71 - .../{feedbacksList.tsx => feedbacks-list.tsx} | 4 +- packages/web/components/footer.tsx | 42 +- packages/web/components/index.ts | 0 packages/web/components/intl.tsx | 9 +- ...introduceChart.tsx => introduce-chart.tsx} | 0 ...ueDetailTabs.tsx => issue-detail-tabs.tsx} | 2 +- ...DetailTitle.tsx => issue-detail-title.tsx} | 8 +- packages/web/components/issue-list.tsx | 392 + ...tedEvents.tsx => issue-related-events.tsx} | 18 +- ...etadata.tsx => issue-related-metadata.tsx} | 12 +- ...latedRrweb.tsx => issue-related-rrweb.tsx} | 13 +- packages/web/components/issueList.tsx | 433 - packages/web/components/layout.tsx | 133 +- ...oadMoreButton.tsx => load-more-button.tsx} | 12 +- packages/web/components/loading.tsx | 3 +- .../{loginButton.tsx => login-button.tsx} | 2 +- packages/web/components/logo.tsx | 28 +- .../{navContainer.tsx => nav-container.tsx} | 2 +- .../components/{navMenu.tsx => nav-menu.tsx} | 55 +- packages/web/components/nav.tsx | 29 +- packages/web/components/project-card.tsx | 68 + packages/web/components/project.tsx | 2 +- packages/web/components/projectCard.tsx | 72 - .../{releaseList.tsx => release-list.tsx} | 4 +- packages/web/components/spinning.tsx | 20 +- .../{stackInfo.tsx => stack-info.tsx} | 0 packages/web/components/tabs.tsx | 16 - packages/web/components/theme.tsx | 52 +- packages/web/components/themeBox.tsx | 34 - packages/web/components/title.tsx | 50 +- ...opProgressBar.tsx => top-progress-bar.tsx} | 0 .../{trendChart.tsx => trend-chart.tsx} | 6 +- packages/web/components/ui/box.tsx | 25 + packages/web/components/ui/button.tsx | 53 + packages/web/components/ui/card.tsx | 87 + packages/web/components/ui/dropdown-menu.tsx | 213 + packages/web/components/ui/table.tsx | 122 + packages/web/components/ui/theme-provider.tsx | 9 + packages/web/components/user.tsx | 138 +- packages/web/components/users-list.tsx | 117 + packages/web/components/usersList.tsx | 83 - packages/web/components/wrapper.tsx | 19 +- .../{useBreadcrumb.ts => use-breadcrumb.ts} | 2 +- .../web/hooks/{useColor.ts => use-color.ts} | 0 ...rrentProject.ts => use-current-project.ts} | 2 +- .../hooks/{useInfinite.ts => use-infinite.ts} | 0 ...seInviteMember.ts => use-invite-member.ts} | 0 .../web/hooks/{useQuery.ts => use-query.ts} | 0 packages/web/libs/utils.tsx | 12 +- packages/web/package.json | 48 +- packages/web/postcss.config.js | 2 +- packages/web/styles/globals.css | 3 + packages/web/styles/theme.ts | 13 +- packages/web/tailwind.config.js | 76 + pnpm-lock.yaml | 8662 +++++++++++------ 102 files changed, 8189 insertions(+), 4654 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc create mode 100644 eslint.config.js rename packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/{feedbackId.tsx => feedback-id.tsx} (58%) create mode 100644 packages/web/app/globals.css create mode 100644 packages/web/components.json create mode 100644 packages/web/components/alert-list.tsx delete mode 100644 packages/web/components/alertList.tsx rename packages/web/components/{cardSection.tsx => card-section.tsx} (79%) delete mode 100644 packages/web/components/copy.tsx rename packages/web/components/{editAlert.tsx => edit-alert.tsx} (97%) rename packages/web/components/{emptyIssues.tsx => empty-issues.tsx} (91%) rename packages/web/components/{eventDetailAction.tsx => event-detail-action.tsx} (88%) rename packages/web/components/{eventDetailProfile.tsx => event-detail-profile.tsx} (97%) rename packages/web/components/{eventDetailStack.tsx => event-detail-stack.tsx} (86%) rename packages/web/components/{eventDetailTrend.tsx => event-detail-trend.tsx} (85%) rename packages/web/components/{eventDetailUser.tsx => event-detail-user.tsx} (70%) create mode 100644 packages/web/components/events-list.tsx delete mode 100644 packages/web/components/eventsList.tsx rename packages/web/components/{feedbacksList.tsx => feedbacks-list.tsx} (93%) create mode 100644 packages/web/components/index.ts rename packages/web/components/{introduceChart.tsx => introduce-chart.tsx} (100%) rename packages/web/components/{issueDetailTabs.tsx => issue-detail-tabs.tsx} (97%) rename packages/web/components/{issueDetailTitle.tsx => issue-detail-title.tsx} (93%) create mode 100644 packages/web/components/issue-list.tsx rename packages/web/components/{issueRelatedEvents.tsx => issue-related-events.tsx} (77%) rename packages/web/components/{issueRelatedMetadata.tsx => issue-related-metadata.tsx} (78%) rename packages/web/components/{issueRelatedRrweb.tsx => issue-related-rrweb.tsx} (75%) delete mode 100644 packages/web/components/issueList.tsx rename packages/web/components/{loadMoreButton.tsx => load-more-button.tsx} (61%) rename packages/web/components/{loginButton.tsx => login-button.tsx} (92%) rename packages/web/components/{navContainer.tsx => nav-container.tsx} (95%) rename packages/web/components/{navMenu.tsx => nav-menu.tsx} (58%) create mode 100644 packages/web/components/project-card.tsx delete mode 100644 packages/web/components/projectCard.tsx rename packages/web/components/{releaseList.tsx => release-list.tsx} (96%) rename packages/web/components/{stackInfo.tsx => stack-info.tsx} (100%) delete mode 100644 packages/web/components/tabs.tsx delete mode 100644 packages/web/components/themeBox.tsx rename packages/web/components/{topProgressBar.tsx => top-progress-bar.tsx} (100%) rename packages/web/components/{trendChart.tsx => trend-chart.tsx} (98%) create mode 100644 packages/web/components/ui/box.tsx create mode 100644 packages/web/components/ui/button.tsx create mode 100644 packages/web/components/ui/card.tsx create mode 100644 packages/web/components/ui/dropdown-menu.tsx create mode 100644 packages/web/components/ui/table.tsx create mode 100644 packages/web/components/ui/theme-provider.tsx create mode 100644 packages/web/components/users-list.tsx delete mode 100644 packages/web/components/usersList.tsx rename packages/web/hooks/{useBreadcrumb.ts => use-breadcrumb.ts} (94%) rename packages/web/hooks/{useColor.ts => use-color.ts} (100%) rename packages/web/hooks/{useCurrentProject.ts => use-current-project.ts} (73%) rename packages/web/hooks/{useInfinite.ts => use-infinite.ts} (100%) rename packages/web/hooks/{useInviteMember.ts => use-invite-member.ts} (100%) rename packages/web/hooks/{useQuery.ts => use-query.ts} (100%) create mode 100644 packages/web/styles/globals.css create mode 100644 packages/web/tailwind.config.js diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index efbead9..0000000 --- a/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -build -public/build diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 967cde2..0000000 --- a/.eslintrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "@chenyueban" -} diff --git a/.npmrc b/.npmrc index 6c59086..acd5774 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ enable-pre-post-scripts=true +public-hoist-pattern[]=*@nextui-org/theme* diff --git a/.vscode/settings.json b/.vscode/settings.json index 19f3161..fce4d2d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,5 +2,6 @@ "cSpell.words": [ "ohbug" ], - "typescript.tsdk": "node_modules/typescript/lib" + "typescript.tsdk": "node_modules/typescript/lib", + "eslint.experimental.useFlatConfig": true } diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..ab613db --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,6 @@ +import { all } from '@chenyueban/eslint-config' + +export default [ + ...all, + { rules: { 'import/no-default-export': 'off' } }, +] diff --git a/package.json b/package.json index ae3705a..2974a15 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,8 @@ { "name": "ohbug-dashboard", + "type": "module", "version": "0.11.0", - "packageManager": "pnpm@8.6.7", + "packageManager": "pnpm@8.6.12", "homepage": "https://github.com/ohbug-org/ohbug-dashboard#readme", "bugs": { "url": "https://github.com/ohbug-org/ohbug-dashboard/issues" @@ -37,43 +38,43 @@ "release": "release-it" }, "dependencies": { - "@chenyueban/tsconfig": "^2.1.0", "@ohbug/browser": "^2.5.1", "@ohbug/core": "^2.2.1", "@ohbug/react": "^2.0.9", "@ohbug/types": "^2.2.1", "@ohbug/vue": "^2.0.10", - "@prisma/client": "^5.0.0", - "@types/js-yaml": "^4.0.5", - "@types/node": "^20.4.1", - "@types/ramda": "^0.29.3", - "cross-env": "^7.0.3", + "@prisma/client": "^5.2.0", "dayjs": "^1.11.9", "js-yaml": "^4.1.0", - "nodemailer": "^6.9.3", - "prisma": "^5.0.0", + "nodemailer": "^6.9.4", "ramda": "^0.29.0", - "rimraf": "^5.0.1", - "source-map-trace": "^0.2.6", - "tsup": "^7.1.0", - "tsx": "^3.12.7", - "typescript": "^5.1.6" + "source-map-trace": "^0.2.6" }, "devDependencies": { - "@antfu/ni": "^0.21.4", - "@babel/types": "^7.22.5", - "@chenyueban/eslint-config": "^1.1.0", - "@commitlint/cli": "^17.6.6", + "@antfu/ni": "^0.21.6", + "@babel/types": "^7.22.10", + "@chenyueban/eslint-config": "^3.0.5", + "@chenyueban/tsconfig": "^3.0.5", + "@commitlint/cli": "^17.7.1", "@release-it/conventional-changelog": "^7.0.0", "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.68", + "@swc/core": "^1.3.78", + "@types/js-yaml": "^4.0.5", + "@types/node": "^20.5.4", + "@types/ramda": "^0.29.3", "commitizen": "^4.3.0", + "cross-env": "^7.0.3", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.44.0", + "eslint": "^8.47.0", "husky": "^8.0.3", - "lint-staged": "^13.2.3", - "release-it": "^16.1.0", - "taze": "^0.11.2" + "lint-staged": "^14.0.1", + "prisma": "^5.2.0", + "release-it": "^16.1.5", + "rimraf": "^5.0.1", + "taze": "^0.11.2", + "tsup": "^7.2.0", + "tsx": "^3.12.7", + "typescript": "^5.1.6" }, "prisma": { "seed": "npx tsx prisma/seed.ts" diff --git a/packages/server/package.json b/packages/server/package.json index 6c5c3cc..e3a98cf 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -14,21 +14,21 @@ "dependencies": { "@nestjs/axios": "^3.0.0", "@nestjs/bull": "^10.0.1", - "@nestjs/cli": "^10.1.8", - "@nestjs/common": "^10.0.5", - "@nestjs/core": "^10.0.5", + "@nestjs/cli": "^10.1.14", + "@nestjs/common": "^10.2.1", + "@nestjs/core": "^10.2.1", "@nestjs/mapped-types": "^2.0.2", - "@nestjs/platform-fastify": "^10.0.5", - "@nestjs/schedule": "^3.0.1", - "@nestjs/schematics": "^10.0.1", - "@nestjs/swagger": "^7.1.1", + "@nestjs/platform-fastify": "^10.2.1", + "@nestjs/schedule": "^3.0.3", + "@nestjs/schematics": "^10.0.2", + "@nestjs/swagger": "^7.1.8", "@types/bull": "^4.10.0", - "@types/cron": "^2.0.1", + "@types/cron": "^2.4.0", "@types/express": "^4.17.17", - "@types/markdown-it": "^12.2.3", - "@types/nodemailer": "^6.4.8", + "@types/markdown-it": "^13.0.0", + "@types/nodemailer": "^6.4.9", "@webundsoehne/nest-fastify-file-upload": "^2.1.0", - "bull": "^4.10.4", + "bull": "^4.11.3", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "common": "workspace:*", @@ -37,10 +37,10 @@ "fastify-multer": "^2.0.3", "markdown-it": "^13.0.1", "nanoid": "3.3.6", - "nestjs-pino": "^3.3.0", - "pino": "^8.14.1", - "pino-http": "^8.3.3", - "pino-pretty": "^10.0.1", + "nestjs-pino": "^3.4.0", + "pino": "^8.15.0", + "pino-http": "^8.4.0", + "pino-pretty": "^10.2.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1" }, diff --git a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alertId.tsx b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alertId.tsx index 609e92d..444ca0e 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alertId.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alertId.tsx @@ -1,18 +1,18 @@ 'use client' import { Badge, Box, Button, Code, Flex, Tag, Text, Tooltip } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' -import type { Alert, AlertEvent, Event, Issue } from '@prisma/client' +import Link from 'next/link' import { useMemo } from 'react' -import type { Action, ConditionOption, FilterOption } from 'common' +import { type Action, type ConditionOption, type FilterOption } from 'common' import dayjs from 'dayjs' -import type { AlertEventTrend } from '~/services/alerts' -import ThemeBox from '~/components/themeBox' +import { type Alert, type AlertEvent, type Event, type Issue } from '@prisma/client' +import { type AlertEventTrend } from '~/services/alerts' +import { Box } from '~/components/ui/box' import Wrapper from '~/components/wrapper' -import CardSection from '~/components/cardSection' +import CardSection from '~/components/card-section' import Title from '~/components/title' -import useCurrentProject from '~/hooks/useCurrentProject' -import EventsList from '~/components/eventsList' +import useCurrentProject from '~/hooks/use-current-project' +import EventsList from '~/components/events-list' import { ConditionOptions, FilterOptions } from '~/components/editAlert' import TrendChart from '~/components/trendChart' @@ -43,7 +43,7 @@ export default function AlertId({ alert, alertEvents, alertEventTrends }: Props) {alert.name} - + - + ) } diff --git a/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx b/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx index b94da56..b56ffc6 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx @@ -8,7 +8,7 @@ import { useTranslations } from 'next-intl' import Card from '~/components/card' import Title from '~/components/title' import Wrapper from '~/components/wrapper' -import useCurrentProject from '~/hooks/useCurrentProject' +import useCurrentProject from '~/hooks/use-current-project' import EditAlert from '~/components/editAlert' import { serviceCreateAlert } from '~/services/alerts' diff --git a/packages/web/app/[locale]/[projectId]/alerts/page.tsx b/packages/web/app/[locale]/[projectId]/alerts/page.tsx index 855f14b..64ba9e7 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/page.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/page.tsx @@ -1,16 +1,16 @@ 'use client' import { Box, Button } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' -import type { Alert } from '@prisma/client' +import Link from 'next/link' import { useTranslations } from 'next-intl' +import { type Alert } from '@prisma/client' import Card from '~/components/card' -import AlertsList from '~/components/alertList' +import AlertsList from '~/components/alert-list' import Title from '~/components/title' import Wrapper from '~/components/wrapper' -import useCurrentProject from '~/hooks/useCurrentProject' -import { useInfinite } from '~/hooks/useInfinite' -import LoadingMoreButton from '~/components/loadMoreButton' +import useCurrentProject from '~/hooks/use-current-project' +import { useInfinite } from '~/hooks/use-infinite' +import LoadingMoreButton from '~/components/load-more-button' import { serviceGetAlerts } from '~/services/alerts' const Alerts = () => { diff --git a/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedbackId.tsx b/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedback-id.tsx similarity index 58% rename from packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedbackId.tsx rename to packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedback-id.tsx index 35f30df..c851d4a 100644 --- a/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedbackId.tsx +++ b/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedback-id.tsx @@ -1,14 +1,14 @@ 'use client' -import { Box, Flex, HStack, VStack } from '@chakra-ui/react' +import { Flex, HStack, VStack } from '@chakra-ui/react' import { useMemo } from 'react' -import EventDetailActions from '~/components/eventDetailAction' -import EventDetailProfile from '~/components/eventDetailProfile' -import EventDetailUser from '~/components/eventDetailUser' -import CardSection from '~/components/cardSection' -import ThemeBox from '~/components/themeBox' +import { Snippet } from '@nextui-org/react' +import EventDetailActions from '~/components/event-detail-action' +import EventDetailProfile from '~/components/event-detail-profile' +import EventDetailUser from '~/components/event-detail-user' +import CardSection from '~/components/card-section' +import { Box } from '~/components/ui/box' import Wrapper from '~/components/wrapper' -import Copy from '~/components/copy' interface Props { feedback: any @@ -24,19 +24,19 @@ export default function FeedbackId({ feedback }: Props) { > - + - {detail.feedback && Feedback:{detail.feedback}} - {detail.selector && Selector:{detail.selector}} - {detail.outerHTML && outerHTML:{detail.outerHTML}} + {detail.feedback && Feedback:{detail.feedback}} + {detail.selector && Selector:{detail.selector}} + {detail.outerHTML && outerHTML:{detail.outerHTML}} - + diff --git a/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/page.tsx b/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/page.tsx index 7727bfb..b6bd7ae 100644 --- a/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/page.tsx +++ b/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/page.tsx @@ -1,4 +1,4 @@ -import FeedbackId from './feedbackId' +import FeedbackId from './feedback-id' import { serviceGetFeedback } from '~/services/feedbacks' export default async function FeedbackIdPage({ params }: { params: { feedbackId: string } }) { diff --git a/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx b/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx index f424236..b331998 100644 --- a/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx +++ b/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx @@ -1,15 +1,15 @@ 'use client' import { Button, Icon, Link } from '@chakra-ui/react' -import type { EventUser, Feedback } from '@prisma/client' import { useTranslations } from 'next-intl' import { RiQuestionLine } from 'react-icons/ri' -import FeedbacksList from '~/components/feedbacksList' -import ThemeBox from '~/components/themeBox' +import { type EventUser, type Feedback } from '@prisma/client' +import FeedbacksList from '~/components/feedbacks-list' +import { Box } from '~/components/ui/box' import Title from '~/components/title' import Wrapper from '~/components/wrapper' -import useCurrentProject from '~/hooks/useCurrentProject' -import { useInfinite } from '~/hooks/useInfinite' +import useCurrentProject from '~/hooks/use-current-project' +import { useInfinite } from '~/hooks/use-infinite' import { serviceGetFeedbacks } from '~/services/feedbacks' export default function FeedbacksPage() { @@ -27,7 +27,7 @@ export default function FeedbacksPage() { ) return ( - + </Wrapper> - </ThemeBox> + </Box> ) } diff --git a/packages/web/app/[locale]/[projectId]/issues/[issueId]/issueId.tsx b/packages/web/app/[locale]/[projectId]/issues/[issueId]/issueId.tsx index ac593c7..34afc9b 100644 --- a/packages/web/app/[locale]/[projectId]/issues/[issueId]/issueId.tsx +++ b/packages/web/app/[locale]/[projectId]/issues/[issueId]/issueId.tsx @@ -1,23 +1,23 @@ 'use client' -import type { Issue, OhbugEventLike } from 'common' import { Flex } from '@chakra-ui/react' import { useSearchParams } from 'next/navigation' import { useMemo } from 'react' import dynamic from 'next/dynamic' -import EventDetailActions from '~/components/eventDetailAction' -import EventDetailProfile from '~/components/eventDetailProfile' -import EventDetailStack from '~/components/eventDetailStack' -import IssueDetailTitle from '~/components/issueDetailTitle' -import EventDetailTrend from '~/components/eventDetailTrend' -import EventDetailUser from '~/components/eventDetailUser' -import IssueRelatedEvents from '~/components/issueRelatedEvents' -import type { IssueTrend } from '~/services/issues' -import IssueRelatedMetadata from '~/components/issueRelatedMetadata' +import { type Issue, type OhbugEventLike } from 'common' +import { type IssueTrend } from '~/services/issues' +import EventDetailActions from '~/components/event-detail-action' +import EventDetailProfile from '~/components/event-detail-profile' +import EventDetailStack from '~/components/event-detail-stack' +import IssueDetailTitle from '~/components/issue-detail-title' +import EventDetailTrend from '~/components/event-detail-trend' +import EventDetailUser from '~/components/event-detail-user' +import IssueRelatedEvents from '~/components/issue-related-events' +import IssueRelatedMetadata from '~/components/issue-related-metadata' const IssueRelatedRrweb = dynamic( () => { - return import('~/components/issueRelatedRrweb') + return import('~/components/issue-related-rrweb') }, { ssr: false }, ) diff --git a/packages/web/app/[locale]/[projectId]/issues/page.tsx b/packages/web/app/[locale]/[projectId]/issues/page.tsx index fbafa44..11e9f04 100644 --- a/packages/web/app/[locale]/[projectId]/issues/page.tsx +++ b/packages/web/app/[locale]/[projectId]/issues/page.tsx @@ -1,18 +1,18 @@ 'use client' -import EmptyIssues from '~/components/emptyIssues' -import IssueList from '~/components/issueList' -import ThemeBox from '~/components/themeBox' +import EmptyIssues from '~/components/empty-issues' +import IssueList from '~/components/issue-list' +import { Box } from '~/components/ui/box' import Wrapper from '~/components/wrapper' export default function IssuesPage() { return ( - <ThemeBox bg="current"> + <Box> <Wrapper> <IssueList empty={<EmptyIssues />} /> </Wrapper> - </ThemeBox> + </Box> ) } diff --git a/packages/web/app/[locale]/[projectId]/layout.tsx b/packages/web/app/[locale]/[projectId]/layout.tsx index af0cbca..da93c64 100644 --- a/packages/web/app/[locale]/[projectId]/layout.tsx +++ b/packages/web/app/[locale]/[projectId]/layout.tsx @@ -1,4 +1,4 @@ -import type { ReactNode } from 'react' +import { type ReactNode } from 'react' interface Props { children: ReactNode diff --git a/packages/web/app/[locale]/[projectId]/metrics/page.tsx b/packages/web/app/[locale]/[projectId]/metrics/page.tsx index 3cfa703..8334c1a 100644 --- a/packages/web/app/[locale]/[projectId]/metrics/page.tsx +++ b/packages/web/app/[locale]/[projectId]/metrics/page.tsx @@ -3,15 +3,15 @@ import { Button, Icon, Link } from '@chakra-ui/react' import { useTranslations } from 'next-intl' import { RiQuestionLine } from 'react-icons/ri' -import IntroduceChart from '~/components/introduceChart' -import ThemeBox from '~/components/themeBox' +import IntroduceChart from '~/components/introduce-chart' +import { Box } from '~/components/ui/box' import Title from '~/components/title' -import TrendChart from '~/components/trendChart' +import TrendChart from '~/components/trend-chart' import Wrapper from '~/components/wrapper' -import useCurrentProject from '~/hooks/useCurrentProject' +import useCurrentProject from '~/hooks/use-current-project' import { average } from '~/libs/utils' import { serviceGetMetricsTrends } from '~/services/metrics' -import { useQuery } from '~/hooks/useQuery' +import { useQuery } from '~/hooks/use-query' const CLS_THRESHOLD = [0.1, 0.25] const FID_THRESHOLD = [100, 300] @@ -74,7 +74,7 @@ export default function MetricsPage() { ) return ( - <ThemeBox bg="current"> + <Box > <Title rightNodes={ ( @@ -216,6 +216,6 @@ export default function MetricsPage() { /> </IntroduceChart> </Wrapper> - </ThemeBox> + </Box> ) } diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx index 428f6ec..5d7cfcb 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx @@ -1,7 +1,7 @@ 'use client' import { HStack } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' +import Link from 'next/link' import Card from '~/components/card' function HashChange() { diff --git a/packages/web/app/[locale]/[projectId]/mock/mock.tsx b/packages/web/app/[locale]/[projectId]/mock/mock.tsx index 1c92345..17c78a0 100644 --- a/packages/web/app/[locale]/[projectId]/mock/mock.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/mock.tsx @@ -1,9 +1,9 @@ 'use client' -import type { Project } from '@prisma/client' +import { type Project } from '@prisma/client' import Frame from './frame' import Wrapper from '~/components/wrapper' -import ThemeBox from '~/components/themeBox' +import { Box } from '~/components/ui/box' interface Props { project: Project @@ -11,10 +11,10 @@ interface Props { export default function Mock({ project }: Props) { return ( - <ThemeBox bg="current"> + <Box > <Wrapper> <Frame project={project} /> </Wrapper> - </ThemeBox> + </Box> ) } diff --git a/packages/web/app/[locale]/[projectId]/profile/page.tsx b/packages/web/app/[locale]/[projectId]/profile/page.tsx index 8127ce7..f87edf3 100644 --- a/packages/web/app/[locale]/[projectId]/profile/page.tsx +++ b/packages/web/app/[locale]/[projectId]/profile/page.tsx @@ -2,9 +2,12 @@ import dayjs from 'dayjs' import Profile from './profile' import { serviceGetProject, serviceGetProjectTrends } from '~/services/projects' import { serviceGetPVPathGroupResult, serviceGetPVReferrerGroupResult, serviceGetPageView, serviceGetUserView } from '~/services/views' +import { getPrisma } from '~/db' export default async function ProfilePage({ params }: { params: { projectId: string } }) { - const projectId = parseInt(params.projectId) + const projectId = parseInt(params.projectId) || (await getPrisma().project.findFirst())?.id + if (!projectId) return null + const project = await serviceGetProject(projectId) const trends14d = await serviceGetProjectTrends({ id: projectId, type: '14d' }) const trends24h = await serviceGetProjectTrends({ id: projectId, type: '24h' }) diff --git a/packages/web/app/[locale]/[projectId]/profile/profile.tsx b/packages/web/app/[locale]/[projectId]/profile/profile.tsx index bf350d2..45f21c7 100644 --- a/packages/web/app/[locale]/[projectId]/profile/profile.tsx +++ b/packages/web/app/[locale]/[projectId]/profile/profile.tsx @@ -1,21 +1,19 @@ 'use client' -import { Box, Button, Flex, FormControl, FormLabel, Icon, Stat, StatArrow, StatGroup, StatHelpText, StatLabel, StatNumber, Switch, Text, Tooltip } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' -import type { Event, Project } from '@prisma/client' +import Link from 'next/link' import { useMemo, useState } from 'react' -import { RiSettings2Line } from 'react-icons/ri' import { useTranslations } from 'next-intl' -import Card from '~/components/card' -import ThemeBox from '~/components/themeBox' -import TrendChart from '~/components/trendChart' +import { Button, Card, CardBody, Switch, Tooltip } from '@nextui-org/react' +import { type Event, type Project } from '@prisma/client' +import { type ProjectTrend } from '~/services/projects' +import { Box } from '~/components/ui/box' +import TrendChart from '~/components/trend-chart' import Wrapper from '~/components/wrapper' -import EventsList from '~/components/eventsList' -import type { ProjectTrend } from '~/services/projects' +import EventsList from '~/components/events-list' import Title from '~/components/title' -import { useInfinite } from '~/hooks/useInfinite' +import { useInfinite } from '~/hooks/use-infinite' import { serviceGetEventByProjectId } from '~/services/events' -import type { PVGroupResult } from '~/services/views' +import { type PVGroupResult } from '~/services/views' interface Props { project?: Project @@ -61,75 +59,81 @@ const View = ({ views }: Props) => { <> <Wrapper> <Card> - <StatGroup> - <Stat> - <StatLabel>{t('pv')}(PV)</StatLabel> - <StatNumber>{views?.pageView}</StatNumber> - <StatHelpText> - <StatArrow type="increase" /> - {pageViewTrend}% - </StatHelpText> - </Stat> + <CardBody> + <div className="flex justify-between gap-4"> + <div className="flex flex-col"> + <div className="text-lg">{t('pv')}(PV)</div> + <div className="text-xl font-semibold">{views?.pageView}</div> + <div> + <i className="i-ri-arrow-up-s" /> + {pageViewTrend}% + </div> + </div> - <Stat> - <StatLabel>{t('uv')}(UV)</StatLabel> - <StatNumber>{views?.userView}</StatNumber> - <StatHelpText> - <StatArrow type="increase" /> - {userViewTrend}% - </StatHelpText> - </Stat> + <div> + <div>{t('uv')}(UV)</div> + <div>{views?.userView}</div> + <div> + <i className="i-ri-arrow-up-s" /> + {userViewTrend}% + </div> + </div> - <Stat> - <StatLabel>{t('activeUser')}</StatLabel> - <StatNumber>{views?.activeUser ?? 0}</StatNumber> - </Stat> - </StatGroup> + <div> + <div>{t('activeUser')}</div> + <div>{views?.activeUser ?? 0}</div> + </div> + </div> + </CardBody> </Card> </Wrapper> <Wrapper> - <Flex gap="8"> + <div className="flex gap-8"> { views?.pvPathGroupResult.length > 0 && ( - <Card flex="1"> - <TrendChart - data={views?.pvPathGroupResult} - name="number" - timeField="value" - title={ - ( - <Tooltip label={t('pageViewsDesc')}> - {t('pageViews')} - </Tooltip> - ) - } - type="14d" - variant="row" - /> + <Card className="flex-1"> + <CardBody> + <TrendChart + data={views?.pvPathGroupResult} + name="number" + timeField="value" + title={ + ( + <Tooltip content={t('pageViewsDesc')}> + {t('pageViews')} + </Tooltip> + ) + } + type="14d" + variant="row" + /> + </CardBody> </Card> ) } { views?.pvReferrerGroupResult.length > 0 && ( - <Card flex="1"> - <TrendChart - data={views?.pvReferrerGroupResult} - name="number" - timeField="value" - title={ - ( - <Tooltip label={t('referrersDesc')}> - {t('referrers')} - </Tooltip> - ) - } - type="14d" - variant="row" - /> + <Card className="flex-1"> + <CardBody> + <TrendChart + data={views?.pvReferrerGroupResult} + name="number" + timeField="value" + title={ + ( + <Tooltip content={t('referrersDesc')}> + {t('referrers')} + </Tooltip> + ) + } + type="14d" + variant="row" + /> + </CardBody> </Card> ) } - </Flex> + </div> </Wrapper> </> ) @@ -137,37 +141,31 @@ const View = ({ views }: Props) => { const Trend = ({ trends }: Props) => { const [chartType, setChartType] = useState<'24h' | '14d'>('24h') const TrendTitle = useMemo(() => ( - <Flex justify="space-between"> - <Text fontWeight="semibold">Event Trends</Text> - <FormControl - alignItems="center" - display="flex" - w="auto" - > - <FormLabel - htmlFor="trendsType" - mb="0" - > - {chartType === '24h' ? '24小时' : '14天'} - </FormLabel> + <div className="flex justify-between"> + <div className="font-semibold">Event Trends</div> + <div className="flex items-center"> <Switch id="trendsType" - isChecked={chartType === '24h'} - onChange={e => setChartType(e.target.checked ? '24h' : '14d')} - /> - </FormControl> - </Flex> + isSelected={chartType === '24h'} + onValueChange={e => setChartType(e ? '24h' : '14d')} + > + {chartType === '24h' ? '24小时' : '14天'} + </Switch> + </div> + </div> ), [chartType]) return ( <Wrapper> <Card> - <TrendChart - data={trends?.[chartType]} - title={TrendTitle} - type="14d" - variant="detail" - /> + <CardBody> + <TrendChart + data={trends?.[chartType]} + title={TrendTitle} + type="14d" + variant="detail" + /> + </CardBody> </Card> </Wrapper> ) @@ -182,16 +180,14 @@ const Events = ({ project }: Props) => { ) return ( - <ThemeBox bg="current"> + <Box> <Wrapper> <EventsList events={data} /> <Button + className="mt-6 w-full" disabled={isLoading || isReachingEnd} - mt="6" onClick={() => setSize(size + 1)} size="sm" - variant="outline" - w="full" > { isLoading @@ -202,22 +198,21 @@ const Events = ({ project }: Props) => { } </Button> </Wrapper> - </ThemeBox> + </Box> ) } export default function Profile({ project, trends, views }: Props) { return ( - <Box> + <div> <Title rightNodes={ ( <Link href={`/${project?.id}/settings`}> <Button - leftIcon={ - <Icon as={RiSettings2Line} /> + startContent={ + <i className="i-ri-settings-2-line" /> } - variant="solid" > Setting </Button> @@ -228,13 +223,13 @@ export default function Profile({ project, trends, views }: Props) { {project?.name} - +
- +
-
+ ) } diff --git a/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/sourceMaps.tsx b/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/sourceMaps.tsx index 2d3bcce..62518f3 100644 --- a/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/sourceMaps.tsx +++ b/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/sourceMaps.tsx @@ -1,11 +1,11 @@ 'use client' import { Flex, IconButton, Link, Text } from '@chakra-ui/react' -import type { Release } from '@prisma/client' import { useMemo } from 'react' import { formatBytes } from 'common' import { RiFileDownloadLine } from 'react-icons/ri' -import ThemeBox from '~/components/themeBox' +import { type Release } from '@prisma/client' +import { Box } from '~/components/ui/box' import Wrapper from '~/components/wrapper' import Title from '~/components/title' import Card from '~/components/card' @@ -21,7 +21,7 @@ export default function SourceMaps({ release }: Props) { SourceMaps - + { @@ -55,7 +55,7 @@ export default function SourceMaps({ release }: Props) { } - +
) } diff --git a/packages/web/app/[locale]/[projectId]/releases/page.tsx b/packages/web/app/[locale]/[projectId]/releases/page.tsx index cea7468..216dca7 100644 --- a/packages/web/app/[locale]/[projectId]/releases/page.tsx +++ b/packages/web/app/[locale]/[projectId]/releases/page.tsx @@ -1,16 +1,15 @@ 'use client' -import { Box, Button, Icon, Link } from '@chakra-ui/react' +import { Button, Card } from '@nextui-org/react' import type { Release } from '@prisma/client' import { useTranslations } from 'next-intl' -import { RiQuestionLine } from 'react-icons/ri' -import Card from '~/components/card' -import LoadingMoreButton from '~/components/loadMoreButton' -import ReleaseList from '~/components/releaseList' +import Link from 'next/link' +import LoadingMoreButton from '~/components/load-more-button' +import ReleaseList from '~/components/release-list' import Title from '~/components/title' import Wrapper from '~/components/wrapper' -import useCurrentProject from '~/hooks/useCurrentProject' -import { useInfinite } from '~/hooks/useInfinite' +import useCurrentProject from '~/hooks/use-current-project' +import { useInfinite } from '~/hooks/use-infinite' import { serviceGetReleases } from '~/services/releases' export default function ReleasesPage() { @@ -28,7 +27,7 @@ export default function ReleasesPage() { ) return ( - +
<Button - leftIcon={ + startContent={ ( - <Icon - as={RiQuestionLine} - h="5" - w="5" - /> + <i className="i-ri-question-line" /> ) } variant="ghost" @@ -57,12 +52,7 @@ export default function ReleasesPage() { Releases - + { data && ( @@ -79,6 +69,6 @@ export default function ReleasesPage() { /> - +
) } diff --git a/packages/web/app/[locale]/[projectId]/settings/page.tsx b/packages/web/app/[locale]/[projectId]/settings/page.tsx index 026ff36..acc2dee 100644 --- a/packages/web/app/[locale]/[projectId]/settings/page.tsx +++ b/packages/web/app/[locale]/[projectId]/settings/page.tsx @@ -1,21 +1,18 @@ 'use client' -import { Avatar, Box, Button, Flex, FormControl, FormErrorMessage, Input, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, Skeleton, Text, useDisclosure, useToast } from '@chakra-ui/react' import type { Project } from '@prisma/client' import { useTranslations } from 'next-intl' import { useCallback, useMemo } from 'react' import { useForm } from 'react-hook-form' import type { ProjectWithMembers } from 'common' -import { RiAddLine } from 'react-icons/ri' import { useSession } from 'next-auth/react' -import Card from '~/components/card' -import Copy from '~/components/copy' -import ThemeBox from '~/components/themeBox' +import { Avatar, Button, Card, CardBody, CardFooter, CardHeader, Input, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, Skeleton, Snippet, useDisclosure } from '@nextui-org/react' +import { useToast } from '@chakra-ui/react' import Title from '~/components/title' import Wrapper from '~/components/wrapper' -import useCurrentProject from '~/hooks/useCurrentProject' +import useCurrentProject from '~/hooks/use-current-project' import { serviceGetProjectWithUsers, serviceUpdateProject } from '~/services/projects' -import { useQuery } from '~/hooks/useQuery' +import { useQuery } from '~/hooks/use-query' interface CommonProps { project?: ProjectWithMembers @@ -52,88 +49,64 @@ const SettingsProjectName = ({ project }: CommonProps) => { return (
- - {t('projectDescription')} - - - - - {errors.name && errors.name.message} - - + + + {t('projectName')} + + +
{t('projectDescription')}
+ + - { - (!!name && name !== project?.name) && ( - - {t('yourProjectWillBeRenamedTo')} ` - - {name} - + { + (!!name && name !== project?.name) && ( +
+ {t('yourProjectWillBeRenamedTo')} ` + + {name} + `. - - ) - } - - ) - } - footer={ - ( - -
- - - ) - } - title={t('projectName')} - /> +
+ ) + } + + +
+ + + ) } const SettingsProjectApiKey = ({ project }: CommonProps) => { const t = useTranslations('Settings') - return ( - - {t('apiKeyDescription')} - {project?.apiKey ?? ''} - - ) - } - title={t('projectApiKey')} - /> + return ( + + + {t('projectApiKey')} + + +
{t('apiKeyDescription')}
+ {project?.apiKey ?? ''} +
+
) } @@ -151,58 +124,48 @@ const SettingsProjectUsers = ({ project }: CommonProps) => { return ( <> - - { - project?.members?.map(member => ( - - - - - {member.name} - {member.email} - - - - - - )) - } - - ) - } - extra={ - ( - - ) - } - title={t('projectMembers')} - /> + + + {t('projectMembers')} + + + +
+ { + project?.members?.map(member => ( +
+
+ +
+ {member.name} + {member.email} +
+
+
+ )) + } +
+
+
- {t('inviteMembers')} - - - {t('inviteMembersDescription')} - {inviteUrl} + +
{t('inviteMembersDescription')}
+ {inviteUrl}
@@ -226,15 +189,10 @@ export default function SettingsPage() { ) return ( - +
{t('projectSettings')} - + - +
) } diff --git a/packages/web/app/[locale]/[projectId]/users/[userId]/userId.tsx b/packages/web/app/[locale]/[projectId]/users/[userId]/userId.tsx index 43b008b..8685a24 100644 --- a/packages/web/app/[locale]/[projectId]/users/[userId]/userId.tsx +++ b/packages/web/app/[locale]/[projectId]/users/[userId]/userId.tsx @@ -1,15 +1,15 @@ 'use client' import { Flex, Table, TableContainer, Tbody, Td, Th, Thead, Tr } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' -import type { Event, EventUser, Feedback } from '@prisma/client' +import Link from 'next/link' import dayjs from 'dayjs' import dynamic from 'next/dynamic' -import EventsList from '~/components/eventsList' -import ThemeBox from '~/components/themeBox' +import { type Event, type EventUser, type Feedback } from '@prisma/client' +import EventsList from '~/components/events-list' +import { Box } from '~/components/ui/box' import Wrapper from '~/components/wrapper' -import CardSection from '~/components/cardSection' -import useCurrentProject from '~/hooks/useCurrentProject' +import CardSection from '~/components/card-section' +import useCurrentProject from '~/hooks/use-current-project' import Title from '~/components/title' const DynamicReactJson = dynamic(import('react-json-view'), { ssr: false }) @@ -29,7 +29,7 @@ export default function UserId({ user }: Props) { flexDirection="column" gap="6" > - + <DynamicReactJson @@ -85,7 +85,7 @@ export default function UserId({ user }: Props) { </TableContainer> </CardSection> </Wrapper> - </ThemeBox> + </Box> </Flex> ) } diff --git a/packages/web/app/[locale]/[projectId]/users/page.tsx b/packages/web/app/[locale]/[projectId]/users/page.tsx index 25ab9c6..7053018 100644 --- a/packages/web/app/[locale]/[projectId]/users/page.tsx +++ b/packages/web/app/[locale]/[projectId]/users/page.tsx @@ -1,17 +1,15 @@ 'use client' -import { Box, Button, Heading, Input, InputGroup, InputLeftElement, VStack } from '@chakra-ui/react' -import type { EventUser } from '@prisma/client' import { useTranslations } from 'next-intl' -import { RiSearchLine } from 'react-icons/ri' import { useState } from 'react' import { useDebounce } from 'react-use' -import UsersList from '~/components/usersList' -import ThemeBox from '~/components/themeBox' +import { Button, Input } from '@nextui-org/react' +import { type EventUser } from '@prisma/client' +import UsersList from '~/components/users-list' import Title from '~/components/title' import Wrapper from '~/components/wrapper' -import useCurrentProject from '~/hooks/useCurrentProject' -import { useInfinite } from '~/hooks/useInfinite' +import useCurrentProject from '~/hooks/use-current-project' +import { useInfinite } from '~/hooks/use-infinite' import { serviceGetEventUsers } from '~/services/eventUsers' export default function UsersPage() { @@ -48,46 +46,29 @@ export default function UsersPage() { ) return ( - <ThemeBox bg="current"> + <div> <Title> - <VStack - spacing="4" - w="full" - > - <Heading - fontWeight="semibold" - size="lg" - w="full" - > + <div className="flex gap-4 w-full"> + <h2 className="font-semibold text-lg w-full"> Users - </Heading> - <Box w="full"> - <InputGroup> - <InputLeftElement - pointerEvents="none" - > - <RiSearchLine /> - </InputLeftElement> - <Input - onChange={e => setQuery(e.target.value)} - placeholder="Search for users ipAddress uuid email name and metadata" - value={query} - variant="filled" - /> - </InputGroup> - </Box> - </VStack> + </h2> + <div className="w-full"> + <Input + onChange={e => setQuery(e.target.value)} + placeholder="Search for users ipAddress uuid email name and metadata" + startContent={<i className="i-ri-search-line" />} + value={query} + /> + </div> + </div> - +
) } diff --git a/packages/web/app/[locale]/home.tsx b/packages/web/app/[locale]/home.tsx index 47a4258..0155eb6 100644 --- a/packages/web/app/[locale]/home.tsx +++ b/packages/web/app/[locale]/home.tsx @@ -1,15 +1,14 @@ 'use client' -import { Button, Flex, SimpleGrid } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' -import { RiAddLine } from 'react-icons/ri' +import Link from 'next/link' import { useTranslations } from 'next-intl' import { useSession } from 'next-auth/react' -import type { User } from '@prisma/client' -import ProjectCard from '~/components/projectCard' +import { type User } from '@prisma/client' +import { Button } from '~/components/ui/button' +import ProjectCard from '~/components/project-card' import Wrapper from '~/components/wrapper' -import { useInviteMember } from '~/hooks/useInviteMember' -import { useQuery } from '~/hooks/useQuery' +import { useInviteMember } from '~/hooks/use-invite-member' +import { useQuery } from '~/hooks/use-query' import { serviceGetProjectsWithEventCount } from '~/services/projects' export default function Home() { @@ -24,20 +23,16 @@ export default function Home() { return ( - +
- - +
+
{ projects?.map(project => ( )) } - +
) } diff --git a/packages/web/app/[locale]/layout.tsx b/packages/web/app/[locale]/layout.tsx index 5b16bd6..4f6f61d 100644 --- a/packages/web/app/[locale]/layout.tsx +++ b/packages/web/app/[locale]/layout.tsx @@ -1,4 +1,3 @@ -import type { ReactNode } from 'react' import { NextIntlClientProvider } from 'next-intl' import { notFound } from 'next/navigation' import { getServerSession } from 'next-auth' @@ -6,8 +5,11 @@ import dayjs from 'dayjs' import relativeTime from 'dayjs/plugin/relativeTime' import timezone from 'dayjs/plugin/timezone' import utc from 'dayjs/plugin/utc' +import { type ReactNode } from 'react' import { Providers } from './providers' import { getAuthOptions } from '~/auth' +import '~/styles/globals.css' +import { ThemeProvider } from '~/components/ui/theme-provider' dayjs.extend(relativeTime) dayjs.extend(utc) @@ -21,7 +23,7 @@ export default async function Layout({ children, params: { locale } }: { try { messages = (await import(`../../messages/${locale}.json`)).default } - catch (error) { + catch { notFound() } const session = await getServerSession(getAuthOptions()) @@ -33,14 +35,20 @@ export default async function Layout({ children, params: { locale } }: { - - - {children} - - + + + {children} + + + ) diff --git a/packages/web/app/[locale]/providers.tsx b/packages/web/app/[locale]/providers.tsx index a032c31..8ee43f8 100644 --- a/packages/web/app/[locale]/providers.tsx +++ b/packages/web/app/[locale]/providers.tsx @@ -1,7 +1,7 @@ 'use client' -import type { ReactElement, ReactNode } from 'react' import { useEffect } from 'react' +import { NextUIProvider } from '@nextui-org/react' import { ChakraProvider, ColorModeScript } from '@chakra-ui/react' import { SessionProvider, useSession } from 'next-auth/react' import dayjs from 'dayjs' @@ -10,18 +10,19 @@ import timezone from 'dayjs/plugin/timezone' import utc from 'dayjs/plugin/utc' import { usePathname, useRouter } from 'next-intl/client' import dynamic from 'next/dynamic' -import type { User } from '@prisma/client' import { CacheProvider } from '@chakra-ui/next-js' -import type { Session } from 'next-auth' +import { type ReactElement, type ReactNode } from 'react' +import { type Session } from 'next-auth' +import { type User } from '@prisma/client' import Layout from '~/components/layout' import theme from '~/styles/theme' import { serviceGetProjects } from '~/services/projects' -import { useQuery } from '~/hooks/useQuery' +import { useQuery } from '~/hooks/use-query' import '~/styles/nprogress.css' const TopProgressBar = dynamic( () => { - return import('~/components/topProgressBar') + return import('~/components/top-progress-bar') }, { ssr: false }, ) @@ -39,14 +40,12 @@ function Controller({ children }: { children: ReactElement }) { ) useEffect(() => { - if (session.status === 'unauthenticated') { - if (pathname !== '/auth/signin') { - router.replace('/auth/signin') - } + if (session.status === 'unauthenticated' && pathname !== '/auth/signin') { + router.replace('/auth/signin') } }, [pathname, session]) useEffect(() => { - if (projects && !projects.length) { + if (projects && projects.length === 0) { router.replace('/create-project') } }, [projects]) @@ -64,13 +63,15 @@ export function Providers({ children, session }: Props) { - - - - - {children} - - + + + + + + {children} + + + diff --git a/packages/web/app/globals.css b/packages/web/app/globals.css new file mode 100644 index 0000000..e4e2494 --- /dev/null +++ b/packages/web/app/globals.css @@ -0,0 +1,76 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 20 14.3% 4.1%; + + --card: 0 0% 100%; + --card-foreground: 20 14.3% 4.1%; + + --popover: 0 0% 100%; + --popover-foreground: 20 14.3% 4.1%; + + --primary: 24 9.8% 10%; + --primary-foreground: 60 9.1% 97.8%; + + --secondary: 60 4.8% 95.9%; + --secondary-foreground: 24 9.8% 10%; + + --muted: 60 4.8% 95.9%; + --muted-foreground: 25 5.3% 44.7%; + + --accent: 60 4.8% 95.9%; + --accent-foreground: 24 9.8% 10%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 60 9.1% 97.8%; + + --border: 20 5.9% 90%; + --input: 20 5.9% 90%; + --ring: 20 14.3% 4.1%; + + --radius: 0.5rem; + } + + .dark { + --background: 20 14.3% 4.1%; + --foreground: 60 9.1% 97.8%; + + --card: 20 14.3% 4.1%; + --card-foreground: 60 9.1% 97.8%; + + --popover: 20 14.3% 4.1%; + --popover-foreground: 60 9.1% 97.8%; + + --primary: 60 9.1% 97.8%; + --primary-foreground: 24 9.8% 10%; + + --secondary: 12 6.5% 15.1%; + --secondary-foreground: 60 9.1% 97.8%; + + --muted: 12 6.5% 15.1%; + --muted-foreground: 24 5.4% 63.9%; + + --accent: 12 6.5% 15.1%; + --accent-foreground: 60 9.1% 97.8%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 60 9.1% 97.8%; + + --border: 12 6.5% 15.1%; + --input: 12 6.5% 15.1%; + --ring: 24 5.7% 82.9%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/packages/web/app/layout.tsx b/packages/web/app/layout.tsx index af0cbca..da93c64 100644 --- a/packages/web/app/layout.tsx +++ b/packages/web/app/layout.tsx @@ -1,4 +1,4 @@ -import type { ReactNode } from 'react' +import { type ReactNode } from 'react' interface Props { children: ReactNode diff --git a/packages/web/components.json b/packages/web/components.json new file mode 100644 index 0000000..9d52571 --- /dev/null +++ b/packages/web/components.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "app/globals.css", + "baseColor": "stone", + "cssVariables": true + }, + "aliases": { + "components": "~/components", + "utils": "~/libs/utils" + } +} diff --git a/packages/web/components/alert-list.tsx b/packages/web/components/alert-list.tsx new file mode 100644 index 0000000..d6d91bb --- /dev/null +++ b/packages/web/components/alert-list.tsx @@ -0,0 +1,107 @@ +'use client' + +import { useCallback } from 'react' +import dayjs from 'dayjs' +import { Badge, Tag, useToast } from '@chakra-ui/react' +import Link from 'next/link' +import type { Alert } from '@prisma/client' +import { Button, Dropdown, DropdownItem, DropdownMenu, DropdownTrigger, Tooltip } from '@nextui-org/react' +import useCurrentProject from '~/hooks/use-current-project' +import { serviceDeleteAlert } from '~/services/alerts' + +interface Props { + alerts: Alert[] + mutate: any +} + +export default function AlertList({ alerts, mutate }: Props) { + const { projectId } = useCurrentProject() + const toast = useToast() + const onDelete = useCallback((id: number) => { + serviceDeleteAlert({ id }) + .then(() => { + toast({ + title: 'Alert Deleted!', + description: 'Your alert has been deleted!', + status: 'success', + }) + mutate() + }) + .catch((error) => { + toast({ + title: 'Alert Delete Error', + description: error.message, + status: 'error', + }) + }) + }, []) + + return ( +
+ { + alerts.map((alert) => { + let colorScheme = 'gray' + if (alert.level === 'serious') colorScheme = 'red' + if (alert.level === 'warning') colorScheme = 'yellow' + return ( +
+
+ + {alert.name} + + {alert.level} +
+ +
+
+ { + (alert.actions as Array)?.map(action => ( + {action.type} + )) + } +
+ +
{dayjs(alert.createdAt).fromNow()}
+
+ + + + + + + + Edit + + + { + onDelete(alert.id) + } + } + > + Delete + + + +
+
+ ) + }) + } +
+ ) +} diff --git a/packages/web/components/alertList.tsx b/packages/web/components/alertList.tsx deleted file mode 100644 index 4809e08..0000000 --- a/packages/web/components/alertList.tsx +++ /dev/null @@ -1,121 +0,0 @@ -'use client' - -import type { FC } from 'react' -import { useCallback } from 'react' -import dayjs from 'dayjs' -import { Badge, Box, Flex, IconButton, Menu, MenuButton, MenuItem, MenuList, Tag, Text, Tooltip, useToast } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' -import type { Alert } from '@prisma/client' -import { RiMoreLine } from 'react-icons/ri' -import useCurrentProject from '~/hooks/useCurrentProject' -import { serviceDeleteAlert } from '~/services/alerts' - -interface Props { - alerts: Alert[] - mutate: any -} -const AlertList: FC = ({ alerts, mutate }) => { - const { projectId } = useCurrentProject() - const toast = useToast() - const onDelete = useCallback((id: number) => { - serviceDeleteAlert({ id }) - .then(() => { - toast({ - title: 'Alert Deleted!', - description: 'Your alert has been deleted!', - status: 'success', - }) - mutate() - }) - .catch((error) => { - toast({ - title: 'Alert Delete Error', - description: error.message, - status: 'error', - }) - }) - }, []) - - return ( - - { - alerts.map((alert) => { - let colorScheme = 'gray' - if (alert.level === 'serious') colorScheme = 'red' - if (alert.level === 'warning') colorScheme = 'yellow' - return ( - - - - {alert.name} - - {alert.level} - - - - - { - (alert.actions as Array)?.map(action => ( - {action.type} - )) - } - - - {dayjs(alert.createdAt).fromNow()} - - - } - size="sm" - variant="ghost" - /> - - - - Edit - - - { - onDelete(alert.id) - } - } - textColor="red" - > - Delete - - - - - - ) - }) - } - - ) -} - -export default AlertList diff --git a/packages/web/components/breadcrumbs.tsx b/packages/web/components/breadcrumbs.tsx index b097de3..cfbcf79 100644 --- a/packages/web/components/breadcrumbs.tsx +++ b/packages/web/components/breadcrumbs.tsx @@ -1,62 +1,41 @@ 'use client' -import type { FC } from 'react' -import { useMemo } from 'react' -import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, Center, Flex, useColorModeValue } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' +import Link from 'next/link' +import { Divider } from '@nextui-org/react' import Project from './project' import Logo from './logo' -import useBreadcrumb from '~/hooks/useBreadcrumb' +import useBreadcrumb from '~/hooks/use-breadcrumb' -const Breadcrumbs: FC = () => { +export default function Breadcrumbs() { const [breadcrumbs] = useBreadcrumb() - const separatorColor = useColorModeValue('gray.200', 'gray.600') - - const Separator = useMemo(() => ( -
- / -
- ), [separatorColor]) return ( - - - - +
+ - {Separator} + - {breadcrumbs.length ? Separator : null} + {breadcrumbs.length > 0 ? : null} - +
{ breadcrumbs - .slice(0, breadcrumbs.length - 1) + .slice(0, - 1) .map(v => ( - +
- - {v.breadcrumb} - + {v.breadcrumb} - +
)) } - {breadcrumbs.at(-1)?.breadcrumb} - - + + +
{breadcrumbs.at(-1)?.breadcrumb}
+
+
) } - -export default Breadcrumbs diff --git a/packages/web/components/cardSection.tsx b/packages/web/components/card-section.tsx similarity index 79% rename from packages/web/components/cardSection.tsx rename to packages/web/components/card-section.tsx index 6bafa82..05418ef 100644 --- a/packages/web/components/cardSection.tsx +++ b/packages/web/components/card-section.tsx @@ -1,12 +1,12 @@ 'use client' -import { Accordion, AccordionButton, AccordionIcon, AccordionItem, AccordionPanel, Box, Heading, Text } from '@chakra-ui/react' -import type { FC, ReactNode } from 'react' +import { Accordion, AccordionButton, AccordionIcon, AccordionItem, AccordionPanel, Heading, Text } from '@chakra-ui/react' +import { type FC, type ReactNode } from 'react' import Card from './card' -import type { ThemeBoxProps } from './themeBox' -import ThemeBox from './themeBox' +import { type BoxProps } from './ui' +import { Box } from './ui' -interface Props extends ThemeBoxProps { +interface Props extends BoxProps { title?: string head?: ReactNode collapse?: ReactNode @@ -16,13 +16,10 @@ interface Props extends ThemeBoxProps { const CardSection: FC = ({ title, head, collapse, collapseTitle, children, ...props }) => { return ( - - +
+

{title} - +

= ({ title, head, collapse, collapseTitle, children } {children} - +
) } diff --git a/packages/web/components/card.tsx b/packages/web/components/card.tsx index 8859799..4e050ba 100644 --- a/packages/web/components/card.tsx +++ b/packages/web/components/card.tsx @@ -1,12 +1,12 @@ 'use client' -import { Flex, Heading, useColorModeValue } from '@chakra-ui/react' -import type { ReactNode } from 'react' import { forwardRef, useMemo } from 'react' -import type { ThemeBoxProps } from './themeBox' -import ThemeBox from './themeBox' +import { useColorModeValue } from '@chakra-ui/react' +import { type ReactNode } from 'react' +import { Box } from './ui' +import { type BoxProps } from './ui' -interface Props extends Omit { +interface Props extends Omit { children?: ReactNode title?: string extra?: ReactNode @@ -22,35 +22,32 @@ const Card = forwardRef(({ children, title, extra, conten <> { title && ( - {title} {extra} - + ) } { content && ( - +
{content} - +
) } { footer && ( - {footer} - + ) } @@ -59,7 +56,7 @@ const Card = forwardRef(({ children, title, extra, conten const hoverBorderColor = useColorModeValue('dark.50', 'gray.200') return ( - (({ children, title, extra, conten } : {} } - bg="current" + border={variant === 'default' ? '1px' : '0'} borderColor={variant === 'default' ? 'current' : 'transparent'} boxShadow={variant === 'shadow' ? 'md' : 'none'} @@ -81,7 +78,7 @@ const Card = forwardRef(({ children, title, extra, conten {...props} > {node} - + ) }) Card.displayName = 'Card' diff --git a/packages/web/components/copy.tsx b/packages/web/components/copy.tsx deleted file mode 100644 index 8b3473d..0000000 --- a/packages/web/components/copy.tsx +++ /dev/null @@ -1,56 +0,0 @@ -'use client' - -import { Box, IconButton, useToast } from '@chakra-ui/react' -import type { FC } from 'react' -import { useCallback } from 'react' -import { RiClipboardLine } from 'react-icons/ri' -import copy from 'copy-to-clipboard' -import ThemeBox from './themeBox' - -interface Props { - children: string -} - -const Copy: FC = ({ children }) => { - const toast = useToast() - const handleClick = useCallback(() => { - copy(children, { - format: 'text/plain', - onCopy() { - toast({ title: 'Copied to clipboard!' }) - }, - }) - }, []) - - return ( - - - {children} - - } - ml="2" - onClick={handleClick} - size="sm" - variant="ghost" - /> - - ) -} - -export default Copy diff --git a/packages/web/components/editAlert.tsx b/packages/web/components/edit-alert.tsx similarity index 97% rename from packages/web/components/editAlert.tsx rename to packages/web/components/edit-alert.tsx index b35d0a2..ef0441c 100644 --- a/packages/web/components/editAlert.tsx +++ b/packages/web/components/edit-alert.tsx @@ -1,14 +1,14 @@ 'use client' import { Badge, Box, Button, Flex, FormControl, FormErrorMessage, FormLabel, IconButton, Input, Menu, MenuButton, MenuItemOption, MenuList, MenuOptionGroup, NumberDecrementStepper, NumberIncrementStepper, NumberInput, NumberInputField, NumberInputStepper, Select, Text, Tooltip } from '@chakra-ui/react' -import type { FC } from 'react' import { useCallback } from 'react' import { useFieldArray, useForm } from 'react-hook-form' import { RiCustomerService2Fill, RiDeleteBinLine, RiDingdingFill, RiWechatFill } from 'react-icons/ri' -import type { Action, ConditionOption, FilterMatch, FilterOption, Interval, OmitAlert } from 'common' import { AlertConditionTopic, AlertFilterTopic } from 'common' import { useTranslations } from 'next-intl' -import ThemeBox from '~/components/themeBox' +import { type FC } from 'react' +import { type Action, type ConditionOption, type FilterMatch, type FilterOption, type Interval, type OmitAlert } from 'common' +import { Box } from '~/components/ui/box' export const ActionOptions = ['email', 'webhook'] export const ConditionOptions: ConditionOption[] = [ @@ -141,9 +141,9 @@ const EditAlert: FC = ({ alert, onSubmit }) => { { conditionsFields.map((item, index) => { return ( - = ({ alert, onSubmit }) => { type="button" variant="ghost" /> - + ) }) } @@ -349,9 +349,9 @@ const EditAlert: FC = ({ alert, onSubmit }) => { { filtersFields.map((item, index) => { return ( - = ({ alert, onSubmit }) => { type="button" variant="ghost" /> - + ) }) } @@ -556,7 +556,7 @@ const EditAlert: FC = ({ alert, onSubmit }) => { { actionsFields.map((item, index) => { return ( - = ({ alert, onSubmit }) => { {...register(`actions.${index}.uri`, { required: ct('thisIsRequired'), pattern: { - value: item.type === 'email' ? /\S+@\S+\.\S+/ : /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/, + value: item.type === 'email' ? /\S+@\S+\.\S+/ : /https?:\/\/(www\.)?[\w#%+.:=@~-]{1,256}\.[\d()A-Za-z]{1,6}\b([\w#%&()+./:=?@~-]*)/, message: item.type === 'email' ? ct('mustBeTheCorrectEmailAddress') : t('mustBeTheCorrectUrlAddress'), }, })} @@ -618,7 +618,7 @@ const EditAlert: FC = ({ alert, onSubmit }) => { {errors.actions && errors.actions?.[index]?.uri?.message} - + ) }) } diff --git a/packages/web/components/emptyIssues.tsx b/packages/web/components/empty-issues.tsx similarity index 91% rename from packages/web/components/emptyIssues.tsx rename to packages/web/components/empty-issues.tsx index cabefc4..f7a4a19 100644 --- a/packages/web/components/emptyIssues.tsx +++ b/packages/web/components/empty-issues.tsx @@ -2,10 +2,10 @@ import type { FC } from 'react' import { Box, Button, Center } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' +import Link from 'next/link' import { useTranslations } from 'next-intl' import { RiExternalLinkLine } from 'react-icons/ri' -import useCurrentProject from '~/hooks/useCurrentProject' +import useCurrentProject from '~/hooks/use-current-project' const EmptyIssues: FC = () => { const { projectId } = useCurrentProject() diff --git a/packages/web/components/eventDetailAction.tsx b/packages/web/components/event-detail-action.tsx similarity index 88% rename from packages/web/components/eventDetailAction.tsx rename to packages/web/components/event-detail-action.tsx index a6d1a99..42b99eb 100644 --- a/packages/web/components/eventDetailAction.tsx +++ b/packages/web/components/event-detail-action.tsx @@ -1,14 +1,14 @@ 'use client' -import { Box, Flex, Tag, TagLabel, TagLeftIcon, Tooltip, VStack } from '@chakra-ui/react' +import { Flex, Tag, TagLabel, TagLeftIcon, Tooltip, VStack } from '@chakra-ui/react' import dayjs from 'dayjs' -import type { FC } from 'react' import { useMemo } from 'react' -import type { OhbugEventLike } from 'common' -import type { OhbugAction } from '@ohbug/types' -import ThemeBox from './themeBox' +import { type OhbugEventLike } from 'common' +import { type FC } from 'react' +import { type OhbugAction } from '@ohbug/types' +import { Box } from './ui' import Wrapper from './wrapper' -import CardSection from './cardSection' +import CardSection from './card-section' import { getMessageAndIconByActionType } from '~/libs/utils' interface Props { @@ -25,7 +25,7 @@ const EventDetailActions: FC = ({ event }) => { }, ], [event]) return ( - + = ({ event }) => { { index !== actions.length - 1 && ( - = ({ event }) => { - + ) } diff --git a/packages/web/components/eventDetailProfile.tsx b/packages/web/components/event-detail-profile.tsx similarity index 97% rename from packages/web/components/eventDetailProfile.tsx rename to packages/web/components/event-detail-profile.tsx index cad91dc..a29b506 100644 --- a/packages/web/components/eventDetailProfile.tsx +++ b/packages/web/components/event-detail-profile.tsx @@ -1,15 +1,15 @@ 'use client' import dayjs from 'dayjs' -import type { FC } from 'react' import { useMemo } from 'react' -import type { OhbugEventLike } from 'common' import { RiCake2Line, RiCake3Line, RiCakeLine, RiComputerLine, RiEarthLine, RiFingerprintLine, RiHeading, RiLinkedinLine, RiLinksLine, RiTimeLine } from 'react-icons/ri' import { Icon, Link, Stat, StatGroup, StatHelpText, StatLabel, Tag, Tooltip, Wrap, WrapItem } from '@chakra-ui/react' import { useTranslations } from 'next-intl' -import ThemeBox from './themeBox' +import { type FC } from 'react' +import { type OhbugEventLike } from 'common' +import { Box } from './ui' import Wrapper from './wrapper' -import CardSection from './cardSection' +import CardSection from './card-section' import { getDeviceInfo } from '~/libs/utils' interface Props { @@ -110,7 +110,7 @@ const EventDetailProfile: FC = ({ event }) => { }, [event]) return ( - +
= ({ event }) => { - +
) } diff --git a/packages/web/components/eventDetailStack.tsx b/packages/web/components/event-detail-stack.tsx similarity index 86% rename from packages/web/components/eventDetailStack.tsx rename to packages/web/components/event-detail-stack.tsx index 706657e..1ff41e9 100644 --- a/packages/web/components/eventDetailStack.tsx +++ b/packages/web/components/event-detail-stack.tsx @@ -1,12 +1,11 @@ 'use client' -import type { FC } from 'react' -import type { OhbugEventLike } from 'common' -import { Box } from '@chakra-ui/react' -import StackInfo from './stackInfo' -import ThemeBox from './themeBox' +import { type FC } from 'react' +import { type OhbugEventLike } from 'common' +import StackInfo from './stack-info' +import { Box } from './ui' import Wrapper from './wrapper' -import CardSection from './cardSection' +import CardSection from './card-section' import { renderStringOrJson } from '~/libs/utils' interface Props { @@ -15,7 +14,7 @@ interface Props { const EventDetailStack: FC = ({ event }) => { return ( - + = ({ event }) => { } - + ) } diff --git a/packages/web/components/eventDetailTrend.tsx b/packages/web/components/event-detail-trend.tsx similarity index 85% rename from packages/web/components/eventDetailTrend.tsx rename to packages/web/components/event-detail-trend.tsx index 5aaa08c..d9b86d3 100644 --- a/packages/web/components/eventDetailTrend.tsx +++ b/packages/web/components/event-detail-trend.tsx @@ -1,15 +1,15 @@ 'use client' import dayjs from 'dayjs' -import type { FC } from 'react' -import type { Issue } from 'common' -import { Box, Stat, StatGroup, StatLabel, StatNumber, Tooltip } from '@chakra-ui/react' +import { Stat, StatGroup, StatLabel, StatNumber, Tooltip } from '@chakra-ui/react' import { useTranslations } from 'next-intl' -import TrendChart from './trendChart' -import ThemeBox from './themeBox' +import { type FC } from 'react' +import { type Issue } from 'common' +import TrendChart from './trend-chart' +import { Box } from './ui' import Wrapper from './wrapper' -import CardSection from './cardSection' -import type { IssueTrend } from '~/services/issues' +import CardSection from './card-section' +import { type IssueTrend } from '~/services/issues' interface Props { issue: Issue @@ -22,7 +22,7 @@ interface Props { const EventDetailTrend: FC = ({ issue, trends }) => { const ct = useTranslations('Common') return ( - + = ({ issue, trends }) => { - + ) } diff --git a/packages/web/components/eventDetailUser.tsx b/packages/web/components/event-detail-user.tsx similarity index 70% rename from packages/web/components/eventDetailUser.tsx rename to packages/web/components/event-detail-user.tsx index 990299a..6d3c087 100644 --- a/packages/web/components/eventDetailUser.tsx +++ b/packages/web/components/event-detail-user.tsx @@ -1,11 +1,11 @@ 'use client' -import type { FC } from 'react' -import type { OhbugEventLike } from 'common' import dynamic from 'next/dynamic' -import ThemeBox from './themeBox' +import { type FC } from 'react' +import { type OhbugEventLike } from 'common' +import { Box } from './ui' import Wrapper from './wrapper' -import CardSection from './cardSection' +import CardSection from './card-section' const DynamicReactJson = dynamic(import('react-json-view'), { ssr: false }) @@ -15,13 +15,13 @@ interface Props { const EventDetailUser: FC = ({ event }) => { return ( - + - + ) } diff --git a/packages/web/components/events-list.tsx b/packages/web/components/events-list.tsx new file mode 100644 index 0000000..660cb62 --- /dev/null +++ b/packages/web/components/events-list.tsx @@ -0,0 +1,115 @@ +'use client' + +import Link from 'next/link' +import dayjs from 'dayjs' +import { type FC, useCallback } from 'react' +import { type Event } from '@prisma/client' +import { type OhbugEventLike } from 'common' +import { Table, TableBody, TableCell, TableColumn, TableHeader, TableRow } from '@nextui-org/react' +import { renderStringOrJson } from '~/libs/utils' +import useCurrentProject from '~/hooks/use-current-project' + +const columns = [ + { name: 'TITLE', key: 'description' }, + { name: 'TRENDS', key: 'appType' }, + { name: 'APPVERSION', key: 'appVersion' }, + { name: 'CATEGORY', key: 'category' }, + { name: 'RELEASESTAGE', key: 'releaseStage' }, + { name: 'USER', key: 'user' }, + { name: 'SDK', key: 'sdk' }, + { name: 'DEVICE', key: 'device' }, + { name: 'METADATA', key: 'metadata' }, +] + +interface Props { + events?: Event[] | OhbugEventLike[] +} + +const EventsList: FC = ({ events }) => { + const { projectId } = useCurrentProject() + + const renderCell = useCallback((event: Event, columnKey: Key) => { + switch (columnKey) { + case 'description': + return ( +
+ + {dayjs(event.createdAt).format('YYYY-MM-DD HH:mm:ss')} + +
{event.type}: {renderStringOrJson((event.detail as any).message ?? event.detail)}
+
+ ) + case 'appType': + return ( +
{event.appType}
+ ) + case 'appVersion': + return ( +
{event.appVersion}
+ ) + case 'category': + return ( +
{event.category}
+ ) + case 'releaseStage': + return ( +
{event.releaseStage}
+ ) + case 'users': + return ( +
{renderStringOrJson(('user' in event) ? event.user : '')}
+ ) + case 'sdk': + return ( +
{renderStringOrJson(event.sdk)}
+ ) + case 'device': + return ( +
{renderStringOrJson(event.device)}
+ ) + case 'metadata': + return ( +
{renderStringOrJson(event.metadata)}
+ ) + default: + return null + } + }, []) + + return ( + + + { + column => ( + + {column.name} + + ) + } + + + { + events + ? item => ( + + { + columnKey => ( + {renderCell(item, columnKey)} + ) + } + + ) + : [] + } + +
+ ) +} + +export default EventsList diff --git a/packages/web/components/eventsList.tsx b/packages/web/components/eventsList.tsx deleted file mode 100644 index 7db81a7..0000000 --- a/packages/web/components/eventsList.tsx +++ /dev/null @@ -1,71 +0,0 @@ -'use client' - -import { Table, TableContainer, Tbody, Td, Th, Thead, Tr } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' -import dayjs from 'dayjs' -import type { FC } from 'react' -import type { Event } from '@prisma/client' -import type { OhbugEventLike } from 'common' -import { renderStringOrJson } from '~/libs/utils' -import useCurrentProject from '~/hooks/useCurrentProject' - -interface Props { - events?: Event[] | OhbugEventLike[] -} - -const EventsList: FC = ({ events }) => { - const { projectId } = useCurrentProject() - - return ( - - - - - - - - - - - - - - - - - { - events?.map(event => ( - - {/* description */} - - {/* appType */} - - {/* appVersion */} - - {/* category */} - - {/* releaseStage */} - - {/* user */} - - {/* sdk */} - - {/* device */} - - {/* metadata */} - - - )) - } - -
descriptionappTypeappVersioncategoryreleaseStageusersdkdevicemetadata
- - {dayjs(event.createdAt).format('YYYY-MM-DD HH:mm:ss')} - -
{event.type}: {renderStringOrJson((event.detail as any).message ?? event.detail)}
-
{event.appType}{event.appVersion}{event.category}{event.releaseStage}{renderStringOrJson(('user' in event) ? event.user : '')}{renderStringOrJson(event.sdk)}{renderStringOrJson(event.device)}{renderStringOrJson(event.metadata)}
-
- ) -} - -export default EventsList diff --git a/packages/web/components/feedbacksList.tsx b/packages/web/components/feedbacks-list.tsx similarity index 93% rename from packages/web/components/feedbacksList.tsx rename to packages/web/components/feedbacks-list.tsx index 90a6d52..b904f58 100644 --- a/packages/web/components/feedbacksList.tsx +++ b/packages/web/components/feedbacks-list.tsx @@ -1,12 +1,12 @@ 'use client' import { Table, TableContainer, Tbody, Td, Th, Thead, Tr } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' +import Link from 'next/link' import dayjs from 'dayjs' import type { FC } from 'react' import type { EventUser, Feedback } from '@prisma/client' import { renderStringOrJson } from '~/libs/utils' -import useCurrentProject from '~/hooks/useCurrentProject' +import useCurrentProject from '~/hooks/use-current-project' interface Props { feedbacks?: (Feedback & { user: EventUser })[] diff --git a/packages/web/components/footer.tsx b/packages/web/components/footer.tsx index 5eef0a2..1fba31f 100644 --- a/packages/web/components/footer.tsx +++ b/packages/web/components/footer.tsx @@ -1,57 +1,41 @@ 'use client' -import { Flex, HStack, Icon, Link } from '@chakra-ui/react' +import Link from 'next/link' import type { FC } from 'react' -import { RiDiscordFill, RiGithubFill } from 'react-icons/ri' import Logo from './logo' import Intl from './intl' import Theme from './theme' -import ThemeBox from './themeBox' const Footer: FC = () => { return ( - - +
+
- +
v{process.env.NEXT_PUBLIC_VERSION} - - +
+
- +
- + - + - +
- +
- - +
+
) } diff --git a/packages/web/components/index.ts b/packages/web/components/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/web/components/intl.tsx b/packages/web/components/intl.tsx index 16ce416..cdcd2b0 100644 --- a/packages/web/components/intl.tsx +++ b/packages/web/components/intl.tsx @@ -2,7 +2,6 @@ import type { ChangeEvent } from 'react' import { useCallback, useTransition } from 'react' -import { Select } from '@chakra-ui/react' import { usePathname } from 'next-intl/client' import { useRouter } from 'next/navigation' import { useLocale } from 'next-intl' @@ -32,13 +31,11 @@ export default function Intl() { }, [pathname]) return ( - + ) } diff --git a/packages/web/components/introduceChart.tsx b/packages/web/components/introduce-chart.tsx similarity index 100% rename from packages/web/components/introduceChart.tsx rename to packages/web/components/introduce-chart.tsx diff --git a/packages/web/components/issueDetailTabs.tsx b/packages/web/components/issue-detail-tabs.tsx similarity index 97% rename from packages/web/components/issueDetailTabs.tsx rename to packages/web/components/issue-detail-tabs.tsx index 609e64a..10e3cfa 100644 --- a/packages/web/components/issueDetailTabs.tsx +++ b/packages/web/components/issue-detail-tabs.tsx @@ -7,7 +7,7 @@ import { useSearchParams } from 'next/navigation' import { Link, Tab, TabList, Tabs } from '@chakra-ui/react' import type { OhbugEventLike } from 'common' import { useTranslations } from 'next-intl' -import useCurrentProject from '~/hooks/useCurrentProject' +import useCurrentProject from '~/hooks/use-current-project' interface Props { event: OhbugEventLike diff --git a/packages/web/components/issueDetailTitle.tsx b/packages/web/components/issue-detail-title.tsx similarity index 93% rename from packages/web/components/issueDetailTitle.tsx rename to packages/web/components/issue-detail-title.tsx index 8903c73..51e5786 100644 --- a/packages/web/components/issueDetailTitle.tsx +++ b/packages/web/components/issue-detail-title.tsx @@ -1,12 +1,12 @@ 'use client' import { Badge, Box, Stat, StatGroup, StatLabel, StatNumber } from '@chakra-ui/react' -import type { FC } from 'react' import { useMemo } from 'react' -import type { Issue, OhbugEventLike } from 'common' import { useTranslations } from 'next-intl' +import { type FC } from 'react' +import { type Issue, type OhbugEventLike } from 'common' import Title from './title' -import IssueDetailTabs from './issueDetailTabs' +import IssueDetailTabs from './issue-detail-tabs' import { renderStringOrJson } from '~/libs/utils' interface Props { @@ -19,7 +19,7 @@ const IssueDetailTitle: FC = ({ issue, event }) => { const metadata = useMemo(() => JSON.parse(issue.metadata) || {}, [issue]) return ( } diff --git a/packages/web/components/issue-list.tsx b/packages/web/components/issue-list.tsx new file mode 100644 index 0000000..66d2346 --- /dev/null +++ b/packages/web/components/issue-list.tsx @@ -0,0 +1,392 @@ +'use client' + +import { useCallback, useMemo, useRef, useState } from 'react' +import Link from 'next/link' +import { type Issue } from 'common' +import dayjs from 'dayjs' +import { useTranslations } from 'next-intl' +import { useDebounce, useSet } from 'react-use' +import { useAtom } from 'jotai' +import { + Badge, + Button, + Checkbox, + Dropdown, + DropdownItem, + DropdownMenu, + DropdownTrigger, + Input, + Modal, + ModalBody, + ModalContent, + ModalFooter, + ModalHeader, + Switch, + Table, + TableBody, + TableCell, + TableColumn, + TableHeader, + TableRow, + Tooltip, + useDisclosure, +} from '@nextui-org/react' +import { useToast } from '@chakra-ui/react' +import { type Key, type ReactNode } from 'react' +import TrendChart from './trend-chart' +import Pagination from './pagination' +import Spinning from './spinning' +import { type SearchIssuesOrderBy } from '~/services/issues' +import { + serviceDeleteIssues, + serviceGetIssues, + serviceGetIssuesTrends, +} from '~/services/issues' +import { renderStringOrJson } from '~/libs/utils' +import useCurrentProject from '~/hooks/use-current-project' +import { useQuery } from '~/hooks/use-query' +import { useInfinite } from '~/hooks/use-infinite' +import { issueSortAtom } from '~/atoms/issue' + +const columns = [ + { name: 'TITLE', key: 'title' }, + { name: 'TRENDS', key: 'trends' }, + { name: 'EVENTSCOUNT', key: 'eventsCount' }, + { name: 'USERSCOUNT', key: 'usersCount' }, +] + +interface Props { + empty: ReactNode; +} + +export default function IssueList({ empty }: Props) { + const toast = useToast() + const t = useTranslations('Issues') + const ct = useTranslations('Common') + const { projectId } = useCurrentProject() + const { isOpen, onClose, onOpen } = useDisclosure() + const cancelRef = useRef(null) + const [orderBy, setOrderBy] = useAtom(issueSortAtom) + const [query, setQuery] = useState('') + const [debouncedQuery, setDebouncedQuery] = useState('') + useDebounce( + () => { + setDebouncedQuery(query) + }, + 500, + [query], + ) + const { data, size, setSize, isLoading, isReachingEnd, mutate } + = useInfinite<Issue>( + index => + serviceGetIssues({ + page: index + 1, + projectId: projectId!, + orderBy, + query: debouncedQuery, + }), + { + enabled: projectId !== undefined, + deps: [projectId, orderBy, debouncedQuery], + pagination: true, + }, + ) + const [chartType, setChartType] = useState<'24h' | '14d'>('24h') + const { data: trends } = useQuery( + () => + serviceGetIssuesTrends({ + ids: data!.map(issue => issue.id).join(','), + type: chartType, + }), + { + enabled: !!data, + deps: [data, chartType], + }, + ) + + // handle selected data + const [checkedItems, checkedItemsActions] = useSet(new Set<string>()) + const allChecked = useMemo( + () => + checkedItems?.size > 0 + && checkedItems?.size === data?.length + && Array.from(checkedItems ?? []).every(v => (data?.findIndex(issue => issue.id === v) ?? -1) > -1), + [checkedItems, data], + ) + const isIndeterminate = useMemo( + () => + Array.from(checkedItems ?? []).some(v => (data?.findIndex(issue => issue.id === v) ?? -1) > -1) && !allChecked, + [checkedItems, data, allChecked], + ) + const handleDeleteIssue = useCallback(() => { + const issueIds = Array.from(checkedItems) + serviceDeleteIssues(issueIds) + .then(() => { + toast({ + title: 'Issue Deleted!', + description: 'Your issues has been deleted!', + status: 'success', + }) + mutate() + }) + .catch((error) => { + toast({ + title: 'Alert Delete Error', + description: error.message, + status: 'error', + }) + }) + .finally(onClose) + }, [checkedItems]) + + const renderTitleCell = useCallback((columnKey: Key) => { + switch (columnKey) { + case 'title': + return ( + <div className="w-1/2"> + <div className="flex gap-2"> + <select + className="w-40" + onChange={ + e => + setOrderBy(e.target.value as SearchIssuesOrderBy) + } + value={orderBy} + > + <option value="updatedAt">{t('orderByUpdatedAt')}</option> + <option value="createdAt">{t('orderByCreatedAt')}</option> + <option value="events">{t('orderByEvents')}</option> + <option value="users">{t('orderByUsers')}</option> + </select> + + <Dropdown> + <DropdownTrigger> + <Button + disabled={checkedItems.size <= 0} + isIconOnly + size="sm" + variant="light" + > + <i className="i-ri-more-line" /> + </Button> + </DropdownTrigger> + <DropdownMenu> + <DropdownItem + color="danger" + key="delete" + onClick={onOpen} + > + Delete + </DropdownItem> + </DropdownMenu> + </Dropdown> + </div> + </div> + ) + case 'trends': + return ( + <div className="w-48"> + <Switch + id="trendsType" + isDisabled={!trends || !data?.length} + isSelected={chartType === '24h'} + onChange={e => setChartType(e ? '24h' : '14d')} + > + {chartType === '24h' ? ct('24h') : ct('14d')} + </Switch> + </div> + ) + case 'eventsCount': + return ( + <div className="w-20 flex items-center justify-center">Events</div> + ) + case 'usersCount': + return ( + <div className="w-20 flex items-center justify-center">Users</div> + ) + default: + return null + } + }, []) + const renderCell = useCallback((issue: Issue, columnKey: Key) => { + const metadata = JSON.parse(issue.metadata) || {} + + switch (columnKey) { + case 'title': + return ( + <div className="w-1/2"> + <Link + className="cursor-pointer flex justify-between w-full line-clamp-2" + href={`/${projectId}/issues/${issue.id}`} + > + {/* title */} + <span className="font-semibold mr-2">{issue.type}</span> + { + issue.releaseStage === 'mock' && ( + <Badge + className="mr-2" + color="danger" + > + Mock + </Badge> + ) + } + {/* second description */} + <code className="text-stone-500"> + {renderStringOrJson(metadata.filename ?? metadata.others)} + </code> + </Link> + {/* message */} + <div className="text-stone-500 line-clamp-2"> + { + metadata.message && ( + <code>{renderStringOrJson(metadata.message)}</code> + ) + } + </div> + {/* other message (time/appType/...) */} + <div> + {/* appType */} + {/* time */} + <div className="flex items-center text-xs"> + <i className="i-ri-time-line mr-2" /> + <Tooltip + aria-label="A tooltip" + content={ + `${ct('lastSeen')} ${dayjs(issue.updatedAt).format('YYYY-MM-DD HH:mm:ss')}` + } + > + <span>{dayjs(issue.updatedAt).fromNow()}</span> + </Tooltip> + + <div className="mx-1">|</div> + + <Tooltip + aria-label="A tooltip" + content={ + `${ct('firstSeen')} ${dayjs(issue.createdAt).format('YYYY-MM-DD HH:mm:ss')}` + } + > + <span>{dayjs(issue.createdAt).fromNow()}</span> + </Tooltip> + </div> + </div> + </div> + ) + case 'trends': + return ( + <div className="w-48"> + <TrendChart + data={trends?.[issue.id]} + type={chartType} + /> + </div> + ) + case 'eventsCount': + return ( + <div className="flex items-center justify-center w-20"> + {issue._count?.events} + </div> + ) + case 'usersCount': + return ( + <div className="flex items-center justify-center w-20"> + {issue._count?.users} + </div> + ) + default: + return null + } + }, []) + + return ( + <div className="h-full overflow-x-hidden overflow-y-auto w-full"> + <div className="mb-4 w-full"> + <Input + onChange={e => setQuery(e.target.value)} + placeholder="Search..." + startContent={ + isLoading ? <Spinning /> : <i className="i-ri-search-line" /> + } + value={query} + /> + </div> + + <Table aria-label="Issues Table"> + <TableHeader columns={columns}> + { + column => ( + <TableColumn + align="start" + key={column.key} + > + {renderTitleCell(column.key)} + </TableColumn> + ) + } + </TableHeader> + <TableBody + emptyContent="No rows to display." + items={data} + > + { + data + ? item => ( + <TableRow key={item.id}> + { + columnKey => ( + <TableCell>{renderCell(item, columnKey)}</TableCell> + ) + } + </TableRow> + ) + : [] + } + </TableBody> + </Table> + + { + !!data?.length && ( + <div className="flex items-center justify-between mt-6 w-full"> + <Link href={`/${projectId}/mock`}>Mock Data</Link> + <Pagination + isReachingEnd={!!isReachingEnd} + onChange={page => setSize(page - 1)} + page={size + 1} + /> + </div> + ) + } + + <Modal + isOpen={isOpen} + onClose={onClose} + > + <> + <ModalHeader className="text-lg font-bold"> + Are you sure you want to delete this {checkedItems.size} issue? + </ModalHeader> + <ModalContent> + <ModalBody>{t('deleteIssuesConfirm')}</ModalBody> + </ModalContent> + <ModalFooter> + <Button + onClick={onClose} + ref={cancelRef} + variant="light" + > + Cancel + </Button> + <Button + className="ml-3" + color="danger" + onClick={handleDeleteIssue} + > + Delete + </Button> + </ModalFooter> + </> + </Modal> + </div> + ) +} diff --git a/packages/web/components/issueRelatedEvents.tsx b/packages/web/components/issue-related-events.tsx similarity index 77% rename from packages/web/components/issueRelatedEvents.tsx rename to packages/web/components/issue-related-events.tsx index 2cc94ba..18e1c52 100644 --- a/packages/web/components/issueRelatedEvents.tsx +++ b/packages/web/components/issue-related-events.tsx @@ -1,15 +1,15 @@ 'use client' -import type { Issue } from 'common' import { Button } from '@chakra-ui/react' -import type { Event } from '@prisma/client' -import type { FC } from 'react' +import { type Event } from '@prisma/client' +import { type FC } from 'react' import { useTranslations } from 'next-intl' -import EventsList from '~/components/eventsList' -import ThemeBox from '~/components/themeBox' +import { type Issue } from 'common' +import EventsList from '~/components/events-list' +import { Box } from '~/components/ui/box' import Wrapper from '~/components/wrapper' -import CardSection from '~/components/cardSection' -import { useInfinite } from '~/hooks/useInfinite' +import CardSection from '~/components/card-section' +import { useInfinite } from '~/hooks/use-infinite' import { serviceGetEventsByIssueId } from '~/services/events' interface Props { @@ -27,7 +27,7 @@ const IssueRelatedEvents: FC<Props> = ({ issue }) => { ) return ( - <ThemeBox bg="gray"> + <Box> <Wrapper> <CardSection title="Events"> <EventsList events={events} /> @@ -49,7 +49,7 @@ const IssueRelatedEvents: FC<Props> = ({ issue }) => { </Button> </CardSection> </Wrapper> - </ThemeBox> + </Box> ) } diff --git a/packages/web/components/issueRelatedMetadata.tsx b/packages/web/components/issue-related-metadata.tsx similarity index 78% rename from packages/web/components/issueRelatedMetadata.tsx rename to packages/web/components/issue-related-metadata.tsx index a262599..52f433e 100644 --- a/packages/web/components/issueRelatedMetadata.tsx +++ b/packages/web/components/issue-related-metadata.tsx @@ -1,11 +1,11 @@ 'use client' -import type { OhbugEventLike } from 'common' import dynamic from 'next/dynamic' -import type { FC } from 'react' import { useMemo } from 'react' -import CardSection from './cardSection' -import ThemeBox from './themeBox' +import { type OhbugEventLike } from 'common' +import { type FC } from 'react' +import CardSection from './card-section' +import { Box } from './ui' import Wrapper from './wrapper' const DynamicReactJson = dynamic(import('react-json-view'), { ssr: false }) @@ -24,13 +24,13 @@ const IssueRelatedMetadata: FC<Props> = ({ event, tab }) => { }, [event]) return ( - <ThemeBox bg="gray"> + <Box> <Wrapper> <CardSection title="Custom Metadata"> <DynamicReactJson src={metadata[tab]} /> </CardSection> </Wrapper> - </ThemeBox> + </Box> ) } diff --git a/packages/web/components/issueRelatedRrweb.tsx b/packages/web/components/issue-related-rrweb.tsx similarity index 75% rename from packages/web/components/issueRelatedRrweb.tsx rename to packages/web/components/issue-related-rrweb.tsx index d713134..3e0fafa 100644 --- a/packages/web/components/issueRelatedRrweb.tsx +++ b/packages/web/components/issue-related-rrweb.tsx @@ -1,13 +1,12 @@ 'use client' -import type { OhbugEventLike } from 'common' -import { Box } from '@chakra-ui/react' -import type { FC } from 'react' import { useRef } from 'react' import RrwebPlayer from 'rrweb-player' import { unpack } from 'rrweb' import { useMount } from 'react-use' -import ThemeBox from '~/components/themeBox' +import { type OhbugEventLike } from 'common' +import { type FC } from 'react' +import { Box } from '~/components/ui/box' import Wrapper from '~/components/wrapper' import 'rrweb-player/dist/style.css' @@ -18,7 +17,7 @@ interface Props { const IssueRelatedRrweb: FC<Props> = ({ event }) => { const rootRef = useRef<HTMLDivElement>(null) useMount(() => { - if (rootRef.current && !rootRef.current.children.length) { + if (rootRef.current && rootRef.current.children.length === 0) { const events = event?.metadata ? JSON.parse(event.metadata as unknown as string)?.rrweb ?? [] : [] @@ -30,11 +29,11 @@ const IssueRelatedRrweb: FC<Props> = ({ event }) => { } }) return ( - <ThemeBox bg="gray"> + <Box> <Wrapper> <Box ref={rootRef} /> </Wrapper> - </ThemeBox> + </Box> ) } diff --git a/packages/web/components/issueList.tsx b/packages/web/components/issueList.tsx deleted file mode 100644 index 3223f7e..0000000 --- a/packages/web/components/issueList.tsx +++ /dev/null @@ -1,433 +0,0 @@ -'use client' - -import type { FC, ReactNode } from 'react' -import { useCallback, useMemo, useRef, useState } from 'react' -import { Link } from '@chakra-ui/next-js' -import type { Issue } from 'common' -import { RiMoreLine, RiSearchLine, RiTimeLine } from 'react-icons/ri' -import dayjs from 'dayjs' -import { AlertDialog, AlertDialogBody, AlertDialogContent, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, Badge, Box, Button, Center, Checkbox, CheckboxGroup, Flex, FormControl, FormLabel, HStack, Icon, IconButton, Input, InputGroup, InputLeftElement, Menu, MenuButton, MenuItem, MenuList, Select, Switch, Text, Tooltip, useColorModeValue, useDisclosure, useToast } from '@chakra-ui/react' -import { useTranslations } from 'next-intl' -import { useDebounce, useSet } from 'react-use' -import { useAtom } from 'jotai' -import TrendChart from './trendChart' -import ThemeBox from './themeBox' -import Pagination from './pagination' -import Spinning from './spinning' -import type { SearchIssuesOrderBy } from '~/services/issues' -import { serviceDeleteIssues, serviceGetIssues, serviceGetIssuesTrends } from '~/services/issues' -import { renderStringOrJson } from '~/libs/utils' -import useCurrentProject from '~/hooks/useCurrentProject' -import { useQuery } from '~/hooks/useQuery' -import { useInfinite } from '~/hooks/useInfinite' -import { issueSortAtom } from '~/atoms/issue' - -interface Props { - empty: ReactNode -} -const IssueList: FC<Props> = ({ empty }) => { - const toast = useToast() - const t = useTranslations('Issues') - const ct = useTranslations('Common') - const { projectId } = useCurrentProject() - const { isOpen, onClose, onOpen } = useDisclosure() - const cancelRef = useRef(null) - const [orderBy, setOrderBy] = useAtom(issueSortAtom) - const [query, setQuery] = useState('') - const [debouncedQuery, setDebouncedQuery] = useState('') - useDebounce( - () => { - setDebouncedQuery(query) - }, - 500, - [query], - ) - const { data, size, setSize, isLoading, isReachingEnd, mutate } = useInfinite<Issue>( - index => serviceGetIssues({ - page: index + 1, - projectId: projectId!, - orderBy, - query: debouncedQuery, - }), - { - enabled: projectId !== undefined, - deps: [projectId, orderBy, debouncedQuery], - pagination: true, - }, - ) - const [chartType, setChartType] = useState<'24h' | '14d'>('24h') - const { data: trends } = useQuery( - () => serviceGetIssuesTrends({ - ids: data!.map(issue => issue.id).join(','), - type: chartType, - }), - { - enabled: !!data, - deps: [data, chartType], - }, - ) - const rowHoverBg = useColorModeValue('gray.100', 'dark.500') - - // handle selected data - const [checkedItems, checkedItemsActions] = useSet(new Set<string>()) - const allChecked = useMemo( - () => - (checkedItems?.size > 0 && checkedItems?.size === data?.length) - && Array.from(checkedItems ?? []) - .every(v => (data?.findIndex(issue => issue.id === v) ?? -1) > -1) - , [checkedItems, data], - ) - const isIndeterminate = useMemo( - () => Array.from(checkedItems ?? []) - .some(v => (data?.findIndex(issue => issue.id === v) ?? -1) > -1) && !allChecked - , [checkedItems, data, allChecked], - ) - const handleDeleteIssue = useCallback(() => { - const issueIds = Array.from(checkedItems) - serviceDeleteIssues(issueIds) - .then(() => { - toast({ - title: 'Issue Deleted!', - description: 'Your issues has been deleted!', - status: 'success', - }) - mutate() - }) - .catch((error) => { - toast({ - title: 'Alert Delete Error', - description: error.message, - status: 'error', - }) - }) - .finally(onClose) - }, [checkedItems]) - - return ( - <Box - h="full" - overflowX="hidden" - overflowY="auto" - w="full" - > - <Box - mb="4" - w="full" - > - <InputGroup> - <InputLeftElement - pointerEvents="none" - > - { - isLoading - ? <Spinning /> - : <RiSearchLine /> - } - </InputLeftElement> - <Input - onChange={e => setQuery(e.target.value)} - placeholder="Search..." - value={query} - variant="filled" - /> - </InputGroup> - </Box> - - <CheckboxGroup variant="subtle"> - {/* header */} - <ThemeBox - bg="gray" - border="1px" - borderColor="current" - display="flex" - overflow="hidden" - p="2" - rounded="lg" - > - <Center mr="2"> - <Checkbox - isChecked={allChecked} - isIndeterminate={isIndeterminate} - onChange={ - (e) => { - const checked = e.target.checked - if (checked) { - data?.forEach(v => checkedItemsActions?.add(v.id)) - } - else { - checkedItemsActions?.reset() - } - } - } - /> - </Center> - - <Box w="50%"> - <HStack spacing="2"> - <Select - onChange={e => setOrderBy(e.target.value as SearchIssuesOrderBy)} - size="sm" - value={orderBy} - w="40" - > - <option value="updatedAt">{t('orderByUpdatedAt')}</option> - <option value="createdAt">{t('orderByCreatedAt')}</option> - <option value="events">{t('orderByEvents')}</option> - <option value="users">{t('orderByUsers')}</option> - </Select> - - <Menu> - <MenuButton - as={IconButton} - disabled={checkedItems.size <= 0} - icon={<RiMoreLine />} - size="sm" - variant="outline" - /> - <MenuList> - <MenuItem - color="red" - onClick={onOpen} - > - Delete - </MenuItem> - </MenuList> - </Menu> - </HStack> - </Box> - - <Box w="48"> - <FormControl - alignItems="center" - display="flex" - > - <FormLabel - htmlFor="trendsType" - mb="0" - > - {chartType === '24h' ? ct('24h') : ct('14d')} - </FormLabel> - <Switch - disabled={!trends || !data?.length} - id="trendsType" - isChecked={chartType === '24h'} - onChange={e => setChartType(e.target.checked ? '24h' : '14d')} - /> - </FormControl> - </Box> - - <Center w="20"> - Events - </Center> - - <Center w="20"> - Users - </Center> - </ThemeBox> - {/* body */} - <Box> - { - data?.length - ? data.map((issue) => { - const metadata = JSON.parse(issue.metadata) || {} - - return ( - <ThemeBox - _hover={ - { bg: rowHoverBg } - } - border="1px" - borderColor="current" - borderTop="none" - borderX="none" - display="flex" - key={issue.id} - px="2" - py="3" - > - <Center mr="2"> - <Checkbox - isChecked={checkedItems?.has(issue.id)} - onChange={ - (e) => { - const checked = e.target.checked - if (checked) { - checkedItemsActions?.add(issue.id) - } - else { - checkedItemsActions?.reset() - } - } - } - /> - </Center> - - {/* main */} - <Box w="50%"> - <Link - cursor="pointer" - display="flex" - href={`/${projectId}/issues/${issue.id}`} - justifyContent="space-between" - noOfLines={2} - w="full" - > - {/* title */} - <Box - as="span" - fontWeight="semibold" - mr="2" - > - {issue.type} - </Box> - { - issue.releaseStage === 'mock' && ( - <Badge - colorScheme="red" - mr="2" - > - Mock - </Badge> - ) - } - {/* second description */} - <Box - as="code" - textColor="gray.400" - > - {renderStringOrJson(metadata.filename ?? metadata.others)} - </Box> - </Link> - {/* message */} - <Text - noOfLines={[1, 2]} - textColor="gray.400" - > - { - metadata.message && ( - <code> - {renderStringOrJson(metadata.message)} - </code> - ) - } - </Text> - {/* other message (time/appType/...) */} - <Box> - {/* appType */} - {/* time */} - <Flex - align="center" - fontSize="xs" - > - <Icon - as={RiTimeLine} - mr="2" - /> - <Tooltip - aria-label="A tooltip" - label={`${ct('lastSeen')} ${dayjs(issue.updatedAt).format('YYYY-MM-DD HH:mm:ss')}`} - > - {dayjs(issue.updatedAt).fromNow()} - </Tooltip> - - <Box - as="span" - mx="1" - > - | - </Box> - - <Tooltip - aria-label="A tooltip" - label={`${ct('firstSeen')} ${dayjs(issue.createdAt).format('YYYY-MM-DD HH:mm:ss')}`} - > - {dayjs(issue.createdAt).fromNow()} - </Tooltip> - </Flex> - </Box> - </Box> - - <Box w="48"> - <TrendChart - data={trends?.[issue.id]} - type={chartType} - /> - </Box> - - <Center w="20"> - {issue._count?.events} - </Center> - - <Center w="20"> - {issue._count?.users} - </Center> - </ThemeBox> - ) - }) - : empty - } - </Box> - </CheckboxGroup> - - { - !!data?.length && ( - <Flex - alignItems="center" - justifyContent="space-between" - mt="6" - w="full" - > - <Link href={`/${projectId}/mock`}> - Mock Data - </Link> - <Pagination - isReachingEnd={!!isReachingEnd} - onChange={page => setSize(page - 1)} - page={size + 1} - /> - </Flex> - ) - } - - <AlertDialog - isOpen={isOpen} - leastDestructiveRef={cancelRef} - onClose={onClose} - > - <AlertDialogOverlay> - <AlertDialogContent> - <AlertDialogHeader - fontSize="lg" - fontWeight="bold" - > - Are you sure you want to delete this {checkedItems.size} issue? - </AlertDialogHeader> - - <AlertDialogBody> - {t('deleteIssuesConfirm')} - </AlertDialogBody> - - <AlertDialogFooter> - <Button - onClick={onClose} - ref={cancelRef} - variant="outline" - > - Cancel - </Button> - <Button - bg="red" - ml={3} - onClick={handleDeleteIssue} - > - Delete - </Button> - </AlertDialogFooter> - </AlertDialogContent> - </AlertDialogOverlay> - </AlertDialog> - </Box> - ) -} - -export default IssueList diff --git a/packages/web/components/layout.tsx b/packages/web/components/layout.tsx index 5093269..c054d7a 100644 --- a/packages/web/components/layout.tsx +++ b/packages/web/components/layout.tsx @@ -1,15 +1,16 @@ 'use client' -import { Box, Container, Flex } from '@chakra-ui/react' -import type { FC, ReactNode } from 'react' import { useState } from 'react' import { useIsomorphicLayoutEffect, useWindowScroll } from 'react-use' +import { twMerge } from 'tailwind-merge' +import { type FC, type ReactNode } from 'react' import Nav from './nav' -import NavMenu from './navMenu' +import NavMenu from './nav-menu' import User from './user' -import ThemeBox from './themeBox' import Logo from './logo' import Footer from './footer' +import { Box } from './ui/box' +import Wrapper from './wrapper' import { scrollWindowTo } from '~/libs/utils' const HeadHeight = 64 @@ -29,90 +30,84 @@ const Layout: FC<Props> = ({ children }) => { return ( <> - <ThemeBox - as="main" - bg="current" - minH="full" - w="full" - > + <div className="min-h-screen w-full"> {/* nav */} - <Container - as="nav" - h={`${HeadHeight}px`} - maxW="container.xl" + <Box + className="container mx-auto" + style={{ height: HeadHeight }} > <Nav /> - </Container> + </Box> {/* navMenu */} - <ThemeBox - acrylic - bg="current" - boxShadow="inset 0 -1px 0 0 rgba(0,0,0,.1)" - h={`${NavHeight}px`} - position={scrollNavVisible ? 'sticky' : 'relative'} - top={scrollNavVisible ? 0 : ''} - w="full" - zIndex={scrollNavVisible ? 'sticky' : ''} + <Box + className={ + twMerge( + 'backdrop-blur shadow-sm w-full', + scrollNavVisible ? 'sticky' : 'relative', + scrollNavVisible && 'top-0', + scrollNavVisible && 'z-10', + ) + } + style={{ height: NavHeight }} > - <Container - alignItems="center" - as="nav" - display="flex" - h="full" - justifyContent="space-between" - maxW="container.xl" + <nav + className=" h-full flex items-center justify-between container mx-auto" > - <Flex position="relative"> + <div className="flex relative"> <Logo - h={`${NavHeight}px`} + className={ + twMerge( + 'relative transition-all', + scrollNavVisible ? 'opacity-100' : 'opacity-0', + scrollNavVisible ? 'visible' : 'invisible', + ) + } onClick={() => scrollWindowTo()} - opacity={scrollNavVisible ? 1 : 0} - position="relative" - transform={scrollNavVisible ? 'translateZ(0)' : `translate3d(0,-${NavHeight}px,0)`} - transition="all 250ms ease" - visibility={scrollNavVisible ? 'visible' : 'hidden'} - w={`${NavHeight}px`} + style={{ height: NavHeight, width: NavHeight, transform: scrollNavVisible ? 'translateZ(0)' : `translate3d(0,-${NavHeight}px,0)` }} /> - <Box - transform={scrollNavVisible ? 'translate3d(24px,0,0)' : `translate3d(-${NavHeight + 12}px,0,0)`} - transition="all 250ms ease" + <div + className="transition-transform" + style={ + { transform: scrollNavVisible ? 'translate3d(24px,0,0)' : `translate3d(-${NavHeight + 12}px,0,0)` } + } > <NavMenu /> - </Box> - </Flex> + </div> + </div> - <Box - opacity={scrollNavVisible ? 1 : 0} - transform={scrollNavVisible ? 'translateZ(0)' : `translate3d(0,-${NavHeight}px,0)`} - transition="all 250ms ease" - visibility={scrollNavVisible ? 'visible' : 'hidden'} + <div + className={ + twMerge( + 'transition-all', + scrollNavVisible ? 'opacity-100' : 'opacity-0', + scrollNavVisible ? 'visible' : 'invisible', + ) + } + style={ + { transform: scrollNavVisible ? 'translateZ(0)' : `translate3d(0,-${NavHeight}px,0)` } + } > <User /> - </Box> - </Container> - </ThemeBox> + </div> + </nav> + </Box> {/* main */} - <ThemeBox - bg="gray" - borderBottom="1px" - borderColor="current" - minH={`calc(100vh - ${HeadHeight + NavHeight}px)`} - w="full" + <div + className="w-full border-b border-stone" + style={ + { minHeight: `calc(100vh - ${HeadHeight + NavHeight}px)` } + } > - <Box>{children}</Box> - </ThemeBox> + <div>{children}</div> + </div> {/* footer */} - <ThemeBox> - <Container - as="footer" - maxW="container.xl" - py="8" - > + <Box className="py-8"> + <Wrapper> <Footer /> - </Container> - </ThemeBox> - </ThemeBox> + </Wrapper> + </Box> + </div> </> ) } diff --git a/packages/web/components/loadMoreButton.tsx b/packages/web/components/load-more-button.tsx similarity index 61% rename from packages/web/components/loadMoreButton.tsx rename to packages/web/components/load-more-button.tsx index 1e1d847..b63561f 100644 --- a/packages/web/components/loadMoreButton.tsx +++ b/packages/web/components/load-more-button.tsx @@ -1,7 +1,7 @@ 'use client' -import { Button } from '@chakra-ui/react' -import type { FC, MouseEventHandler } from 'react' +import { Button } from '~/components/ui/button' +import type { MouseEventHandler } from 'react' interface Props { isLoading?: boolean @@ -9,15 +9,13 @@ interface Props { onClick: MouseEventHandler<HTMLButtonElement> } -const LoadingMoreButton: FC<Props> = ({ isLoading, isReachingEnd, onClick }) => { +export default function LoadingMoreButton({ isLoading, isReachingEnd, onClick }: Props) { return ( <Button + className="w-full mt-6" disabled={isLoading || isReachingEnd} - mt="6" onClick={onClick} size="sm" - variant="filled" - w="full" > { isLoading @@ -29,5 +27,3 @@ const LoadingMoreButton: FC<Props> = ({ isLoading, isReachingEnd, onClick }) => </Button> ) } - -export default LoadingMoreButton diff --git a/packages/web/components/loading.tsx b/packages/web/components/loading.tsx index 25e486a..c965cde 100644 --- a/packages/web/components/loading.tsx +++ b/packages/web/components/loading.tsx @@ -1,11 +1,10 @@ 'use client' -import { Center } from '@chakra-ui/react' import type { FC } from 'react' import Spinning from './spinning' const Loading: FC = () => { - return <Center><Spinning /></Center> + return <div className="flex items-center justify-center"><Spinning /></div> } export default Loading diff --git a/packages/web/components/loginButton.tsx b/packages/web/components/login-button.tsx similarity index 92% rename from packages/web/components/loginButton.tsx rename to packages/web/components/login-button.tsx index bf98897..17d41e3 100644 --- a/packages/web/components/loginButton.tsx +++ b/packages/web/components/login-button.tsx @@ -2,7 +2,7 @@ import type { FC } from 'react' import { signIn, signOut, useSession } from 'next-auth/react' -import { Button } from '@chakra-ui/react' +import { Button } from '~/components/ui/button' const LoginButton: FC = () => { const { data: session } = useSession() diff --git a/packages/web/components/logo.tsx b/packages/web/components/logo.tsx index b078ccc..e94ff77 100644 --- a/packages/web/components/logo.tsx +++ b/packages/web/components/logo.tsx @@ -1,24 +1,26 @@ 'use client' -import type { BoxProps } from '@chakra-ui/react' -import { Box, useColorMode } from '@chakra-ui/react' +import type { CSSProperties } from 'react' import { forwardRef } from 'react' +import Link from 'next/link' +import { useColorMode } from '@chakra-ui/react' import Image from 'next/image' +import { twMerge } from 'tailwind-merge' -interface Props extends BoxProps {} +interface Props { + className?: string + style?: CSSProperties + onClick?: () => void +} -const Logo = forwardRef<HTMLDivElement, Props>((props, ref) => { +const Logo = forwardRef<HTMLAnchorElement, Props>((props, ref) => { const { colorMode } = useColorMode() return ( - <Box - as="a" - cursor="pointer" - display="inline-block" - h="16" - position="relative" - ref={ref} - w="16" + <Link + href="/" {...props} + className={twMerge('inline-block cursor-pointer relative w-16 h-16', props.className)} + ref={ref} > <Image alt="logo" @@ -26,7 +28,7 @@ const Logo = forwardRef<HTMLDivElement, Props>((props, ref) => { priority src={colorMode === 'dark' ? '/logo-white.svg' : '/logo.svg'} /> - </Box> + </Link> ) }) Logo.displayName = 'Logo' diff --git a/packages/web/components/navContainer.tsx b/packages/web/components/nav-container.tsx similarity index 95% rename from packages/web/components/navContainer.tsx rename to packages/web/components/nav-container.tsx index dc9a7d5..e2e696d 100644 --- a/packages/web/components/navContainer.tsx +++ b/packages/web/components/nav-container.tsx @@ -1,7 +1,7 @@ 'use client' import { Box, Button, Flex } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' +import Link from 'next/link' import type { FC, ReactNode } from 'react' export interface Nav { diff --git a/packages/web/components/navMenu.tsx b/packages/web/components/nav-menu.tsx similarity index 58% rename from packages/web/components/navMenu.tsx rename to packages/web/components/nav-menu.tsx index a29772d..d49d332 100644 --- a/packages/web/components/navMenu.tsx +++ b/packages/web/components/nav-menu.tsx @@ -1,10 +1,10 @@ 'use client' -import type { FC } from 'react' -import { useMemo } from 'react' -import { Button, Flex, Text, useColorModeValue } from '@chakra-ui/react' +import { useCallback, useMemo } from 'react' import { usePathname, useRouter } from 'next-intl/client' -import useCurrentProject from '~/hooks/useCurrentProject' +import { Tab, Tabs } from '@nextui-org/react' +import { type FC, type Key } from 'react' +import useCurrentProject from '~/hooks/use-current-project' interface NavMenuItem { label: string @@ -15,8 +15,6 @@ interface NavMenuItem { const NavMenu: FC = () => { const router = useRouter() const pathname = usePathname() - const textColor = useColorModeValue('gray.500', 'gray.400') - const activeTextColor = useColorModeValue('gray.800', 'gray.20') const { projectId } = useCurrentProject() const navMenuList = useMemo<NavMenuItem[]>(() => [ { @@ -61,40 +59,37 @@ const NavMenu: FC = () => { }, ], [projectId]) + const active = useMemo(() => { + return navMenuList.find(item => pathname.includes(item.as)) + }, [navMenuList, pathname]) + const handleSelectionChange = useCallback((key: Key) => { + const item = navMenuList.find(item => item.link === key) + if (item) { + router.push(item.as) + } + }, [navMenuList]) + return ( - <Flex - align="center" - gap="4" - h="full" - w="full" + <Tabs + className="flex items-center gap-4 h-full w-full" + onSelectionChange={handleSelectionChange} + selectedKey={active?.link} + size="lg" + variant="light" > { navMenuList.map((item) => { - const active = pathname.includes(item.as) return ( - <Flex - align="center" - borderBottom={active ? '2px' : ''} - h="full" + <Tab + className="flex items-center h-full" key={item.link} - > - <Button - alignItems="center" - gap="2" - justifyContent="start" - onClick={() => router.push(item.as)} - size="sm" - textColor={active ? activeTextColor : textColor} - variant="ghost" - > - <Text>{item.label}</Text> - </Button> - </Flex> + title={item.label} + /> ) }) } - </Flex> + </Tabs> ) } diff --git a/packages/web/components/nav.tsx b/packages/web/components/nav.tsx index 2362949..4061189 100644 --- a/packages/web/components/nav.tsx +++ b/packages/web/components/nav.tsx @@ -1,30 +1,17 @@ 'use client' -import type { FC } from 'react' -import { Flex } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' +import Link from 'next/link' import User from './user' import Breadcrumbs from './breadcrumbs' -import ThemeBox from './themeBox' -interface Props {} - -const Nav: FC<Props> = () => { +export default function Nav() { return ( - <ThemeBox - alignItems="center" - bg="current" - display="flex" - h="full" - justifyContent="space-between" - w="full" + <div + className="flex items-center justify-between w-full h-full" > <Breadcrumbs /> - <Flex - align="center" - gap="4" - > + <div className="flex items-center gap-4"> <Link href="https://ohbug.net/" target="_blank" @@ -32,9 +19,7 @@ const Nav: FC<Props> = () => { Docs </Link> <User /> - </Flex> - </ThemeBox> + </div> + </div> ) } - -export default Nav diff --git a/packages/web/components/project-card.tsx b/packages/web/components/project-card.tsx new file mode 100644 index 0000000..60860ee --- /dev/null +++ b/packages/web/components/project-card.tsx @@ -0,0 +1,68 @@ +'use client' + +import { Card, CardBody } from '@nextui-org/react' +import { Avatar, Text } from '@chakra-ui/react' +import Link from 'next/link' +import { type ProjectWithEventCount } from 'common' +import Loading from './loading' +import TrendChart from './trend-chart' +import { type ProjectTrend } from '~/services/projects' +import { serviceGetProjectTrends } from '~/services/projects' +import { useQuery } from '~/hooks/use-query' + +interface Props { + project: ProjectWithEventCount +} + +export default function ProjectCard({ project }: Props) { + const { data: trends, isLoading } = useQuery<ProjectTrend[]>( + () => serviceGetProjectTrends({ + id: project.id, + type: '14d', + }), + { enabled: project.id !== undefined }, + ) + + return ( + <Link href={`/${project.id}/profile`}> + <Card isBlurred> + <CardBody> + <div className="flex gap-6"> + <Avatar + name={project.name} + src={project.image ?? ''} + /> + <div> + <Text + cursor="pointer" + fontWeight="semibold" + > + {project.name} + </Text> + + <Text + fontSize="xs" + textColor="gray.500" + > + Events: {project.eventCount ?? 0} + </Text> + </div> + </div> + + <div className="mt-4"> + { + isLoading + ? <Loading /> + : ( + <TrendChart + data={trends} + type="14d" + /> + ) + } + </div> + </CardBody> + </Card> + </Link> + ) +} diff --git a/packages/web/components/project.tsx b/packages/web/components/project.tsx index 55cf605..a87ef79 100644 --- a/packages/web/components/project.tsx +++ b/packages/web/components/project.tsx @@ -11,7 +11,7 @@ import { useSession } from 'next-auth/react' import Loading from './loading' import { useStore } from '~/store' import { serviceGetProjectsWithEventCount } from '~/services/projects' -import { useQuery } from '~/hooks/useQuery' +import { useQuery } from '~/hooks/use-query' const ProjectComponent: FC = () => { const router = useRouter() diff --git a/packages/web/components/projectCard.tsx b/packages/web/components/projectCard.tsx deleted file mode 100644 index 228d9b3..0000000 --- a/packages/web/components/projectCard.tsx +++ /dev/null @@ -1,72 +0,0 @@ -'use client' - -import { Avatar, Box, Flex, Text } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' -import type { FC } from 'react' -import type { ProjectWithEventCount } from 'common' -import Loading from './loading' -import TrendChart from './trendChart' -import Card from './card' -import type { ProjectTrend } from '~/services/projects' -import { serviceGetProjectTrends } from '~/services/projects' -import { useQuery } from '~/hooks/useQuery' - -interface Props { - project: ProjectWithEventCount -} -const ProjectCard: FC<Props> = ({ project }) => { - const { data: trends, isLoading } = useQuery<ProjectTrend[]>( - () => serviceGetProjectTrends({ - id: project.id, - type: '14d', - }), - { enabled: project.id !== undefined }, - ) - - return ( - <Link href={`/${project.id}/profile`}> - <Card - hover - minW="sm" - w="full" - > - <Flex gap="6"> - <Avatar - name={project.name} - src={project.image ?? ''} - /> - <Box> - <Text - cursor="pointer" - fontWeight="semibold" - > - {project.name} - </Text> - - <Text - fontSize="xs" - textColor="gray.500" - > - Events: {project.eventCount ?? 0} - </Text> - </Box> - </Flex> - - <Box mt="4"> - { - isLoading - ? <Loading /> - : ( - <TrendChart - data={trends} - type="14d" - /> - ) - } - </Box> - </Card> - </Link> - ) -} - -export default ProjectCard diff --git a/packages/web/components/releaseList.tsx b/packages/web/components/release-list.tsx similarity index 96% rename from packages/web/components/releaseList.tsx rename to packages/web/components/release-list.tsx index ae22af8..27e046e 100644 --- a/packages/web/components/releaseList.tsx +++ b/packages/web/components/release-list.tsx @@ -4,10 +4,10 @@ import type { FC } from 'react' import { useCallback } from 'react' import dayjs from 'dayjs' import { Box, Flex, IconButton, Menu, MenuButton, MenuItem, MenuList, Text, Tooltip, useToast } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' +import Link from 'next/link' import type { Release } from '@prisma/client' import { RiMoreLine } from 'react-icons/ri' -import useCurrentProject from '~/hooks/useCurrentProject' +import useCurrentProject from '~/hooks/use-current-project' import { serviceDeleteRelease } from '~/services/releases' interface Props { diff --git a/packages/web/components/spinning.tsx b/packages/web/components/spinning.tsx index 247c30f..85b5a38 100644 --- a/packages/web/components/spinning.tsx +++ b/packages/web/components/spinning.tsx @@ -1,26 +1,14 @@ 'use client' -import { Box, keyframes } from '@chakra-ui/react' -import { motion } from 'framer-motion' import type { FC } from 'react' -import { RiLoader2Line } from 'react-icons/ri' - -const animationKeyframes = keyframes` - 0% { transform: scale(1) rotate(0) } - 50% { transform: scale(1) rotate(180deg) } - 100% { transform: scale(1) rotate(360deg) } -` - -const animation = `${animationKeyframes} 2s infinite` const Spinning: FC = () => { return ( - <Box - animation={animation} - as={motion.div} + <div + className="animate-spin" > - <RiLoader2Line /> - </Box> + <i className="i-ri-loader-2-line" /> + </div> ) } diff --git a/packages/web/components/stackInfo.tsx b/packages/web/components/stack-info.tsx similarity index 100% rename from packages/web/components/stackInfo.tsx rename to packages/web/components/stack-info.tsx diff --git a/packages/web/components/tabs.tsx b/packages/web/components/tabs.tsx deleted file mode 100644 index eb59323..0000000 --- a/packages/web/components/tabs.tsx +++ /dev/null @@ -1,16 +0,0 @@ -'use client' - -import type { TabsProps as BaseTabsProps } from '@chakra-ui/react' -import { Tabs as BaseTabs } from '@chakra-ui/react' -import type { FC } from 'react' - -interface TabsProps extends BaseTabsProps {} - -export const Tabs: FC<TabsProps> = (props) => { - return ( - <BaseTabs - {...props} - variant="" - /> - ) -} diff --git a/packages/web/components/theme.tsx b/packages/web/components/theme.tsx index f7fedee..d592320 100644 --- a/packages/web/components/theme.tsx +++ b/packages/web/components/theme.tsx @@ -1,28 +1,42 @@ 'use client' -import { Icon, IconButton, useColorMode } from '@chakra-ui/react' -import type { FC } from 'react' -import { useCallback } from 'react' -import { RiMoonLine, RiSunLine } from 'react-icons/ri' +import { type FC } from 'react' +import { useTheme } from 'next-themes' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from './ui/dropdown-menu' +import { Button } from './ui/button' const Theme: FC = () => { - const { colorMode, toggleColorMode } = useColorMode() - const handleToggleTheme = useCallback(() => { - toggleColorMode() - }, [colorMode]) + const { setTheme } = useTheme() return ( - <IconButton - aria-label="toggle theme" - cursor="pointer" - display="inline-block" - h="6" - icon={<Icon as={colorMode === 'light' ? RiMoonLine : RiSunLine} />} - onClick={handleToggleTheme} - textColor={colorMode === 'light' ? 'black' : 'white'} - variant="ghost" - w="6" - /> + <DropdownMenu> + <DropdownMenuTrigger asChild> + <Button + size="icon" + variant="outline" + > + <i className="i-ri-sun-line h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" /> + <i className="i-ri-moon-line absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" /> + <span className="sr-only">Toggle theme</span> + </Button> + </DropdownMenuTrigger> + <DropdownMenuContent align="end"> + <DropdownMenuItem onClick={() => setTheme('light')}> + Light + </DropdownMenuItem> + <DropdownMenuItem onClick={() => setTheme('dark')}> + Dark + </DropdownMenuItem> + <DropdownMenuItem onClick={() => setTheme('system')}> + System + </DropdownMenuItem> + </DropdownMenuContent> + </DropdownMenu> ) } diff --git a/packages/web/components/themeBox.tsx b/packages/web/components/themeBox.tsx deleted file mode 100644 index f3cca77..0000000 --- a/packages/web/components/themeBox.tsx +++ /dev/null @@ -1,34 +0,0 @@ -'use client' - -import type { BoxProps } from '@chakra-ui/react' -import { Box } from '@chakra-ui/react' -import { forwardRef, useMemo } from 'react' -import { useBgColor, useBorderColor } from '~/hooks/useColor' - -export interface ThemeBoxProps extends BoxProps { - acrylic?: boolean -} - -const ThemeBox = forwardRef<HTMLDivElement, ThemeBoxProps>(({ acrylic, ...props }, ref) => { - const bgColor = useBgColor({ acrylic }) - const bgGrayColor = useBgColor({ gray: true }) - const borderColor = useBorderColor() - - const bg = useMemo(() => { - if (props.bg === 'current') return bgColor - else if (props.bg === 'gray') return bgGrayColor - return props.bg - }, [props.bg, bgColor, bgGrayColor]) - - return ( - <Box - {...props} - backdropFilter={acrylic ? 'saturate(100%) blur(10px)' : undefined} - bg={bg} - borderColor={props.borderColor === 'current' ? borderColor : props.borderColor} - ref={ref} - /> - ) -}) -ThemeBox.displayName = 'ThemeBox' -export default ThemeBox diff --git a/packages/web/components/title.tsx b/packages/web/components/title.tsx index 91a31bf..42a654d 100644 --- a/packages/web/components/title.tsx +++ b/packages/web/components/title.tsx @@ -1,12 +1,11 @@ 'use client' -import { Box, Flex, Heading } from '@chakra-ui/react' -import type { FC, ReactNode } from 'react' -import type { ThemeBoxProps } from './themeBox' -import ThemeBox from './themeBox' +import { type ReactNode } from 'react' import Wrapper from './wrapper' +import { Box } from './ui/box' +import { type BoxProps } from './ui/box' -interface Props extends ThemeBoxProps { +interface Props extends BoxProps { children: ReactNode rightNodes?: ReactNode bottomNodes?: ReactNode @@ -14,43 +13,34 @@ interface Props extends ThemeBoxProps { const PADDING = '12' -const Title: FC<Props> = ({ children, rightNodes, bottomNodes, ...props }) => { +export default function Title({ children, rightNodes, bottomNodes, ...props }: Props) { return ( - <ThemeBox - bg="current" - borderBottom="1px" - borderColor="current" + <Box {...props} > <Wrapper - display="flex" - flexDirection="column" - justifyContent="space-between" - pb={bottomNodes ? '0' : PADDING} - pt={PADDING} + className="flex flex-col justify-between" + style={ + { + paddingBottom: bottomNodes ? '0' : PADDING, + paddingTop: PADDING, + } + } > - <Flex - align="center" - justify="space-between" - > + <div className="flex items-center justify-between"> { typeof children === 'string' ? ( - <Heading - fontWeight="semibold" - size="lg" - > + <h2 className="text-2xl font-semibold"> {children} - </Heading> + </h2> ) : children } - <Box>{rightNodes}</Box> - </Flex> - <Box mt={bottomNodes ? '6' : 0}>{bottomNodes}</Box> + <div>{rightNodes}</div> + </div> + <div style={{ marginTop: bottomNodes ? 6 : 0 }}>{bottomNodes}</div> </Wrapper> - </ThemeBox> + </Box> ) } - -export default Title diff --git a/packages/web/components/topProgressBar.tsx b/packages/web/components/top-progress-bar.tsx similarity index 100% rename from packages/web/components/topProgressBar.tsx rename to packages/web/components/top-progress-bar.tsx diff --git a/packages/web/components/trendChart.tsx b/packages/web/components/trend-chart.tsx similarity index 98% rename from packages/web/components/trendChart.tsx rename to packages/web/components/trend-chart.tsx index 1e3bf38..c2618a5 100644 --- a/packages/web/components/trendChart.tsx +++ b/packages/web/components/trend-chart.tsx @@ -7,7 +7,7 @@ import Highcharts from 'highcharts' import HighchartsExporting from 'highcharts/modules/exporting' import HighchartsReact from 'highcharts-react-official' import dayjs from 'dayjs' -import { Box, useColorMode } from '@chakra-ui/react' +import { useColorMode } from '@chakra-ui/react' import Loading from './loading' import { theme } from '~/styles/chart.theme' import { colors } from '~/styles/colors' @@ -183,14 +183,14 @@ const TrendChart: FC<MiniChartProps> = memo(({ type, data, title, variant = 'min ) return ( - <Box> + <div> {title} <HighchartsReact highcharts={Highcharts} options={options} ref={ref} /> - </Box> + </div> ) }) diff --git a/packages/web/components/ui/box.tsx b/packages/web/components/ui/box.tsx new file mode 100644 index 0000000..0b8941a --- /dev/null +++ b/packages/web/components/ui/box.tsx @@ -0,0 +1,25 @@ +'use client' + +import { type CSSProperties, type ReactNode, forwardRef } from 'react' +import { twMerge } from 'tailwind-merge' + +export interface BoxProps { + acrylic?: boolean + children?: ReactNode + className?: string + style?: CSSProperties +} + +export const Box = forwardRef<HTMLDivElement, BoxProps>(({ acrylic, className, children, ...props }, ref) => { + + return ( + <div + className={twMerge('bg-white dark:bg-stone-900', acrylic && 'backdrop-blur', className)} + {...props} + ref={ref} + > + {children} + </div> + ) +}) +Box.displayName = 'Box' diff --git a/packages/web/components/ui/button.tsx b/packages/web/components/ui/button.tsx new file mode 100644 index 0000000..3845f33 --- /dev/null +++ b/packages/web/components/ui/button.tsx @@ -0,0 +1,53 @@ +import * as React from 'react' +import { Slot } from '@radix-ui/react-slot' +import { type VariantProps, cva } from 'class-variance-authority' +import { cn } from '~/libs/utils' + +const buttonVariants = cva( + 'inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50', + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground hover:bg-primary/90', + destructive: + 'bg-destructive text-destructive-foreground hover:bg-destructive/90', + outline: + 'border border-input bg-background hover:bg-accent hover:text-accent-foreground', + secondary: + 'bg-secondary text-secondary-foreground hover:bg-secondary/80', + ghost: 'hover:bg-accent hover:text-accent-foreground', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-10 px-4 py-2', + sm: 'h-9 rounded-md px-3', + lg: 'h-11 rounded-md px-8', + icon: 'h-10 w-10', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes<HTMLButtonElement>, + VariantProps<typeof buttonVariants> { + asChild?: boolean +} + +const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : 'button' + return ( + <Comp + className={cn(buttonVariants({ variant, size, className }))} + ref={ref} + {...props} + /> + ) +}) +Button.displayName = 'Button' + +export { Button, buttonVariants } diff --git a/packages/web/components/ui/card.tsx b/packages/web/components/ui/card.tsx new file mode 100644 index 0000000..d07056a --- /dev/null +++ b/packages/web/components/ui/card.tsx @@ -0,0 +1,87 @@ +import * as React from 'react' + +import { cn } from '~/libs/utils' + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes<HTMLDivElement> +>(({ className, ...props }, ref) => ( + <div + className={ + cn( + 'rounded-lg border bg-card text-card-foreground shadow-sm', + className, + ) + } + ref={ref} + {...props} + /> +)) +Card.displayName = 'Card' + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes<HTMLDivElement> +>(({ className, ...props }, ref) => ( + <div + className={cn('flex flex-col space-y-1.5 p-6', className)} + ref={ref} + {...props} + /> +)) +CardHeader.displayName = 'CardHeader' + +const CardTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes<HTMLHeadingElement> +>(({ className, ...props }, ref) => ( + <h3 + className={ + cn( + 'text-2xl font-semibold leading-none tracking-tight', + className, + ) + } + ref={ref} + {...props} + /> +)) +CardTitle.displayName = 'CardTitle' + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes<HTMLParagraphElement> +>(({ className, ...props }, ref) => ( + <p + className={cn('text-sm text-muted-foreground', className)} + ref={ref} + {...props} + /> +)) +CardDescription.displayName = 'CardDescription' + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes<HTMLDivElement> +>(({ className, ...props }, ref) => ( + <div + className={cn('p-6 pt-0', className)} + ref={ref} + {...props} + /> +)) +CardContent.displayName = 'CardContent' + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes<HTMLDivElement> +>(({ className, ...props }, ref) => ( + <div + className={cn('flex items-center p-6 pt-0', className)} + ref={ref} + {...props} + /> +)) +CardFooter.displayName = 'CardFooter' + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/packages/web/components/ui/dropdown-menu.tsx b/packages/web/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..51bd6f7 --- /dev/null +++ b/packages/web/components/ui/dropdown-menu.tsx @@ -0,0 +1,213 @@ +'use client' + +import * as React from 'react' +import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' + +import { cn } from '~/libs/utils' + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>, + React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & { + inset?: boolean + } +>(({ className, inset, children, ...props }, ref) => ( + <DropdownMenuPrimitive.SubTrigger + className={ + cn( + 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent', + inset && 'pl-8', + className, + ) + } + ref={ref} + {...props} + > + {children} + <i className="i-ri-arrow-right-s-line ml-auto h-4 w-4" /> + </DropdownMenuPrimitive.SubTrigger> +)) +DropdownMenuSubTrigger.displayName + = DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef<typeof DropdownMenuPrimitive.SubContent>, + React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent> +>(({ className, ...props }, ref) => ( + <DropdownMenuPrimitive.SubContent + className={ + cn( + 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', + className, + ) + } + ref={ref} + {...props} + /> +)) +DropdownMenuSubContent.displayName + = DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef< + React.ElementRef<typeof DropdownMenuPrimitive.Content>, + React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> +>(({ className, sideOffset = 4, ...props }, ref) => ( + <DropdownMenuPrimitive.Portal> + <DropdownMenuPrimitive.Content + className={ + cn( + 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', + className, + ) + } + ref={ref} + sideOffset={sideOffset} + {...props} + /> + </DropdownMenuPrimitive.Portal> +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef< + React.ElementRef<typeof DropdownMenuPrimitive.Item>, + React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + <DropdownMenuPrimitive.Item + className={ + cn( + 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', + inset && 'pl-8', + className, + ) + } + ref={ref} + {...props} + /> +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>, + React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem> +>(({ className, children, checked, ...props }, ref) => ( + <DropdownMenuPrimitive.CheckboxItem + checked={checked} + className={ + cn( + 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', + className, + ) + } + ref={ref} + {...props} + > + <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center"> + <DropdownMenuPrimitive.ItemIndicator> + <i className="i-ri-check-line h-4 w-4" /> + </DropdownMenuPrimitive.ItemIndicator> + </span> + {children} + </DropdownMenuPrimitive.CheckboxItem> +)) +DropdownMenuCheckboxItem.displayName + = DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>, + React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem> +>(({ className, children, ...props }, ref) => ( + <DropdownMenuPrimitive.RadioItem + className={ + cn( + 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', + className, + ) + } + ref={ref} + {...props} + > + <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center"> + <DropdownMenuPrimitive.ItemIndicator> + <i className="i-ri-checkbox-blank-circle-line h-2 w-2 fill-current" /> + </DropdownMenuPrimitive.ItemIndicator> + </span> + {children} + </DropdownMenuPrimitive.RadioItem> +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef<typeof DropdownMenuPrimitive.Label>, + React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + <DropdownMenuPrimitive.Label + className={ + cn( + 'px-2 py-1.5 text-sm font-semibold', + inset && 'pl-8', + className, + ) + } + ref={ref} + {...props} + /> +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef<typeof DropdownMenuPrimitive.Separator>, + React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator> +>(({ className, ...props }, ref) => ( + <DropdownMenuPrimitive.Separator + className={cn('-mx-1 my-1 h-px bg-muted', className)} + ref={ref} + {...props} + /> +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes<HTMLSpanElement>) => { + return ( + <span + className={cn('ml-auto text-xs tracking-widest opacity-60', className)} + {...props} + /> + ) +} +DropdownMenuShortcut.displayName = 'DropdownMenuShortcut' + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +} diff --git a/packages/web/components/ui/table.tsx b/packages/web/components/ui/table.tsx new file mode 100644 index 0000000..51f54ce --- /dev/null +++ b/packages/web/components/ui/table.tsx @@ -0,0 +1,122 @@ +import * as React from 'react' + +import { cn } from '~/libs/utils' + +const Table = React.forwardRef< + HTMLTableElement, + React.HTMLAttributes<HTMLTableElement> +>(({ className, ...props }, ref) => ( + <div className="w-full overflow-auto"> + <table + className={cn('w-full caption-bottom text-sm', className)} + ref={ref} + {...props} + /> + </div> +)) +Table.displayName = 'Table' + +const TableHeader = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes<HTMLTableSectionElement> +>(({ className, ...props }, ref) => ( + <thead + className={cn('[&_tr]:border-b', className)} + ref={ref} + {...props} + /> +)) +TableHeader.displayName = 'TableHeader' + +const TableBody = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes<HTMLTableSectionElement> +>(({ className, ...props }, ref) => ( + <tbody + className={cn('[&_tr:last-child]:border-0', className)} + ref={ref} + {...props} + /> +)) +TableBody.displayName = 'TableBody' + +const TableFooter = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes<HTMLTableSectionElement> +>(({ className, ...props }, ref) => ( + <tfoot + className={cn('bg-primary font-medium text-primary-foreground', className)} + ref={ref} + {...props} + /> +)) +TableFooter.displayName = 'TableFooter' + +const TableRow = React.forwardRef< + HTMLTableRowElement, + React.HTMLAttributes<HTMLTableRowElement> +>(({ className, ...props }, ref) => ( + <tr + className={ + cn( + 'border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted', + className, + ) + } + ref={ref} + {...props} + /> +)) +TableRow.displayName = 'TableRow' + +const TableHead = React.forwardRef< + HTMLTableCellElement, + React.ThHTMLAttributes<HTMLTableCellElement> +>(({ className, ...props }, ref) => ( + <th + className={ + cn( + 'h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0', + className, + ) + } + ref={ref} + {...props} + /> +)) +TableHead.displayName = 'TableHead' + +const TableCell = React.forwardRef< + HTMLTableCellElement, + React.TdHTMLAttributes<HTMLTableCellElement> +>(({ className, ...props }, ref) => ( + <td + className={cn('p-4 align-middle [&:has([role=checkbox])]:pr-0', className)} + ref={ref} + {...props} + /> +)) +TableCell.displayName = 'TableCell' + +const TableCaption = React.forwardRef< + HTMLTableCaptionElement, + React.HTMLAttributes<HTMLTableCaptionElement> +>(({ className, ...props }, ref) => ( + <caption + className={cn('mt-4 text-sm text-muted-foreground', className)} + ref={ref} + {...props} + /> +)) +TableCaption.displayName = 'TableCaption' + +export { + Table, + TableHeader, + TableBody, + TableFooter, + TableHead, + TableRow, + TableCell, + TableCaption, +} diff --git a/packages/web/components/ui/theme-provider.tsx b/packages/web/components/ui/theme-provider.tsx new file mode 100644 index 0000000..d4b4bbf --- /dev/null +++ b/packages/web/components/ui/theme-provider.tsx @@ -0,0 +1,9 @@ +'use client' + +import * as React from 'react' +import { ThemeProvider as NextThemesProvider } from 'next-themes' +import { type ThemeProviderProps } from 'next-themes/dist/types' + +export function ThemeProvider({ children, ...props }: ThemeProviderProps) { + return <NextThemesProvider {...props}>{children}</NextThemesProvider> +} diff --git a/packages/web/components/user.tsx b/packages/web/components/user.tsx index fec57eb..d2f6bfd 100644 --- a/packages/web/components/user.tsx +++ b/packages/web/components/user.tsx @@ -1,133 +1,73 @@ 'use client' -import type { FC } from 'react' -import { useState } from 'react' -import { Avatar, AvatarBadge, Box, Button, Flex, Highlight, Menu, MenuButton, MenuDivider, MenuGroup, MenuItem, MenuList, Text } from '@chakra-ui/react' +import { Avatar, Button, Dropdown, DropdownItem, DropdownMenu, DropdownSection, DropdownTrigger, User } from '@nextui-org/react' import { signIn, signOut, useSession } from 'next-auth/react' import { useTranslations } from 'next-intl' -import { useMount } from 'react-use' import Theme from './theme' import Intl from './intl' -const User: FC = () => { +export default function UserComponent() { const t = useTranslations('Header.User') const { data: session } = useSession() - const [hasNewVersion, setHasNewVersion] = useState(false) - useMount(async() => { - const data = await (await fetch('https://cdn.jsdelivr.net/gh/ohbug-org/ohbug-dashboard/package.json')).json() - if (!data) return - const { version } = data - const currentVersion = process.env.NEXT_PUBLIC_VERSION - setHasNewVersion(version !== currentVersion) - }) if (session) { return ( - <Menu> - <MenuButton> + <Dropdown backdrop="blur"> + <DropdownTrigger> <Avatar + as="button" + className="transition-transform" name={session.user?.name ?? ''} size="sm" src={session.user?.image ?? ''} - > - { - hasNewVersion && ( - <AvatarBadge - bg="green.500" - boxSize="1.25em" - /> - ) - } - </Avatar> - </MenuButton> + /> + </DropdownTrigger> - <MenuList> - <MenuGroup> - <Flex - gap="4" - px="3" - py="2" - > - <Avatar + <DropdownMenu> + <DropdownSection + showDivider + > + <DropdownItem> + <User + avatarProps={ + { src: session.user?.image ?? '' } + } + description={session.user?.email} name={session.user?.name ?? ''} - size="md" - src={session.user?.image ?? ''} /> - <Flex direction="column"> - <Text fontWeight="semibold">{session.user?.name}</Text> - <Text - fontSize="12" - textColor="gray.500" - > - {session.user?.email} - </Text> - </Flex> - </Flex> - { - hasNewVersion && ( - <MenuItem - as="a" - href="https://www.ohbug.net/guide/upgrade.html" - target="_blank" - > - <Highlight - query="latest version" - styles={{ ml: '2', px: '2', bg: 'orange.100' }} - > - Get the latest version - </Highlight> - </MenuItem> - ) - } - </MenuGroup> - - <MenuDivider /> + </DropdownItem> + </DropdownSection> - <MenuGroup> - <Flex - align="center" - justify="space-between" - px="3" - py="2" - w="full" + <DropdownSection showDivider> + <DropdownItem + endContent={<Theme />} + isReadOnly > - <Box>{t('theme')}</Box> - <Theme /> - </Flex> - </MenuGroup> + {t('theme')} + </DropdownItem> + </DropdownSection> - <MenuDivider /> - - <MenuGroup> - <Flex - align="center" - justify="space-between" - px="3" - py="2" - w="full" + <DropdownSection> + <DropdownItem + endContent={<Intl />} + isReadOnly > - <Box>{t('language')}</Box> - <Intl /> - </Flex> - </MenuGroup> - - <MenuDivider /> + {t('language')} + </DropdownItem> + </DropdownSection> - <MenuGroup> - <MenuItem onClick={() => signOut()}>{t('logout')}</MenuItem> - </MenuGroup> - </MenuList> - </Menu> + <DropdownSection> + <DropdownItem onPress={() => signOut()}>{t('logout')}</DropdownItem> + </DropdownSection> + </DropdownMenu> + </Dropdown> ) } return ( <Button onClick={() => signIn()} - size="xs" > {t('signIn')} </Button> ) } - -export default User diff --git a/packages/web/components/users-list.tsx b/packages/web/components/users-list.tsx new file mode 100644 index 0000000..d67301f --- /dev/null +++ b/packages/web/components/users-list.tsx @@ -0,0 +1,117 @@ +'use client' + +import { Table, TableBody, TableCell, TableColumn, TableHeader, TableRow } from '@nextui-org/react' +import Link from 'next/link' +import { useCallback } from 'react' +import { type Key } from 'react' +import { type EventUser } from '@prisma/client' +import useCurrentProject from '~/hooks/use-current-project' + +type User = EventUser & { + _count: { + issues: number + metrics: number + feedbacks: number + pageViews: number + userViews: number + } +} +interface Props { + users?: User[] +} + +function getUserView(user: EventUser) { + const result = [] + if (user.email) { + result.push(`Email[${user.email}]`) + } + if (user.ipAddress) { + result.push(`IP[${user.ipAddress}]`) + } + if (user.name) { + result.push(`Name[${user.name}]`) + } + if (user.uuid) { + result.push(`UUID[${user.uuid}]`) + } + if (user.metadata) { + result.push(`Metadata[${JSON.stringify(user.metadata)}]`) + } + return result.join(' / ') +} + +const columns = [ + { + key: 'user', + label: 'user', + }, + { + key: 'issues', + label: 'issues', + }, + { + key: 'metrics', + label: 'metrics', + }, + { + key: 'feedbacks', + label: 'feedbacks', + }, + { + key: 'pageViews', + label: 'pageViews', + }, + { + key: 'userViews', + label: 'userViews', + }, +] + +export default function UsersList({ users }: Props) { + const { projectId } = useCurrentProject() + + const renderCell = useCallback((item: User, columnKey: Key) => { + switch (columnKey) { + case 'user': + return ( + <Link href={`/${projectId}/users/${item.id}`}> + {getUserView(item)} + </Link> + ) + case 'issues': + return item._count.issues + case 'metrics': + return item._count.metrics + case 'feedbacks': + return item._count.feedbacks + case 'pageViews': + return item._count.pageViews + case 'userViews': + return item._count.userViews + default: + return null + } + }, [projectId]) + + return ( + <Table> + <TableHeader columns={columns}> + {column => <TableColumn key={column.key}>{column.label}</TableColumn>} + </TableHeader> + <TableBody + emptyContent="No rows to display." + items={users} + > + { + users + ? item => ( + <TableRow key={item.id}> + {columnKey => <TableCell>{renderCell(item, columnKey)}</TableCell>} + </TableRow> + ) + :[] + } + </TableBody> + </Table> + ) +} diff --git a/packages/web/components/usersList.tsx b/packages/web/components/usersList.tsx deleted file mode 100644 index 7335bee..0000000 --- a/packages/web/components/usersList.tsx +++ /dev/null @@ -1,83 +0,0 @@ -'use client' - -import { Table, TableContainer, Tbody, Td, Th, Thead, Tr } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' -import type { FC } from 'react' -import type { EventUser } from '@prisma/client' -import useCurrentProject from '~/hooks/useCurrentProject' - -interface Props { - users?: (EventUser & { - _count: { - issues: number - metrics: number - feedbacks: number - pageViews: number - userViews: number - } - })[] -} - -function getUserView(user: EventUser) { - const result = [] - if (user.email) { - result.push(`Email[${user.email}]`) - } - if (user.ipAddress) { - result.push(`IP[${user.ipAddress}]`) - } - if (user.name) { - result.push(`Name[${user.name}]`) - } - if (user.uuid) { - result.push(`UUID[${user.uuid}]`) - } - if (user.metadata) { - result.push(`Metadata[${JSON.stringify(user.metadata)}]`) - } - return result.join(' / ') -} - -const UsersList: FC<Props> = ({ users }) => { - const { projectId } = useCurrentProject() - - return ( - <TableContainer> - <Table className="w-full table table-compact"> - <Thead> - <Tr> - <Th>user</Th> - <Th>issues</Th> - <Th>metrics</Th> - <Th>feedbacks</Th> - <Th>pageViews</Th> - <Th>userViews</Th> - </Tr> - </Thead> - <Tbody> - { - users?.map((user) => { - const desc = getUserView(user) - return ( - <Tr key={user.id}> - <Td> - <Link href={`/${projectId}/users/${user.id}`}> - {desc} - </Link> - </Td> - <Td>{user._count.issues}</Td> - <Td>{user._count.metrics}</Td> - <Td>{user._count.feedbacks}</Td> - <Td>{user._count.pageViews}</Td> - <Td>{user._count.userViews}</Td> - </Tr> - ) - }) - } - </Tbody> - </Table> - </TableContainer> - ) -} - -export default UsersList diff --git a/packages/web/components/wrapper.tsx b/packages/web/components/wrapper.tsx index f595185..1481555 100644 --- a/packages/web/components/wrapper.tsx +++ b/packages/web/components/wrapper.tsx @@ -1,24 +1,25 @@ 'use client' -import type { ContainerProps } from '@chakra-ui/react' -import { Container } from '@chakra-ui/react' -import type { ReactNode } from 'react' +import type { CSSProperties, ReactNode } from 'react' import { forwardRef } from 'react' +import { twMerge } from 'tailwind-merge' -interface Props extends ContainerProps { +interface Props { children: ReactNode + className?: string + style?: CSSProperties } -const Wrapper = forwardRef<HTMLDivElement, Props>(({ children, ...props }, ref) => { +const Wrapper = forwardRef<HTMLDivElement, Props>(({ children, className, style, ...props }, ref) => { return ( - <Container - maxW="container.xl" - py="4" + <div + className={twMerge('container mx-auto py-4', className)} ref={ref} + style={style} {...props} > {children} - </Container> + </div> ) }) Wrapper.displayName = 'Wrapper' diff --git a/packages/web/hooks/useBreadcrumb.ts b/packages/web/hooks/use-breadcrumb.ts similarity index 94% rename from packages/web/hooks/useBreadcrumb.ts rename to packages/web/hooks/use-breadcrumb.ts index d6e449c..46b215a 100644 --- a/packages/web/hooks/useBreadcrumb.ts +++ b/packages/web/hooks/use-breadcrumb.ts @@ -1,6 +1,6 @@ import { usePathname } from 'next-intl/client' import { useEffect, useState } from 'react' -import useCurrentProject from './useCurrentProject' +import useCurrentProject from './use-current-project' interface Breadcrumb { breadcrumb: string diff --git a/packages/web/hooks/useColor.ts b/packages/web/hooks/use-color.ts similarity index 100% rename from packages/web/hooks/useColor.ts rename to packages/web/hooks/use-color.ts diff --git a/packages/web/hooks/useCurrentProject.ts b/packages/web/hooks/use-current-project.ts similarity index 73% rename from packages/web/hooks/useCurrentProject.ts rename to packages/web/hooks/use-current-project.ts index 6012341..7ad3fba 100644 --- a/packages/web/hooks/useCurrentProject.ts +++ b/packages/web/hooks/use-current-project.ts @@ -6,5 +6,5 @@ export default function useCurrentProject() { const projectId = params.projectId const project = useStore(state => state.project) - return { projectId: projectId ? parseInt(projectId as string) : project?.id } + return { projectId: projectId ? Number.parseInt(projectId as string) : project?.id } } diff --git a/packages/web/hooks/useInfinite.ts b/packages/web/hooks/use-infinite.ts similarity index 100% rename from packages/web/hooks/useInfinite.ts rename to packages/web/hooks/use-infinite.ts diff --git a/packages/web/hooks/useInviteMember.ts b/packages/web/hooks/use-invite-member.ts similarity index 100% rename from packages/web/hooks/useInviteMember.ts rename to packages/web/hooks/use-invite-member.ts diff --git a/packages/web/hooks/useQuery.ts b/packages/web/hooks/use-query.ts similarity index 100% rename from packages/web/hooks/useQuery.ts rename to packages/web/hooks/use-query.ts diff --git a/packages/web/libs/utils.tsx b/packages/web/libs/utils.tsx index a9033f3..4952f11 100644 --- a/packages/web/libs/utils.tsx +++ b/packages/web/libs/utils.tsx @@ -1,9 +1,11 @@ -import type { ReactNode } from 'react' -import type { OhbugAction, OhbugEvent } from '@ohbug/types' import UA from 'ua-parser-js' import { Text } from '@chakra-ui/react' import { RiBugFill, RiCursorFill, RiGift2Fill, RiLoader2Fill, RiRouterFill, RiTerminalBoxFill } from 'react-icons/ri' -import type { IconType } from 'react-icons' +import { type IconType } from 'react-icons' +import { type OhbugAction, type OhbugEvent } from '@ohbug/types' +import { type ReactNode } from 'react' +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' export function renderStringOrJson(value?: any) { return typeof value === 'string' @@ -144,3 +146,7 @@ export function scrollWindowTo(to?: number) { export function average(arr: number[]) { return (arr.reduce((a, b) => a + b, 0) / arr.length).toFixed(2) } + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/packages/web/package.json b/packages/web/package.json index e9e365c..75e8bc8 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -9,48 +9,62 @@ }, "dependencies": { "@chakra-ui/next-js": "^2.1.4", - "@chakra-ui/react": "^2.7.1", - "@chakra-ui/theme-tools": "^2.0.18", + "@chakra-ui/react": "^2.8.0", + "@chakra-ui/theme-tools": "^2.1.0", "@chakra-ui/utils": "^2.0.14", + "@egoist/tailwindcss-icons": "^1.1.0", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", + "@iconify-json/ri": "^1.1.12", "@next-auth/prisma-adapter": "^1.0.7", + "@nextui-org/react": "^2.1.5", + "@nextui-org/theme": "^2.1.2", "@ohbug/extension-feedback": "^0.7.2", "@ohbug/extension-rrweb": "^1.10.1", "@ohbug/extension-uuid": "^2.1.1", "@ohbug/extension-view": "^0.1.1", "@ohbug/extension-web-vitals": "^0.2.1", - "@types/node": "^20.4.1", + "@radix-ui/react-dropdown-menu": "^2.0.5", + "@radix-ui/react-slot": "^1.0.2", + "@tanstack/react-table": "^8.9.3", + "@types/node": "^20.5.4", "@types/nprogress": "^0.2.0", - "@types/react": "^18.2.14", - "@types/react-dom": "^18.2.6", + "@types/react": "^18.2.21", + "@types/react-dom": "^18.2.7", "@types/ua-parser-js": "^0.7.36", - "autoprefixer": "^10.4.14", - "clsx": "^1.2.1", + "autoprefixer": "^10.4.15", + "class-variance-authority": "^0.7.0", + "clsx": "^2.0.0", "common": "workspace:*", "config": "workspace:*", - "copy-to-clipboard": "^3.3.3", - "downshift": "^7.6.0", - "framer-motion": "^10.12.18", + "downshift": "^8.1.0", + "framer-motion": "^10.16.1", "highcharts": "^11.1.0", "highcharts-react-official": "^3.2.0", - "jotai": "^2.2.2", - "next": "^13.4.9", - "next-auth": "^4.22.1", - "next-intl": "^2.17.5", + "jotai": "^2.4.0", + "lucide-react": "^0.268.0", + "next": "^13.4.19", + "next-auth": "^4.23.1", + "next-intl": "^2.20.0", + "next-themes": "^0.2.1", "nprogress": "^0.2.0", - "postcss": "^8.4.25", + "postcss": "^8.4.28", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-hook-form": "^7.45.1", + "react-hook-form": "^7.45.4", "react-icons": "^4.10.1", "react-json-view": "^1.21.3", "react-use": "^17.4.0", "rrweb": "^2.0.0-alpha.4", "rrweb-player": "^1.0.0-alpha.4", "source-map-trace": "^0.2.6", + "tailwind-merge": "^1.14.0", + "tailwindcss-animate": "^1.0.6", "ua-parser-js": "^1.0.35", "web-vitals": "^3.4.0", - "zustand": "^4.3.9" + "zustand": "^4.4.1" + }, + "devDependencies": { + "tailwindcss": "^3.3.3" } } diff --git a/packages/web/postcss.config.js b/packages/web/postcss.config.js index bf7d3b6..2959567 100644 --- a/packages/web/postcss.config.js +++ b/packages/web/postcss.config.js @@ -1 +1 @@ -module.exports = { plugins: { autoprefixer: {} } } +module.exports = { plugins: { tailwindcss: {}, autoprefixer: {} } } diff --git a/packages/web/styles/globals.css b/packages/web/styles/globals.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/packages/web/styles/globals.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/packages/web/styles/theme.ts b/packages/web/styles/theme.ts index 98ac046..e5271a8 100644 --- a/packages/web/styles/theme.ts +++ b/packages/web/styles/theme.ts @@ -1,7 +1,7 @@ -import type { Dict } from '@chakra-ui/utils' import { extendTheme } from '@chakra-ui/react' -import type { GlobalStyleProps } from '@chakra-ui/theme-tools' import { mode } from '@chakra-ui/theme-tools' +import { type Dict } from '@chakra-ui/utils' +import { type GlobalStyleProps } from '@chakra-ui/theme-tools' import { colors } from './colors' const theme: Dict = extendTheme({ @@ -101,15 +101,6 @@ const theme: Dict = extendTheme({ Checkbox: { baseStyle: (props: GlobalStyleProps) => ({ control: { borderColor: mode('gray.200', 'dark.50')(props) } }) }, Table: { baseStyle: { table: { mx: '-4' } } }, }, - styles: { - global: (props: GlobalStyleProps) => ({ - 'html, body, #__next': { width: '100%', minHeight: '100vh' }, - 'body': { - bg: mode('white', 'dark.800')(props), - overflowX: 'hidden', - }, - }), - }, config: { useSystemColorMode: true }, }) diff --git a/packages/web/tailwind.config.js b/packages/web/tailwind.config.js new file mode 100644 index 0000000..cdfb0db --- /dev/null +++ b/packages/web/tailwind.config.js @@ -0,0 +1,76 @@ +const { iconsPlugin, getIconCollections } = require('@egoist/tailwindcss-icons') + +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: ['class'], + content: [ + './pages/**/*.{ts,tsx}', + './components/**/*.{ts,tsx}', + './app/**/*.{ts,tsx}', + './src/**/*.{ts,tsx}', + ], + theme: { + container: { + center: true, + padding: '2rem', + screens: { '2xl': '1400px' }, + }, + extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + keyframes: { + 'accordion-down': { + from: { height: 0 }, + to: { height: 'var(--radix-accordion-content-height)' }, + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: 0 }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, + }, + }, + plugins: [require('tailwindcss-animate'), iconsPlugin({ collections: getIconCollections(['ri']) })], +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3037e25..e8083bd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,6 @@ importers: .: dependencies: - '@chenyueban/tsconfig': - specifier: ^2.1.0 - version: 2.1.0(typescript@5.1.6) '@ohbug/browser': specifier: ^2.5.1 version: 2.5.1 @@ -27,20 +24,8 @@ importers: specifier: ^2.0.10 version: 2.0.10(vue@3.3.4) '@prisma/client': - specifier: ^5.0.0 - version: 5.0.0(prisma@5.0.0) - '@types/js-yaml': - specifier: ^4.0.5 - version: 4.0.5 - '@types/node': - specifier: ^20.4.1 - version: 20.4.1 - '@types/ramda': - specifier: ^0.29.3 - version: 0.29.3 - cross-env: - specifier: ^7.0.3 - version: 7.0.3 + specifier: ^5.2.0 + version: 5.2.0(prisma@5.2.0) dayjs: specifier: ^1.11.9 version: 1.11.9 @@ -48,72 +33,87 @@ importers: specifier: ^4.1.0 version: 4.1.0 nodemailer: - specifier: ^6.9.3 - version: 6.9.3 - prisma: - specifier: ^5.0.0 - version: 5.0.0 + specifier: ^6.9.4 + version: 6.9.4 ramda: specifier: ^0.29.0 version: 0.29.0 - rimraf: - specifier: ^5.0.1 - version: 5.0.1 source-map-trace: specifier: ^0.2.6 version: 0.2.6 - tsup: - specifier: ^7.1.0 - version: 7.1.0(@swc/core@1.3.68)(ts-node@10.9.1)(typescript@5.1.6) - tsx: - specifier: ^3.12.7 - version: 3.12.7 - typescript: - specifier: ^5.1.6 - version: 5.1.6 devDependencies: '@antfu/ni': - specifier: ^0.21.4 - version: 0.21.4 + specifier: ^0.21.6 + version: 0.21.6 '@babel/types': - specifier: ^7.22.5 - version: 7.22.5 + specifier: ^7.22.10 + version: 7.22.10 '@chenyueban/eslint-config': - specifier: ^1.1.0 - version: 1.1.0(eslint@8.44.0)(typescript@5.1.6) + specifier: ^3.0.5 + version: 3.0.5(eslint@8.47.0)(typescript@5.1.6) + '@chenyueban/tsconfig': + specifier: ^3.0.5 + version: 3.0.5(typescript@5.1.6) '@commitlint/cli': - specifier: ^17.6.6 - version: 17.6.6(@swc/core@1.3.68) + specifier: ^17.7.1 + version: 17.7.1(@swc/core@1.3.78) '@release-it/conventional-changelog': specifier: ^7.0.0 - version: 7.0.0(release-it@16.1.0) + version: 7.0.0(release-it@16.1.5) '@swc/cli': specifier: ^0.1.62 - version: 0.1.62(@swc/core@1.3.68) + version: 0.1.62(@swc/core@1.3.78) '@swc/core': - specifier: ^1.3.68 - version: 1.3.68 + specifier: ^1.3.78 + version: 1.3.78 + '@types/js-yaml': + specifier: ^4.0.5 + version: 4.0.5 + '@types/node': + specifier: ^20.5.4 + version: 20.5.4 + '@types/ramda': + specifier: ^0.29.3 + version: 0.29.3 commitizen: specifier: ^4.3.0 - version: 4.3.0(@swc/core@1.3.68) + version: 4.3.0(@swc/core@1.3.78) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 cz-conventional-changelog: specifier: ^3.3.0 - version: 3.3.0(@swc/core@1.3.68) + version: 3.3.0(@swc/core@1.3.78) eslint: - specifier: ^8.44.0 - version: 8.44.0 + specifier: ^8.47.0 + version: 8.47.0 husky: specifier: ^8.0.3 version: 8.0.3 lint-staged: - specifier: ^13.2.3 - version: 13.2.3 + specifier: ^14.0.1 + version: 14.0.1 + prisma: + specifier: ^5.2.0 + version: 5.2.0 release-it: - specifier: ^16.1.0 - version: 16.1.0 + specifier: ^16.1.5 + version: 16.1.5 + rimraf: + specifier: ^5.0.1 + version: 5.0.1 taze: specifier: ^0.11.2 version: 0.11.2 + tsup: + specifier: ^7.2.0 + version: 7.2.0(@swc/core@1.3.78)(ts-node@10.9.1)(typescript@5.1.6) + tsx: + specifier: ^3.12.7 + version: 3.12.7 + typescript: + specifier: ^5.1.6 + version: 5.1.6 packages/common: dependencies: @@ -131,55 +131,55 @@ importers: dependencies: '@nestjs/axios': specifier: ^3.0.0 - version: 3.0.0(@nestjs/common@10.0.5)(axios@1.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + version: 3.0.0(@nestjs/common@10.2.1)(axios@1.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/bull': specifier: ^10.0.1 - version: 10.0.1(@nestjs/common@10.0.5)(@nestjs/core@10.0.5)(bull@4.10.4) + version: 10.0.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(bull@4.11.3) '@nestjs/cli': - specifier: ^10.1.8 - version: 10.1.8(@swc/cli@0.1.62)(@swc/core@1.3.68)(esbuild@0.18.10) + specifier: ^10.1.14 + version: 10.1.14(@swc/cli@0.1.62)(@swc/core@1.3.78)(esbuild@0.18.19) '@nestjs/common': - specifier: ^10.0.5 - version: 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.2.1 + version: 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': - specifier: ^10.0.5 - version: 10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.2.1 + version: 10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/mapped-types': specifier: ^2.0.2 - version: 2.0.2(@nestjs/common@10.0.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + version: 2.0.2(@nestjs/common@10.2.1)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) '@nestjs/platform-fastify': - specifier: ^10.0.5 - version: 10.0.5(@nestjs/common@10.0.5)(@nestjs/core@10.0.5) + specifier: ^10.2.1 + version: 10.2.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1) '@nestjs/schedule': - specifier: ^3.0.1 - version: 3.0.1(@nestjs/common@10.0.5)(@nestjs/core@10.0.5)(reflect-metadata@0.1.13) + specifier: ^3.0.3 + version: 3.0.3(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(reflect-metadata@0.1.13) '@nestjs/schematics': - specifier: ^10.0.1 - version: 10.0.1(chokidar@3.5.3)(typescript@5.1.6) + specifier: ^10.0.2 + version: 10.0.2(chokidar@3.5.3)(typescript@5.1.6) '@nestjs/swagger': - specifier: ^7.1.1 - version: 7.1.1(@nestjs/common@10.0.5)(@nestjs/core@10.0.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + specifier: ^7.1.8 + version: 7.1.8(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) '@types/bull': specifier: ^4.10.0 version: 4.10.0 '@types/cron': - specifier: ^2.0.1 - version: 2.0.1 + specifier: ^2.4.0 + version: 2.4.0 '@types/express': specifier: ^4.17.17 version: 4.17.17 '@types/markdown-it': - specifier: ^12.2.3 - version: 12.2.3 + specifier: ^13.0.0 + version: 13.0.0 '@types/nodemailer': - specifier: ^6.4.8 - version: 6.4.8 + specifier: ^6.4.9 + version: 6.4.9 '@webundsoehne/nest-fastify-file-upload': specifier: ^2.1.0 - version: 2.1.0(@nestjs/common@10.0.5)(@nestjs/core@10.0.5)(@nestjs/platform-fastify@10.0.5) + version: 2.1.0(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(@nestjs/platform-fastify@10.2.1) bull: - specifier: ^4.10.4 - version: 4.10.4 + specifier: ^4.11.3 + version: 4.11.3 class-transformer: specifier: ^0.5.1 version: 0.5.1 @@ -205,17 +205,17 @@ importers: specifier: 3.3.6 version: 3.3.6 nestjs-pino: - specifier: ^3.3.0 - version: 3.3.0(@nestjs/common@10.0.5)(pino-http@8.3.3) + specifier: ^3.4.0 + version: 3.4.0(@nestjs/common@10.2.1)(pino-http@8.4.0) pino: - specifier: ^8.14.1 - version: 8.14.1 + specifier: ^8.15.0 + version: 8.15.0 pino-http: - specifier: ^8.3.3 - version: 8.3.3 + specifier: ^8.4.0 + version: 8.4.0 pino-pretty: - specifier: ^10.0.1 - version: 10.0.1 + specifier: ^10.2.0 + version: 10.2.0 reflect-metadata: specifier: ^0.1.13 version: 0.1.13 @@ -228,34 +228,46 @@ importers: version: 0.5.21 ts-loader: specifier: ^9.4.4 - version: 9.4.4(typescript@5.1.6)(webpack@5.88.1) + version: 9.4.4(typescript@5.1.6)(webpack@5.88.2) ts-node: specifier: ^10.9.1 - version: 10.9.1(@swc/core@1.3.68)(@types/node@20.4.1)(typescript@5.1.6) + version: 10.9.1(@swc/core@1.3.78)(@types/node@20.5.4)(typescript@5.1.6) packages/web: dependencies: '@chakra-ui/next-js': specifier: ^2.1.4 - version: 2.1.4(@chakra-ui/react@2.7.1)(@emotion/react@11.11.1)(next@13.4.9)(react@18.2.0) + version: 2.1.4(@chakra-ui/react@2.8.0)(@emotion/react@11.11.1)(next@13.4.19)(react@18.2.0) '@chakra-ui/react': - specifier: ^2.7.1 - version: 2.7.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.14)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0) + specifier: ^2.8.0 + version: 2.8.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0) '@chakra-ui/theme-tools': - specifier: ^2.0.18 - version: 2.0.18(@chakra-ui/styled-system@2.9.1) + specifier: ^2.1.0 + version: 2.1.0(@chakra-ui/styled-system@2.9.1) '@chakra-ui/utils': specifier: ^2.0.14 version: 2.0.14 + '@egoist/tailwindcss-icons': + specifier: ^1.1.0 + version: 1.1.0(tailwindcss@3.3.3) '@emotion/react': specifier: ^11.11.1 - version: 11.11.1(@types/react@18.2.14)(react@18.2.0) + version: 11.11.1(@types/react@18.2.21)(react@18.2.0) '@emotion/styled': specifier: ^11.11.0 - version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.14)(react@18.2.0) + version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.21)(react@18.2.0) + '@iconify-json/ri': + specifier: ^1.1.12 + version: 1.1.12 '@next-auth/prisma-adapter': specifier: ^1.0.7 - version: 1.0.7(@prisma/client@5.0.0)(next-auth@4.22.1) + version: 1.0.7(@prisma/client@5.2.0)(next-auth@4.23.1) + '@nextui-org/react': + specifier: ^2.1.5 + version: 2.1.5(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': + specifier: ^2.1.2 + version: 2.1.2(tailwindcss@3.3.3) '@ohbug/extension-feedback': specifier: ^0.7.2 version: 0.7.2 @@ -271,42 +283,51 @@ importers: '@ohbug/extension-web-vitals': specifier: ^0.2.1 version: 0.2.1(web-vitals@3.4.0) + '@radix-ui/react-dropdown-menu': + specifier: ^2.0.5 + version: 2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': + specifier: ^1.0.2 + version: 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@tanstack/react-table': + specifier: ^8.9.3 + version: 8.9.3(react-dom@18.2.0)(react@18.2.0) '@types/node': - specifier: ^20.4.1 - version: 20.4.1 + specifier: ^20.5.4 + version: 20.5.4 '@types/nprogress': specifier: ^0.2.0 version: 0.2.0 '@types/react': - specifier: ^18.2.14 - version: 18.2.14 + specifier: ^18.2.21 + version: 18.2.21 '@types/react-dom': - specifier: ^18.2.6 - version: 18.2.6 + specifier: ^18.2.7 + version: 18.2.7 '@types/ua-parser-js': specifier: ^0.7.36 version: 0.7.36 autoprefixer: - specifier: ^10.4.14 - version: 10.4.14(postcss@8.4.25) + specifier: ^10.4.15 + version: 10.4.15(postcss@8.4.28) + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.0 clsx: - specifier: ^1.2.1 - version: 1.2.1 + specifier: ^2.0.0 + version: 2.0.0 common: specifier: workspace:* version: link:../common config: specifier: workspace:* version: link:../config - copy-to-clipboard: - specifier: ^3.3.3 - version: 3.3.3 downshift: - specifier: ^7.6.0 - version: 7.6.0(react@18.2.0) + specifier: ^8.1.0 + version: 8.1.0(react@18.2.0) framer-motion: - specifier: ^10.12.18 - version: 10.12.18(react-dom@18.2.0)(react@18.2.0) + specifier: ^10.16.1 + version: 10.16.1(react-dom@18.2.0)(react@18.2.0) highcharts: specifier: ^11.1.0 version: 11.1.0 @@ -314,23 +335,29 @@ importers: specifier: ^3.2.0 version: 3.2.0(highcharts@11.1.0)(react@18.2.0) jotai: - specifier: ^2.2.2 - version: 2.2.2(react@18.2.0) + specifier: ^2.4.0 + version: 2.4.0(@types/react@18.2.21)(react@18.2.0) + lucide-react: + specifier: ^0.268.0 + version: 0.268.0(react@18.2.0) next: - specifier: ^13.4.9 - version: 13.4.9(react-dom@18.2.0)(react@18.2.0) + specifier: ^13.4.19 + version: 13.4.19(react-dom@18.2.0)(react@18.2.0) next-auth: - specifier: ^4.22.1 - version: 4.22.1(next@13.4.9)(nodemailer@6.9.3)(react-dom@18.2.0)(react@18.2.0) + specifier: ^4.23.1 + version: 4.23.1(next@13.4.19)(nodemailer@6.9.4)(react-dom@18.2.0)(react@18.2.0) next-intl: - specifier: ^2.17.5 - version: 2.17.5(next@13.4.9)(react@18.2.0) + specifier: ^2.20.0 + version: 2.20.0(next@13.4.19)(react@18.2.0) + next-themes: + specifier: ^0.2.1 + version: 0.2.1(next@13.4.19)(react-dom@18.2.0)(react@18.2.0) nprogress: specifier: ^0.2.0 version: 0.2.0 postcss: - specifier: ^8.4.25 - version: 8.4.25 + specifier: ^8.4.28 + version: 8.4.28 react: specifier: ^18.2.0 version: 18.2.0 @@ -338,14 +365,14 @@ importers: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) react-hook-form: - specifier: ^7.45.1 - version: 7.45.1(react@18.2.0) + specifier: ^7.45.4 + version: 7.45.4(react@18.2.0) react-icons: specifier: ^4.10.1 version: 4.10.1(react@18.2.0) react-json-view: specifier: ^1.21.3 - version: 1.21.3(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0) + version: 1.21.3(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) react-use: specifier: ^17.4.0 version: 17.4.0(react-dom@18.2.0)(react@18.2.0) @@ -358,6 +385,12 @@ importers: source-map-trace: specifier: ^0.2.6 version: 0.2.6 + tailwind-merge: + specifier: ^1.14.0 + version: 1.14.0 + tailwindcss-animate: + specifier: ^1.0.6 + version: 1.0.6(tailwindcss@3.3.3) ua-parser-js: specifier: ^1.0.35 version: 1.0.35 @@ -365,8 +398,12 @@ importers: specifier: ^3.4.0 version: 3.4.0 zustand: - specifier: ^4.3.9 - version: 4.3.9(react@18.2.0) + specifier: ^4.4.1 + version: 4.4.1(@types/react@18.2.21)(react@18.2.0) + devDependencies: + tailwindcss: + specifier: ^3.3.3 + version: 3.3.3(ts-node@10.9.1) packages: @@ -375,8 +412,12 @@ packages: engines: {node: '>=0.10.0'} dev: true - /@angular-devkit/core@16.1.0(chokidar@3.5.3): - resolution: {integrity: sha512-mrWpuDvttmhrCGcLc68RIXKtTzUhkBTsE5ZZFZNO1+FSC+vO/ZpyCpPd6C+6coM68NfXYjHlms5XF6KbxeGn/Q==} + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + /@angular-devkit/core@16.1.8(chokidar@3.5.3): + resolution: {integrity: sha512-dSRD/+bGanArIXkj+kaU1kDFleZeQMzmBiOXX+pK0Ah9/0Yn1VmY3RZh1zcX9vgIQXV+t7UPrTpOjaERMUtVGw==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^3.5.2 @@ -392,8 +433,8 @@ packages: source-map: 0.7.4 dev: false - /@angular-devkit/core@16.1.3(chokidar@3.5.3): - resolution: {integrity: sha512-cFhNdJHumNMZGD3NYxOtNuMGRQXeDnKbwvK+IJmKAttXt8na6EvURR/ZxZOI7rl/YRVX+vcNSdtXz3hE6g+Isw==} + /@angular-devkit/core@16.2.0(chokidar@3.5.3): + resolution: {integrity: sha512-l1k6Rqm3YM16BEn3CWyQKrk9xfu+2ux7Bw3oS+h1TO4/RoxO2PgHj8LLRh/WNrYVarhaqO7QZ5ePBkXNMkzJ1g==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^3.5.2 @@ -409,13 +450,13 @@ packages: source-map: 0.7.4 dev: false - /@angular-devkit/schematics-cli@16.1.3(chokidar@3.5.3): - resolution: {integrity: sha512-uZAi5xrvZLgQkqVsR0wxbUZgiMHVNstOnNm446Bs69iadbLymvWvdg95hYPL3IWAlYrNiwwGNSjyp6JS0Qn06Q==} + /@angular-devkit/schematics-cli@16.2.0(chokidar@3.5.3): + resolution: {integrity: sha512-f3HjrDvSrRMvESogLsqsZXsEg//trIBySCHRXCglPrWLVdBbIRctGOhXqZoclRxXimIKUx14zLsOWzDwZG8+HQ==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true dependencies: - '@angular-devkit/core': 16.1.3(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.3(chokidar@3.5.3) + '@angular-devkit/core': 16.2.0(chokidar@3.5.3) + '@angular-devkit/schematics': 16.2.0(chokidar@3.5.3) ansi-colors: 4.1.3 inquirer: 8.2.4 symbol-observable: 4.0.0 @@ -424,11 +465,11 @@ packages: - chokidar dev: false - /@angular-devkit/schematics@16.1.0(chokidar@3.5.3): - resolution: {integrity: sha512-LM35PH9DT3eQRSZgrkk2bx1ZQjjVh8BCByTlr37/c+FnF9mNbeBsa1YkxrlsN/CwO+045OwEwRHnkM9Zcx0U/A==} + /@angular-devkit/schematics@16.1.8(chokidar@3.5.3): + resolution: {integrity: sha512-6LyzMdFJs337RTxxkI2U1Ndw0CW5mMX/aXWl8d7cW2odiSrAg8IdlMqpc+AM8+CPfsB0FtS1aWkEZqJLT0jHOg==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) + '@angular-devkit/core': 16.1.8(chokidar@3.5.3) jsonc-parser: 3.2.0 magic-string: 0.30.0 ora: 5.4.1 @@ -437,27 +478,33 @@ packages: - chokidar dev: false - /@angular-devkit/schematics@16.1.3(chokidar@3.5.3): - resolution: {integrity: sha512-hWEuQnfQOgcSs4YX6iF4QR/34ROeSPaMi7lQOYg33hStg+pnk/JDdIU0f2nrIIz3t0jqAj+5VXVLBJvOCd84vg==} + /@angular-devkit/schematics@16.2.0(chokidar@3.5.3): + resolution: {integrity: sha512-QMDJXPE0+YQJ9Ap3MMzb0v7rx6ZbBEokmHgpdIjN3eILYmbAdsSGE8HTV8NjS9nKmcyE9OGzFCMb7PFrDTlTAw==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: - '@angular-devkit/core': 16.1.3(chokidar@3.5.3) + '@angular-devkit/core': 16.2.0(chokidar@3.5.3) jsonc-parser: 3.2.0 - magic-string: 0.30.0 + magic-string: 0.30.1 ora: 5.4.1 rxjs: 7.8.1 transitivePeerDependencies: - chokidar dev: false - /@antfu/ni@0.21.4: - resolution: {integrity: sha512-O0Uv9LbLDSoEg26fnMDdDRiPwFJnQSoD4WnrflDwKCJm8Cx/0mV4cGxwBLXan5mGIrpK4Dd7vizf4rQm0QCEAA==} + /@antfu/install-pkg@0.1.1: + resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} + dependencies: + execa: 5.1.1 + find-up: 5.0.0 + dev: false + + /@antfu/ni@0.21.6: + resolution: {integrity: sha512-Hj0BKIOspbo+OsPT5mjONeqpuVb4bxp9jdJ4p/b5GxgYNIqJjBcJdp0DEON7CJflKoWuHf7I52wO5kOJJ4DveQ==} hasBin: true dev: true - /@antfu/utils@0.7.4: - resolution: {integrity: sha512-qe8Nmh9rYI/HIspLSTwtbMFPj6dISG6+dJnOguTlPNXtCvS2uezdxscVBb7/3DrmNbQK49TDqpkSQ1chbRGdpQ==} - dev: true + /@antfu/utils@0.7.5: + resolution: {integrity: sha512-dlR6LdS+0SzOAPx/TPRhnoi7hE251OVeT2Snw0RguNbBSbjUHdWr0l3vcUUDg26rEysT89kCbtw1lVorBXLLCg==} /@babel/code-frame@7.22.5: resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} @@ -469,7 +516,7 @@ packages: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.22.10 dev: false /@babel/helper-string-parser@7.22.5: @@ -488,97 +535,90 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.22.5: - resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} + /@babel/parser@7.22.7: + resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.5 - dev: false - - /@babel/runtime@7.20.0: - resolution: {integrity: sha512-NDYdls71fTXoU8TZHfbBWg7DiZfNzClcKui/+kyi6ppD2L1qnWW3VV6CjtaBXSUGGhiTWJ6ereOIkUvenif66Q==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.10 + '@babel/types': 7.22.10 dev: false - /@babel/runtime@7.22.5: - resolution: {integrity: sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==} + /@babel/runtime@7.22.6: + resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: false - /@babel/types@7.22.5: - resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} + /@babel/types@7.22.10: + resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 - /@chakra-ui/accordion@2.2.0(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0): - resolution: {integrity: sha512-2IK1iLzTZ22u8GKPPPn65mqJdZidn4AvkgAbv17ISdKA07VHJ8jSd4QF1T5iCXjKfZ0XaXozmhP4kDhjwF2IbQ==} + /@chakra-ui/accordion@2.3.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0): + resolution: {integrity: sha512-A4TkRw3Jnt+Fam6dSSJ62rskdrvjF3JGctYcfXlojfFIpHPuIw4pDwfZgNAxlaxWkcj0e7JJKlQ88dnZW+QfFg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' react: '>=18' dependencies: - '@chakra-ui/descendant': 3.0.14(react@18.2.0) - '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/descendant': 3.1.0(react@18.2.0) + '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/transition': 2.0.16(framer-motion@10.12.18)(react@18.2.0) - framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/transition': 2.1.0(framer-motion@10.16.1)(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/alert@2.1.0(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-OcfHwoXI5VrmM+tHJTHT62Bx6TfyfCxSa0PWUOueJzSyhlUOKBND5we6UtrOB7D0jwX45qKKEDJOLG5yCG21jQ==} + /@chakra-ui/alert@2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-De+BT88iYOu3Con7MxQeICb1SwgAdVdgpHIYjTh3qvGlNXAQjs81rhG0fONXvwW1FIYletvr9DY2Tlg8xJe7tQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/spinner': 2.0.13(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/anatomy@2.1.2: - resolution: {integrity: sha512-pKfOS/mztc4sUXHNc8ypJ1gPWSolWT770jrgVRfolVbYlki8y5Y+As996zMF6k5lewTu6j9DQequ7Cc9a69IVQ==} + /@chakra-ui/anatomy@2.2.0: + resolution: {integrity: sha512-cD8Ms5C8+dFda0LrORMdxiFhAZwOIY1BSlCadz6/mHUIgNdQy13AHPrXiq6qWdMslqVHq10k5zH7xMPLt6kjFg==} dev: false - /@chakra-ui/avatar@2.2.11(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-CJFkoWvlCTDJTUBrKA/aVyG5Zz6TBEIVmmsJtqC6VcQuVDTxkWod8ruXnjb0LT2DUveL7xR5qZM9a5IXcsH3zg==} + /@chakra-ui/avatar@2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-8gKSyLfygnaotbJbDMHDiJoF38OHXUYVme4gGxZ1fLnQEdPVEaIWfH+NndIjOM0z8S+YEFnT9KyGMUtvPrBk3g==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/image': 2.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/image': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/breadcrumb@2.1.5(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-p3eQQrHQBkRB69xOmNyBJqEdfCrMt+e0eOH+Pm/DjFWfIVIbnIaFbmDCeWClqlLa21Ypc6h1hR9jEmvg8kmOog==} + /@chakra-ui/breadcrumb@2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-4cWCG24flYBxjruRi4RJREWTGF74L/KzI2CognAW/d/zWR0CjiScuJhf37Am3LFbCySP6WSoyBOtTIoTA4yLEA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -588,120 +628,120 @@ packages: '@chakra-ui/shared-utils': 2.0.5 dev: false - /@chakra-ui/button@2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-E3c99+lOm6ou4nQVOTLkG+IdOPMjsQK+Qe7VyP8A/xeAMFONuibrWPRPpprr4ZkB4kEoLMfNuyH2+aEza3ScUA==} + /@chakra-ui/button@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-95CplwlRKmmUXkdEp/21VkEWgnwcx2TOBG6NfYlsuLBDHSLlo5FKIiE2oSi4zXc4TLcopGcWPNcm/NDaSC5pvA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/react-context': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/spinner': 2.0.13(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/card@2.1.6(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-fFd/WAdRNVY/WOSQv4skpy0WeVhhI0f7dTY1Sm0jVl0KLmuP/GnpsWtKtqWjNcV00K963EXDyhlk6+9oxbP4gw==} + /@chakra-ui/card@2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-xUB/k5MURj4CtPAhdSoXZidUbm8j3hci9vnc+eZJVDqhDOShNlD6QeniQNRPRys4lWAQLCbFcrwL29C8naDi6g==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/checkbox@2.2.15(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-Ju2yQjX8azgFa5f6VLPuwdGYobZ+rdbcYqjiks848JvPc75UsPhpS05cb4XlrKT7M16I8txDA5rPJdqqFicHCA==} + /@chakra-ui/checkbox@2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-fX7M5sQK27aFWoj7vqnPkf1Q3AHmML/5dIRYfm7HEIsZXYH2C1CkM6+dijeSWIk6a0mp0r3el6SNDUti2ehH8g==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/form-control': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/form-control': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) - '@chakra-ui/react-use-update-effect': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/visually-hidden': 2.0.15(@chakra-ui/system@2.5.8)(react@18.2.0) - '@zag-js/focus-visible': 0.2.2 + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/visually-hidden': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@zag-js/focus-visible': 0.10.5 react: 18.2.0 dev: false - /@chakra-ui/clickable@2.0.14(react@18.2.0): - resolution: {integrity: sha512-jfsM1qaD74ZykLHmvmsKRhDyokLUxEfL8Il1VoZMNX5RBI0xW/56vKpLTFF/v/+vLPLS+Te2cZdD4+2O+G6ulA==} + /@chakra-ui/clickable@2.1.0(react@18.2.0): + resolution: {integrity: sha512-flRA/ClPUGPYabu+/GLREZVZr9j2uyyazCAUHAdrTUEdDYCr31SVGhgh7dgKdtq23bOvAQJpIJjw/0Bs0WvbXw==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 react: 18.2.0 dev: false - /@chakra-ui/close-button@2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-05YPXk456t1Xa3KpqTrvm+7smx+95dmaPiwjiBN3p7LHUQVHJd8ZXSDB0V+WKi419k3cVQeJUdU/azDO2f40sw==} + /@chakra-ui/close-button@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-KfJcz6UAaR2dDWSIv6UrCGkZQS54Fjl+DEEVOUTJ7gf4KOP4FQZCkv8hqsAB9FeCtnwU43adq2oaw3aZH/Uzew==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/color-mode@2.1.12(react@18.2.0): - resolution: {integrity: sha512-sYyfJGDoJSLYO+V2hxV9r033qhte5Nw/wAn5yRGGZnEEN1dKPEdWQ3XZvglWSDTNd0w9zkoH2w6vP4FBBYb/iw==} + /@chakra-ui/color-mode@2.2.0(react@18.2.0): + resolution: {integrity: sha512-niTEA8PALtMWRI9wJ4LL0CSBDo8NBfLNp4GD6/0hstcm3IlbBHTVKxN6HwSaoNYfphDQLxCjT4yG+0BJA5tFpg==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/control-box@2.0.13(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-FEyrU4crxati80KUF/+1Z1CU3eZK6Sa0Yv7Z/ydtz9/tvGblXW9NFanoomXAOvcIFLbaLQPPATm9Gmpr7VG05A==} + /@chakra-ui/control-box@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-gVrRDyXFdMd8E7rulL0SKeoljkLQiPITFnsyMO8EFHNZ+AHt5wK4LIguYVEq88APqAGZGfHFWXr79RYrNiE3Mg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/counter@2.0.14(react@18.2.0): - resolution: {integrity: sha512-KxcSRfUbb94dP77xTip2myoE7P2HQQN4V5fRJmNAGbzcyLciJ+aDylUU/UxgNcEjawUp6Q242NbWb1TSbKoqog==} + /@chakra-ui/counter@2.1.0(react@18.2.0): + resolution: {integrity: sha512-s6hZAEcWT5zzjNz2JIWUBzRubo9la/oof1W7EKZVVfPYHERnl5e16FmBC79Yfq8p09LQ+aqFKm/etYoJMMgghw==} peerDependencies: react: '>=18' dependencies: '@chakra-ui/number-utils': 2.0.7 - '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 react: 18.2.0 dev: false - /@chakra-ui/css-reset@2.1.2(@emotion/react@11.11.1)(react@18.2.0): - resolution: {integrity: sha512-4ySTLd+3iRpp4lX0yI9Yo2uQm2f+qwYGNOZF0cNcfN+4UJCd3IsaWxYRR/Anz+M51NVldZbYzC+TEYC/kpJc4A==} + /@chakra-ui/css-reset@2.2.0(@emotion/react@11.11.1)(react@18.2.0): + resolution: {integrity: sha512-nn7hjquIrPwCzwI4d/Y4wzM5A5xAeswREOfT8gT0Yd+U+Qnw3pPT8NPLbNJ3DvuOfJaCV6/N5ld/6RRTgYF/sQ==} peerDependencies: '@emotion/react': '>=10.0.35' react: '>=18' dependencies: - '@emotion/react': 11.11.1(@types/react@18.2.14)(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.2.21)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/descendant@3.0.14(react@18.2.0): - resolution: {integrity: sha512-+Ahvp9H4HMpfScIv9w1vaecGz7qWAaK1YFHHolz/SIsGLaLGlbdp+5UNabQC7L6TUnzzJDQDxzwif78rTD7ang==} + /@chakra-ui/descendant@3.1.0(react@18.2.0): + resolution: {integrity: sha512-VxCIAir08g5w27klLyi7PVo8BxhW4tgU/lxQyujkmi4zx7hT9ZdrcQLAted/dAa+aSIZ14S1oV0Q9lGjsAdxUQ==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-context': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) react: 18.2.0 dev: false @@ -709,22 +749,22 @@ packages: resolution: {integrity: sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ==} dev: false - /@chakra-ui/editable@3.0.0(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-q/7C/TM3iLaoQKlEiM8AY565i9NoaXtS6N6N4HWIEL5mZJPbMeHKxrCHUZlHxYuQJqFOGc09ZPD9fAFx1GkYwQ==} + /@chakra-ui/editable@3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-j2JLrUL9wgg4YA6jLlbU88370eCRyor7DZQD9lzpY95tSOXpTljeg3uF9eOmDnCs6fxp3zDWIfkgMm/ExhcGTg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-focus-on-pointer-down': 2.0.6(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) - '@chakra-ui/react-use-update-effect': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-focus-on-pointer-down': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -732,30 +772,30 @@ packages: resolution: {integrity: sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw==} dev: false - /@chakra-ui/focus-lock@2.0.17(@types/react@18.2.14)(react@18.2.0): - resolution: {integrity: sha512-V+m4Ml9E8QY66DUpHX/imInVvz5XJ5zx59Tl0aNancXgeVY1Rt/ZdxuZdPLCAmPC/MF3GUOgnEA+WU8i+VL6Gw==} + /@chakra-ui/focus-lock@2.1.0(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-EmGx4PhWGjm4dpjRqM4Aa+rCWBxP+Rq8Uc/nAVnD4YVqkEhBkrPTpui2lnjsuxqNaZ24fIAZ10cF1hlpemte/w==} peerDependencies: react: '>=18' dependencies: '@chakra-ui/dom-utils': 2.1.0 react: 18.2.0 - react-focus-lock: 2.9.4(@types/react@18.2.14)(react@18.2.0) + react-focus-lock: 2.9.5(@types/react@18.2.21)(react@18.2.0) transitivePeerDependencies: - '@types/react' dev: false - /@chakra-ui/form-control@2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-I0a0jG01IAtRPccOXSNugyRdUAe8Dy40ctqedZvznMweOXzbMCF1m+sHPLdWeWC/VI13VoAispdPY0/zHOdjsQ==} + /@chakra-ui/form-control@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-3QmWG9v6Rx+JOwJP3Wt89+AWZxK0F1NkVAgXP3WVfE9VDXOKFRV/faLT0GEe2V+l7WZHF5PLdEBvKG8Cgw2mkA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -771,57 +811,57 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/icon@3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-RpA1X5Ptz8Mt39HSyEIW1wxAz2AXyf9H0JJ5HVx/dBdMZaGMDJ0HyyPBVci0m4RCoJuyG1HHG/DXJaVfUTVAeg==} + /@chakra-ui/icon@3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-t6v0lGCXRbwUJycN8A/nDTuLktMP+LRjKbYJnd2oL6Pm2vOl99XwEQ5cAEyEa4XoseYNEgXiLR+2TfvgfNFvcw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/image@2.0.16(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-iFypk1slgP3OK7VIPOtkB0UuiqVxNalgA59yoRM43xLIeZAEZpKngUVno4A2kFS61yKN0eIY4hXD3Xjm+25EJA==} + /@chakra-ui/image@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-bskumBYKLiLMySIWDGcz0+D9Th0jPvmX6xnRMs4o92tT3Od/bW26lahmV2a2Op2ItXeCmRMY+XxJH5Gy1i46VA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/input@2.0.22(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-dCIC0/Q7mjZf17YqgoQsnXn0bus6vgriTRn8VmxOc+WcVl+KBSTBWujGrS5yu85WIFQ0aeqQvziDnDQybPqAbA==} + /@chakra-ui/input@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-HItI2vq6vupCuixdzof4sIanGdLlszhDtlR5be5z8Nrda1RkXVqI+9CTJPbNsx2nIKEfwPt01pnT9mozoOSMMw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/form-control': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/form-control': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) '@chakra-ui/object-utils': 2.1.0 '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/layout@2.2.0(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-WvfsWQjqzbCxv7pbpPGVKxj9eQr7MC2i37ag4Wn7ClIG7uPuwHYTUWOnjnu27O3H/zA4cRVZ4Hs3GpSPbojZFQ==} + /@chakra-ui/layout@2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-tp1/Bn+cHn0Q4HWKY62HtOwzhpH1GUA3i5fvs23HEhOEryTps05hyuQVeJ71fLqSs6f1QEIdm+9It+5WCj64vQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/breakpoint-utils': 2.0.8 - '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) '@chakra-ui/object-utils': 2.1.0 '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -829,81 +869,81 @@ packages: resolution: {integrity: sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg==} dev: false - /@chakra-ui/live-region@2.0.13(react@18.2.0): - resolution: {integrity: sha512-Ja+Slk6ZkxSA5oJzU2VuGU7TpZpbMb/4P4OUhIf2D30ctmIeXkxTWw1Bs1nGJAVtAPcGS5sKA+zb89i8g+0cTQ==} + /@chakra-ui/live-region@2.1.0(react@18.2.0): + resolution: {integrity: sha512-ZOxFXwtaLIsXjqnszYYrVuswBhnIHHP+XIgK1vC6DePKtyK590Wg+0J0slDwThUAd4MSSIUa/nNX84x1GMphWw==} peerDependencies: react: '>=18' dependencies: react: 18.2.0 dev: false - /@chakra-ui/media-query@3.2.12(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-8pSLDf3oxxhFrhd40rs7vSeIBfvOmIKHA7DJlGUC/y+9irD24ZwgmCtFnn+y3gI47hTJsopbSX+wb8nr7XPswA==} + /@chakra-ui/media-query@3.3.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-IsTGgFLoICVoPRp9ykOgqmdMotJG0CnPsKvGQeSFOB/dZfIujdVb14TYxDU4+MURXry1MhJ7LzZhv+Ml7cr8/g==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/breakpoint-utils': 2.0.8 - '@chakra-ui/react-env': 3.0.0(react@18.2.0) + '@chakra-ui/react-env': 3.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/menu@2.1.15(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0): - resolution: {integrity: sha512-+1fh7KBKZyhy8wi7Q6nQAzrvjM6xggyhGMnSna0rt6FJVA2jlfkjb5FozyIVPnkfJKjkKd8THVhrs9E7pHNV/w==} + /@chakra-ui/menu@2.2.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0): + resolution: {integrity: sha512-l7HQjriW4JGeCyxDdguAzekwwB+kHGDLxACi0DJNp37sil51SRaN1S1OrneISbOHVpHuQB+KVNgU0rqhoglVew==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' react: '>=18' dependencies: - '@chakra-ui/clickable': 2.0.14(react@18.2.0) - '@chakra-ui/descendant': 3.0.14(react@18.2.0) + '@chakra-ui/clickable': 2.1.0(react@18.2.0) + '@chakra-ui/descendant': 3.1.0(react@18.2.0) '@chakra-ui/lazy-utils': 2.0.5 - '@chakra-ui/popper': 3.0.14(react@18.2.0) + '@chakra-ui/popper': 3.1.0(react@18.2.0) '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-animation-state': 2.0.9(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-disclosure': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-focus-effect': 2.0.11(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-outside-click': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-update-effect': 2.0.7(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-animation-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-disclosure': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-focus-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-outside-click': 2.2.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/transition': 2.0.16(framer-motion@10.12.18)(react@18.2.0) - framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/transition': 2.1.0(framer-motion@10.16.1)(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/modal@2.2.12(@chakra-ui/system@2.5.8)(@types/react@18.2.14)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-F1nNmYGvyqlmxidbwaBM3y57NhZ/Qeyc8BE9tb1FL1v9nxQhkfrPvMQ9miK0O1syPN6aZ5MMj+uD3AsRFE+/tA==} + /@chakra-ui/modal@2.3.0(@chakra-ui/system@2.6.0)(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-S1sITrIeLSf21LJ0Vz8xZhj5fWEud5z5Dl2dmvOEv1ezypgOrCCBdOEnnqCkoEKZDbKvzZWZXWR5791ikLP6+g==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/close-button': 2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/focus-lock': 2.0.17(@types/react@18.2.14)(react@18.2.0) - '@chakra-ui/portal': 2.0.16(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/close-button': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/focus-lock': 2.1.0(@types/react@18.2.21)(react@18.2.0) + '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/transition': 2.0.16(framer-motion@10.12.18)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/transition': 2.1.0(framer-motion@10.16.1)(react@18.2.0) aria-hidden: 1.2.3 - framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.14)(react@18.2.0) + react-remove-scroll: 2.5.6(@types/react@18.2.21)(react@18.2.0) transitivePeerDependencies: - '@types/react' dev: false - /@chakra-ui/next-js@2.1.4(@chakra-ui/react@2.7.1)(@emotion/react@11.11.1)(next@13.4.9)(react@18.2.0): + /@chakra-ui/next-js@2.1.4(@chakra-ui/react@2.8.0)(@emotion/react@11.11.1)(next@13.4.19)(react@18.2.0): resolution: {integrity: sha512-qPmpZSA6ONozcD8gC8fyuEPqweZqk1Y4ar/hbfUDLMdCCRsU+aigN6ay2HBBn3kPzzMOE6BUlkgvij8uB8smxQ==} peerDependencies: '@chakra-ui/react': '>=2.4.0' @@ -911,32 +951,32 @@ packages: next: '>=13' react: '>=18' dependencies: - '@chakra-ui/react': 2.7.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.14)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react': 2.8.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0) '@emotion/cache': 11.11.0 - '@emotion/react': 11.11.1(@types/react@18.2.14)(react@18.2.0) - next: 13.4.9(react-dom@18.2.0)(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.2.21)(react@18.2.0) + next: 13.4.19(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/number-input@2.0.19(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-HDaITvtMEqOauOrCPsARDxKD9PSHmhWywpcyCSOX0lMe4xx2aaGhU0QQFhsJsykj8Er6pytMv6t0KZksdDv3YA==} + /@chakra-ui/number-input@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-/gEAzQHhrMA+1rzyCMaN8OkKtUPuER6iA+nloYEYBoT7dH/EoNlRtBkiIQhDp+E4VpgZJ0SK3OVrm9/eBbtHHg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/counter': 2.0.14(react@18.2.0) - '@chakra-ui/form-control': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/counter': 2.1.0(react@18.2.0) + '@chakra-ui/form-control': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-event-listener': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-interval': 2.0.5(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) - '@chakra-ui/react-use-update-effect': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-interval': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -948,111 +988,111 @@ packages: resolution: {integrity: sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ==} dev: false - /@chakra-ui/pin-input@2.0.20(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-IHVmerrtHN8F+jRB3W1HnMir1S1TUCWhI7qDInxqPtoRffHt6mzZgLZ0izx8p1fD4HkW4c1d4/ZLEz9uH9bBRg==} + /@chakra-ui/pin-input@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-x4vBqLStDxJFMt+jdAHHS8jbh294O53CPQJoL4g228P513rHylV/uPscYUHrVJXRxsHfRztQO9k45jjTYaPRMw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/descendant': 3.0.14(react@18.2.0) + '@chakra-ui/descendant': 3.1.0(react@18.2.0) '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/popover@2.1.12(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0): - resolution: {integrity: sha512-Corh8trA1f3ydcMQqomgSvYNNhAlpxiBpMY2sglwYazOJcueHA8CI05cJVD0T/wwoTob7BShabhCGFZThn61Ng==} + /@chakra-ui/popover@2.2.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0): + resolution: {integrity: sha512-cTqXdgkU0vgK82AR1nWcC2MJYhEL/y6uTeprvO2+j4o2D0yPrzVMuIZZRl0abrQwiravQyVGEMgA5y0ZLYwbiQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' react: '>=18' dependencies: - '@chakra-ui/close-button': 2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/close-button': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) '@chakra-ui/lazy-utils': 2.0.5 - '@chakra-ui/popper': 3.0.14(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/popper': 3.1.0(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-animation-state': 2.0.9(react@18.2.0) - '@chakra-ui/react-use-disclosure': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-focus-effect': 2.0.11(react@18.2.0) - '@chakra-ui/react-use-focus-on-pointer-down': 2.0.6(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-animation-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-disclosure': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-focus-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-focus-on-pointer-down': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/popper@3.0.14(react@18.2.0): - resolution: {integrity: sha512-RDMmmSfjsmHJbVn2agDyoJpTbQK33fxx//njwJdeyM0zTG/3/4xjI/Cxru3acJ2Y+1jFGmPqhO81stFjnbtfIw==} + /@chakra-ui/popper@3.1.0(react@18.2.0): + resolution: {integrity: sha512-ciDdpdYbeFG7og6/6J8lkTFxsSvwTdMLFkpVylAF6VNC22jssiWfquj2eyD4rJnzkRFPvIWJq8hvbfhsm+AjSg==} peerDependencies: react: '>=18' dependencies: '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) - '@popperjs/core': 2.11.6 + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@popperjs/core': 2.11.8 react: 18.2.0 dev: false - /@chakra-ui/portal@2.0.16(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-bVID0qbQ0l4xq38LdqAN4EKD4/uFkDnXzFwOlviC9sl0dNhzICDb1ltuH/Adl1d2HTMqyN60O3GO58eHy7plnQ==} + /@chakra-ui/portal@2.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9q9KWf6SArEcIq1gGofNcFPSWEyl+MfJjEUg/un1SMlQjaROOh3zYr+6JAwvcORiX7tyHosnmWC3d3wI2aPSQg==} peerDependencies: react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/react-context': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@chakra-ui/progress@2.1.6(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-hHh5Ysv4z6bK+j2GJbi/FT9CVyto2PtNUNwBmr3oNMVsoOUMoRjczfXvvYqp0EHr9PCpxqrq7sRwgQXUzhbDSw==} + /@chakra-ui/progress@2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-qUXuKbuhN60EzDD9mHR7B67D7p/ZqNS2Aze4Pbl1qGGZfulPW0PY8Rof32qDtttDQBkzQIzFGE8d9QpAemToIQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/react-context': 2.0.8(react@18.2.0) - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/provider@2.3.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-vKgmjoLVS3NnHW8RSYwmhhda2ZTi3fQc1egkYSVwngGky4CsN15I+XDhxJitVd66H41cjah/UNJyoeq7ACseLA==} + /@chakra-ui/provider@2.4.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-KJ/TNczpY+EStQXa2Y5PZ+senlBHrY7P+RpBgJLBZLGkQUCS3APw5KvCwgpA0COb2M4AZXCjw+rm+Ko7ontlgA==} peerDependencies: '@emotion/react': ^11.0.0 '@emotion/styled': ^11.0.0 react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/css-reset': 2.1.2(@emotion/react@11.11.1)(react@18.2.0) - '@chakra-ui/portal': 2.0.16(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/react-env': 3.0.0(react@18.2.0) - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/css-reset': 2.2.0(@emotion/react@11.11.1)(react@18.2.0) + '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-env': 3.1.0(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) '@chakra-ui/utils': 2.0.15 - '@emotion/react': 11.11.1(@types/react@18.2.14)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.14)(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.2.21)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.21)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@chakra-ui/radio@2.0.22(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-GsQ5WAnLwivWl6gPk8P1x+tCcpVakCt5R5T0HumF7DGPXKdJbjS+RaFySrbETmyTJsKY4QrfXn+g8CWVrMjPjw==} + /@chakra-ui/radio@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-WiRlSCqKWgy4m9106w4g77kcLYqBxqGhFRO1pTTJp99rxpM6jNadOeK+moEjqj64N9mSz3njEecMJftKKcOYdg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/form-control': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/form-control': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@zag-js/focus-visible': 0.2.2 + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@zag-js/focus-visible': 0.10.5 react: 18.2.0 dev: false @@ -1064,20 +1104,20 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react-context@2.0.8(react@18.2.0): - resolution: {integrity: sha512-tRTKdn6lCTXM6WPjSokAAKCw2ioih7Eg8cNgaYRSwKBck8nkz9YqxgIIEj3dJD7MGtpl24S/SNI98iRWkRwR/A==} + /@chakra-ui/react-context@2.1.0(react@18.2.0): + resolution: {integrity: sha512-iahyStvzQ4AOwKwdPReLGfDesGG+vWJfEsn0X/NoGph/SkN+HXtv2sCfYFFR9k7bb+Kvc6YfpLlSuLvKMHi2+w==} peerDependencies: react: '>=18' dependencies: react: 18.2.0 dev: false - /@chakra-ui/react-env@3.0.0(react@18.2.0): - resolution: {integrity: sha512-tfMRO2v508HQWAqSADFrwZgR9oU10qC97oV6zGbjHh9ALP0/IcFR+Bi71KRTveDTm85fMeAzZYGj57P3Dsipkw==} + /@chakra-ui/react-env@3.1.0(react@18.2.0): + resolution: {integrity: sha512-Vr96GV2LNBth3+IKzr/rq1IcnkXv+MLmwjQH6C8BRtn3sNskgDFD5vLkVXcEhagzZMCh8FR3V/bzZPojBOyNhw==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) react: 18.2.0 dev: false @@ -1089,153 +1129,153 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react-use-animation-state@2.0.9(react@18.2.0): - resolution: {integrity: sha512-WFoD5OG03PBmzJCoRwM8rVfU442AvKBPPgA0yGGlKioH29OGuX7W78Ml+cYdXxonTiB03YSRZzUwaUnP4wAy1Q==} + /@chakra-ui/react-use-animation-state@2.1.0(react@18.2.0): + resolution: {integrity: sha512-CFZkQU3gmDBwhqy0vC1ryf90BVHxVN8cTLpSyCpdmExUEtSEInSCGMydj2fvn7QXsz/za8JNdO2xxgJwxpLMtg==} peerDependencies: react: '>=18' dependencies: '@chakra-ui/dom-utils': 2.1.0 - '@chakra-ui/react-use-event-listener': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-callback-ref@2.0.7(react@18.2.0): - resolution: {integrity: sha512-YjT76nTpfHAK5NxplAlZsQwNju5KmQExnqsWNPFeOR6vvbC34+iPSTr+r91i1Hdy7gBSbevsOsd5Wm6RN3GuMw==} + /@chakra-ui/react-use-callback-ref@2.1.0(react@18.2.0): + resolution: {integrity: sha512-efnJrBtGDa4YaxDzDE90EnKD3Vkh5a1t3w7PhnRQmsphLy3g2UieasoKTlT2Hn118TwDjIv5ZjHJW6HbzXA9wQ==} peerDependencies: react: '>=18' dependencies: react: 18.2.0 dev: false - /@chakra-ui/react-use-controllable-state@2.0.8(react@18.2.0): - resolution: {integrity: sha512-F7rdCbLEmRjwwODqWZ3y+mKgSSHPcLQxeUygwk1BkZPXbKkJJKymOIjIynil2cbH7ku3hcSIWRvuhpCcfQWJ7Q==} + /@chakra-ui/react-use-controllable-state@2.1.0(react@18.2.0): + resolution: {integrity: sha512-QR/8fKNokxZUs4PfxjXuwl0fj/d71WPrmLJvEpCTkHjnzu7LnYvzoe2wB867IdooQJL0G1zBxl0Dq+6W1P3jpg==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-disclosure@2.0.8(react@18.2.0): - resolution: {integrity: sha512-2ir/mHe1YND40e+FyLHnDsnDsBQPwzKDLzfe9GZri7y31oU83JSbHdlAXAhp3bpjohslwavtRCp+S/zRxfO9aQ==} + /@chakra-ui/react-use-disclosure@2.1.0(react@18.2.0): + resolution: {integrity: sha512-Ax4pmxA9LBGMyEZJhhUZobg9C0t3qFE4jVF1tGBsrLDcdBeLR9fwOogIPY9Hf0/wqSlAryAimICbr5hkpa5GSw==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-event-listener@2.0.7(react@18.2.0): - resolution: {integrity: sha512-4wvpx4yudIO3B31pOrXuTHDErawmwiXnvAN7gLEOVREi16+YGNcFnRJ5X5nRrmB7j2MDUtsEDpRBFfw5Z9xQ5g==} + /@chakra-ui/react-use-event-listener@2.1.0(react@18.2.0): + resolution: {integrity: sha512-U5greryDLS8ISP69DKDsYcsXRtAdnTQT+jjIlRYZ49K/XhUR/AqVZCK5BkR1spTDmO9H8SPhgeNKI70ODuDU/Q==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-focus-effect@2.0.11(react@18.2.0): - resolution: {integrity: sha512-/zadgjaCWD50TfuYsO1vDS2zSBs2p/l8P2DPEIA8FuaowbBubKrk9shKQDWmbfDU7KArGxPxrvo+VXvskPPjHw==} + /@chakra-ui/react-use-focus-effect@2.1.0(react@18.2.0): + resolution: {integrity: sha512-xzVboNy7J64xveLcxTIJ3jv+lUJKDwRM7Szwn9tNzUIPD94O3qwjV7DDCUzN2490nSYDF4OBMt/wuDBtaR3kUQ==} peerDependencies: react: '>=18' dependencies: '@chakra-ui/dom-utils': 2.1.0 - '@chakra-ui/react-use-event-listener': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) - '@chakra-ui/react-use-update-effect': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-focus-on-pointer-down@2.0.6(react@18.2.0): - resolution: {integrity: sha512-OigXiLRVySn3tyVqJ/rn57WGuukW8TQe8fJYiLwXbcNyAMuYYounvRxvCy2b53sQ7QIZamza0N0jhirbH5FNoQ==} + /@chakra-ui/react-use-focus-on-pointer-down@2.1.0(react@18.2.0): + resolution: {integrity: sha512-2jzrUZ+aiCG/cfanrolsnSMDykCAbv9EK/4iUyZno6BYb3vziucmvgKuoXbMPAzWNtwUwtuMhkby8rc61Ue+Lg==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-event-listener': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-interval@2.0.5(react@18.2.0): - resolution: {integrity: sha512-1nbdwMi2K87V6p5f5AseOKif2CkldLaJlq1TOqaPRwb7v3aU9rltBtYdf+fIyuHSToNJUV6wd9budCFdLCl3Fg==} + /@chakra-ui/react-use-interval@2.1.0(react@18.2.0): + resolution: {integrity: sha512-8iWj+I/+A0J08pgEXP1J1flcvhLBHkk0ln7ZvGIyXiEyM6XagOTJpwNhiu+Bmk59t3HoV/VyvyJTa+44sEApuw==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-latest-ref@2.0.5(react@18.2.0): - resolution: {integrity: sha512-3mIuFzMyIo3Ok/D8uhV9voVg7KkrYVO/pwVvNPJOHsDQqCA6DpYE4WDsrIx+fVcwad3Ta7SupexR5PoI+kq6QQ==} + /@chakra-ui/react-use-latest-ref@2.1.0(react@18.2.0): + resolution: {integrity: sha512-m0kxuIYqoYB0va9Z2aW4xP/5b7BzlDeWwyXCH6QpT2PpW3/281L3hLCm1G0eOUcdVlayqrQqOeD6Mglq+5/xoQ==} peerDependencies: react: '>=18' dependencies: react: 18.2.0 dev: false - /@chakra-ui/react-use-merge-refs@2.0.7(react@18.2.0): - resolution: {integrity: sha512-zds4Uhsc+AMzdH8JDDkLVet9baUBgtOjPbhC5r3A0ZXjZvGhCztFAVE3aExYiVoMPoHLKbLcqvCWE6ioFKz1lw==} + /@chakra-ui/react-use-merge-refs@2.1.0(react@18.2.0): + resolution: {integrity: sha512-lERa6AWF1cjEtWSGjxWTaSMvneccnAVH4V4ozh8SYiN9fSPZLlSG3kNxfNzdFvMEhM7dnP60vynF7WjGdTgQbQ==} peerDependencies: react: '>=18' dependencies: react: 18.2.0 dev: false - /@chakra-ui/react-use-outside-click@2.1.0(react@18.2.0): - resolution: {integrity: sha512-JanCo4QtWvMl9ZZUpKJKV62RlMWDFdPCE0Q64a7eWTOQgWWcpyBW7TOYRunQTqrK30FqkYFJCOlAWOtn+6Rw7A==} + /@chakra-ui/react-use-outside-click@2.2.0(react@18.2.0): + resolution: {integrity: sha512-PNX+s/JEaMneijbgAM4iFL+f3m1ga9+6QK0E5Yh4s8KZJQ/bLwZzdhMz8J/+mL+XEXQ5J0N8ivZN28B82N1kNw==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-pan-event@2.0.9(react@18.2.0): - resolution: {integrity: sha512-xu35QXkiyrgsHUOnctl+SwNcwf9Rl62uYE5y8soKOZdBm8E+FvZIt2hxUzK1EoekbJCMzEZ0Yv1ZQCssVkSLaQ==} + /@chakra-ui/react-use-pan-event@2.1.0(react@18.2.0): + resolution: {integrity: sha512-xmL2qOHiXqfcj0q7ZK5s9UjTh4Gz0/gL9jcWPA6GVf+A0Od5imEDa/Vz+533yQKWiNSm1QGrIj0eJAokc7O4fg==} peerDependencies: react: '>=18' dependencies: '@chakra-ui/event-utils': 2.0.8 - '@chakra-ui/react-use-latest-ref': 2.0.5(react@18.2.0) + '@chakra-ui/react-use-latest-ref': 2.1.0(react@18.2.0) framesync: 6.1.2 react: 18.2.0 dev: false - /@chakra-ui/react-use-previous@2.0.5(react@18.2.0): - resolution: {integrity: sha512-BIZgjycPE4Xr+MkhKe0h67uHXzQQkBX/u5rYPd65iMGdX1bCkbE0oorZNfOHLKdTmnEb4oVsNvfN6Rfr+Mnbxw==} + /@chakra-ui/react-use-previous@2.1.0(react@18.2.0): + resolution: {integrity: sha512-pjxGwue1hX8AFcmjZ2XfrQtIJgqbTF3Qs1Dy3d1krC77dEsiCUbQ9GzOBfDc8pfd60DrB5N2tg5JyHbypqh0Sg==} peerDependencies: react: '>=18' dependencies: react: 18.2.0 dev: false - /@chakra-ui/react-use-safe-layout-effect@2.0.5(react@18.2.0): - resolution: {integrity: sha512-MwAQBz3VxoeFLaesaSEN87reVNVbjcQBDex2WGexAg6hUB6n4gc1OWYH/iXp4tzp4kuggBNhEHkk9BMYXWfhJQ==} + /@chakra-ui/react-use-safe-layout-effect@2.1.0(react@18.2.0): + resolution: {integrity: sha512-Knbrrx/bcPwVS1TorFdzrK/zWA8yuU/eaXDkNj24IrKoRlQrSBFarcgAEzlCHtzuhufP3OULPkELTzz91b0tCw==} peerDependencies: react: '>=18' dependencies: react: 18.2.0 dev: false - /@chakra-ui/react-use-size@2.0.10(react@18.2.0): - resolution: {integrity: sha512-fdIkH14GDnKQrtQfxX8N3gxbXRPXEl67Y3zeD9z4bKKcQUAYIMqs0MsPZY+FMpGQw8QqafM44nXfL038aIrC5w==} + /@chakra-ui/react-use-size@2.1.0(react@18.2.0): + resolution: {integrity: sha512-tbLqrQhbnqOjzTaMlYytp7wY8BW1JpL78iG7Ru1DlV4EWGiAmXFGvtnEt9HftU0NJ0aJyjgymkxfVGI55/1Z4A==} peerDependencies: react: '>=18' dependencies: - '@zag-js/element-size': 0.3.2 + '@zag-js/element-size': 0.10.5 react: 18.2.0 dev: false - /@chakra-ui/react-use-timeout@2.0.5(react@18.2.0): - resolution: {integrity: sha512-QqmB+jVphh3h/CS60PieorpY7UqSPkrQCB7f7F+i9vwwIjtP8fxVHMmkb64K7VlzQiMPzv12nlID5dqkzlv0mw==} + /@chakra-ui/react-use-timeout@2.1.0(react@18.2.0): + resolution: {integrity: sha512-cFN0sobKMM9hXUhyCofx3/Mjlzah6ADaEl/AXl5Y+GawB5rgedgAcu2ErAgarEkwvsKdP6c68CKjQ9dmTQlJxQ==} peerDependencies: react: '>=18' dependencies: - '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/react-use-update-effect@2.0.7(react@18.2.0): - resolution: {integrity: sha512-vBM2bmmM83ZdDtasWv3PXPznpTUd+FvqBC8J8rxoRmvdMEfrxTiQRBJhiGHLpS9BPLLPQlosN6KdFU97csB6zg==} + /@chakra-ui/react-use-update-effect@2.1.0(react@18.2.0): + resolution: {integrity: sha512-ND4Q23tETaR2Qd3zwCKYOOS1dfssojPLJMLvUtUbW5M9uW1ejYWgGUobeAiOVfSplownG8QYMmHTP86p/v0lbA==} peerDependencies: react: '>=18' dependencies: @@ -1251,8 +1291,8 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react@2.7.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.14)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-uIYIAg+gnUoRbgdCfSEVvQnrEz0oWWXATGGSQpxmuJovNVyZKnX/Xug7NkWQfBUJPYRSG+VB69ZmsAFpyLSMtA==} + /@chakra-ui/react@2.8.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-tV82DaqE4fMbLIWq58BYh4Ol3gAlNEn+qYOzx8bPrZudboEDnboq8aVfSBwWOY++MLWz2Nn7CkT69YRm91e5sg==} peerDependencies: '@emotion/react': ^11.0.0 '@emotion/styled': ^11.0.0 @@ -1260,77 +1300,77 @@ packages: react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/accordion': 2.2.0(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0) - '@chakra-ui/alert': 2.1.0(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/avatar': 2.2.11(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/breadcrumb': 2.1.5(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/button': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/card': 2.1.6(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/checkbox': 2.2.15(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/close-button': 2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/control-box': 2.0.13(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/counter': 2.0.14(react@18.2.0) - '@chakra-ui/css-reset': 2.1.2(@emotion/react@11.11.1)(react@18.2.0) - '@chakra-ui/editable': 3.0.0(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/focus-lock': 2.0.17(@types/react@18.2.14)(react@18.2.0) - '@chakra-ui/form-control': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/accordion': 2.3.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0) + '@chakra-ui/alert': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/avatar': 2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/breadcrumb': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/button': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/card': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/checkbox': 2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/close-button': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/control-box': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/counter': 2.1.0(react@18.2.0) + '@chakra-ui/css-reset': 2.2.0(@emotion/react@11.11.1)(react@18.2.0) + '@chakra-ui/editable': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/focus-lock': 2.1.0(@types/react@18.2.21)(react@18.2.0) + '@chakra-ui/form-control': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) '@chakra-ui/hooks': 2.2.0(react@18.2.0) - '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/image': 2.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/input': 2.0.22(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/layout': 2.2.0(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/live-region': 2.0.13(react@18.2.0) - '@chakra-ui/media-query': 3.2.12(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/menu': 2.1.15(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0) - '@chakra-ui/modal': 2.2.12(@chakra-ui/system@2.5.8)(@types/react@18.2.14)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/number-input': 2.0.19(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/pin-input': 2.0.20(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/popover': 2.1.12(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0) - '@chakra-ui/popper': 3.0.14(react@18.2.0) - '@chakra-ui/portal': 2.0.16(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/progress': 2.1.6(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/provider': 2.3.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/radio': 2.0.22(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/react-env': 3.0.0(react@18.2.0) - '@chakra-ui/select': 2.0.19(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/skeleton': 2.0.24(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/skip-nav': 2.0.15(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/slider': 2.0.25(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/spinner': 2.0.13(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/stat': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/stepper': 2.2.0(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/image': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/input': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/layout': 2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/live-region': 2.1.0(react@18.2.0) + '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/menu': 2.2.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0) + '@chakra-ui/modal': 2.3.0(@chakra-ui/system@2.6.0)(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/number-input': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/pin-input': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/popover': 2.2.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0) + '@chakra-ui/popper': 3.1.0(react@18.2.0) + '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/progress': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/provider': 2.4.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/radio': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/react-env': 3.1.0(react@18.2.0) + '@chakra-ui/select': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/skeleton': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/skip-nav': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/slider': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/stat': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/stepper': 2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/switch': 2.0.27(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0) - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/table': 2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/tabs': 2.1.9(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/tag': 3.0.0(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/textarea': 2.0.19(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/theme': 3.1.2(@chakra-ui/styled-system@2.9.1) - '@chakra-ui/theme-utils': 2.0.18 - '@chakra-ui/toast': 6.1.4(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/tooltip': 2.2.9(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/transition': 2.0.16(framer-motion@10.12.18)(react@18.2.0) + '@chakra-ui/switch': 2.1.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/table': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/tabs': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/tag': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/textarea': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/theme': 3.2.0(@chakra-ui/styled-system@2.9.1) + '@chakra-ui/theme-utils': 2.0.19 + '@chakra-ui/toast': 7.0.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/tooltip': 2.3.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/transition': 2.1.0(framer-motion@10.16.1)(react@18.2.0) '@chakra-ui/utils': 2.0.15 - '@chakra-ui/visually-hidden': 2.0.15(@chakra-ui/system@2.5.8)(react@18.2.0) - '@emotion/react': 11.11.1(@types/react@18.2.14)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.14)(react@18.2.0) - framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/visually-hidden': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.2.21)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.21)(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' dev: false - /@chakra-ui/select@2.0.19(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-eAlFh+JhwtJ17OrB6fO6gEAGOMH18ERNrXLqWbYLrs674Le7xuREgtuAYDoxUzvYXYYTTdOJtVbcHGriI3o6rA==} + /@chakra-ui/select@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-6GEjCJNOm1pS9E7XRvodoVOuSFl82Jio3MGWgmcQrLznjJAhIZVMq85vCQqzGpjjfbHys/UctfdJY75Ctas/Jg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/form-control': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/form-control': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1338,83 +1378,83 @@ packages: resolution: {integrity: sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q==} dev: false - /@chakra-ui/skeleton@2.0.24(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-1jXtVKcl/jpbrJlc/TyMsFyI651GTXY5ma30kWyTXoby2E+cxbV6OR8GB/NMZdGxbQBax8/VdtYVjI0n+OBqWA==} + /@chakra-ui/skeleton@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-JNRuMPpdZGd6zFVKjVQ0iusu3tXAdI29n4ZENYwAJEMf/fN0l12sVeirOxkJ7oEL0yOx2AgEYFSKdbcAgfUsAQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/media-query': 3.2.12(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/react-use-previous': 2.0.5(react@18.2.0) + '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/react-use-previous': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/skip-nav@2.0.15(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-5UtmlnV4BmIgEk6lQ0h81JEYhPX04wJEk5ZMoilQ2zEQYL6TkVVHkhRXyc1Zfq76hmHuZPXZV/yJeTecj6jIrA==} + /@chakra-ui/skip-nav@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-Hk+FG+vadBSH0/7hwp9LJnLjkO0RPGnx7gBJWI4/SpoJf3e4tZlWYtwGj0toYY4aGKl93jVghuwGbDBEMoHDug==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/slider@2.0.25(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-FnWSi0AIXP+9sHMCPboOKGqm902k8dJtsJ7tu3D0AcKkE62WtYLZ2sTqvwJxCfSl4KqVI1i571SrF9WadnnJ8w==} + /@chakra-ui/slider@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-lUOBcLMCnFZiA/s2NONXhELJh6sY5WtbRykPtclGfynqqOo47lwWJx+VP7xaeuhDOPcWSSecWc9Y1BfPOCz9cQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/number-utils': 2.0.7 - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-callback-ref': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-latest-ref': 2.0.5(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-pan-event': 2.0.9(react@18.2.0) - '@chakra-ui/react-use-size': 2.0.10(react@18.2.0) - '@chakra-ui/react-use-update-effect': 2.0.7(react@18.2.0) - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-latest-ref': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-pan-event': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-size': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/spinner@2.0.13(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-T1/aSkVpUIuiYyrjfn1+LsQEG7Onbi1UE9ccS/evgf61Dzy4GgTXQUnDuWFSgpV58owqirqOu6jn/9eCwDlzlg==} + /@chakra-ui/spinner@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-hczbnoXt+MMv/d3gE+hjQhmkzLiKuoTo42YhUG7Bs9OSv2lg1fZHW1fGNRFP3wTi6OIbD044U1P9HK+AOgFH3g==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/stat@2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-wKyfBqhVlIs9bkSerUc6F9KJMw0yTIEKArW7dejWwzToCLPr47u+CtYO6jlJHV6lRvkhi4K4Qc6pyvtJxZ3VpA==} + /@chakra-ui/stat@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-sqx0/AdFFZ80dsiM5owmhtQyYl+zON1r+IY0m70I/ABRVy+I3br06xdUhoaxh3tcP7c0O/BQgb+VCfXa9Y34CA==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/stepper@2.2.0(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-8ZLxV39oghSVtOUGK8dX8Z6sWVSQiKVmsK4c3OQDa8y2TvxP0VtFD0Z5U1xJlOjQMryZRWhGj9JBc3iQLukuGg==} + /@chakra-ui/stepper@2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-q80QX/NLrjJQIlBP1N+Q8GVJb7/HiOpMoK1PlP4denB/KxkU2K8GEjss8U2vklR1XsWJy1fwfj03+66Q78Uk/Q==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1422,154 +1462,154 @@ packages: resolution: {integrity: sha512-jhYKBLxwOPi9/bQt9kqV3ELa/4CjmNNruTyXlPp5M0v0+pDMUngPp48mVLoskm9RKZGE0h1qpvj/jZ3K7c7t8w==} dependencies: '@chakra-ui/shared-utils': 2.0.5 - csstype: 3.1.1 + csstype: 3.1.2 lodash.mergewith: 4.6.2 dev: false - /@chakra-ui/switch@2.0.27(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react@18.2.0): - resolution: {integrity: sha512-z76y2fxwMlvRBrC5W8xsZvo3gP+zAEbT3Nqy5P8uh/IPd5OvDsGeac90t5cgnQTyxMOpznUNNK+1eUZqtLxWnQ==} + /@chakra-ui/switch@2.1.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0): + resolution: {integrity: sha512-uWHOaIDQdGh+mszxeppj5aYVepbkSK445KZlJJkfr9Bnr6sythTwM63HSufnVDiTEE4uRqegv9jEjZK2JKA+9A==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' react: '>=18' dependencies: - '@chakra-ui/checkbox': 2.2.15(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/checkbox': 2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/system@2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): - resolution: {integrity: sha512-Vy8UUaCxikOzOGE54IP8tKouvU38rEYU1HCSquU9+oe7Jd70HaiLa4vmUKvHyMUmxkOzDHIkgZLbVQCubSnN5w==} + /@chakra-ui/system@2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-MgAFRz9V1pW0dplwWsB99hx49LCC+LsrkMala7KXcP0OvWdrkjw+iu+voBksO3626+glzgIwlZW113Eja+7JEQ==} peerDependencies: '@emotion/react': ^11.0.0 '@emotion/styled': ^11.0.0 react: '>=18' dependencies: - '@chakra-ui/color-mode': 2.1.12(react@18.2.0) + '@chakra-ui/color-mode': 2.2.0(react@18.2.0) '@chakra-ui/object-utils': 2.1.0 '@chakra-ui/react-utils': 2.0.12(react@18.2.0) '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/theme-utils': 2.0.18 + '@chakra-ui/theme-utils': 2.0.19 '@chakra-ui/utils': 2.0.15 - '@emotion/react': 11.11.1(@types/react@18.2.14)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.14)(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.2.21)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.21)(react@18.2.0) react: 18.2.0 react-fast-compare: 3.2.1 dev: false - /@chakra-ui/table@2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-OScheTEp1LOYvTki2NFwnAYvac8siAhW9BI5RKm5f5ORL2gVJo4I72RUqE0aKe1oboxgm7CYt5afT5PS5cG61A==} + /@chakra-ui/table@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-o5OrjoHCh5uCLdiUb0Oc0vq9rIAeHSIRScc2ExTC9Qg/uVZl2ygLrjToCaKfaaKl1oQexIeAcZDKvPG8tVkHyQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/react-context': 2.0.8(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/tabs@2.1.9(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-Yf8e0kRvaGM6jfkJum0aInQ0U3ZlCafmrYYni2lqjcTtThqu+Yosmo3iYlnullXxCw5MVznfrkb9ySvgQowuYg==} + /@chakra-ui/tabs@2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-ulN7McHZ322qlbJXg8S+IwdN8Axh8q0HzYBOHzSdcnVphEytfv9TsfJhN0Hx5yjkpekAzG5fewn33ZdIpIpKyQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/clickable': 2.0.14(react@18.2.0) - '@chakra-ui/descendant': 3.0.14(react@18.2.0) + '@chakra-ui/clickable': 2.1.0(react@18.2.0) + '@chakra-ui/descendant': 3.1.0(react@18.2.0) '@chakra-ui/lazy-utils': 2.0.5 '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-safe-layout-effect': 2.0.5(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/tag@3.0.0(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-YWdMmw/1OWRwNkG9pX+wVtZio+B89odaPj6XeMn5nfNN8+jyhIEpouWv34+CO9G0m1lupJTxPSfgLAd7cqXZMA==} + /@chakra-ui/tag@3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-Mn2u828z5HvqEBEG+tUJWe3al5tzN87bK2U0QfThx3+zqWbBCWBSCVfnWRtkNh80m+5a1TekexDAPZqu5G8zdw==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/icon': 3.0.16(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/textarea@2.0.19(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-adJk+qVGsFeJDvfn56CcJKKse8k7oMGlODrmpnpTdF+xvlsiTM+1GfaJvgNSpHHuQFdz/A0z1uJtfGefk0G2ZA==} + /@chakra-ui/textarea@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-4F7X/lPRsY+sPxYrWGrhh1pBtdnFvVllIOapzAwnjYwsflm+vf6c+9ZgoDWobXsNezJ9fcqN0FTPwaBnDvDQRQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/form-control': 2.0.18(@chakra-ui/system@2.5.8)(react@18.2.0) + '@chakra-ui/form-control': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/theme-tools@2.0.18(@chakra-ui/styled-system@2.9.1): - resolution: {integrity: sha512-MbiRuXb2tb41FbnW41zhsYYAU0znlpfYZnu0mxCf8U2otCwPekJCfESUGYypjq4JnydQ7TDOk+Kz/Wi974l4mw==} + /@chakra-ui/theme-tools@2.1.0(@chakra-ui/styled-system@2.9.1): + resolution: {integrity: sha512-TKv4trAY8q8+DWdZrpSabTd3SZtZrnzFDwUdzhbWBhFEDEVR3fAkRTPpnPDtf1X9w1YErWn3QAcMACVFz4+vkw==} peerDependencies: '@chakra-ui/styled-system': '>=2.0.0' dependencies: - '@chakra-ui/anatomy': 2.1.2 + '@chakra-ui/anatomy': 2.2.0 '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/styled-system': 2.9.1 color2k: 2.0.2 dev: false - /@chakra-ui/theme-utils@2.0.18: - resolution: {integrity: sha512-aSbkUUiFpc1NHC7lQdA6uYlr6EcZFXz6b4aJ7VRDpqTiywvqYnvfGzhmsB0z94vgtS9qXc6HoIwBp25jYGV2MA==} + /@chakra-ui/theme-utils@2.0.19: + resolution: {integrity: sha512-UQ+KvozTN86+0oA80rdQd1a++4rm4ulo+DEabkgwNpkK3yaWsucOxkDQpi2sMIMvw5X0oaWvNBZJuVyK7HdOXg==} dependencies: '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/theme': 3.1.2(@chakra-ui/styled-system@2.9.1) + '@chakra-ui/theme': 3.2.0(@chakra-ui/styled-system@2.9.1) lodash.mergewith: 4.6.2 dev: false - /@chakra-ui/theme@3.1.2(@chakra-ui/styled-system@2.9.1): - resolution: {integrity: sha512-ebUXMS3LZw2OZxEQNYaFw3/XuA3jpyprhS/frjHMvZKSOaCjMW+c9z25S0jp1NnpQff08VGI8EWbyVZECXU1QA==} + /@chakra-ui/theme@3.2.0(@chakra-ui/styled-system@2.9.1): + resolution: {integrity: sha512-q9mppdkhmaBnvOT8REr/lVNNBX/prwm50EzObJ+r+ErVhNQDc55gCFmtr+It3xlcCqmOteG6XUdwRCJz8qzOqg==} peerDependencies: '@chakra-ui/styled-system': '>=2.8.0' dependencies: - '@chakra-ui/anatomy': 2.1.2 + '@chakra-ui/anatomy': 2.2.0 '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/theme-tools': 2.0.18(@chakra-ui/styled-system@2.9.1) + '@chakra-ui/theme-tools': 2.1.0(@chakra-ui/styled-system@2.9.1) dev: false - /@chakra-ui/toast@6.1.4(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-wAcPHq/N/ar4jQxkUGhnsbp+lx2eKOpHxn1KaWdHXUkqCNUA1z09fvBsoMyzObSiiwbDuQPZG5RxsOhzfPZX4Q==} + /@chakra-ui/toast@7.0.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-XQgSnn4DYRgfOBzBvh8GI/AZ7SfrO8wlVSmChfp92Nfmqm7tRDUT9x8ws/iNKAvMRHkhl7fmRjJ39ipeXYrMvA==} peerDependencies: - '@chakra-ui/system': 2.5.8 + '@chakra-ui/system': 2.6.0 framer-motion: '>=4.0.0' react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/alert': 2.1.0(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/close-button': 2.0.17(@chakra-ui/system@2.5.8)(react@18.2.0) - '@chakra-ui/portal': 2.0.16(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/react-context': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-timeout': 2.0.5(react@18.2.0) - '@chakra-ui/react-use-update-effect': 2.0.7(react@18.2.0) + '@chakra-ui/alert': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/close-button': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-timeout': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/theme': 3.1.2(@chakra-ui/styled-system@2.9.1) - framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/theme': 3.2.0(@chakra-ui/styled-system@2.9.1) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@chakra-ui/tooltip@2.2.9(@chakra-ui/system@2.5.8)(framer-motion@10.12.18)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-ZoksllanqXRUyMDaiogvUVJ+RdFXwZrfrwx3RV22fejYZIQ602hZ3QHtHLB5ZnKFLbvXKMZKM23HxFTSb0Ytqg==} + /@chakra-ui/tooltip@2.3.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2s23f93YIij1qEDwIK//KtEu4LLYOslhR1cUhDBk/WUzyFR3Ez0Ee+HlqlGEGfGe9x77E6/UXPnSAKKdF/cpsg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' framer-motion: '>=4.0.0' @@ -1577,27 +1617,27 @@ packages: react-dom: '>=18' dependencies: '@chakra-ui/dom-utils': 2.1.0 - '@chakra-ui/popper': 3.0.14(react@18.2.0) - '@chakra-ui/portal': 2.0.16(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/popper': 3.1.0(react@18.2.0) + '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-disclosure': 2.0.8(react@18.2.0) - '@chakra-ui/react-use-event-listener': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-disclosure': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@chakra-ui/transition@2.0.16(framer-motion@10.12.18)(react@18.2.0): - resolution: {integrity: sha512-E+RkwlPc3H7P1crEXmXwDXMB2lqY2LLia2P5siQ4IEnRWIgZXlIw+8Em+NtHNgusel2N+9yuB0wT9SeZZeZ3CQ==} + /@chakra-ui/transition@2.1.0(framer-motion@10.16.1)(react@18.2.0): + resolution: {integrity: sha512-orkT6T/Dt+/+kVwJNy7zwJ+U2xAZ3EU7M3XCs45RBvUnZDr/u9vdmaM/3D/rOpmQJWgQBwKPJleUXrYWUagEDQ==} peerDependencies: framer-motion: '>=4.0.0' react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - framer-motion: 10.12.18(react-dom@18.2.0)(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1619,39 +1659,42 @@ packages: lodash.mergewith: 4.6.2 dev: false - /@chakra-ui/visually-hidden@2.0.15(@chakra-ui/system@2.5.8)(react@18.2.0): - resolution: {integrity: sha512-WWULIiucYRBIewHKFA7BssQ2ABLHLVd9lrUo3N3SZgR0u4ZRDDVEUNOy+r+9ruDze8+36dGbN9wsN1IdELtdOw==} + /@chakra-ui/visually-hidden@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): + resolution: {integrity: sha512-3OHKqTz78PX7V4qto+a5Y6VvH6TbU3Pg6Z0Z2KnDkOBP3Po8fiz0kk+/OSPzIwdcSsQKiocLi0c1pnnUPdMZPg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/system': 2.5.8(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chenyueban/eslint-config@1.1.0(eslint@8.44.0)(typescript@5.1.6): - resolution: {integrity: sha512-9PRBA1LIiWM6a4kYLRZUFBzKVFBlndtePy9AynQb+GG1/fyfFVhb57K8wrMFpVhJtgwtcpvOiv2q5J0/nQOiHQ==} + /@chenyueban/eslint-config@3.0.5(eslint@8.47.0)(typescript@5.1.6): + resolution: {integrity: sha512-whFg8PUas0gBw6wF+bO2l7YhWuGMoaA19MKPGxlgWRTJ5GlmIeo1Qa58swy6tewCBKScpUyatwgXl04PWVn/Cw==} engines: {node: '>=16', npm: '>=7'} peerDependencies: eslint: ^8.0.0 dependencies: - '@typescript-eslint/eslint-plugin': 5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.44.0)(typescript@5.1.6) - '@typescript-eslint/parser': 5.60.1(eslint@8.44.0)(typescript@5.1.6) - eslint: 8.44.0 - eslint-config-standard: 17.1.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@16.0.1)(eslint-plugin-promise@6.1.1)(eslint@8.44.0) - eslint-plugin-eslint-comments: 3.2.0(eslint@8.44.0) - eslint-plugin-html: 7.1.0 - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.1)(eslint@8.44.0) - eslint-plugin-jsonc: 2.9.0(eslint@8.44.0) - eslint-plugin-jsx: 0.1.0 - eslint-plugin-markdown: 3.0.0(eslint@8.44.0) - eslint-plugin-n: 16.0.1(eslint@8.44.0) - eslint-plugin-promise: 6.1.1(eslint@8.44.0) - eslint-plugin-react: 7.32.2(eslint@8.44.0) - eslint-plugin-unicorn: 47.0.0(eslint@8.44.0) - eslint-plugin-vue: 9.15.1(eslint@8.44.0) - eslint-plugin-yml: 1.8.0(eslint@8.44.0) + '@eslint/js': 8.47.0 + '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.1.6) + eslint: 8.47.0 + eslint-define-config: 1.23.0 + eslint-plugin-antfu: 0.40.3(eslint@8.47.0)(typescript@5.1.6) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.47.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0) + eslint-plugin-jsonc: 2.9.0(eslint@8.47.0) + eslint-plugin-markdown: 3.0.1(eslint@8.47.0) + eslint-plugin-react: 7.33.2(eslint@8.47.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.47.0) + eslint-plugin-unicorn: 48.0.1(eslint@8.47.0) + eslint-plugin-unused-imports: 3.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0) + eslint-plugin-vue: 9.17.0(eslint@8.47.0) + eslint-plugin-yml: 1.8.0(eslint@8.47.0) + globals: 13.21.0 jsonc-eslint-parser: 2.3.0 + local-pkg: 0.4.3 + vue-eslint-parser: 9.3.1(eslint@8.47.0) yaml-eslint-parser: 1.2.2 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -1660,14 +1703,14 @@ packages: - typescript dev: true - /@chenyueban/tsconfig@2.1.0(typescript@5.1.6): - resolution: {integrity: sha512-9rvdfafujrKySjJ/LkrO8Ys7CgFtQ6KtaVGlR2eeqfpkm4LljVdZ2V2Z+XWUt4a/gVlOtRH7er3LZIev4VNYEg==} + /@chenyueban/tsconfig@3.0.5(typescript@5.1.6): + resolution: {integrity: sha512-6MfWp0G3XWJwgpx6OIm62JM3S4kaIYehxdUEn+UX1zXbvny1Zmj8j4jq5holO5aGsrkodw5nGBFlGAQ9Hu79AQ==} engines: {node: '>=16', npm: '>=7'} peerDependencies: typescript: ^4.4.2 dependencies: typescript: 5.1.6 - dev: false + dev: true /@colors/colors@1.5.0: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -1676,14 +1719,14 @@ packages: dev: false optional: true - /@commitlint/cli@17.6.6(@swc/core@1.3.68): - resolution: {integrity: sha512-sTKpr2i/Fjs9OmhU+beBxjPavpnLSqZaO6CzwKVq2Tc4UYVTMFgpKOslDhUBVlfAUBfjVO8ParxC/MXkIOevEA==} + /@commitlint/cli@17.7.1(@swc/core@1.3.78): + resolution: {integrity: sha512-BCm/AT06SNCQtvFv921iNhudOHuY16LswT0R3OeolVGLk8oP+Rk9TfQfgjH7QPMjhvp76bNqGFEcpKojxUNW1g==} engines: {node: '>=v14'} hasBin: true dependencies: '@commitlint/format': 17.4.4 - '@commitlint/lint': 17.6.6 - '@commitlint/load': 17.5.0(@swc/core@1.3.68) + '@commitlint/lint': 17.7.0 + '@commitlint/load': 17.7.1(@swc/core@1.3.78) '@commitlint/read': 17.5.1 '@commitlint/types': 17.4.4 execa: 5.1.1 @@ -1696,16 +1739,16 @@ packages: - '@swc/wasm' dev: true - /@commitlint/config-validator@17.4.4: - resolution: {integrity: sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==} + /@commitlint/config-validator@17.6.7: + resolution: {integrity: sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==} engines: {node: '>=v14'} dependencies: '@commitlint/types': 17.4.4 ajv: 8.12.0 dev: true - /@commitlint/ensure@17.4.4: - resolution: {integrity: sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==} + /@commitlint/ensure@17.6.7: + resolution: {integrity: sha512-mfDJOd1/O/eIb/h4qwXzUxkmskXDL9vNPnZ4AKYKiZALz4vHzwMxBSYtyL2mUIDeU9DRSpEUins8SeKtFkYHSw==} engines: {node: '>=v14'} dependencies: '@commitlint/types': 17.4.4 @@ -1729,41 +1772,66 @@ packages: chalk: 4.1.2 dev: true - /@commitlint/is-ignored@17.6.6: - resolution: {integrity: sha512-4Fw875faAKO+2nILC04yW/2Vy/wlV3BOYCSQ4CEFzriPEprc1Td2LILmqmft6PDEK5Sr14dT9tEzeaZj0V56Gg==} + /@commitlint/is-ignored@17.7.0: + resolution: {integrity: sha512-043rA7m45tyEfW7Zv2vZHF++176MLHH9h70fnPoYlB1slKBeKl8BwNIlnPg4xBdRBVNPaCqvXxWswx2GR4c9Hw==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + semver: 7.5.4 + dev: true + + /@commitlint/lint@17.7.0: + resolution: {integrity: sha512-TCQihm7/uszA5z1Ux1vw+Nf3yHTgicus/+9HiUQk+kRSQawByxZNESeQoX9ujfVd3r4Sa+3fn0JQAguG4xvvbA==} engines: {node: '>=v14'} dependencies: + '@commitlint/is-ignored': 17.7.0 + '@commitlint/parse': 17.7.0 + '@commitlint/rules': 17.7.0 '@commitlint/types': 17.4.4 - semver: 7.5.2 dev: true - /@commitlint/lint@17.6.6: - resolution: {integrity: sha512-5bN+dnHcRLkTvwCHYMS7Xpbr+9uNi0Kq5NR3v4+oPNx6pYXt8ACuw9luhM/yMgHYwW0ajIR20wkPAFkZLEMGmg==} + /@commitlint/load@17.6.7(@swc/core@1.3.78): + resolution: {integrity: sha512-QZ2rJTbX55BQdYrCm/p6+hh/pFBgC9nTJxfsrK6xRPe2thiQzHN0AQDBqBwAirn6gIkHrjIbCbtAE6kiDYLjrw==} engines: {node: '>=v14'} + requiresBuild: true dependencies: - '@commitlint/is-ignored': 17.6.6 - '@commitlint/parse': 17.6.5 - '@commitlint/rules': 17.6.5 + '@commitlint/config-validator': 17.6.7 + '@commitlint/execute-rule': 17.4.0 + '@commitlint/resolve-extends': 17.6.7 '@commitlint/types': 17.4.4 + '@types/node': 20.5.4 + chalk: 4.1.2 + cosmiconfig: 8.2.0 + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.4)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@20.5.4)(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' dev: true + optional: true - /@commitlint/load@17.5.0(@swc/core@1.3.68): - resolution: {integrity: sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==} + /@commitlint/load@17.7.1(@swc/core@1.3.78): + resolution: {integrity: sha512-S/QSOjE1ztdogYj61p6n3UbkUvweR17FQ0zDbNtoTLc+Hz7vvfS7ehoTMQ27hPSjVBpp7SzEcOQu081RLjKHJQ==} engines: {node: '>=v14'} dependencies: - '@commitlint/config-validator': 17.4.4 + '@commitlint/config-validator': 17.6.7 '@commitlint/execute-rule': 17.4.0 - '@commitlint/resolve-extends': 17.4.4 + '@commitlint/resolve-extends': 17.6.7 '@commitlint/types': 17.4.4 - '@types/node': 20.4.1 + '@types/node': 20.4.7 chalk: 4.1.2 cosmiconfig: 8.2.0 - cosmiconfig-typescript-loader: 4.2.0(@types/node@20.4.1)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6) + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.4.7)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@swc/core@1.3.68)(@types/node@20.4.1)(typescript@5.1.6) + ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@20.4.7)(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - '@swc/core' @@ -1775,13 +1843,13 @@ packages: engines: {node: '>=v14'} dev: true - /@commitlint/parse@17.6.5: - resolution: {integrity: sha512-0zle3bcn1Hevw5Jqpz/FzEWNo2KIzUbc1XyGg6WrWEoa6GH3A1pbqNF6MvE6rjuy6OY23c8stWnb4ETRZyN+Yw==} + /@commitlint/parse@17.7.0: + resolution: {integrity: sha512-dIvFNUMCUHqq5Abv80mIEjLVfw8QNuA4DS7OWip4pcK/3h5wggmjVnlwGCDvDChkw2TjK1K6O+tAEV78oxjxag==} engines: {node: '>=v14'} dependencies: '@commitlint/types': 17.4.4 - conventional-changelog-angular: 5.0.13 - conventional-commits-parser: 3.2.4 + conventional-changelog-angular: 6.0.0 + conventional-commits-parser: 4.0.0 dev: true /@commitlint/read@17.5.1: @@ -1792,14 +1860,14 @@ packages: '@commitlint/types': 17.4.4 fs-extra: 11.1.1 git-raw-commits: 2.0.11 - minimist: 1.2.7 + minimist: 1.2.8 dev: true - /@commitlint/resolve-extends@17.4.4: - resolution: {integrity: sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==} + /@commitlint/resolve-extends@17.6.7: + resolution: {integrity: sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==} engines: {node: '>=v14'} dependencies: - '@commitlint/config-validator': 17.4.4 + '@commitlint/config-validator': 17.6.7 '@commitlint/types': 17.4.4 import-fresh: 3.3.0 lodash.mergewith: 4.6.2 @@ -1807,11 +1875,11 @@ packages: resolve-global: 1.0.0 dev: true - /@commitlint/rules@17.6.5: - resolution: {integrity: sha512-uTB3zSmnPyW2qQQH+Dbq2rekjlWRtyrjDo4aLFe63uteandgkI+cc0NhhbBAzcXShzVk0qqp8SlkQMu0mgHg/A==} + /@commitlint/rules@17.7.0: + resolution: {integrity: sha512-J3qTh0+ilUE5folSaoK91ByOb8XeQjiGcdIdiB/8UT1/Rd1itKo0ju/eQVGyFzgTMYt8HrDJnGTmNWwcMR1rmA==} engines: {node: '>=v14'} dependencies: - '@commitlint/ensure': 17.4.4 + '@commitlint/ensure': 17.6.7 '@commitlint/message': 17.4.2 '@commitlint/to-lines': 17.4.0 '@commitlint/types': 17.4.4 @@ -1843,11 +1911,22 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.9 + /@egoist/tailwindcss-icons@1.1.0(tailwindcss@3.3.3): + resolution: {integrity: sha512-3zIBtwMH4viBDtDF7nDgGOFS/mxu4qtfhimeyyGlK+RHJu26YaLhHrJf6NaEK5Gwxt8chNntJwslklR+66AErg==} + peerDependencies: + tailwindcss: '*' + dependencies: + '@iconify/utils': 2.1.7 + tailwindcss: 3.3.3(ts-node@10.9.1) + transitivePeerDependencies: + - supports-color + dev: false + /@emotion/babel-plugin@11.11.0: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: '@babel/helper-module-imports': 7.22.5 - '@babel/runtime': 7.22.5 + '@babel/runtime': 7.22.6 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/serialize': 1.1.2 @@ -1889,6 +1968,7 @@ packages: /@emotion/memoize@0.7.4: resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + requiresBuild: true dev: false optional: true @@ -1896,7 +1976,7 @@ packages: resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} dev: false - /@emotion/react@11.11.1(@types/react@18.2.14)(react@18.2.0): + /@emotion/react@11.11.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==} peerDependencies: '@types/react': '*' @@ -1905,14 +1985,14 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.20.0 + '@babel/runtime': 7.22.6 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.2 '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 - '@types/react': 18.2.14 + '@types/react': 18.2.21 hoist-non-react-statics: 3.3.2 react: 18.2.0 dev: false @@ -1924,14 +2004,14 @@ packages: '@emotion/memoize': 0.8.1 '@emotion/unitless': 0.8.1 '@emotion/utils': 1.2.1 - csstype: 3.1.1 + csstype: 3.1.2 dev: false /@emotion/sheet@1.2.2: resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} dev: false - /@emotion/styled@11.11.0(@emotion/react@11.11.1)(@types/react@18.2.14)(react@18.2.0): + /@emotion/styled@11.11.0(@emotion/react@11.11.1)(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 @@ -1941,14 +2021,14 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.20.0 + '@babel/runtime': 7.22.6 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.1 - '@emotion/react': 11.11.1(@types/react@18.2.14)(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.2.21)(react@18.2.0) '@emotion/serialize': 1.1.2 '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 - '@types/react': 18.2.14 + '@types/react': 18.2.21 react: 18.2.0 dev: false @@ -1975,240 +2055,420 @@ packages: /@esbuild-kit/cjs-loader@2.4.2: resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} dependencies: - '@esbuild-kit/core-utils': 3.0.0 + '@esbuild-kit/core-utils': 3.1.0 get-tsconfig: 4.6.2 - dev: false + dev: true - /@esbuild-kit/core-utils@3.0.0: - resolution: {integrity: sha512-TXmwH9EFS3DC2sI2YJWJBgHGhlteK0Xyu1VabwetMULfm3oYhbrsWV5yaSr2NTWZIgDGVLHbRf0inxbjXqAcmQ==} + /@esbuild-kit/core-utils@3.1.0: + resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} dependencies: - esbuild: 0.15.12 + esbuild: 0.17.19 source-map-support: 0.5.21 - dev: false + dev: true /@esbuild-kit/esm-loader@2.5.5: resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} dependencies: - '@esbuild-kit/core-utils': 3.0.0 + '@esbuild-kit/core-utils': 3.1.0 get-tsconfig: 4.6.2 - dev: false + dev: true + + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true - /@esbuild/android-arm64@0.18.10: - resolution: {integrity: sha512-ynm4naLbNbK0ajf9LUWtQB+6Vfg1Z/AplArqr4tGebC00Z6m9Y91OVIcjDa461wGcZwcaHYaZAab4yJxfhisTQ==} + /@esbuild/android-arm64@0.18.19: + resolution: {integrity: sha512-4+jkUFQxZkQfQOOxfGVZB38YUWHMJX2ihZwF+2nh8m7bHdWXpixiurgGRN3c/KMSwlltbYI0/i929jwBRMFzbA==} engines: {node: '>=12'} cpu: [arm64] os: [android] requiresBuild: true optional: true - /@esbuild/android-arm@0.15.12: - resolution: {integrity: sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==} + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} cpu: [arm] os: [android] requiresBuild: true - dev: false + dev: true optional: true - /@esbuild/android-arm@0.18.10: - resolution: {integrity: sha512-3KClmVNd+Fku82uZJz5C4Rx8m1PPmWUFz5Zkw8jkpZPOmsq+EG1TTOtw1OXkHuX3WczOFQigrtf60B1ijKwNsg==} + /@esbuild/android-arm@0.18.19: + resolution: {integrity: sha512-1uOoDurJYh5MNqPqpj3l/TQCI1V25BXgChEldCB7D6iryBYqYKrbZIhYO5AI9fulf66sM8UJpc3UcCly2Tv28w==} engines: {node: '>=12'} cpu: [arm] os: [android] requiresBuild: true optional: true - /@esbuild/android-x64@0.18.10: - resolution: {integrity: sha512-vFfXj8P9Yfjh54yqUDEHKzqzYuEfPyAOl3z7R9hjkwt+NCvbn9VMxX+IILnAfdImRBfYVItgSUsqGKhJFnBwZw==} + /@esbuild/android-x64@0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.19: + resolution: {integrity: sha512-ae5sHYiP/Ogj2YNrLZbWkBmyHIDOhPgpkGvFnke7XFGQldBDWvc/AyYwSLpNuKw9UNkgnLlB/jPpnBmlF3G9Bg==} engines: {node: '>=12'} cpu: [x64] os: [android] requiresBuild: true optional: true - /@esbuild/darwin-arm64@0.18.10: - resolution: {integrity: sha512-k2OJQ7ZxE6sVc91+MQeZH9gFeDAH2uIYALPAwTjTCvcPy9Dzrf7V7gFUQPYkn09zloWhQ+nvxWHia2x2ZLR0sQ==} + /@esbuild/darwin-arm64@0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.19: + resolution: {integrity: sha512-HIpQvNQWFYROmWDANMRL+jZvvTQGOiTuwWBIuAsMaQrnStedM+nEKJBzKQ6bfT9RFKH2wZ+ej+DY7+9xHBTFPg==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@esbuild/darwin-x64@0.18.10: - resolution: {integrity: sha512-tnz/mdZk1L1Z3WpGjin/L2bKTe8/AKZpI8fcCLtH+gq8WXWsCNJSxlesAObV4qbtTl6pG5vmqFXfWUQ5hV8PAQ==} + /@esbuild/darwin-x64@0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.19: + resolution: {integrity: sha512-m6JdvXJQt0thNLIcWOeG079h2ivhYH4B5sVCgqb/B29zTcFd7EE8/J1nIUHhdtwGeItdUeqKaqqb4towwxvglQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/freebsd-arm64@0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true optional: true - /@esbuild/freebsd-arm64@0.18.10: - resolution: {integrity: sha512-QJluV0LwBrbHnYYwSKC+K8RGz0g/EyhpQH1IxdoFT0nM7PfgjE+aS8wxq/KFEsU0JkL7U/EEKd3O8xVBxXb2aA==} + /@esbuild/freebsd-arm64@0.18.19: + resolution: {integrity: sha512-G0p4EFMPZhGn/xVNspUyMQbORH3nlKTV0bFNHPIwLraBuAkTeMyxNviTe0ZXUbIXQrR1lrwniFjNFU4s+x7veQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] requiresBuild: true optional: true - /@esbuild/freebsd-x64@0.18.10: - resolution: {integrity: sha512-Hi/ycUkS6KTw+U9G5PK5NoK7CZboicaKUSVs0FSiPNtuCTzK6HNM4DIgniH7hFaeuszDS9T4dhAHWiLSt/Y5Ng==} + /@esbuild/freebsd-x64@0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.19: + resolution: {integrity: sha512-hBxgRlG42+W+j/1/cvlnSa+3+OBKeDCyO7OG2ICya1YJaSCYfSpuG30KfOnQHI7Ytgu4bRqCgrYXxQEzy0zM5Q==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] requiresBuild: true optional: true - /@esbuild/linux-arm64@0.18.10: - resolution: {integrity: sha512-Nz6XcfRBOO7jSrVpKAyEyFOPGhySPNlgumSDhWAspdQQ11ub/7/NZDMhWDFReE9QH/SsCOCLQbdj0atAk/HMOQ==} + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.19: + resolution: {integrity: sha512-X8g33tczY0GsJq3lhyBrjnFtaKjWVpp1gMq5IlF9BQJ3TUfSK74nQnz9mRIEejmcV+OIYn6bkOJeUaU1Knrljg==} engines: {node: '>=12'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-arm@0.18.10: - resolution: {integrity: sha512-HfFoxY172tVHPIvJy+FHxzB4l8xU7e5cxmNS11cQ2jt4JWAukn/7LXaPdZid41UyTweqa4P/1zs201gRGCTwHw==} + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.19: + resolution: {integrity: sha512-qtWyoQskfJlb9MD45mvzCEKeO4uCnDZ7lPFeNqbfaaJHqBiH9qA5Vu2EuckqYZuFMJWy1l4dxTf9NOulCVfUjg==} engines: {node: '>=12'} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-ia32@0.18.10: - resolution: {integrity: sha512-otMdmSmkMe+pmiP/bZBjfphyAsTsngyT9RCYwoFzqrveAbux9nYitDTpdgToG0Z0U55+PnH654gCH2GQ1aB6Yw==} + /@esbuild/linux-ia32@0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.19: + resolution: {integrity: sha512-SAkRWJgb+KN+gOhmbiE6/wu23D6HRcGQi15cB13IVtBZZgXxygTV5GJlUAKLQ5Gcx0gtlmt+XIxEmSqA6sZTOw==} engines: {node: '>=12'} cpu: [ia32] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-loong64@0.15.12: - resolution: {integrity: sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==} + /@esbuild/linux-loong64@0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true - /@esbuild/linux-loong64@0.18.10: - resolution: {integrity: sha512-t8tjFuON1koxskzQ4VFoh0T5UDUMiLYjwf9Wktd0tx8AoK6xgU+5ubKOpWpcnhEQ2tESS5u0v6QuN8PX/ftwcQ==} + /@esbuild/linux-loong64@0.18.19: + resolution: {integrity: sha512-YLAslaO8NsB9UOxBchos82AOMRDbIAWChwDKfjlGrHSzS3v1kxce7dGlSTsrb0PJwo1KYccypN3VNjQVLtz7LA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-mips64el@0.18.10: - resolution: {integrity: sha512-+dUkcVzcfEJHz3HEnVpIJu8z8Wdn2n/nWMWdl6FVPFGJAVySO4g3+XPzNKFytVFwf8hPVDwYXzVcu8GMFqsqZw==} + /@esbuild/linux-mips64el@0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.19: + resolution: {integrity: sha512-vSYFtlYds/oTI8aflEP65xo3MXChMwBOG1eWPGGKs/ev9zkTeXVvciU+nifq8J1JYMz+eQ4J9JDN0O2RKF8+1Q==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-ppc64@0.18.10: - resolution: {integrity: sha512-sO3PjjxEGy+PY2qkGe2gwJbXdZN9wAYpVBZWFD0AwAoKuXRkWK0/zaMQ5ekUFJDRDCRm8x5U0Axaub7ynH/wVg==} + /@esbuild/linux-ppc64@0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.19: + resolution: {integrity: sha512-tgG41lRVwlzqO9tv9l7aXYVw35BxKXLtPam1qALScwSqPivI8hjkZLNH0deaaSCYCFT9cBIdB+hUjWFlFFLL9A==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-riscv64@0.18.10: - resolution: {integrity: sha512-JDtdbJg3yjDeXLv4lZYE1kiTnxv73/8cbPHY9T/dUKi8rYOM/k5b3W4UJLMUksuQ6nTm5c89W1nADsql6FW75A==} + /@esbuild/linux-riscv64@0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.19: + resolution: {integrity: sha512-EgBZFLoN1S5RuB4cCJI31pBPsjE1nZ+3+fHRjguq9Ibrzo29bOLSBcH1KZJvRNh5qtd+fcYIGiIUia8Jw5r1lQ==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-s390x@0.18.10: - resolution: {integrity: sha512-NLuSKcp8WckjD2a7z5kzLiCywFwBTMlIxDNuud1AUGVuwBBJSkuubp6cNjJ0p5c6CZaA3QqUGwjHJBiG1SoOFw==} + /@esbuild/linux-s390x@0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.19: + resolution: {integrity: sha512-q1V1rtHRojAzjSigZEqrcLkpfh5K09ShCoIsdTakozVBnM5rgV58PLFticqDp5UJ9uE0HScov9QNbbl8HBo6QQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-x64@0.18.10: - resolution: {integrity: sha512-wj2KRsCsFusli+6yFgNO/zmmLslislAWryJnodteRmGej7ZzinIbMdsyp13rVGde88zxJd5vercNYK9kuvlZaQ==} + /@esbuild/linux-x64@0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.19: + resolution: {integrity: sha512-D0IiYjpZRXxGZLQfsydeAD7ZWqdGyFLBj5f2UshJpy09WPs3qizDCsEr8zyzcym6Woj/UI9ZzMIXwvoXVtyt0A==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/netbsd-x64@0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true optional: true - /@esbuild/netbsd-x64@0.18.10: - resolution: {integrity: sha512-pQ9QqxEPI3cVRZyUtCoZxhZK3If+7RzR8L2yz2+TDzdygofIPOJFaAPkEJ5rYIbUO101RaiYxfdOBahYexLk5A==} + /@esbuild/netbsd-x64@0.18.19: + resolution: {integrity: sha512-3tt3SOS8L3D54R8oER41UdDshlBIAjYhdWRPiZCTZ1E41+shIZBpTjaW5UaN/jD1ENE/Ok5lkeqhoNMbxstyxw==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] requiresBuild: true optional: true - /@esbuild/openbsd-x64@0.18.10: - resolution: {integrity: sha512-k8GTIIW9I8pEEfoOUm32TpPMgSg06JhL5DO+ql66aLTkOQUs0TxCA67Wi7pv6z8iF8STCGcNbm3UWFHLuci+ag==} + /@esbuild/openbsd-x64@0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.19: + resolution: {integrity: sha512-MxbhcuAYQPlfln1EMc4T26OUoeg/YQc6wNoEV8xvktDKZhLtBxjkoeESSo9BbPaGKhAPzusXYj5n8n5A8iZSrA==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] requiresBuild: true optional: true - /@esbuild/sunos-x64@0.18.10: - resolution: {integrity: sha512-vIGYJIdEI6d4JBucAx8py792G8J0GP40qSH+EvSt80A4zvGd6jph+5t1g+eEXcS2aRpgZw6CrssNCFZxTdEsxw==} + /@esbuild/sunos-x64@0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.19: + resolution: {integrity: sha512-m0/UOq1wj25JpWqOJxoWBRM9VWc3c32xiNzd+ERlYstUZ6uwx5SZsQUtkiFHaYmcaoj+f6+Tfcl7atuAz3idwQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] requiresBuild: true optional: true - /@esbuild/win32-arm64@0.18.10: - resolution: {integrity: sha512-kRhNcMZFGMW+ZHCarAM1ypr8OZs0k688ViUCetVCef9p3enFxzWeBg9h/575Y0nsFu0ZItluCVF5gMR2pwOEpA==} + /@esbuild/win32-arm64@0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.19: + resolution: {integrity: sha512-L4vb6pcoB1cEcXUHU6EPnUhUc4+/tcz4OqlXTWPcSQWxegfmcOprhmIleKKwmMNQVc4wrx/+jB7tGkjjDmiupg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@esbuild/win32-ia32@0.18.10: - resolution: {integrity: sha512-AR9PX1whYaYh9p0EOaKna0h48F/A101Mt/ag72+kMkkBZXPQ7cjbz2syXI/HI3OlBdUytSdHneljfjvUoqwqiQ==} + /@esbuild/win32-ia32@0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.19: + resolution: {integrity: sha512-rQng7LXSKdrDlNDb7/v0fujob6X0GAazoK/IPd9C3oShr642ri8uIBkgM37/l8B3Rd5sBQcqUXoDdEy75XC/jg==} engines: {node: '>=12'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@esbuild/win32-x64@0.18.10: - resolution: {integrity: sha512-5sTkYhAGHNRr6bVf4RM0PsscqVr6/DBYdrlMh168oph3usid3lKHcHEEHmr34iZ9GHeeg2juFOxtpl6XyC3tpw==} + /@esbuild/win32-x64@0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.19: + resolution: {integrity: sha512-z69jhyG20Gq4QL5JKPLqUT+eREuqnDAFItLbza4JCmpvUnIlY73YNjd5djlO7kBiiZnvTnJuAbOjIoZIOa1GjA==} engines: {node: '>=12'} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.44.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.44.0 - eslint-visitor-keys: 3.4.1 + eslint: 8.47.0 + eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.5.1: - resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} + /@eslint-community/regexpp@4.6.2: + resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@2.1.0: - resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.6.0 + espree: 9.6.1 globals: 13.20.0 ignore: 5.2.4 import-fresh: 3.3.0 @@ -2219,8 +2479,8 @@ packages: - supports-color dev: true - /@eslint/js@8.44.0: - resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} + /@eslint/js@8.47.0: + resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -2229,12 +2489,12 @@ packages: dependencies: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) - fast-uri: 2.1.0 + fast-uri: 2.2.0 dev: false - /@fastify/busboy@1.1.0: - resolution: {integrity: sha512-Fv854f94v0CzIDllbY3i/0NJPNBRNLDawf3BTYVGCe9VrIIs3Wi7AFx24F9NzCxdf0wyx/x0Q9kEVnvDOPnlxA==} - engines: {node: '>=10.17.0'} + /@fastify/busboy@1.2.1: + resolution: {integrity: sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==} + engines: {node: '>=14'} dependencies: text-decoding: 1.0.0 dev: false @@ -2242,12 +2502,12 @@ packages: /@fastify/cors@8.3.0: resolution: {integrity: sha512-oj9xkka2Tg0MrwuKhsSUumcAkfp2YCnKxmFEusi01pjk1YrdDsuSYTHXEelWNW+ilSy/ApZq0c2SvhKrLX0H1g==} dependencies: - fastify-plugin: 4.3.0 + fastify-plugin: 4.5.1 mnemonist: 0.39.5 dev: false - /@fastify/deepmerge@1.1.0: - resolution: {integrity: sha512-E8Hfdvs1bG6u0N4vN5Nty6JONUfTdOciyD5rn8KnEsLKIenvOVcr210BQR9t34PRkNyjqnMLGk3e0BsaxRdL+g==} + /@fastify/deepmerge@1.3.0: + resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} dev: false /@fastify/error@3.3.0: @@ -2257,43 +2517,77 @@ packages: /@fastify/fast-json-stringify-compiler@4.3.0: resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} dependencies: - fast-json-stringify: 5.7.0 + fast-json-stringify: 5.8.0 dev: false /@fastify/formbody@7.4.0: resolution: {integrity: sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og==} dependencies: - fast-querystring: 1.0.0 - fastify-plugin: 4.3.0 + fast-querystring: 1.1.2 + fastify-plugin: 4.5.1 dev: false /@fastify/middie@8.3.0: resolution: {integrity: sha512-h+zBxCzMlkEkh4fM7pZaSGzqS7P9M0Z6rXnWPdUEPfe7x1BCj++wEk/pQ5jpyYY4pF8AknFqb77n7uwh8HdxEA==} dependencies: '@fastify/error': 3.3.0 - fastify-plugin: 4.3.0 + fastify-plugin: 4.5.1 path-to-regexp: 6.2.1 reusify: 1.0.4 dev: false - /@formatjs/ecma402-abstract@1.11.4: - resolution: {integrity: sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==} + /@floating-ui/core@1.4.1: + resolution: {integrity: sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==} dependencies: - '@formatjs/intl-localematcher': 0.2.25 - tslib: 2.6.0 + '@floating-ui/utils': 0.1.1 dev: false - /@formatjs/ecma402-abstract@1.13.0: - resolution: {integrity: sha512-CQ8Ykd51jYD1n05dtoX6ns6B9n/+6ZAxnWUAonvHC4kkuAemROYBhHkEB4tm1uVrRlE7gLDqXkAnY51Y0pRCWQ==} + /@floating-ui/dom@1.5.1: + resolution: {integrity: sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==} dependencies: - '@formatjs/intl-localematcher': 0.2.31 - tslib: 2.4.0 + '@floating-ui/core': 1.4.1 + '@floating-ui/utils': 0.1.1 + dev: false + + /@floating-ui/react-dom@2.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@floating-ui/utils@0.1.1: + resolution: {integrity: sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==} + dev: false + + /@formatjs/ecma402-abstract@1.11.4: + resolution: {integrity: sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==} + dependencies: + '@formatjs/intl-localematcher': 0.2.25 + tslib: 2.6.1 + dev: false + + /@formatjs/ecma402-abstract@1.17.0: + resolution: {integrity: sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==} + dependencies: + '@formatjs/intl-localematcher': 0.4.0 + tslib: 2.6.1 dev: false /@formatjs/fast-memoize@1.2.1: resolution: {integrity: sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==} dependencies: - tslib: 2.6.0 + tslib: 2.6.1 + dev: false + + /@formatjs/fast-memoize@2.2.0: + resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} + dependencies: + tslib: 2.6.1 dev: false /@formatjs/icu-messageformat-parser@2.1.0: @@ -2301,32 +2595,47 @@ packages: dependencies: '@formatjs/ecma402-abstract': 1.11.4 '@formatjs/icu-skeleton-parser': 1.3.6 - tslib: 2.6.0 + tslib: 2.6.1 + dev: false + + /@formatjs/icu-messageformat-parser@2.6.0: + resolution: {integrity: sha512-yT6at0qc0DANw9qM/TU8RZaCtfDXtj4pZM/IC2WnVU80yAcliS3KVDiuUt4jSQAeFL9JS5bc2hARnFmjPdA6qw==} + dependencies: + '@formatjs/ecma402-abstract': 1.17.0 + '@formatjs/icu-skeleton-parser': 1.6.0 + tslib: 2.6.1 dev: false /@formatjs/icu-skeleton-parser@1.3.6: resolution: {integrity: sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==} dependencies: '@formatjs/ecma402-abstract': 1.11.4 - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@formatjs/intl-localematcher@0.2.25: - resolution: {integrity: sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==} + /@formatjs/icu-skeleton-parser@1.6.0: + resolution: {integrity: sha512-eMmxNpoX/J1IPUjPGSZwo0Wh+7CEvdEMddP2Jxg1gQJXfGfht/FdW2D5XDFj3VMbOTUQlDIdZJY7uC6O6gjPoA==} dependencies: - tslib: 2.6.0 + '@formatjs/ecma402-abstract': 1.17.0 + tslib: 2.6.1 dev: false - /@formatjs/intl-localematcher@0.2.31: - resolution: {integrity: sha512-9QTjdSBpQ7wHShZgsNzNig5qT3rCPvmZogS/wXZzKotns5skbXgs0I7J8cuN0PPqXyynvNVuN+iOKhNS2eb+ZA==} + /@formatjs/intl-localematcher@0.2.25: + resolution: {integrity: sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==} dependencies: - tslib: 2.4.0 + tslib: 2.6.1 dev: false /@formatjs/intl-localematcher@0.2.32: resolution: {integrity: sha512-k/MEBstff4sttohyEpXxCmC3MqbUn9VvHGlZ8fauLzkbwXmVrEeyzS+4uhrvAk9DWU9/7otYWxyDox4nT/KVLQ==} dependencies: - tslib: 2.6.0 + tslib: 2.6.1 + dev: false + + /@formatjs/intl-localematcher@0.4.0: + resolution: {integrity: sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==} + dependencies: + tslib: 2.6.1 dev: false /@humanwhocodes/config-array@0.11.10: @@ -2358,6 +2667,54 @@ packages: resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} dev: true + /@iconify-json/ri@1.1.12: + resolution: {integrity: sha512-s5VsyMWYuUuTB5bATJRoDQKGqo6W0dsxvOBrJI/P2H9QI7IAaAWl8zHxseSjoUGG6AwZwWwDMW9YPULPt+vA6w==} + dependencies: + '@iconify/types': 2.0.0 + dev: false + + /@iconify/types@2.0.0: + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + dev: false + + /@iconify/utils@2.1.7: + resolution: {integrity: sha512-P8S3z/L1LcV4Qem9AoCfVAaTFGySEMzFEY4CHZLkfRj0Fv9LiR+AwjDgrDrzyI93U2L2mg9JHsbTJ52mF8suNw==} + dependencies: + '@antfu/install-pkg': 0.1.1 + '@antfu/utils': 0.7.5 + '@iconify/types': 2.0.0 + debug: 4.3.4 + kolorist: 1.8.0 + local-pkg: 0.4.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@internationalized/date@3.4.0: + resolution: {integrity: sha512-QUDSGCsvrEVITVf+kv9VSAraAmCgjQmU5CiXtesUBBhBe374NmnEIIaOFBZ72t29dfGMBP0zF+v6toVnbcc6jg==} + dependencies: + '@swc/helpers': 0.5.1 + dev: false + + /@internationalized/message@3.1.1: + resolution: {integrity: sha512-ZgHxf5HAPIaR0th+w0RUD62yF6vxitjlprSxmLJ1tam7FOekqRSDELMg4Cr/DdszG5YLsp5BG3FgHgqquQZbqw==} + dependencies: + '@swc/helpers': 0.5.1 + intl-messageformat: 10.5.0 + dev: false + + /@internationalized/number@3.2.1: + resolution: {integrity: sha512-hK30sfBlmB1aIe3/OwAPg9Ey0DjjXvHEiGVhNaOiBJl31G0B6wMaX8BN3ibzdlpyRNE9p7X+3EBONmxtJO9Yfg==} + dependencies: + '@swc/helpers': 0.5.1 + dev: false + + /@internationalized/string@3.1.1: + resolution: {integrity: sha512-fvSr6YRoVPgONiVIUhgCmIAlifMVCeej/snPZVzbzRPxGpHl3o1GRe+d/qh92D8KhgOciruDUH8I5mjdfdjzfA==} + dependencies: + '@swc/helpers': 0.5.1 + dev: false + /@ioredis/commands@1.2.0: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} dev: false @@ -2368,38 +2725,46 @@ packages: dependencies: string-width: 5.1.2 string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 strip-ansi-cjs: /strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true - /@jridgewell/gen-mapping@0.3.2: - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} - /@jridgewell/source-map@0.3.3: - resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - /@jridgewell/trace-mapping@0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 @@ -2407,8 +2772,13 @@ packages: /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@ljharb/through@2.3.9: + resolution: {integrity: sha512-yN599ZBuMPPK4tdoToLlvgJB4CLK8fGl7ntfy0Wn7U6ttNvHYurd81bfUiK/6sMkiIwm65R6ck4L6+Y3DfVbNQ==} + engines: {node: '>= 0.4'} + dev: true /@lukeed/csprng@1.1.0: resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} @@ -2428,55 +2798,55 @@ packages: got: 11.8.6 os-filter-obj: 2.0.0 - /@msgpackr-extract/msgpackr-extract-darwin-arm64@2.1.2: - resolution: {integrity: sha512-TyVLn3S/+ikMDsh0gbKv2YydKClN8HaJDDpONlaZR+LVJmsxLFUgA+O7zu59h9+f9gX1aj/ahw9wqa6rosmrYQ==} + /@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2: + resolution: {integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==} cpu: [arm64] os: [darwin] requiresBuild: true dev: false optional: true - /@msgpackr-extract/msgpackr-extract-darwin-x64@2.1.2: - resolution: {integrity: sha512-YPXtcVkhmVNoMGlqp81ZHW4dMxK09msWgnxtsDpSiZwTzUBG2N+No2bsr7WMtBKCVJMSD6mbAl7YhKUqkp/Few==} + /@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2: + resolution: {integrity: sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==} cpu: [x64] os: [darwin] requiresBuild: true dev: false optional: true - /@msgpackr-extract/msgpackr-extract-linux-arm64@2.1.2: - resolution: {integrity: sha512-vHZ2JiOWF2+DN9lzltGbhtQNzDo8fKFGrf37UJrgqxU0yvtERrzUugnfnX1wmVfFhSsF8OxrfqiNOUc5hko1Zg==} + /@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2: + resolution: {integrity: sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==} cpu: [arm64] os: [linux] requiresBuild: true dev: false optional: true - /@msgpackr-extract/msgpackr-extract-linux-arm@2.1.2: - resolution: {integrity: sha512-42R4MAFeIeNn+L98qwxAt360bwzX2Kf0ZQkBBucJ2Ircza3asoY4CDbgiu9VWklq8gWJVSJSJBwDI+c/THiWkA==} + /@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2: + resolution: {integrity: sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==} cpu: [arm] os: [linux] requiresBuild: true dev: false optional: true - /@msgpackr-extract/msgpackr-extract-linux-x64@2.1.2: - resolution: {integrity: sha512-RjRoRxg7Q3kPAdUSC5EUUPlwfMkIVhmaRTIe+cqHbKrGZ4M6TyCA/b5qMaukQ/1CHWrqYY2FbKOAU8Hg0pQFzg==} + /@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2: + resolution: {integrity: sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==} cpu: [x64] os: [linux] requiresBuild: true dev: false optional: true - /@msgpackr-extract/msgpackr-extract-win32-x64@2.1.2: - resolution: {integrity: sha512-rIZVR48zA8hGkHIK7ED6+ZiXsjRCcAVBJbm8o89OKAMTmEAQ2QvoOxoiu3w2isAaWwzgtQIOFIqHwvZDyLKCvw==} + /@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2: + resolution: {integrity: sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==} cpu: [x64] os: [win32] requiresBuild: true dev: false optional: true - /@nestjs/axios@3.0.0(@nestjs/common@10.0.5)(axios@1.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + /@nestjs/axios@3.0.0(@nestjs/common@10.2.1)(axios@1.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): resolution: {integrity: sha512-ULdH03jDWkS5dy9X69XbUVbhC+0pVnrRcj7bIK/ytTZ76w7CgvTZDJqsIyisg3kNOiljRW/4NIjSf3j6YGvl+g==} peerDependencies: '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -2484,39 +2854,39 @@ packages: reflect-metadata: ^0.1.12 rxjs: ^6.0.0 || ^7.0.0 dependencies: - '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) axios: 1.4.0 reflect-metadata: 0.1.13 rxjs: 7.8.1 dev: false - /@nestjs/bull-shared@10.0.1(@nestjs/common@10.0.5)(@nestjs/core@10.0.5): + /@nestjs/bull-shared@10.0.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1): resolution: {integrity: sha512-8Td36l2i5x9+iQWjPB5Bd5+6u5Eangb5DclNcwrdwKqvd28xE92MSW97P4JV52C2kxrTjZwx8ck/wObAwtpQPw==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 dependencies: - '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) tslib: 2.6.0 dev: false - /@nestjs/bull@10.0.1(@nestjs/common@10.0.5)(@nestjs/core@10.0.5)(bull@4.10.4): + /@nestjs/bull@10.0.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(bull@4.11.3): resolution: {integrity: sha512-1GcJ8BkHDgQdBMZ7SqAqgUHiFnISXmpGvewFeTc8wf87JLk2PweiKv9j9/KQKU+NI237pCe82XB0bXzTnsdxSw==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 bull: ^3.3 || ^4.0.0 dependencies: - '@nestjs/bull-shared': 10.0.1(@nestjs/common@10.0.5)(@nestjs/core@10.0.5) - '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) - bull: 4.10.4 + '@nestjs/bull-shared': 10.0.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1) + '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + bull: 4.11.3 tslib: 2.6.0 dev: false - /@nestjs/cli@10.1.8(@swc/cli@0.1.62)(@swc/core@1.3.68)(esbuild@0.18.10): - resolution: {integrity: sha512-ge9NQdnDKc9ANKA+1xEckOWgGe3bnuWhQagpnhrspV0lMi+LZm6a0XF8ptVdJB3Ghclbfdh+1XF5XlieIcbVRw==} + /@nestjs/cli@10.1.14(@swc/cli@0.1.62)(@swc/core@1.3.78)(esbuild@0.18.19): + resolution: {integrity: sha512-oxfoebzrq6g+MKc6FRx2O8D86Vk0ViEmlP4B1E3dzwC3X5yjxlA1IDulLrVz3VIpGjuyuXmrQjjd8l0NUVZiKg==} engines: {node: '>= 16'} hasBin: true peerDependencies: @@ -2528,18 +2898,18 @@ packages: '@swc/core': optional: true dependencies: - '@angular-devkit/core': 16.1.3(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.3(chokidar@3.5.3) - '@angular-devkit/schematics-cli': 16.1.3(chokidar@3.5.3) - '@nestjs/schematics': 10.0.1(chokidar@3.5.3)(typescript@5.1.6) - '@swc/cli': 0.1.62(@swc/core@1.3.68) - '@swc/core': 1.3.68 + '@angular-devkit/core': 16.2.0(chokidar@3.5.3) + '@angular-devkit/schematics': 16.2.0(chokidar@3.5.3) + '@angular-devkit/schematics-cli': 16.2.0(chokidar@3.5.3) + '@nestjs/schematics': 10.0.2(chokidar@3.5.3)(typescript@5.1.6) + '@swc/cli': 0.1.62(@swc/core@1.3.78) + '@swc/core': 1.3.78 chalk: 4.1.2 chokidar: 3.5.3 cli-table3: 0.6.3 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.1.6)(webpack@5.88.1) - inquirer: 8.2.5 + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.1.6)(webpack@5.88.2) + inquirer: 8.2.6 node-emoji: 1.11.0 ora: 5.4.1 os-name: 4.0.1 @@ -2548,9 +2918,9 @@ packages: source-map-support: 0.5.21 tree-kill: 1.2.2 tsconfig-paths: 4.2.0 - tsconfig-paths-webpack-plugin: 4.0.1 + tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.1.6 - webpack: 5.88.1(@swc/core@1.3.68)(esbuild@0.18.10) + webpack: 5.88.2(@swc/core@1.3.78)(esbuild@0.18.19) webpack-node-externals: 3.0.0 transitivePeerDependencies: - esbuild @@ -2558,8 +2928,8 @@ packages: - webpack-cli dev: false - /@nestjs/common@10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-0E+SBI+SKswXbFG+Nwtnctrei5dvdFJ7b9/fQDL6KzDBtZwsglJpD86S3ooxnc7ek4vRG57oN2iLmMTjrcesMg==} + /@nestjs/common@10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-zo5OQbNmchV58SHw4vBCLIbsCrpZmNuW9W4m5BE1lB+9FW9ZiLQeZjIxzlL3bEKiI9cezRvDhct/53LPS8R4aA==} peerDependencies: class-transformer: '*' class-validator: '*' @@ -2576,12 +2946,12 @@ packages: iterare: 1.2.1 reflect-metadata: 0.1.13 rxjs: 7.8.1 - tslib: 2.6.0 + tslib: 2.6.1 uid: 2.0.2 dev: false - /@nestjs/core@10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-9A8nixBfE33TWAmmWvNoxdmHrRmHJY0oO3O4Iue0FVkawWJc0YOhSqdNs87McwvKE4InJMI7GVv01NYMEROdPA==} + /@nestjs/core@10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-oH1jmCrVUkBkbeiEzAaYZ5unddn5bW/Id15pPGblYeLGAmfjXW9+G5VCffoGpO1DxBZdZu5/qcXTYyCR6rgXTg==} requiresBuild: true peerDependencies: '@nestjs/common': ^10.0.0 @@ -2598,20 +2968,20 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 path-to-regexp: 3.2.0 reflect-metadata: 0.1.13 rxjs: 7.8.1 - tslib: 2.6.0 + tslib: 2.6.1 uid: 2.0.2 transitivePeerDependencies: - encoding dev: false - /@nestjs/mapped-types@2.0.2(@nestjs/common@10.0.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): + /@nestjs/mapped-types@2.0.2(@nestjs/common@10.2.1)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): resolution: {integrity: sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -2624,17 +2994,17 @@ packages: class-validator: optional: true dependencies: - '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) class-transformer: 0.5.1 class-validator: 0.14.0 reflect-metadata: 0.1.13 dev: false - /@nestjs/platform-fastify@10.0.5(@nestjs/common@10.0.5)(@nestjs/core@10.0.5): - resolution: {integrity: sha512-kkQetzDuLmDWpC2uw14P+XGxANLfQ2dAxJ6GHoZ+rEN+TYUppV1EzKLX7rXfLlQgm+EM2WSvEvFuScmcw+gHLA==} + /@nestjs/platform-fastify@10.2.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1): + resolution: {integrity: sha512-ROY2K5Rl1ADYAx8JfOwZDNXrS0TYOCFmWUx9lhfgpUV7ppWfMrA1tV0Kjo+SDSwMpExXbLcNRwVzNCsLTqH/Lg==} peerDependencies: '@fastify/static': ^6.0.0 - '@fastify/view': ^7.0.0 + '@fastify/view': ^7.0.0 || ^8.0.0 '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 peerDependenciesMeta: @@ -2646,37 +3016,37 @@ packages: '@fastify/cors': 8.3.0 '@fastify/formbody': 7.4.0 '@fastify/middie': 8.3.0 - '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) - fastify: 4.19.1 + '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + fastify: 4.21.0 light-my-request: 5.10.0 path-to-regexp: 3.2.0 - tslib: 2.6.0 + tslib: 2.6.1 transitivePeerDependencies: - supports-color dev: false - /@nestjs/schedule@3.0.1(@nestjs/common@10.0.5)(@nestjs/core@10.0.5)(reflect-metadata@0.1.13): - resolution: {integrity: sha512-4CAFu4rE/QPYnz/icRg3GiuLmY1bXopG8bWTJ9d7bXzaHBaPKIjGvZ20wsK8P+MncrVCkmK0iYhQrNj0cwX9+A==} + /@nestjs/schedule@3.0.3(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-xsMA4dmP3LcW3rt2iMPfm88bDbCj/hLuDsLrKmJQlbnxyCYtBwLtmu/4cSfZELLM7pTDT+E8QDAqGwhYyUUjxg==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 reflect-metadata: ^0.1.12 dependencies: - '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) - cron: 2.3.1 + '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + cron: 2.4.1 reflect-metadata: 0.1.13 uuid: 9.0.0 dev: false - /@nestjs/schematics@10.0.1(chokidar@3.5.3)(typescript@5.1.6): - resolution: {integrity: sha512-buxpYtSwOmWyf0nUJWJCkCkYITwbOfIEKHTnGS7sDbcfaajrOFXb5pPAGD2E1CUb3C1+NkQIURPKzs0IouZTQg==} + /@nestjs/schematics@10.0.2(chokidar@3.5.3)(typescript@5.1.6): + resolution: {integrity: sha512-DaZZjymYoIfRqC5W62lnYXIIods1PDY6CGc8+IpRwyinzffjKxZ3DF3exu+mdyvllzkXo9DTXkoX4zOPSJHCkw==} peerDependencies: typescript: '>=4.8.2' dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) + '@angular-devkit/core': 16.1.8(chokidar@3.5.3) + '@angular-devkit/schematics': 16.1.8(chokidar@3.5.3) comment-json: 4.2.3 jsonc-parser: 3.2.0 pluralize: 8.0.0 @@ -2685,8 +3055,8 @@ packages: - chokidar dev: false - /@nestjs/swagger@7.1.1(@nestjs/common@10.0.5)(@nestjs/core@10.0.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): - resolution: {integrity: sha512-gIG1aVCegZlIppXZizKHqWkqZvQkvptTBR1C5CzZoDwGoVVKJBmJ2i9FAcsnzzb0j7hncFKhcBuWYOBJOsCvug==} + /@nestjs/swagger@7.1.8(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-Jpl3laGAqvyWccc3auLU0mMjl5hJ2kqzzDb63ynJi5NMbFlgBwrR8FCGBVstSsqL9YSJWLR4L1BZzVmVExcY+g==} peerDependencies: '@fastify/static': ^6.0.0 '@nestjs/common': ^9.0.0 || ^10.0.0 @@ -2702,34 +3072,34 @@ packages: class-validator: optional: true dependencies: - '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/mapped-types': 2.0.2(@nestjs/common@10.0.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/mapped-types': 2.0.2(@nestjs/common@10.2.1)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) class-transformer: 0.5.1 class-validator: 0.14.0 js-yaml: 4.1.0 lodash: 4.17.21 path-to-regexp: 3.2.0 reflect-metadata: 0.1.13 - swagger-ui-dist: 5.1.0 + swagger-ui-dist: 5.3.1 dev: false - /@next-auth/prisma-adapter@1.0.7(@prisma/client@5.0.0)(next-auth@4.22.1): + /@next-auth/prisma-adapter@1.0.7(@prisma/client@5.2.0)(next-auth@4.23.1): resolution: {integrity: sha512-Cdko4KfcmKjsyHFrWwZ//lfLUbcLqlyFqjd/nYE2m3aZ7tjMNUjpks47iw7NTCnXf+5UWz5Ypyt1dSs1EP5QJw==} peerDependencies: '@prisma/client': '>=2.26.0 || >=3' next-auth: ^4 dependencies: - '@prisma/client': 5.0.0(prisma@5.0.0) - next-auth: 4.22.1(next@13.4.9)(nodemailer@6.9.3)(react-dom@18.2.0)(react@18.2.0) + '@prisma/client': 5.2.0(prisma@5.2.0) + next-auth: 4.23.1(next@13.4.19)(nodemailer@6.9.4)(react-dom@18.2.0)(react@18.2.0) dev: false - /@next/env@13.4.9: - resolution: {integrity: sha512-vuDRK05BOKfmoBYLNi2cujG2jrYbEod/ubSSyqgmEx9n/W3eZaJQdRNhTfumO+qmq/QTzLurW487n/PM/fHOkw==} + /@next/env@13.4.19: + resolution: {integrity: sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ==} dev: false - /@next/swc-darwin-arm64@13.4.9: - resolution: {integrity: sha512-TVzGHpZoVBk3iDsTOQA/R6MGmFp0+17SWXMEWd6zG30AfuELmSSMe2SdPqxwXU0gbpWkJL1KgfLzy5ReN0crqQ==} + /@next/swc-darwin-arm64@13.4.19: + resolution: {integrity: sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -2737,8 +3107,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@13.4.9: - resolution: {integrity: sha512-aSfF1fhv28N2e7vrDZ6zOQ+IIthocfaxuMWGReB5GDriF0caTqtHttAvzOMgJgXQtQx6XhyaJMozLTSEXeNN+A==} + /@next/swc-darwin-x64@13.4.19: + resolution: {integrity: sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -2746,8 +3116,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@13.4.9: - resolution: {integrity: sha512-JhKoX5ECzYoTVyIy/7KykeO4Z2lVKq7HGQqvAH+Ip9UFn1MOJkOnkPRB7v4nmzqAoY+Je05Aj5wNABR1N18DMg==} + /@next/swc-linux-arm64-gnu@13.4.19: + resolution: {integrity: sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -2755,8 +3125,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@13.4.9: - resolution: {integrity: sha512-OOn6zZBIVkm/4j5gkPdGn4yqQt+gmXaLaSjRSO434WplV8vo2YaBNbSHaTM9wJpZTHVDYyjzuIYVEzy9/5RVZw==} + /@next/swc-linux-arm64-musl@13.4.19: + resolution: {integrity: sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -2764,8 +3134,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@13.4.9: - resolution: {integrity: sha512-iA+fJXFPpW0SwGmx/pivVU+2t4zQHNOOAr5T378PfxPHY6JtjV6/0s1vlAJUdIHeVpX98CLp9k5VuKgxiRHUpg==} + /@next/swc-linux-x64-gnu@13.4.19: + resolution: {integrity: sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -2773,8 +3143,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@13.4.9: - resolution: {integrity: sha512-rlNf2WUtMM+GAQrZ9gMNdSapkVi3koSW3a+dmBVp42lfugWVvnyzca/xJlN48/7AGx8qu62WyO0ya1ikgOxh6A==} + /@next/swc-linux-x64-musl@13.4.19: + resolution: {integrity: sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -2782,8 +3152,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@13.4.9: - resolution: {integrity: sha512-5T9ybSugXP77nw03vlgKZxD99AFTHaX8eT1ayKYYnGO9nmYhJjRPxcjU5FyYI+TdkQgEpIcH7p/guPLPR0EbKA==} + /@next/swc-win32-arm64-msvc@13.4.19: + resolution: {integrity: sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -2791,8 +3161,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@13.4.9: - resolution: {integrity: sha512-ojZTCt1lP2ucgpoiFgrFj07uq4CZsq4crVXpLGgQfoFq00jPKRPgesuGPaz8lg1yLfvafkU3Jd1i8snKwYR3LA==} + /@next/swc-win32-ia32-msvc@13.4.19: + resolution: {integrity: sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -2800,8 +3170,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@13.4.9: - resolution: {integrity: sha512-QbT03FXRNdpuL+e9pLnu+XajZdm/TtIXVYY4lA9t+9l0fLZbHXDYEKitAqxrOj37o3Vx5ufxiRAniaIebYDCgw==} + /@next/swc-win32-x64-msvc@13.4.19: + resolution: {integrity: sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2809,402 +3179,2879 @@ packages: dev: false optional: true - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + /@nextui-org/accordion@2.0.16(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-fZQwqEokL0eAF03HEiz9SuzwdoqMtGMhkNwPUJ37NuaGg2S6q0kaaHPceIRTIfXYoiIR3EoKqojr/V5lB9x+lg==} + peerDependencies: + framer-motion: '>=4.0.0' + react: '>=18' dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@nextui-org/aria-utils': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/divider': 2.0.13(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/framer-transitions': 2.0.5(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-icons': 2.0.3(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-aria-accordion-item': 2.0.3(react@18.2.0) + '@react-aria/accordion': 3.0.0-alpha.20(react@18.2.0) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/tree': 3.7.1(react@18.2.0) + '@react-types/accordion': 3.0.0-alpha.15(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + /@nextui-org/aria-utils@2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-pbfSGjQeGQoWMVHE9iCOPq2MSLPa2AIZwazdBO1QKyzfXGRCoJ6FM1zX+EvBrax/8+6DtZb9bZ6UzICr5ZLvVw==} + peerDependencies: + react: '>=18' dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.13.0 + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false - /@npmcli/config@6.2.1: - resolution: {integrity: sha512-Cj/OrSbrLvnwWuzquFCDTwFN8QmR+SWH6qLNCBttUreDkKM5D5p36SeSMbcEUiCGdwjUrVy2yd8C0REwwwDPEw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /@nextui-org/avatar@2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-7HPB3VesRDcXgR9iQVXPR0ruNvIe57cxv1iTym1PeI+eTHna7s2UhIxas6Ao85hOeHBrzC7BY8KVT8fTDxZ0Fw==} + peerDependencies: + react: '>=18' dependencies: - '@npmcli/map-workspaces': 3.0.4 - ci-info: 3.8.0 - ini: 4.1.1 - nopt: 7.2.0 - proc-log: 3.0.0 - read-package-json-fast: 3.0.2 - semver: 7.5.3 - walk-up-path: 3.0.1 - dev: true + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-image': 2.0.2(react@18.2.0) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false - /@npmcli/fs@3.1.0: - resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /@nextui-org/badge@2.0.12(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-FRWIqleKT82kyiZ+q5w8RCuc2+dCXZc9U8cYumFCqGUOm4ynEkR7nw5f1TvVbQag79O2pLbK60xSvxnAzestWQ==} + peerDependencies: + react: '>=18' dependencies: - semver: 7.5.3 - dev: true + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + react: 18.2.0 + transitivePeerDependencies: + - tailwindcss + dev: false - /@npmcli/git@4.1.0: - resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /@nextui-org/button@2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-5ZmuLbrKxrFasKcZaK9+9AmrRUZg9H0O0ohhyWxSOlCyKlcZuxI597MNmNwk/hTuftjFjakyEwMs6DWt9TFBRg==} + peerDependencies: + react: '>=18' dependencies: - '@npmcli/promise-spawn': 6.0.2 - lru-cache: 7.18.3 - npm-pick-manifest: 8.0.1 - proc-log: 3.0.0 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.5.3 - which: 3.0.1 + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/ripple': 2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/spinner': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-aria-button': 2.0.3(react@18.2.0) + '@react-aria/button': 3.8.1(react@18.2.0) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 transitivePeerDependencies: - - bluebird - dev: true + - framer-motion + - react-dom + - tailwindcss + dev: false - /@npmcli/installed-package-contents@2.0.2: - resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + /@nextui-org/card@2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-P4zH6DQ8rOkntUQw2AfwXzfBrz/zmFW7a9pw2+Y0onlC2B+2D6ki+2nQ6wkQw7SNIFPMbP4CApIGKsnTVsfh/g==} + peerDependencies: + react: '>=18' dependencies: - npm-bundled: 3.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/ripple': 2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-aria-button': 2.0.3(react@18.2.0) + '@react-aria/button': 3.8.1(react@18.2.0) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - framer-motion + - react-dom + - tailwindcss + dev: false - /@npmcli/map-workspaces@3.0.4: - resolution: {integrity: sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /@nextui-org/checkbox@2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-zCSY/X92lEm0Ox6FHLOpZqpsQRS081Mw7/u43lycK8dkIbkWsG40qQ2PLF7kM8un0+A5ZlDdoQnJl12Jrl3jCQ==} + peerDependencies: + react: '>=18' dependencies: - '@npmcli/name-from-folder': 2.0.0 - glob: 10.3.1 - minimatch: 9.0.2 - read-package-json-fast: 3.0.2 - dev: true - - /@npmcli/name-from-folder@2.0.0: - resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /@npmcli/node-gyp@3.0.0: - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@react-aria/checkbox': 3.10.0(react@18.2.0) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-stately/checkbox': 3.4.4(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false - /@npmcli/promise-spawn@6.0.2: - resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /@nextui-org/chip@2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-W3NS/RZxKHFKstNJYv7V2zd7nUGSlGiVtCGTFkuoTkHeTJcor4u4aAylTuY3/rxjoyl9wDREpaX4NZrOZx4rRQ==} + peerDependencies: + react: '>=18' dependencies: - which: 3.0.1 - dev: true + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-icons': 2.0.3(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false - /@npmcli/run-script@6.0.2: - resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /@nextui-org/code@2.0.12(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-X5vClH6qs7l4xXzOybo6DMG93MA8paGnVdS/uWdXoUtZTtHBqjir9CkvF7b4NKvuTD20oRu4EZ42wTS8r3Lr0Q==} + peerDependencies: + react: '>=18' dependencies: - '@npmcli/node-gyp': 3.0.0 - '@npmcli/promise-spawn': 6.0.2 - node-gyp: 9.4.0 - read-package-json-fast: 3.0.2 - which: 3.0.1 + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + react: 18.2.0 transitivePeerDependencies: - - supports-color - dev: true + - tailwindcss + dev: false - /@nuxtjs/opencollective@0.3.2: - resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true + /@nextui-org/divider@2.0.13(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-l4f/rmqBl2e9zVM20TP7vgWJ2/LrNunYt5NHZuxXHERuuznKdNVv3Q496zAU5wLJ1S3GE3+H4cw3K7bRG2MiRQ==} + peerDependencies: + react: '>=18' dependencies: - chalk: 4.1.2 - consola: 2.15.3 - node-fetch: 2.6.7 + '@nextui-org/react-rsc-utils': 2.0.7 + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 transitivePeerDependencies: - - encoding + - tailwindcss dev: false - /@octokit/auth-token@3.0.2: - resolution: {integrity: sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q==} - engines: {node: '>= 14'} + /@nextui-org/dropdown@2.1.3(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-ira40ZjOIWIbFE6s0cUgEIsSmVYN1X44vZN32/qTyY+YckWDRcqcVrLz7lBDkJOZ0Y4Zc2ljIqqpNR4IQSelHg==} + peerDependencies: + framer-motion: '>=4.0.0' + react: '>=18' dependencies: - '@octokit/types': 8.0.0 - dev: true + '@nextui-org/menu': 2.0.4(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/popover': 2.1.2(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/menu': 3.10.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/menu': 3.5.4(react@18.2.0) + '@react-types/menu': 3.9.3(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - '@types/react' + - react-dom + - tailwindcss + dev: false - /@octokit/core@4.2.4: - resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} - engines: {node: '>= 14'} + /@nextui-org/framer-transitions@2.0.5(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-lf4u6cQZyCgxwX2HLYqos3czbt3174W6cyptxDSHW1VxZYlRhm4II31awR9ZGxaU0d4I2v5PJxNqj70oSNz2rg==} + peerDependencies: + framer-motion: '>=4.0.0' + react: '>=18' dependencies: - '@octokit/auth-token': 3.0.2 - '@octokit/graphql': 5.0.4 - '@octokit/request': 6.2.2 - '@octokit/request-error': 3.0.2 - '@octokit/types': 9.3.2 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.0 + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 transitivePeerDependencies: - - encoding - dev: true + - react-dom + - tailwindcss + dev: false - /@octokit/endpoint@7.0.3: - resolution: {integrity: sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw==} - engines: {node: '>= 14'} + /@nextui-org/image@2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-BSauRVIzM8aavB5PG/iDEXBrLFisBlx0Z6PiePiNoWi6PI221nVsVXh7tM8kAwB0UdZu7xGqWO+3gKlk7mFbJg==} + peerDependencies: + react: '>=18' dependencies: - '@octokit/types': 8.0.0 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 - dev: true + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-image': 2.0.2(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false - /@octokit/graphql@5.0.4: - resolution: {integrity: sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==} - engines: {node: '>= 14'} + /@nextui-org/input@2.1.2(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-vjLTXVdGr1k2JFlBvZlsfXvt6D70aJhQnUkYJZEBP3cB+w+iYjLy91H8vCnhdiZD3b5MYNTL2wZF8WuUsA2UDA==} + peerDependencies: + react: '>=18' dependencies: - '@octokit/request': 6.2.2 - '@octokit/types': 8.0.0 - universal-user-agent: 6.0.0 + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-icons': 2.0.3(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/textfield': 3.11.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/textfield': 3.7.3(react@18.2.0) + react: 18.2.0 + react-textarea-autosize: 8.5.2(@types/react@18.2.21)(react@18.2.0) transitivePeerDependencies: - - encoding - dev: true + - '@types/react' + - react-dom + - tailwindcss + dev: false - /@octokit/openapi-types@14.0.0: - resolution: {integrity: sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==} - dev: true + /@nextui-org/kbd@2.0.13(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-CwYnfiQ060Q3iGkoTWuLXkmDM329UnP8p+FkeC0qMloHI0V2ChOfoH+wfQXdLAcuhu6l48W64dCy75oxpwzhEg==} + peerDependencies: + react: '>=18' + dependencies: + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@react-aria/utils': 3.19.0(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - tailwindcss + dev: false - /@octokit/openapi-types@18.0.0: - resolution: {integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==} - dev: true + /@nextui-org/link@2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-lEvqOt41gBkM2nMt3DCoy1KoSa1A3evR7+K9sIAfZuuQH81I33x9di0bh7/xTwpTDEDrEt07aU730bybGxr8lQ==} + peerDependencies: + react: '>=18' + dependencies: + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-icons': 2.0.3(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-aria-link': 2.0.12(react@18.2.0) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/link': 3.5.3(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/link': 3.4.4(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false - /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): - resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} - engines: {node: '>= 14'} + /@nextui-org/listbox@2.1.3(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-2ZBBPyVLMKFzfr/p3RPTXK6PA3OPcFtKzoahWxWvGJHm33TxeG47eXwQuxH6Ekx7osnO81KjZAKD8YxFbhDp3g==} peerDependencies: - '@octokit/core': '>=4' + react: '>=18' dependencies: - '@octokit/core': 4.2.4 - '@octokit/tsconfig': 1.0.2 - '@octokit/types': 9.3.2 - dev: true + '@nextui-org/aria-utils': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/divider': 2.0.13(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-is-mobile': 2.0.3(react@18.2.0) + '@react-aria/focus': 3.13.0(react@18.2.0) + '@react-aria/interactions': 3.16.0(react@18.2.0) + '@react-aria/listbox': 3.10.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/list': 3.9.0(react@18.2.0) + '@react-types/menu': 3.9.2(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false - /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): - resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + /@nextui-org/menu@2.0.4(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-WsQ/LGxqTUhnjkVFz6h6Iucn9GdAViGYk59NEzvQZ+ANZgj+FquAK3I5SD31zKJqlR1+B8IPMc/4dyIqfNGN4Q==} peerDependencies: - '@octokit/core': '>=3' + react: '>=18' dependencies: - '@octokit/core': 4.2.4 - dev: true + '@nextui-org/aria-utils': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/divider': 2.0.13(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-is-mobile': 2.0.3(react@18.2.0) + '@react-aria/focus': 3.13.0(react@18.2.0) + '@react-aria/interactions': 3.16.0(react@18.2.0) + '@react-aria/menu': 3.10.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/menu': 3.5.3(react@18.2.0) + '@react-stately/tree': 3.7.0(react@18.2.0) + '@react-types/menu': 3.9.2(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false - /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): - resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} - engines: {node: '>= 14'} + /@nextui-org/modal@2.0.16(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-LlK8Jg0WZN8obu9DIdEHCY3QseiudL8Xh6NGWwf/J31VPtaZ5Lcase4QxsWpJQ4gNxDZW+Qgx6d44Ur3OIXcPw==} peerDependencies: - '@octokit/core': '>=3' + framer-motion: '>=4.0.0' + react: '>=18' dependencies: - '@octokit/core': 4.2.4 - '@octokit/types': 10.0.0 - dev: true + '@nextui-org/framer-transitions': 2.0.5(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-icons': 2.0.3(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-aria-button': 2.0.3(react@18.2.0) + '@nextui-org/use-aria-modal-overlay': 2.0.3(react-dom@18.2.0)(react@18.2.0) + '@nextui-org/use-disclosure': 2.0.3(react@18.2.0) + '@react-aria/dialog': 3.5.4(react-dom@18.2.0)(react@18.2.0) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-types/overlays': 3.8.1(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-remove-scroll: 2.5.6(@types/react@18.2.21)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react-dom + - tailwindcss + dev: false - /@octokit/request-error@3.0.2: - resolution: {integrity: sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg==} - engines: {node: '>= 14'} + /@nextui-org/navbar@2.0.14(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-lpvj4yYmW8807QLViWlXKwKj7jloSrZK8nDCiI/NZ7/WRZBtm8cdqSlU5aekZFmtKUcnCajskzWVmmPpyZBwkw==} + peerDependencies: + framer-motion: '>=4.0.0' + react: '>=18' dependencies: - '@octokit/types': 8.0.0 - deprecation: 2.3.1 - once: 1.4.0 - dev: true + '@nextui-org/framer-transitions': 2.0.5(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-aria-toggle-button': 2.0.3(react@18.2.0) + '@nextui-org/use-scroll-position': 2.0.2(react@18.2.0) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-remove-scroll: 2.5.6(@types/react@18.2.21)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - react-dom + - tailwindcss + dev: false - /@octokit/request@6.2.2: - resolution: {integrity: sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw==} - engines: {node: '>= 14'} + /@nextui-org/pagination@2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-NlT4KTDvprRwPPGuhMjK0RVhczVC/08rhyAhjzQMJlDqgm0hsuojNClHwK4Oca4pZBAiQMytoM3LZ8yrx0NLkA==} + peerDependencies: + react: '>=18' dependencies: - '@octokit/endpoint': 7.0.3 - '@octokit/request-error': 3.0.2 - '@octokit/types': 8.0.0 - is-plain-object: 5.0.0 - node-fetch: 2.6.7 - universal-user-agent: 6.0.0 + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-icons': 2.0.3(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-pagination': 2.0.2(react@18.2.0) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + react: 18.2.0 + scroll-into-view-if-needed: 3.0.10 transitivePeerDependencies: - - encoding - dev: true + - react-dom + - tailwindcss + dev: false - /@octokit/rest@19.0.13: - resolution: {integrity: sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==} - engines: {node: '>= 14'} + /@nextui-org/popover@2.1.2(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-E76xPGCbNqza1F73Avx4M/esofCMLflvAH/vJUI9S5iJYc5Ce/oCokBJ7XqRElEfrghb4lqSnQX2jsZB+eWcnw==} + peerDependencies: + framer-motion: '>=4.0.0' + react: '>=18' dependencies: - '@octokit/core': 4.2.4 - '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) - '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) + '@nextui-org/aria-utils': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/button': 2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/framer-transitions': 2.0.5(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-aria-button': 2.0.3(react@18.2.0) + '@react-aria/dialog': 3.5.4(react-dom@18.2.0)(react@18.2.0) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/overlays': 3.8.1(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-remove-scroll: 2.5.6(@types/react@18.2.21)(react@18.2.0) transitivePeerDependencies: - - encoding - dev: true + - '@types/react' + - react-dom + - tailwindcss + dev: false - /@octokit/tsconfig@1.0.2: - resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} - dev: true + /@nextui-org/progress@2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-qXFYlj6zkSpxUB9syHiWaf08pmcZh6ANm8oBQ2r/2dcZbJSja7l5CmLTCTfinbpYZdFcmCaPJ7hpYYpQ4/C6vA==} + peerDependencies: + react: '>=18' + dependencies: + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-is-mounted': 2.0.2(react-dom@18.2.0)(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/progress': 3.4.4(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/progress': 3.4.1(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false - /@octokit/types@10.0.0: - resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} + /@nextui-org/radio@2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-CZTlFQU4Cia5Uom7um3b6cJ+WOeW6BvZiZ9VI2afR6rMR2ONb1SZg2cLSPWNTkkXUNNzyi31o6nP4epd3AJfCA==} + peerDependencies: + react: '>=18' dependencies: - '@octokit/openapi-types': 18.0.0 - dev: true + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/radio': 3.7.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-stately/radio': 3.8.3(react@18.2.0) + '@react-types/radio': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false - /@octokit/types@8.0.0: - resolution: {integrity: sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==} + /@nextui-org/react-rsc-utils@2.0.7: + resolution: {integrity: sha512-BfbrN0/kh7qHoZYAh0bkV1w04Wngm+7K+soTZR4C3eSIxMMeu179CDELW+VCIBwdat4iSQaaJkHZVm8brtueNA==} + dev: false + + /@nextui-org/react-utils@2.0.7(react@18.2.0): + resolution: {integrity: sha512-dN4vSf3h4BVIN6CVqaSCn2OUyDmGVWORgOsfA1k0z/r1XBwuxlfQIEnj8GTwbltnGkFrgj7PJ2RsuVzUs8Vt3g==} + peerDependencies: + react: '>=18' dependencies: - '@octokit/openapi-types': 14.0.0 - dev: true + '@nextui-org/react-rsc-utils': 2.0.7 + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + react: 18.2.0 + dev: false - /@octokit/types@9.3.2: - resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} + /@nextui-org/react@2.1.5(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-DPBAdoEARFgJgueasOWZcIDkiRYkI1CC0V17j/jqovaezBBKt+pTS5I3djgKuuXL5iUW6FnhmZP39fZh1Rf1UQ==} + peerDependencies: + framer-motion: '>=4.0.0' + react: '>=18' dependencies: - '@octokit/openapi-types': 18.0.0 - dev: true + '@nextui-org/accordion': 2.0.16(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/avatar': 2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/badge': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/button': 2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/card': 2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/checkbox': 2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/chip': 2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/code': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/divider': 2.0.13(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/dropdown': 2.1.3(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/image': 2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/input': 2.1.2(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/kbd': 2.0.13(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/link': 2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/listbox': 2.1.3(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/menu': 2.0.4(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/modal': 2.0.16(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/navbar': 2.0.14(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/pagination': 2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/popover': 2.1.2(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/progress': 2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/radio': 2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/scroll-shadow': 2.1.2(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/select': 2.1.4(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/skeleton': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/snippet': 2.0.18(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/spacer': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/spinner': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/switch': 2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/table': 2.0.16(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/tabs': 2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/tooltip': 2.0.17(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/user': 2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - '@types/react' + - react-dom + - tailwindcss + dev: false - /@ohbug/browser@2.5.1: - resolution: {integrity: sha512-b6XBS7ZXG+7zZmy+S6CVeYYYJphTb/HVt2kfFVD9gC9MXiwTAjHMTkjDKp39jBnqJHv6qMKrUpol7pQAhmcOPA==} + /@nextui-org/ripple@2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-rI2mMXjPtQANJuQE+QQCxLWcJ6ANlNHDfNxZ2jbuVACee6Y1mXEK9AqbZcpLVMpI577l20CcDqU63PRYvf7e9Q==} + peerDependencies: + framer-motion: '>=4.0.0' + react: '>=18' dependencies: - '@ohbug/core': 2.2.1 - '@ohbug/types': 2.2.1 - '@ohbug/utils': 2.0.8 - error-stack-parser: 2.1.4 + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss dev: false - /@ohbug/core@2.2.1: - resolution: {integrity: sha512-fLQ4nSJ28CLmV642zZIDCvI1XbBcWOLQ7HYG5wQYQskSAtz8nbuu3uA4lxpNfrOAe6qmhQa4MZSh8jalBDwTzQ==} + /@nextui-org/scroll-shadow@2.1.2(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-kGNn8fa/IyF//PjLKoloMtEuLm8N3JnQ9kfF0ucuX7fT4TZT8EC9Msc8/+0DtS8AORYcNLGzWjJPXB+VYyY6fQ==} + peerDependencies: + react: '>=18' dependencies: - '@ohbug/types': 2.2.1 - '@ohbug/utils': 2.0.8 + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-data-scroll-overflow': 2.1.0(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss dev: false - /@ohbug/extension-feedback@0.7.2: - resolution: {integrity: sha512-wSXmeua/rIFON4OhvqFipCVWQAZkdQVJP7muqgGKOvo0pcU6w/ut1dQ6kib1tPyCt16i5ayVC54VJe44NvdMIA==} + /@nextui-org/select@2.1.4(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-C5XPeJZ9bpp/uyJ2zI1Q+miQuQ8T4yiX1hqk7WuUGe8nkQ3ZOBRGb9ohSsREsaXJhLkYnnTDph3ngd6ZMqtX8Q==} + peerDependencies: + framer-motion: '>=4.0.0' + react: '>=18' dependencies: - '@ohbug/types': 2.2.1 - '@ohbug/utils': 2.0.8 - solid-js: 1.7.7 + '@nextui-org/aria-utils': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/listbox': 2.1.3(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/popover': 2.1.2(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/scroll-shadow': 2.1.2(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/shared-icons': 2.0.3(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/spinner': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-aria-button': 2.0.3(react@18.2.0) + '@nextui-org/use-aria-multiselect': 2.1.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/focus': 3.13.0(react@18.2.0) + '@react-aria/interactions': 3.16.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - '@types/react' + - react-dom + - tailwindcss dev: false - /@ohbug/extension-rrweb@1.10.1(rrweb@2.0.0-alpha.4): - resolution: {integrity: sha512-KRq/RqgemR+KDlBNP4ojRYhtcfZVolzGaKSLPVJeG/EJCQg9VMvphskHI7BoQyDmOQTm4Nlj5Yg9JS7U9ooksA==} + /@nextui-org/shared-icons@2.0.3(react@18.2.0): + resolution: {integrity: sha512-2ODlzPWW+iYM7Uf7XDkz7GlJ+dzsFo6cBHH9hbbZEOx2v7/wB8x3VvrZcQ4SASewSb18a/wzxP8MJFnIUCOCrQ==} peerDependencies: - rrweb: ^2.0.0 + react: '>=18' dependencies: - '@ohbug/core': 2.2.1 - '@ohbug/types': 2.2.1 - '@rrweb/types': 2.0.0-alpha.9 - rrweb: 2.0.0-alpha.4 + react: 18.2.0 dev: false - /@ohbug/extension-uuid@2.1.1: - resolution: {integrity: sha512-dC7khwKnQ8cgpJI62nvF1cBUp0C33ZQp01vizCteG5BIAI2smQL5dWZhd5GZ0DiYxvv1YmZ3I5BVnuFLCWo/gA==} + /@nextui-org/shared-utils@2.0.2(react@18.2.0): + resolution: {integrity: sha512-tqWVoJtxYbd/hd/laHE85GaXP+b3HeE1tXYjnObbwM+JIh4uu2/Do7Av7mzzyXwS7sZvyHxhi3zW12oank2ykA==} + peerDependencies: + react: '>=18' dependencies: - '@ohbug/types': 2.2.1 - '@ohbug/utils': 2.0.8 - uuid: 9.0.0 + react: 18.2.0 dev: false - /@ohbug/extension-view@0.1.1: - resolution: {integrity: sha512-mtEzlD29Mld5sjYjxOfbjKwJNlGpPCImeYgLS/7QzrzS5OydX7fz+fKhHJmfFciVRqdB8Spd2bRJ1KUoHAmtnQ==} + /@nextui-org/skeleton@2.0.12(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-mVNPkW1q7C37LRyDLAnVZKU5YllcAAguDzWItadKEDCJ4ihhjnWT2wM4m3Iip9ddRU28wbt9C0e2/SZizBYdyA==} + peerDependencies: + react: '>=18' dependencies: - '@ohbug/types': 2.2.1 - '@ohbug/utils': 2.0.8 - dayjs: 1.11.9 + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + react: 18.2.0 + transitivePeerDependencies: + - tailwindcss dev: false - /@ohbug/extension-web-vitals@0.2.1(web-vitals@3.4.0): - resolution: {integrity: sha512-1b7f0Q7xoTjCk2y0PxEpjvwutMeuH2GcFmTDnifTkOGQCdXFfdvMteL1wZm5MKL6xk1GH9f79megHujuFlUypQ==} + /@nextui-org/snippet@2.0.18(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-qvUQQ/GMkb5v+t7pkjlCphiUjBkJca4Qm8cuTzYu9ytTEDFYNBO8Z1UqbgjP+z5QMYF88//LdGERw6VWrY90jg==} + peerDependencies: + framer-motion: '>=4.0.0' + react: '>=18' + dependencies: + '@nextui-org/button': 2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-icons': 2.0.3(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/tooltip': 2.0.17(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/use-clipboard': 2.0.2(react@18.2.0) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false + + /@nextui-org/spacer@2.0.12(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-JIfcbDwvYEZBraT3MR3+NtHLKe517daNhm2mZDDt+nMgqka8rwrsyssGB+rgCAqJ+xN/oAyLycvObMbuKZRhWA==} + peerDependencies: + react: '>=18' + dependencies: + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + react: 18.2.0 + transitivePeerDependencies: + - tailwindcss + dev: false + + /@nextui-org/spinner@2.0.12(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-AwMREvK5N7uAyUqNO7B3r2SG52b+97SpB+KU31CzrUWK9a4Vbepuk6cnu8CBCnFKWcB4coV6QSScpPJfODInLw==} + peerDependencies: + react: '>=18' + dependencies: + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + react: 18.2.0 + transitivePeerDependencies: + - tailwindcss + dev: false + + /@nextui-org/switch@2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-EE9w2M/q+C3obuDrTTAbuyknXV+KQjYBMbaZcRlFBqiLmcbi2rjIzRsxrcGLlkMvo5waYiaACcjhthmQ9CCzug==} + peerDependencies: + react: '>=18' + dependencies: + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/switch': 3.5.3(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false + + /@nextui-org/system-rsc@2.0.3(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-CfWl1JkHPtgSvq/Szz4oWQAg7b6L7wxxHEFzKcvNdhbX61IfE5PvnQMl5z8T9UTSIIwFv4P0ntP5kpKE895w2w==} + peerDependencies: + react: '>=18' + dependencies: + clsx: 1.2.1 + react: 18.2.0 + tailwind-variants: 0.1.13(tailwindcss@3.3.3) + transitivePeerDependencies: + - tailwindcss + dev: false + + /@nextui-org/system@2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-ke02e60ctxnXsxe77TRN6pWVY89aCCi0AXwyQIbgT9lfiVgUGWJa+f6am46ItCzeSkvIQ7j3XJBz717zu+GSRg==} + peerDependencies: + react: '>=18' + dependencies: + '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false + + /@nextui-org/table@2.0.16(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-jrg+h7tpKEoILxwFMqh/nMMbrcF14lpQAX6tC95FFNEHARtRRQ5ZoZJOz/lIxvqwo2i8lggm+L+23Q/iw1tp7g==} + peerDependencies: + react: '>=18' + dependencies: + '@nextui-org/checkbox': 2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-icons': 2.0.3(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/spacer': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/table': 3.11.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-stately/table': 3.11.0(react@18.2.0) + '@react-stately/virtualizer': 3.6.0(react@18.2.0) + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/table': 3.8.0(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false + + /@nextui-org/tabs@2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-QGsIuXxF6rwvTsk81/PBVsOy+tRyAECD5g1auKzNsxW2QokcjNWA8QmbhueefkxeO0AIhUwiK62g86KfiX1nOw==} + peerDependencies: + framer-motion: '>=4.0.0' + react: '>=18' + dependencies: + '@nextui-org/aria-utils': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/framer-transitions': 2.0.5(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@nextui-org/use-is-mounted': 2.0.2(react-dom@18.2.0)(react@18.2.0) + '@nextui-org/use-update-effect': 2.0.2(react@18.2.0) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/tabs': 3.6.2(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/tabs': 3.5.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/tabs': 3.3.1(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + scroll-into-view-if-needed: 3.0.10 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false + + /@nextui-org/theme@2.1.2(tailwindcss@3.3.3): + resolution: {integrity: sha512-r71nB3kP5Y8aGQ2dke4Das8Fyq+B1IlvazL2xYPQBq1HwMOWL9eRsUjnIR8o2o+HqUYchLncuWzWDiKYeTy8YQ==} + peerDependencies: + tailwindcss: '*' + dependencies: + '@types/color': 3.0.3 + '@types/flat': 5.0.2 + '@types/lodash.foreach': 4.5.7 + '@types/lodash.get': 4.4.7 + '@types/lodash.kebabcase': 4.1.7 + '@types/lodash.mapkeys': 4.6.7 + '@types/lodash.omit': 4.5.7 + color: 4.2.3 + color2k: 2.0.2 + deepmerge: 4.3.1 + flat: 5.0.2 + lodash.foreach: 4.5.0 + lodash.get: 4.4.2 + lodash.kebabcase: 4.1.1 + lodash.mapkeys: 4.6.0 + lodash.omit: 4.5.0 + tailwind-variants: 0.1.13(tailwindcss@3.3.3) + tailwindcss: 3.3.3(ts-node@10.9.1) + dev: false + + /@nextui-org/tooltip@2.0.17(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-RXcrs3pVLv1FhGdKw+j1SDJ/Djb7Lm/NUYGt2oPIyvW3VXT5AjB9By+biayEtSkoLKXHzbtHUQtmsw992/P9Cg==} + peerDependencies: + framer-motion: '>=4.0.0' + react: '>=18' + dependencies: + '@nextui-org/aria-utils': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/framer-transitions': 2.0.5(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/tooltip': 3.6.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/tooltip': 3.4.3(react@18.2.0) + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/tooltip': 3.4.3(react@18.2.0) + framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false + + /@nextui-org/use-aria-accordion-item@2.0.3(react@18.2.0): + resolution: {integrity: sha512-nHJypFAwbeKn86KhfOXnf92D89CD5IETuq7RbWm0EC++NajPxRDjJl/zgPef7UWIvq28UC4TRVC7LAknFH7L/Q==} + peerDependencies: + react: '>=18' + dependencies: + '@react-aria/button': 3.8.1(react@18.2.0) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-stately/tree': 3.7.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@nextui-org/use-aria-button@2.0.3(react@18.2.0): + resolution: {integrity: sha512-JdxOk12vXO/AVLwJ0Mnr9QTugLDnjOPfDoV/AtQVGxgU/7VAuyGVt2Gt5eXQM6eOm36UBia59eXlWzF/9Judjw==} + peerDependencies: + react: '>=18' + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@nextui-org/use-aria-link@2.0.12(react@18.2.0): + resolution: {integrity: sha512-Q+ztjV19GK9lT9XZ440pdSKhOY+Hc4cKK4CDsZGYgh2WqUAjy1qI2fiQZjQ2pQNda49Gl+QvZzTglX14wO2xAg==} + peerDependencies: + react: '>=18' + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/link': 3.4.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@nextui-org/use-aria-modal-overlay@2.0.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ajh7bEV+OaQ7s6DWC3rBwbkr8eTi2/ykf4mNc/682Y5cuR2ZPrBGg00HStVcNDZOdwUBArVhTWQaQ8e+0lwBww==} + peerDependencies: + react: '>=18' + dependencies: + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + dev: false + + /@nextui-org/use-aria-multiselect@2.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-dHMTbhFd+/D9h7rruDQgtQMZ95UKKfImtczu4ji0xnTu9ZXVVanM2ZEhU/GqpRdjuKS9xNq3BKZ6GnPlBcwMdA==} + peerDependencies: + react: '>=18' + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/listbox': 3.10.1(react@18.2.0) + '@react-aria/menu': 3.10.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/list': 3.9.0(react@18.2.0) + '@react-stately/menu': 3.5.4(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/select': 3.8.2(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + dev: false + + /@nextui-org/use-aria-toggle-button@2.0.3(react@18.2.0): + resolution: {integrity: sha512-puoPTmrxx7l9vh42oAnkAc57uF+TldUg3G2A/Gc7aTcIq1AXLfaTDaxWiRel6W0Ew2H/IKu9AlQScY28HOQ/iA==} + peerDependencies: + react: '>=18' + dependencies: + '@nextui-org/use-aria-button': 2.0.3(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@nextui-org/use-callback-ref@2.0.2(react@18.2.0): + resolution: {integrity: sha512-avKTXdy/bOfjPKTBj1RIdkbdqTC9ICZUzb5GejR4riA3zCcHwS2JxjQTGb9xNF3Y5DyH1Mb7hf2+jBmqF2g/QA==} + peerDependencies: + react: '>=18' + dependencies: + '@nextui-org/use-safe-layout-effect': 2.0.2(react@18.2.0) + react: 18.2.0 + dev: false + + /@nextui-org/use-clipboard@2.0.2(react@18.2.0): + resolution: {integrity: sha512-Ass+LJR/cWC48AeIUtsukzvA7Mf5bV7ikdNUvuLyrc9pdqr1fmw4aHCkQPQKSjLIHy85KuXDKqrqhVoVLivD4g==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + + /@nextui-org/use-data-scroll-overflow@2.1.0(react@18.2.0): + resolution: {integrity: sha512-hmr5kQ3KguDYTzqkU7F+J/aIu6tFriG5a+0JyfnIzuVmwbMlNf9tvRrfrgFT3OBqwgj2ljhGAPwQ37CFDsCZAA==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + + /@nextui-org/use-disclosure@2.0.3(react@18.2.0): + resolution: {integrity: sha512-bPs4/wXSytiR5xxhlErkxXc2Fk3siQqLK5g/Qo+f2CQopXTaldkbIIlu/0lzd0KBIApX5z0rOr3bnr9Xu1Wn4A==} + peerDependencies: + react: '>=18' + dependencies: + '@nextui-org/use-callback-ref': 2.0.2(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@nextui-org/use-image@2.0.2(react@18.2.0): + resolution: {integrity: sha512-geCUHp2P/2und98/Ka12dyrw78D9F2qG1a8WN/iB0BQWwaEm8km8YH13zlV0GOFHCwlA5gsXqrUvzxPjfZytZQ==} + peerDependencies: + react: '>=18' + dependencies: + '@nextui-org/use-safe-layout-effect': 2.0.2(react@18.2.0) + react: 18.2.0 + dev: false + + /@nextui-org/use-is-mobile@2.0.3(react@18.2.0): + resolution: {integrity: sha512-JOxomIBoMIj7CnLVNrnv3wlUQ/3cr3l1OJw947qRzMlN19Q6X8k4bDvuPPlQbY6KL+emB0RM+lsdHv4WQ+Hpdg==} + peerDependencies: + react: '>=18' + dependencies: + '@react-aria/ssr': 3.7.1(react@18.2.0) + react: 18.2.0 + dev: false + + /@nextui-org/use-is-mounted@2.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-PjwpTkl5f+bTVU9l5GzgZDHd+uOwCZ3bhuYzbbamw1J5kBWruVnKUqZihS3zrLtJxKNxk/f7RT0UWK2a4wGpDw==} + peerDependencies: + react: '>=18' + react-dom: '>=16.8.0' + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@nextui-org/use-pagination@2.0.2(react@18.2.0): + resolution: {integrity: sha512-wQAmKMXzb0DhhXHx3K/LppaP2n5ZknjOYQpm+TAjOaIPJYIbyNIRa2FFAP/lf8vZCHjHB7+KUVLhkIwAzrZ0dw==} + peerDependencies: + react: '>=18' + dependencies: + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + react: 18.2.0 + dev: false + + /@nextui-org/use-safe-layout-effect@2.0.2(react@18.2.0): + resolution: {integrity: sha512-HsFP2e+o2eSiQyAXdiicPBj6qj1naHuiNqqeTPqeJBsr0aUZI8l+7vZ5OXjLc8Qou4AOyNyJBBGFNhwsraxdpw==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + + /@nextui-org/use-scroll-position@2.0.2(react@18.2.0): + resolution: {integrity: sha512-DHmGMoLrjyuE/YQk92OGxF/v3cLaiBIvDpTxAAMtgerVkkPyuL7O9j9cyLiRz9ad92pL9TJwmjJ/00wJ2Qr/Wg==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + + /@nextui-org/use-update-effect@2.0.2(react@18.2.0): + resolution: {integrity: sha512-yN2LWvG2QNDz6XDjRZq6jBQ7+Jaz2eihy+Q7IR+XLXi6fsyKQuYKxphw5VANa0ZbvKVuN/n5m5WRDRmWmeeOWw==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + + /@nextui-org/user@2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): + resolution: {integrity: sha512-Zltwvb0+mIg/WDfFL4UHFi7kCo73vM8r5cbWczzLsjqFvYeZAK/W69armb6nH+fsFuDuFOPbFrDE51LkeSTmww==} + peerDependencies: + react: '>=18' + dependencies: + '@nextui-org/avatar': 2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/react-utils': 2.0.7(react@18.2.0) + '@nextui-org/shared-utils': 2.0.2(react@18.2.0) + '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) + '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - tailwindcss + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@npmcli/config@6.2.1: + resolution: {integrity: sha512-Cj/OrSbrLvnwWuzquFCDTwFN8QmR+SWH6qLNCBttUreDkKM5D5p36SeSMbcEUiCGdwjUrVy2yd8C0REwwwDPEw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/map-workspaces': 3.0.4 + ci-info: 3.8.0 + ini: 4.1.1 + nopt: 7.2.0 + proc-log: 3.0.0 + read-package-json-fast: 3.0.2 + semver: 7.5.4 + walk-up-path: 3.0.1 + dev: true + + /@npmcli/fs@3.1.0: + resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.5.4 + dev: true + + /@npmcli/git@4.1.0: + resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/promise-spawn': 6.0.2 + lru-cache: 7.18.3 + npm-pick-manifest: 8.0.2 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.4 + which: 3.0.1 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/installed-package-contents@2.0.2: + resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + npm-bundled: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /@npmcli/map-workspaces@3.0.4: + resolution: {integrity: sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/name-from-folder': 2.0.0 + glob: 10.3.3 + minimatch: 9.0.3 + read-package-json-fast: 3.0.2 + dev: true + + /@npmcli/name-from-folder@2.0.0: + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@npmcli/node-gyp@3.0.0: + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@npmcli/promise-spawn@6.0.2: + resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + which: 3.0.1 + dev: true + + /@npmcli/run-script@6.0.2: + resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/promise-spawn': 6.0.2 + node-gyp: 9.4.0 + read-package-json-fast: 3.0.2 + which: 3.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@nuxtjs/opencollective@0.3.2: + resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + dependencies: + chalk: 4.1.2 + consola: 2.15.3 + node-fetch: 2.6.12 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/auth-token@3.0.4: + resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} + engines: {node: '>= 14'} + dev: true + + /@octokit/core@4.2.4: + resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/auth-token': 3.0.4 + '@octokit/graphql': 5.0.6 + '@octokit/request': 6.2.8 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/endpoint@7.0.6: + resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: true + + /@octokit/graphql@5.0.6: + resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/request': 6.2.8 + '@octokit/types': 9.3.2 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/openapi-types@18.0.0: + resolution: {integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==} + dev: true + + /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): + resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=4' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/tsconfig': 1.0.2 + '@octokit/types': 9.3.2 + dev: true + + /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + dev: true + + /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): + resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/types': 10.0.0 + dev: true + + /@octokit/request-error@3.0.3: + resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request@6.2.8: + resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/endpoint': 7.0.6 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + node-fetch: 2.6.12 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/rest@19.0.13: + resolution: {integrity: sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==} + engines: {node: '>= 14'} + dependencies: + '@octokit/core': 4.2.4 + '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) + '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/tsconfig@1.0.2: + resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} + dev: true + + /@octokit/types@10.0.0: + resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} + dependencies: + '@octokit/openapi-types': 18.0.0 + dev: true + + /@octokit/types@9.3.2: + resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} + dependencies: + '@octokit/openapi-types': 18.0.0 + dev: true + + /@ohbug/browser@2.5.1: + resolution: {integrity: sha512-b6XBS7ZXG+7zZmy+S6CVeYYYJphTb/HVt2kfFVD9gC9MXiwTAjHMTkjDKp39jBnqJHv6qMKrUpol7pQAhmcOPA==} + dependencies: + '@ohbug/core': 2.2.1 + '@ohbug/types': 2.2.1 + '@ohbug/utils': 2.0.8 + error-stack-parser: 2.1.4 + dev: false + + /@ohbug/core@2.2.1: + resolution: {integrity: sha512-fLQ4nSJ28CLmV642zZIDCvI1XbBcWOLQ7HYG5wQYQskSAtz8nbuu3uA4lxpNfrOAe6qmhQa4MZSh8jalBDwTzQ==} + dependencies: + '@ohbug/types': 2.2.1 + '@ohbug/utils': 2.0.8 + dev: false + + /@ohbug/extension-feedback@0.7.2: + resolution: {integrity: sha512-wSXmeua/rIFON4OhvqFipCVWQAZkdQVJP7muqgGKOvo0pcU6w/ut1dQ6kib1tPyCt16i5ayVC54VJe44NvdMIA==} + dependencies: + '@ohbug/types': 2.2.1 + '@ohbug/utils': 2.0.8 + solid-js: 1.7.9 + dev: false + + /@ohbug/extension-rrweb@1.10.1(rrweb@2.0.0-alpha.4): + resolution: {integrity: sha512-KRq/RqgemR+KDlBNP4ojRYhtcfZVolzGaKSLPVJeG/EJCQg9VMvphskHI7BoQyDmOQTm4Nlj5Yg9JS7U9ooksA==} + peerDependencies: + rrweb: ^2.0.0 + dependencies: + '@ohbug/core': 2.2.1 + '@ohbug/types': 2.2.1 + '@rrweb/types': 2.0.0-alpha.9 + rrweb: 2.0.0-alpha.4 + dev: false + + /@ohbug/extension-uuid@2.1.1: + resolution: {integrity: sha512-dC7khwKnQ8cgpJI62nvF1cBUp0C33ZQp01vizCteG5BIAI2smQL5dWZhd5GZ0DiYxvv1YmZ3I5BVnuFLCWo/gA==} + dependencies: + '@ohbug/types': 2.2.1 + '@ohbug/utils': 2.0.8 + uuid: 9.0.0 + dev: false + + /@ohbug/extension-view@0.1.1: + resolution: {integrity: sha512-mtEzlD29Mld5sjYjxOfbjKwJNlGpPCImeYgLS/7QzrzS5OydX7fz+fKhHJmfFciVRqdB8Spd2bRJ1KUoHAmtnQ==} + dependencies: + '@ohbug/types': 2.2.1 + '@ohbug/utils': 2.0.8 + dayjs: 1.11.9 + dev: false + + /@ohbug/extension-web-vitals@0.2.1(web-vitals@3.4.0): + resolution: {integrity: sha512-1b7f0Q7xoTjCk2y0PxEpjvwutMeuH2GcFmTDnifTkOGQCdXFfdvMteL1wZm5MKL6xk1GH9f79megHujuFlUypQ==} + peerDependencies: + web-vitals: ^2.1.4 + dependencies: + '@ohbug/types': 2.2.1 + web-vitals: 3.4.0 + dev: false + + /@ohbug/react@2.0.9(react@16.14.0): + resolution: {integrity: sha512-UD4i7e7IGd6Qmcwvsm5kKfIojs/wqdcWANt2Wc/WFy9e7ppYyJcIvg1caskj3kmRY7fQS8blemTHQBQMPLN6AA==} + peerDependencies: + react: ^16.8.6 + dependencies: + '@ohbug/core': 2.2.1 + '@ohbug/types': 2.2.1 + react: 16.14.0 + dev: false + + /@ohbug/types@2.2.1: + resolution: {integrity: sha512-ZfY7pW2MPi3Kr+ASrYcBiQe8mAvekwmM2O5mkmiaTU1ggcxrSinqesWsea6BkO+54MSd68UC3vPJH5YkMVTf/Q==} + dev: false + + /@ohbug/utils@2.0.8: + resolution: {integrity: sha512-eAhFr8c+7Q6MtxvkwgEGAg91XZXoZzASIsUzoGQAqt/hlMIPHlsN9CO2Lxr012jBU/I/pnQteopq+sQbZQjKIA==} + dependencies: + '@ohbug/types': 2.2.1 + '@types/node': 20.5.4 + dev: false + + /@ohbug/vue@2.0.10(vue@3.3.4): + resolution: {integrity: sha512-b/f2OhcwS6mwVhQHhlyQXVVydPeyHNoPcRAYafHWRp85UOxlmUWJdHDLXZxwSfy91JllEYeMSbiSWJV9HzLh5A==} + peerDependencies: + vue: 2.x || 3.x + dependencies: + '@ohbug/core': 2.2.1 + '@ohbug/types': 2.2.1 + vue: 3.3.4 + dev: false + + /@panva/hkdf@1.1.1: + resolution: {integrity: sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==} + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@pnpm/config.env-replace@1.1.0: + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + dev: true + + /@pnpm/network.ca-file@1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + dependencies: + graceful-fs: 4.2.10 + dev: true + + /@pnpm/npm-conf@2.2.2: + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + engines: {node: '>=12'} + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + dev: true + + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false + + /@prisma/client@5.2.0(prisma@5.2.0): + resolution: {integrity: sha512-AiTjJwR4J5Rh6Z/9ZKrBBLel3/5DzUNntMohOy7yObVnVoTNVFi2kvpLZlFuKO50d7yDspOtW6XBpiAd0BVXbQ==} + engines: {node: '>=16.13'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f + prisma: 5.2.0 + dev: false + + /@prisma/engines-version@5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f: + resolution: {integrity: sha512-jsnKT5JIDIE01lAeCj2ghY9IwxkedhKNvxQeoyLs6dr4ZXynetD0vTy7u6wMJt8vVPv8I5DPy/I4CFaoXAgbtg==} + dev: false + + /@prisma/engines@5.2.0: + resolution: {integrity: sha512-dT7FOLUCdZmq+AunLqB1Iz+ZH/IIS1Fz2THmKZQ6aFONrQD/BQ5ecJ7g2wGS2OgyUFf4OaLam6/bxmgdOBDqig==} + requiresBuild: true + + /@radix-ui/primitive@1.0.1: + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + dependencies: + '@babel/runtime': 7.22.6 + dev: false + + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-context@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-direction@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-dropdown-menu@2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xdOrZzOTocqqkCkYo8yRPCib5OkTkqN7lqNCdxwPOdE466DOaNl4N8PkUIlsXthQvW5Wwkd+aEmWpfWlBoDPEw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-menu': 2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-id@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-menu@2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Gw4f9pwdH+w5w+49k0gLjN0PfRDHvxmAgG16AbyJZ7zhwZ6PBHKtWohvnSwfusfnK3L68dpBREHpVkj8wEM7ZA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) + dev: false + + /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@floating-ui/react-dom': 2.0.1(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-slot@1.0.2(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/rect@1.0.1: + resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + dependencies: + '@babel/runtime': 7.22.6 + dev: false + + /@react-aria/accordion@3.0.0-alpha.20(react@18.2.0): + resolution: {integrity: sha512-dQIrZrUwfVIezny/7SknsxIeZ5R4VXMizuCC6XCTDgeu7Mx8O3/+quJwE58KAHT9mhvWx7Wk+QGNBOTNbwSXQQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/button': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/tree': 3.7.1(react@18.2.0) + '@react-types/accordion': 3.0.0-alpha.15(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/button@3.8.1(react@18.2.0): + resolution: {integrity: sha512-igxZ871An3Clpmpw+beN8F792NfEnEaLRAZ4jITtC/FdzwQwRM7eCu/ZEaqpNtbUtruAmYhafnG/2uCkKhTpTw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/checkbox@3.10.0(react@18.2.0): + resolution: {integrity: sha512-1s5jkmag+41Fa2BwoOoM5cRRadDh3N8khgsziuGzD0NqvZLRCtHgDetNlileezFHwOeOWK6zCqDOrYLJhcMi8g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/toggle': 3.7.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/checkbox': 3.4.4(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/dialog@3.5.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-+YGjX5ygYvFvnRGDy7LVTL2uRCH5VYosMNKn0vyel99SiwHH9d8fdnnJjVvSJ3u8kvoXk22+OnRE2/vEX+G1EA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-types/dialog': 3.5.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + transitivePeerDependencies: + - react-dom + dev: false + + /@react-aria/focus@3.13.0(react@18.2.0): + resolution: {integrity: sha512-9DW7RqgbFWiImZmkmTIJGe9LrQBqEeLYwlKY+F1FTVXerIPiCCQ3JO3ESEa4lFMmkaHoueFLUrq2jkYjRNqoTw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/interactions': 3.16.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + clsx: 1.2.1 + react: 18.2.0 + dev: false + + /@react-aria/focus@3.14.0(react@18.2.0): + resolution: {integrity: sha512-Xw7PxLT0Cqcz22OVtTZ8+HvurDogn9/xntzoIbVjpRFWzhlYe5WHnZL+2+gIiKf7EZ18Ma9/QsCnrVnvrky/Kw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + clsx: 1.2.1 + react: 18.2.0 + dev: false + + /@react-aria/grid@3.8.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-J/k7i2ZnMgTv3csMIQrIanbb0mWzlokT86QfKDgQpKxIvrPGbdrVJTx99tzJxEzYeXN9w11Jjwjal65rZCs4rQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/grid': 3.8.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/virtualizer': 3.6.1(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/i18n@3.8.1(react@18.2.0): + resolution: {integrity: sha512-ftH3saJlhWaHoHEDb/YjYqP8I4/9t4Ksf0D0kvPDRfRcL98DKUSHZD77+EmbjsmzJInzm76qDeEV0FYl4oj7gg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.4.0 + '@internationalized/message': 3.1.1 + '@internationalized/number': 3.2.1 + '@internationalized/string': 3.1.1 + '@react-aria/ssr': 3.7.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/interactions@3.16.0(react@18.2.0): + resolution: {integrity: sha512-vXANFKVd6ONqNw8U+ZWbSA8lrduCOXw7cWsYosTa5dZ24ZJfRfbhlvRe8CaAKMhB/rOOmvTLaAwdIPia6JtLDg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/ssr': 3.7.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/interactions@3.17.0(react@18.2.0): + resolution: {integrity: sha512-v4BI5Nd8gi8s297fHpgjDDXOyufX+FPHJ31rkMwY6X1nR5gtI0+2jNOL4lh7s+cWzszpA0wpwIrKUPGhhLyUjQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/ssr': 3.7.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/label@3.6.1(react@18.2.0): + resolution: {integrity: sha512-hR7Qx6q0BjOJi/YG5pI13QTQA/2oaXMYdzDCx4Faz8qaY9CCsLjFpo5pUUwRhNieGmf/nHJq6jiYbJqfaONuTQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/label': 3.7.5(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/link@3.5.3(react@18.2.0): + resolution: {integrity: sha512-WGz/s/czlb/+wJUnBfnfaRuvOSiNTaQDTk9QsEEwrTkkYbWo7fMlH5Tc7c0Uxem4UuUblYXKth5SskiKQNWc0w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/link': 3.4.4(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/listbox@3.10.1(react@18.2.0): + resolution: {integrity: sha512-hG+f7URcVk7saRG6bemCRaZSNMCg5U51ol/EuoKyHyvd0Vfq/AcsLYrg8vOyRWTsPwjxFtMLItNOZo36KIDs5w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-types/listbox': 3.4.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/live-announcer@3.3.1: + resolution: {integrity: sha512-hsc77U7S16trM86d+peqJCOCQ7/smO1cybgdpOuzXyiwcHQw8RQ4GrXrS37P4Ux/44E9nMZkOwATQRT2aK8+Ew==} + dependencies: + '@swc/helpers': 0.5.1 + dev: false + + /@react-aria/menu@3.10.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FOb16XVejZgl4sFpclLvGd2RCvUBwl2bzFdAnss8Nd6Mx+h4m0bPeDT102k9v1Vjo7OGeqzvMyNU/KM4FwUGGA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/menu': 3.5.4(react@18.2.0) + '@react-stately/tree': 3.7.1(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/menu': 3.9.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/overlays@3.16.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-jclyCqs1U4XqDA1DAdZaiijKtHLVZ78FV0+IzL4QQfrvzCPC+ba+MC8pe/tw8dMQzXBSnTx/IEqOHu07IwrESQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/ssr': 3.7.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-types/button': 3.7.4(react@18.2.0) + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/progress@3.4.4(react@18.2.0): + resolution: {integrity: sha512-k4EBtYcmqw3j/JYJtn+xKPM8/P1uPcFGSBqvwmVdwDknuT/hR1os3wIKm712N/Ubde8hTeeLcaa38HYezSF8BA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/progress': 3.4.2(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/radio@3.7.0(react@18.2.0): + resolution: {integrity: sha512-ygSr3ow9avO5BNNwm4aL70EwvLHrBbhSVfG1lmP2k5u/2dxn+Pnm3BGMaEriOFiAyAV4nLGUZAjER6GWXfu5cA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/radio': 3.8.3(react@18.2.0) + '@react-types/radio': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/selection@3.16.1(react@18.2.0): + resolution: {integrity: sha512-mOoAeNjq23H5p6IaeoyLHavYHRXOuNUlv8xO4OzYxIEnxmAvk4PCgidGLFYrr4sloftUMgTTL3LpCj21ylBS9A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/ssr@3.7.0(react@18.2.0): + resolution: {integrity: sha512-bfufjg4ESE5giN+Fxj1XIzS5f/YIhqcGc+Ve+vUUKU8xZ8t/Xtjlv8F3kjqDBQdk//n3mluFY7xG1wQVB9rMLQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/ssr@3.7.1(react@18.2.0): + resolution: {integrity: sha512-ovVPSD1WlRpZHt7GI9DqJrWG3OIYS+NXQ9y5HIewMJpSe+jPQmMQfyRmgX4EnvmxSlp0u04Wg/7oItcoSIb/RA==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/switch@3.5.3(react@18.2.0): + resolution: {integrity: sha512-3sV78Oa12/aU+M9P7BqUDdp/zm2zZA2QvtLLdxykrH04AJp0hLNBnmaTDXJVaGPPiU0umOB0LWDquA3apkBiBA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/toggle': 3.7.0(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-types/switch': 3.4.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/table@3.11.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-kPIQWh1dIHFAzl+rzfUGgbpAZGerMwwW0zNvRwcLpBOl/nrOwV5Zg/wuCC5cSdkwgo3SghYbcUaM19teve0UcQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/grid': 3.8.1(react-dom@18.2.0)(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/live-announcer': 3.3.1 + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-aria/visually-hidden': 3.8.3(react@18.2.0) + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/flags': 3.0.0 + '@react-stately/table': 3.11.0(react@18.2.0) + '@react-stately/virtualizer': 3.6.1(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/table': 3.8.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@react-aria/tabs@3.6.2(react@18.2.0): + resolution: {integrity: sha512-FjI0h1Z4TsLOvIODhdDrVLz0O8RAqxDi58DO88CwkdUrWwZspNEpSpHhDarzUT7MlX3X72lsAUwvQLqY1OmaBQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/i18n': 3.8.1(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/selection': 3.16.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-stately/tabs': 3.5.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/tabs': 3.3.1(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/textfield@3.11.0(react@18.2.0): + resolution: {integrity: sha512-07pHRuWeLmsmciWL8y9azUwcBYi1IBmOT9KxBgLdLK5NLejd7q2uqd0WEEgZkOc48i2KEtMDgBslc4hA+cmHow==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/label': 3.6.1(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/textfield': 3.7.3(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/toggle@3.7.0(react@18.2.0): + resolution: {integrity: sha512-8Rpqolm8dxesyHi03RSmX2MjfHO/YwdhyEpAMMO0nsajjdtZneGzIOXzyjdWCPWwwzahcpwRHOA4qfMiRz+axA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/switch': 3.4.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/tooltip@3.6.1(react@18.2.0): + resolution: {integrity: sha512-CVSmndGXhC5EkkGrKcC8EVdAKCbSLTyJibpojC/8uOCbGIQglq3xCAr68PElNNO8+sFDJ4fp9ZzEeDi0Qyxf0w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/focus': 3.14.0(react@18.2.0) + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-stately/tooltip': 3.4.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/tooltip': 3.4.3(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-aria/utils@3.19.0(react@18.2.0): + resolution: {integrity: sha512-5GXqTCrUQtr78aiLVHZoeeGPuAxO4lCM+udWbKpSCh5xLfCZ7zFlZV9Q9FS0ea+IQypUcY8ngXCLsf22nSu/yg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/ssr': 3.7.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + clsx: 1.2.1 + react: 18.2.0 + dev: false + + /@react-aria/visually-hidden@3.8.3(react@18.2.0): + resolution: {integrity: sha512-Ln3rqUnPF/UiiPjj8Xjc5FIagwNvG16qtAR2Diwnsju+X9o2xeDEZhN/5fg98PxH2JBS3IvtsmMZRzPT9mhpmg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + clsx: 1.2.1 + react: 18.2.0 + dev: false + + /@react-stately/checkbox@3.4.4(react@18.2.0): + resolution: {integrity: sha512-TYNod4+4TmS73F+sbKXAMoBH810ZEBdpMfXlNttUCXfVkDXc38W7ucvpQxXPwF+d+ZhGk4DJZsUYqfVPyXXSGg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/toggle': 3.6.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/collections@3.10.0(react@18.2.0): + resolution: {integrity: sha512-PyJEFmt9X0kDMF7D4StGnTdXX1hgyUcTXvvXU2fEw6OyXLtmfWFHmFARRtYbuelGKk6clmJojYmIEds0k8jdww==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/collections@3.9.0(react@18.2.0): + resolution: {integrity: sha512-CBpXSKmCpbIFpIToVFlzo2R1/Cj+dcU8gWw2KfPyyJX+2wHKkDIvtK01EAytDLX/vkE8O+fD5a7qMZ3pf8gpeA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.18.1(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/flags@3.0.0: + resolution: {integrity: sha512-e3i2ItHbIa0eEwmSXAnPdD7K8syW76JjGe8ENxwFJPW/H1Pu9RJfjkCb/Mq0WSPN/TpxBb54+I9TgrGhbCoZ9w==} + dependencies: + '@swc/helpers': 0.4.36 + dev: false + + /@react-stately/grid@3.8.0(react@18.2.0): + resolution: {integrity: sha512-+3Q6D3W5FTc9/t1Gz35sH0NRiJ2u95aDls9ogBNulC/kQvYaF31NT34QdvpstcfrcCFtF+D49+TkesklZRHJlw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/list@3.9.0(react@18.2.0): + resolution: {integrity: sha512-9DNV02zFEkJG38AtHyhvGMfpJQGwV0KMyMObs+KEujzCh+rmHdTu1rWdjzLw1ve+ecESK8UMsF4Kt6wwO0Qi6g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.9.0(react@18.2.0) + '@react-stately/selection': 3.13.2(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/list@3.9.1(react@18.2.0): + resolution: {integrity: sha512-GiKrxGakzMTZKe3mp410l4xKiHbZplJCGrtqlxq/+YRD0uCQwWGYpRG+z9A7tTCusruRD3m91/OjWsbfbGdiEw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/menu@3.5.3(react@18.2.0): + resolution: {integrity: sha512-RFgwVD/4BgTtJkexi1WaHpAEkQWZPvpyri0LQUgXWVqBf9PpjB8wigF3XBLMDNkL+YXE0QtzQZBNS1nJECf7rg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/overlays': 3.6.0(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/menu': 3.9.2(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/menu@3.5.4(react@18.2.0): + resolution: {integrity: sha512-+Q71fMDhMM1iARPFtwqpXY/8qkb0dN4PBJbcjwjGCumGs+ja2YbZxLBHCP0DYBElS9l6m3ssF47RKNMtF/Oi5w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/menu': 3.9.3(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/overlays@3.6.0(react@18.2.0): + resolution: {integrity: sha512-0Bgy4xwCXKM+jkHAGJMN19ZFXNgKstf6qJozfH79j3E5erY30ZStwT7gbAnwv112zFUQLHBKo+3wJTGWuHgs8Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/overlays': 3.8.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/overlays@3.6.1(react@18.2.0): + resolution: {integrity: sha512-c/Mda4ZZmFO4e3XZFd7kqt5wuh6Q/7wYJ+0oG59MfDoQstFwGcJTUnx7S8EUMujbocIOCeOmVPA1eE3DNPC2/A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/overlays': 3.8.1(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/radio@3.8.3(react@18.2.0): + resolution: {integrity: sha512-3ovJ6tDWzl/Qap8065GZS9mQM7LbQwLc7EhhmQ3dn5+pH4pUCHo8Gb0TIcYFsvFMyHrNMg/r8+N3ICq/WDj5NQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/radio': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/selection@3.13.2(react@18.2.0): + resolution: {integrity: sha512-rVnseneG9XWuS0+JEsa0EhRfTZsupm9JiEuZHZ19YeLewjVdFpjgBMDZb8ZYoyilNXVjyUwaoq94FsOXotsg9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.9.0(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/selection@3.13.3(react@18.2.0): + resolution: {integrity: sha512-+CmpZpyIXfbxEwd9eBvo5Jatc2MNX7HinBcW3X8GfvqNzkbgOXETsmXaW6jlKJekvLLE13Is78Ob8NNzZVxQYg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/table@3.11.0(react@18.2.0): + resolution: {integrity: sha512-mHv8KgNHm6scO0gntQc1ZVbQaAqLiNzYi4hxksz2lY+HN2CJbJkYGl/aRt4jmnfpi1xWpwYP5najXdncMAKpGA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/flags': 3.0.0 + '@react-stately/grid': 3.8.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/table': 3.8.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/tabs@3.5.1(react@18.2.0): + resolution: {integrity: sha512-p1vZOuIS98GMF9jfEHQA6Pir1wYY6j+Gni6DcluNnWj90rLEubuwARNw7uscoOaXKlK/DiZIhkLKSDsA5tbadQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/list': 3.9.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@react-types/tabs': 3.3.1(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/toggle@3.6.1(react@18.2.0): + resolution: {integrity: sha512-UUWtuI6gZlX6wpF9/bxBikjyAW1yQojRPCJ4MPkjMMBQL0iveAm3WEQkXRLNycEiOCeoaVFBwAd1L9h9+fuCFg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/tooltip@3.4.3(react@18.2.0): + resolution: {integrity: sha512-IX/XlLdwSQWy75TAOARm6hxajRWV0x/C7vGA54O+JNvvfZ212+nxVyTSduM+zjULzhOPICSSUFKmX4ZCV/aHSg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/overlays': 3.6.1(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/tooltip': 3.4.3(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/tree@3.7.0(react@18.2.0): + resolution: {integrity: sha512-oXOjJwy/o3XSJyBkudiEvnjWzto2jy48kmGjHCJ+B7Hv+WcbN9o7iAaHv11lOqMXRSpuF9gqox4ZZCASG+smIQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.9.0(react@18.2.0) + '@react-stately/selection': 3.13.2(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/tree@3.7.1(react@18.2.0): + resolution: {integrity: sha512-D0BWcLTRx7EOTdAJCgYV6zm18xpNDxmv4meKJ/WmYSFq1bkHPN75NLv7VPf5Uvsm66xshbO/B3A4HB2/ag1yPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.0(react@18.2.0) + '@react-stately/selection': 3.13.3(react@18.2.0) + '@react-stately/utils': 3.7.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/utils@3.7.0(react@18.2.0): + resolution: {integrity: sha512-VbApRiUV2rhozOfk0Qj9xt0qjVbQfLTgAzXLdrfeZSBnyIgo1bFRnjDpnDZKZUUCeGQcJJI03I9niaUtY+kwJQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/virtualizer@3.6.0(react@18.2.0): + resolution: {integrity: sha512-f78BQT9ZSD5Hpqf6axRoNQJFqV+JjMSV2VixMfhIAcqi/fn8rEN2j3g4SPdFzTtFf2FR3+AKdBFu5tsgtk1Tgw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-stately/virtualizer@3.6.1(react@18.2.0): + resolution: {integrity: sha512-Gq5gQ1YPgTakPCkWnmp9P6p5uGoVS+phm6Ie34lmZQ+E62lrkHK0XG0bkOuvMSdWwzql0oLg03E/SMOahI9vNA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/utils': 3.19.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + '@swc/helpers': 0.5.1 + react: 18.2.0 + dev: false + + /@react-types/accordion@3.0.0-alpha.15(react@18.2.0): + resolution: {integrity: sha512-BzR/9zVS1plc7s22szg5q2l15q+2pyyiM7S87Jfs9ROduM9GJjS3MwFvUyXAaYbh9t0Wkw+3ZZITUENimwFVPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/button@3.7.4(react@18.2.0): + resolution: {integrity: sha512-y1JOnJ3pqg2ezZz/fdwMMToPj+8fgj/He7z1NRWtIy1/I7HP+ilSK6S/MLO2jRsM2QfCq8KSw5MQEZBPiPWsjw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/checkbox@3.5.0(react@18.2.0): + resolution: {integrity: sha512-fCisTdqFKkz7FvxNoexXIiVsTBt0ZwIyeIZz/S41M6hzIZM38nKbh6yS/lveQ+/877Dn7+ngvbpJ8QYnXYVrIQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/dialog@3.5.4(react@18.2.0): + resolution: {integrity: sha512-WCEkUf93XauGaPaF1efTJ8u04Z5iUgmmzRbFnGLrske7rQJYfryP3+26zCxtKKlOTgeFORq5AHeH6vqaMKOhhg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/grid@3.2.0(react@18.2.0): + resolution: {integrity: sha512-ZIzFDbuBgqaPNvZ18/fOdm9Ol0m5rFPlhSxQfyAgUOXFaQhl/1+BsG8FsHla/Y6tTmxDt5cVrF5PX2CWzZmtOw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/label@3.7.5(react@18.2.0): + resolution: {integrity: sha512-iNO5T1UYK7FPF23cwRLQJ4zth2rqoJWbz27Wikwt8Cw8VbVVzfLBPUBZoUyeBVZ0/zzTvEgZUW75OrmKb4gqhw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/link@3.4.4(react@18.2.0): + resolution: {integrity: sha512-/FnKf7W6nCNZ2E96Yo1gaX63eSxERmtovQbkRRdsgPLfgRcqzQIVzQtNJThIbVNncOnAw3qvIyhrS0weUTFacQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-aria/interactions': 3.17.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/listbox@3.4.3(react@18.2.0): + resolution: {integrity: sha512-AHOnx5z+q/uIsBnGqrNJ25OSTbOe2/kWXWUcPDdfZ29OBqoDZu86psAOA97glYod97w/KzU5xq8EaxDrWupKuQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/menu@3.9.2(react@18.2.0): + resolution: {integrity: sha512-OIuEOGqo8gHaP4k3Ua+RvuPN2/3Sgcl30dNFIGaK7hra4eWxOUu8TTC+/Quy6xozR/SvFhqCLCoMKixy6MblWQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/overlays': 3.8.0(react@18.2.0) + '@react-types/shared': 3.18.1(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/menu@3.9.3(react@18.2.0): + resolution: {integrity: sha512-0dgIIM9z3hzjFltT+1/L8Hj3oDEcdYkexQhaA+jv6xBHUI5Bqs4SaJAeSGrGz5u6tsrHBPEgf/TLk9Dg9c7XMA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/overlays@3.8.0(react@18.2.0): + resolution: {integrity: sha512-0JxwUW3xwXjsT+nVI5dVE1KUm8QKxnQj9vjqgsazX213+klRd/QdeuFJgcbxzCVFOS/mLkP4o/ATjxt4+1eQsA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.18.1(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/overlays@3.8.1(react@18.2.0): + resolution: {integrity: sha512-aDI/K3E2XACkey8SCBmAerLhYSUFa8g8tML4SoQbfEJPRj+jJztbHbg9F7b3HKDUk4ZOjcUdQRfz1nFHORdbtQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-types/progress@3.4.1(react@18.2.0): + resolution: {integrity: sha512-Y6cTvvJjbfFBeB7Zb3PizhhO3+YLWXpIP8opto15RWu11ktgZVMUgsnlsJgE3dFeoZ7UHwXdCYf8JOzBw5VPHA==} peerDependencies: - web-vitals: ^2.1.4 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: - '@ohbug/types': 2.2.1 - web-vitals: 3.4.0 + '@react-types/shared': 3.18.1(react@18.2.0) + react: 18.2.0 dev: false - /@ohbug/react@2.0.9(react@16.14.0): - resolution: {integrity: sha512-UD4i7e7IGd6Qmcwvsm5kKfIojs/wqdcWANt2Wc/WFy9e7ppYyJcIvg1caskj3kmRY7fQS8blemTHQBQMPLN6AA==} + /@react-types/progress@3.4.2(react@18.2.0): + resolution: {integrity: sha512-UvnBt1OtjgQgOM3556KpuAXSdvSIVGSeD4+otTfkl05ieTcy6Lx7ef3TFI2KfQP45a9JeRBstTNpThBmuRe03A==} peerDependencies: - react: ^16.8.6 + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: - '@ohbug/core': 2.2.1 - '@ohbug/types': 2.2.1 - react: 16.14.0 + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 dev: false - /@ohbug/types@2.2.1: - resolution: {integrity: sha512-ZfY7pW2MPi3Kr+ASrYcBiQe8mAvekwmM2O5mkmiaTU1ggcxrSinqesWsea6BkO+54MSd68UC3vPJH5YkMVTf/Q==} + /@react-types/radio@3.5.0(react@18.2.0): + resolution: {integrity: sha512-jpAG03eYxLvD1+zLoHXVUR7BCXfzbaQnOv5vu2R4EXhBA7t1/HBOAY/WHbUEgrnyDYa2na7dr/RbY81H9JqR0g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 dev: false - /@ohbug/utils@2.0.8: - resolution: {integrity: sha512-eAhFr8c+7Q6MtxvkwgEGAg91XZXoZzASIsUzoGQAqt/hlMIPHlsN9CO2Lxr012jBU/I/pnQteopq+sQbZQjKIA==} + /@react-types/select@3.8.2(react@18.2.0): + resolution: {integrity: sha512-m11J/xBR8yFwPLuueoFHzr4DiLyY7nKLCbZCz1W2lwIyd8Tl2iJwcLcuJiyUTJwdSTcCDgvbkY4vdTfLOIktYQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: - '@ohbug/types': 2.2.1 - '@types/node': 20.4.1 + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 dev: false - /@ohbug/vue@2.0.10(vue@3.3.4): - resolution: {integrity: sha512-b/f2OhcwS6mwVhQHhlyQXVVydPeyHNoPcRAYafHWRp85UOxlmUWJdHDLXZxwSfy91JllEYeMSbiSWJV9HzLh5A==} + /@react-types/shared@3.18.1(react@18.2.0): + resolution: {integrity: sha512-OpTYRFS607Ctfd6Tmhyk6t6cbFyDhO5K+etU35X50pMzpypo1b7vF0mkngEeTc0Xwl0e749ONZNPZskMyu5k8w==} peerDependencies: - vue: 2.x || 3.x + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: - '@ohbug/core': 2.2.1 - '@ohbug/types': 2.2.1 - vue: 3.3.4 + react: 18.2.0 dev: false - /@panva/hkdf@1.0.2: - resolution: {integrity: sha512-MSAs9t3Go7GUkMhpKC44T58DJ5KGk2vBo+h1cqQeqlMfdGkxaVB78ZWpv9gYi/g2fa4sopag9gJsNvS8XGgWJA==} + /@react-types/shared@3.19.0(react@18.2.0): + resolution: {integrity: sha512-h852l8bWhqUxbXIG8vH3ab7gE19nnP3U1kuWf6SNSMvgmqjiRN9jXKPIFxF/PbfdvnXXm0yZSgSMWfUCARF0Cg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + react: 18.2.0 dev: false - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - optional: true - - /@pnpm/network.ca-file@1.0.1: - resolution: {integrity: sha512-gkINruT2KUhZLTaiHxwCOh1O4NVnFT0wLjWFBHmTz9vpKag/C/noIMJXBxFe4F0mYpUVX2puLwAieLYFg2NvoA==} - engines: {node: '>=12.22.0'} + /@react-types/switch@3.4.0(react@18.2.0): + resolution: {integrity: sha512-vUA4Etm7ZiThYN3IotPXl99gHYZNJlc/f9o/SgAUSxtk5pBv5unOSmXLdrvk01Kd6TJ/MjL42IxRShygyr8mTQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: - graceful-fs: 4.2.10 - dev: true + '@react-types/checkbox': 3.5.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 + dev: false - /@pnpm/npm-conf@1.0.5: - resolution: {integrity: sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==} - engines: {node: '>=12'} + /@react-types/table@3.8.0(react@18.2.0): + resolution: {integrity: sha512-/7IBG4ZlJHvEPQwND/q6ZFzfXq0Bc1ohaocDFzEOeNtVUrgQ2rFS64EY2p8G7BL9XDJFTY2R5dLYqjyGFojUvQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: - '@pnpm/network.ca-file': 1.0.1 - config-chain: 1.1.13 - dev: true - - /@popperjs/core@2.11.6: - resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} + '@react-types/grid': 3.2.0(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 dev: false - /@prisma/client@5.0.0(prisma@5.0.0): - resolution: {integrity: sha512-XlO5ELNAQ7rV4cXIDJUNBEgdLwX3pjtt9Q/RHqDpGf43szpNJx2hJnggfFs7TKNx0cOFsl6KJCSfqr5duEU/bQ==} - engines: {node: '>=16.13'} - requiresBuild: true + /@react-types/tabs@3.3.1(react@18.2.0): + resolution: {integrity: sha512-vPxSbLCU7RT+Rupvu/1uOAesxlR/53GD5ZbgLuQRr/oEZRbsjY8Cs3CE3LGv49VdvBWivXUvHiF5wSE7CdWs1w==} peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: - '@prisma/engines-version': 4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584 - prisma: 5.0.0 + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 dev: false - /@prisma/engines-version@4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584: - resolution: {integrity: sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ==} + /@react-types/textfield@3.7.3(react@18.2.0): + resolution: {integrity: sha512-M2u9NK3iqQEmTp4G1Dk36pCleyH/w1n+N52u5n0fRlxvucY/Od8W1zvk3w9uqJLFHSlzleHsfSvkaETDJn7FYw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 dev: false - /@prisma/engines@5.0.0: - resolution: {integrity: sha512-kyT/8fd0OpWmhAU5YnY7eP31brW1q1YrTGoblWrhQJDiN/1K+Z8S1kylcmtjqx5wsUGcP1HBWutayA/jtyt+sg==} - requiresBuild: true + /@react-types/tooltip@3.4.3(react@18.2.0): + resolution: {integrity: sha512-ne1SVhgofHRZNhoQM4iMCSjCstpdPBpM81B4KDJ7XmWax0+dP4qmdxMc7qvEm7GjuZLfYx5f44fWytKm1BkZmg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/overlays': 3.8.1(react@18.2.0) + '@react-types/shared': 3.19.0(react@18.2.0) + react: 18.2.0 dev: false - /@release-it/conventional-changelog@7.0.0(release-it@16.1.0): + /@release-it/conventional-changelog@7.0.0(release-it@16.1.5): resolution: {integrity: sha512-DBzyVS6c4g8w+xomCsygkmLeQBUq41Wvzy0vGgbdCLOxYnwI0cDaF6HOLPkrifH1qLa1uJ9i1pYA+hNyHkNanQ==} engines: {node: '>=16'} peerDependencies: @@ -3213,33 +6060,39 @@ packages: concat-stream: 2.0.0 conventional-changelog: 4.0.0 conventional-recommended-bump: 7.0.1 - release-it: 16.1.0 + release-it: 16.1.5 semver: 7.5.1 dev: true - /@rrweb/types@2.0.0-alpha.8: - resolution: {integrity: sha512-yAr6ZQrgmr7+qZU5DMGqYXnVsolC5epftmZtkOtgFD/bbvCWflNnl09M32hUjttlKCV1ohhmQGioXkCQ37IF7A==} + /@rrweb/types@2.0.0-alpha.10: + resolution: {integrity: sha512-SjpFUq7XJVmMZXuntngmsNH6KCIsFH39tq+vTB96J/tfPkeUsEHszhc4HbeKbcs2TBa+FxAWLb3VQ4fX00Bddg==} dependencies: - rrweb-snapshot: 2.0.0-alpha.8 + rrweb-snapshot: 2.0.0-alpha.10 dev: false /@rrweb/types@2.0.0-alpha.9: resolution: {integrity: sha512-yS2KghLSmSSxo6H7tHrJ6u+nWJA9zCXaKFyc79rUSX8RHHSImRqocTqJ8jz794kCIWA90rvaQayRONdHO+vB0Q==} dependencies: - rrweb-snapshot: 2.0.0-alpha.9 + rrweb-snapshot: 2.0.0-alpha.10 dev: false - /@sigstore/protobuf-specs@0.1.0: - resolution: {integrity: sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==} + /@sigstore/bundle@1.0.0: + resolution: {integrity: sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.0 + dev: true + + /@sigstore/protobuf-specs@0.2.0: + resolution: {integrity: sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /@sigstore/tuf@1.0.0: - resolution: {integrity: sha512-bLzi9GeZgMCvjJeLUIfs8LJYCxrPRA8IXQkzUtaFKKVPTz0mucRyqFcV2U20yg9K+kYAD0YSitzGfRZCFLjdHQ==} + /@sigstore/tuf@1.0.3: + resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - '@sigstore/protobuf-specs': 0.1.0 - make-fetch-happen: 11.1.1 + '@sigstore/protobuf-specs': 0.2.0 tuf-js: 1.1.7 transitivePeerDependencies: - supports-color @@ -3249,12 +6102,12 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - /@sindresorhus/is@5.3.0: - resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==} + /@sindresorhus/is@5.6.0: + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} dev: true - /@swc/cli@0.1.62(@swc/core@1.3.68): + /@swc/cli@0.1.62(@swc/core@1.3.78): resolution: {integrity: sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==} engines: {node: '>= 12.13'} hasBin: true @@ -3266,95 +6119,95 @@ packages: optional: true dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.3.68 + '@swc/core': 1.3.78 commander: 7.2.0 - fast-glob: 3.2.12 - semver: 7.5.3 + fast-glob: 3.3.1 + semver: 7.5.4 slash: 3.0.0 source-map: 0.7.4 - /@swc/core-darwin-arm64@1.3.68: - resolution: {integrity: sha512-Z5pNxeuP2NxpOHTzDQkJs0wAPLnTlglZnR3WjObijwvdwT/kw1Y5EPDKM/BVSIeG40SPMkDLBbI0aj0qyXzrBA==} + /@swc/core-darwin-arm64@1.3.78: + resolution: {integrity: sha512-596KRua/d5Gx1buHKKchSyHuwoIL4S1BRD/wCvYNLNZ3xOzcuBBmXOjrDVigKi1ztNDeS07p30RO5UyYur0XAA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@swc/core-darwin-x64@1.3.68: - resolution: {integrity: sha512-ZHl42g6yXhfX4PzAQ0BNvBXpt/OcbAHfubWRN6eXELK3fiNnxL7QBW1if7iizlq6iA+Mj1pwHyyUit1pz0+fgA==} + /@swc/core-darwin-x64@1.3.78: + resolution: {integrity: sha512-w0RsD1onQAj0vuLAoOVi48HgnW6D6oBEIZP17l0HYejCDBZ+FRZLjml7wgNAWMqHcd2qNRqgtZ+v7aLza2JtBQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.68: - resolution: {integrity: sha512-Mk8f6KCOQ2CNAR4PtWajIjS6XKSSR7ZYDOCf1GXRxhS3qEyQH7V8elWvqWYqHcT4foO60NUmxA/NOM/dQrdO1A==} + /@swc/core-linux-arm-gnueabihf@1.3.78: + resolution: {integrity: sha512-v1CpRn+H6fha1WIqmdRvJM40pFdjUHrGfhf4Ygci72nlAU41l5XimN8Iwkm8FgIwf2wnv0lLzedSM4IHvpq/yA==} engines: {node: '>=10'} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-gnu@1.3.68: - resolution: {integrity: sha512-RhBllggh9t9sIxaRgRcGrVaS7fDk6KsIqR6b9+dwU5OyDr4ZyHWw1ZaH/1/HAebuXYhNBjoNUiRtca6lKRIPgQ==} + /@swc/core-linux-arm64-gnu@1.3.78: + resolution: {integrity: sha512-Sis17dz9joJRFVvR/gteOZSUNrrrioo81RQzani0Zr5ZZOfWLMTB9DA+0MVlfnVa2taYcsJHJZFoAv9JkLwbzg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-musl@1.3.68: - resolution: {integrity: sha512-8K3zjU+tFgn6yGDEeD343gkKaHU9dhz77NiVkI1VzwRaT/Ag5pwl5eMQ1yStm8koNFzn3zq6rGjHfI5g2yI5Wg==} + /@swc/core-linux-arm64-musl@1.3.78: + resolution: {integrity: sha512-E5F8/qp+QupnfBnsP4vN1PKyCmAHYHDG1GMyPE/zLFOUYLgw+jK4C9rfyLBR0o2bWo1ay2WCIjusBZD9XHGOSA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-gnu@1.3.68: - resolution: {integrity: sha512-4xAnvsBOyeTL0AB8GWlRKDM/hsysJ5jr5qvdKKI3rZfJgnnxl/xSX6TJKPsJ8gygfUJ3BmfCbmUmEyeDZ3YPvA==} + /@swc/core-linux-x64-gnu@1.3.78: + resolution: {integrity: sha512-iDxa+RknnTQlyy+WfPor1FM6y44ERNI2E0xiUV6gV6uPwegCngi8LFC+E7IvP6+p+yXtAkesunAaiZ8nn0s+rw==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-musl@1.3.68: - resolution: {integrity: sha512-RCpaBo1fcpy1EFdjF+I7N4lfzOaHXVV0iMw/ABM+0PD6tp3V/9pxsguaZyeAHyEiUlDA6PZ4TfXv5zfnXEgW4Q==} + /@swc/core-linux-x64-musl@1.3.78: + resolution: {integrity: sha512-dWtIYUFL5sMTE2UKshkXTusHcK8+zAhhGzvqWq1wJS45pqTlrAbzpyqB780fle880x3A6DMitWmsAFARdNzpuQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-win32-arm64-msvc@1.3.68: - resolution: {integrity: sha512-v2WZvXrSslYEpY1nqpItyamL4DyaJinmOkXvM8Bc1LLKU5rGuvmBdjUYg/5Y+o0AUynuiWubpgHNOkBWiCvfqw==} + /@swc/core-win32-arm64-msvc@1.3.78: + resolution: {integrity: sha512-CXFaGEc2M9Su3UoUMC8AnzKb9g+GwPxXfakLWZsjwS448h6jcreExq3nwtBNdVGzQ26xqeVLMFfb1l/oK99Hwg==} engines: {node: '>=10'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-ia32-msvc@1.3.68: - resolution: {integrity: sha512-HH5NJrIdzkJs+1xxprie0qSCMBeL9yeEhcC1yZTzYv8bwmabOUSdtKIqS55iYP/2hLWn9CTbvKPmLOIhCopW3Q==} + /@swc/core-win32-ia32-msvc@1.3.78: + resolution: {integrity: sha512-FaH1jwWnJpWkdImpMoiZpMg9oy9UUyZwltzN7hFwjR48e3Li82cRFb+9PifIBHCUSBM+CrrsJXbHP213IMVAyw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-x64-msvc@1.3.68: - resolution: {integrity: sha512-9HZVtLQUgK8r/yXQdwe0VBexbIcrY6+fBROhs7AAPWdewpaUeLkwQEJk6TbYr9CQuHw26FFGg6SjwAiqXF+kgQ==} + /@swc/core-win32-x64-msvc@1.3.78: + resolution: {integrity: sha512-oYxa+tPdhlx1aH14AIoF6kvVjo49tEOW0drNqoEaVHufvgH0y43QU2Jum3b2+xXztmMRtzK2CSN3GPOAXDKKKg==} engines: {node: '>=10'} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@swc/core@1.3.68: - resolution: {integrity: sha512-njGQuJO+Wy06dEayt70cf0c/KI3HGjm4iW9LLViVLBuYNzJ4SSdNfzejludzufu6im+dsDJ0i3QjgWhAIcVHMQ==} + /@swc/core@1.3.78: + resolution: {integrity: sha512-y6DQP571v7fbUUY7nz5G4lNIRGofuO48K5pGhD9VnuOCTuptfooCdi8wnigIrIhM/M4zQ53m/YCMDCbOtDgEww==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -3363,21 +6216,34 @@ packages: '@swc/helpers': optional: true optionalDependencies: - '@swc/core-darwin-arm64': 1.3.68 - '@swc/core-darwin-x64': 1.3.68 - '@swc/core-linux-arm-gnueabihf': 1.3.68 - '@swc/core-linux-arm64-gnu': 1.3.68 - '@swc/core-linux-arm64-musl': 1.3.68 - '@swc/core-linux-x64-gnu': 1.3.68 - '@swc/core-linux-x64-musl': 1.3.68 - '@swc/core-win32-arm64-msvc': 1.3.68 - '@swc/core-win32-ia32-msvc': 1.3.68 - '@swc/core-win32-x64-msvc': 1.3.68 + '@swc/core-darwin-arm64': 1.3.78 + '@swc/core-darwin-x64': 1.3.78 + '@swc/core-linux-arm-gnueabihf': 1.3.78 + '@swc/core-linux-arm64-gnu': 1.3.78 + '@swc/core-linux-arm64-musl': 1.3.78 + '@swc/core-linux-x64-gnu': 1.3.78 + '@swc/core-linux-x64-musl': 1.3.78 + '@swc/core-win32-arm64-msvc': 1.3.78 + '@swc/core-win32-ia32-msvc': 1.3.78 + '@swc/core-win32-x64-msvc': 1.3.78 + + /@swc/helpers@0.4.14: + resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} + dependencies: + tslib: 2.6.1 + dev: false + + /@swc/helpers@0.4.36: + resolution: {integrity: sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==} + dependencies: + legacy-swc-helpers: /@swc/helpers@0.4.14 + tslib: 2.6.1 + dev: false /@swc/helpers@0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@szmarczak/http-timer@4.0.6: @@ -3393,6 +6259,23 @@ packages: defer-to-connect: 2.0.1 dev: true + /@tanstack/react-table@8.9.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Ng9rdm3JPoSCi6cVZvANsYnF+UoGVRxflMb270tVj0+LjeT/ZtZ9ckxF6oLPLcKesza6VKBqtdF9mQ+vaz24Aw==} + engines: {node: '>=12'} + peerDependencies: + react: '>=16' + react-dom: '>=16' + dependencies: + '@tanstack/table-core': 8.9.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@tanstack/table-core@8.9.3: + resolution: {integrity: sha512-NpHZBoHTfqyJk0m/s/+CSuAiwtebhYK90mDuf5eylTvgViNOujiaOaxNDxJkQQAsVvHWZftUGAx1EfO1rkKtLg==} + engines: {node: '>=12'} + dev: false + /@tokenizer/token@0.3.0: resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -3401,6 +6284,10 @@ packages: engines: {node: '>= 10'} dev: true + /@tootallnate/quickjs-emscripten@0.23.0: + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + dev: true + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} @@ -3410,8 +6297,8 @@ packages: /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - /@tsconfig/node16@1.0.3: - resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} /@tsconfig/svelte@1.0.13: resolution: {integrity: sha512-5lYJP45Xllo4yE/RUBccBT32eBlRDbqN8r1/MIvQbKxW3aFqaYPCNgm8D5V20X4ShHcwvYWNlKg3liDh1MlBoA==} @@ -3427,21 +6314,21 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@tufjs/canonical-json': 1.0.0 - minimatch: 9.0.2 + minimatch: 9.0.3 dev: true /@types/body-parser@1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.4.1 + '@types/node': 20.5.4 dev: false /@types/bull@4.10.0: resolution: {integrity: sha512-RkYW8K2H3J76HT6twmHYbzJ0GtLDDotpLP9ah9gtiA7zfF6peBH1l5fEiK0oeIZ3/642M7Jcb9sPmor8Vf4w6g==} deprecated: This is a stub types definition. bull provides its own type definitions, so you do not need this installed. dependencies: - bull: 4.10.4 + bull: 4.11.3 transitivePeerDependencies: - supports-color dev: false @@ -3451,20 +6338,36 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 20.4.1 + '@types/node': 20.5.4 '@types/responselike': 1.0.0 + /@types/color-convert@2.0.0: + resolution: {integrity: sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==} + dependencies: + '@types/color-name': 1.1.1 + dev: false + + /@types/color-name@1.1.1: + resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==} + dev: false + + /@types/color@3.0.3: + resolution: {integrity: sha512-X//qzJ3d3Zj82J9sC/C18ZY5f43utPbAJ6PhYt/M7uG6etcF6MRpKdN880KBy43B0BMzSfeT96MzrsNjFI3GbA==} + dependencies: + '@types/color-convert': 2.0.0 + dev: false + /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.4.1 + '@types/node': 20.5.4 dev: false - /@types/cron@2.0.1: - resolution: {integrity: sha512-WHa/1rtNtD2Q/H0+YTTZoty+/5rcE66iAFX2IY+JuUoOACsevYyFkSYu/2vdw+G5LrmO7Lxowrqm0av4k3qWNQ==} + /@types/cron@2.4.0: + resolution: {integrity: sha512-5bBaAkqvSFBX8JMi/xCofNzG5E594TNsApMz68dLd/sQYz/HGQqgcxGHTRjOvD4G3Y+YF1Oo3S7QdCvKt1KAJQ==} + deprecated: This is a stub types definition. cron provides its own type definitions, so you do not need this installed. dependencies: - '@types/luxon': 3.0.0 - '@types/node': 20.3.2 + cron: 2.4.0 dev: false /@types/crypto-js@4.1.1: @@ -3478,14 +6381,14 @@ packages: /@types/eslint-scope@3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: - '@types/eslint': 8.4.9 + '@types/eslint': 8.44.2 '@types/estree': 1.0.1 - /@types/eslint@8.4.9: - resolution: {integrity: sha512-jFCSo4wJzlHQLCpceUhUnXdrPuCNOjGFMQ8Eg6JXxlz3QaCKOb7eGi2cephQdM4XTYsNej69P9JDJ1zqNIbncQ==} + /@types/eslint@8.44.2: + resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==} dependencies: '@types/estree': 1.0.1 - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.12 /@types/estree@1.0.1: resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} @@ -3493,7 +6396,7 @@ packages: /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 20.4.1 + '@types/node': 20.5.4 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -3505,22 +6408,30 @@ packages: '@types/body-parser': 1.19.2 '@types/express-serve-static-core': 4.17.35 '@types/qs': 6.9.7 - '@types/serve-static': 1.15.0 + '@types/serve-static': 1.15.2 + dev: false + + /@types/flat@5.0.2: + resolution: {integrity: sha512-3zsplnP2djeps5P9OyarTxwRpMLoe5Ash8aL9iprw0JxB+FAHjY+ifn4yZUuW4/9hqtnmor6uvjSRzJhiVbrEQ==} dev: false /@types/http-cache-semantics@4.0.1: resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} + /@types/http-errors@2.0.1: + resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} + dev: false + /@types/js-cookie@2.2.7: resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} dev: false /@types/js-yaml@4.0.5: resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} - dev: false + dev: true - /@types/json-schema@7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -3529,43 +6440,69 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.4.1 + '@types/node': 20.5.4 /@types/linkify-it@3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} dev: false + /@types/lodash.foreach@4.5.7: + resolution: {integrity: sha512-YjBEB6/Bl19V+R70IpyB/MhMb2IvrSgD26maRNyqbGRNDTH9AnPrQoT+ECvhFJ/hwhQ+RgYWaZKvF+knCguMJw==} + dependencies: + '@types/lodash': 4.14.196 + dev: false + + /@types/lodash.get@4.4.7: + resolution: {integrity: sha512-af34Mj+KdDeuzsJBxc/XeTtOx0SZHZNLd+hdrn+PcKGQs0EG2TJTzQAOTCZTgDJCArahlCzLWSy8c2w59JRz7Q==} + dependencies: + '@types/lodash': 4.14.196 + dev: false + + /@types/lodash.kebabcase@4.1.7: + resolution: {integrity: sha512-qzrcpK5uiADZ9OyZaegalM0b9Y3WetoBQ04RAtP3xZFGC5ul1UxmbjZ3j6suCh0BDkvgQmoMh8t5e9cVrdJYMw==} + dependencies: + '@types/lodash': 4.14.196 + dev: false + + /@types/lodash.mapkeys@4.6.7: + resolution: {integrity: sha512-mfK0jlh4Itdhmy69/7r/vYftWaltahoS9kCF62UyvbDtXzMkUjuypaf2IASeoeoUPqBo/heoJSZ/vntbXC6LAA==} + dependencies: + '@types/lodash': 4.14.196 + dev: false + /@types/lodash.mergewith@4.6.6: resolution: {integrity: sha512-RY/8IaVENjG19rxTZu9Nukqh0W2UrYgmBj5sdns4hWRZaV8PqR7wIKHFKzvOTjo4zVRV7sVI+yFhAJql12Kfqg==} dependencies: - '@types/lodash': 4.14.186 + '@types/lodash': 4.14.196 dev: false /@types/lodash.mergewith@4.6.7: resolution: {integrity: sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==} dependencies: - '@types/lodash': 4.14.186 + '@types/lodash': 4.14.196 dev: false - /@types/lodash@4.14.186: - resolution: {integrity: sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==} + /@types/lodash.omit@4.5.7: + resolution: {integrity: sha512-6q6cNg0tQ6oTWjSM+BcYMBhan54P/gLqBldG4AuXd3nKr0oeVekWNS4VrNEu3BhCSDXtGapi7zjhnna0s03KpA==} + dependencies: + '@types/lodash': 4.14.196 dev: false - /@types/luxon@3.0.0: - resolution: {integrity: sha512-Lx+EZoJxUKw4dp8uei9XiUVNlgkYmax5+ovqt6Xf3LzJOnWhlfJw/jLBmqfGVwOP/pDr4HT8bI1WtxK0IChMLw==} + /@types/lodash@4.14.196: + resolution: {integrity: sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==} dev: false - /@types/markdown-it@12.2.3: - resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} + /@types/markdown-it@13.0.0: + resolution: {integrity: sha512-mPTaUl5glYfzdJFeCsvhXQwZKdyszNAZcMm5ZTP5SfpTu+vIbog7J3z8Fa4x/Fzv5TB4R6OA/pHBYIYmkYOWGQ==} dependencies: '@types/linkify-it': 3.0.2 '@types/mdurl': 1.0.2 dev: false - /@types/mdast@3.0.10: - resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} + /@types/mdast@3.0.12: + resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 dev: true /@types/mdurl@1.0.2: @@ -3584,17 +6521,21 @@ packages: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/node@20.3.2: - resolution: {integrity: sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw==} + /@types/node@20.4.7: + resolution: {integrity: sha512-bUBrPjEry2QUTsnuEjzjbS7voGWCc30W0qzgMf90GPeDGFRakvrz47ju+oqDAKCXLUCe39u57/ORMl/O/04/9g==} + dev: true + + /@types/node@20.4.8: + resolution: {integrity: sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg==} dev: false - /@types/node@20.4.1: - resolution: {integrity: sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg==} + /@types/node@20.5.4: + resolution: {integrity: sha512-Y9vbIAoM31djQZrPYjpTLo0XlaSwOIsrlfE3LpulZeRblttsLQRFRlBAppW0LOxyT3ALj2M5vU1ucQQayQH3jA==} - /@types/nodemailer@6.4.8: - resolution: {integrity: sha512-oVsJSCkqViCn8/pEu2hfjwVO+Gb3e+eTWjg3PcjeFKRItfKpKwHphQqbYmPQrlMk+op7pNNWPbsJIEthpFN/OQ==} + /@types/nodemailer@6.4.9: + resolution: {integrity: sha512-XYG8Gv+sHjaOtUpiuytahMy2mM3rectgroNbs6R3djZEKmPNiIJwe9KqOJBGzKKnNZNKvnuvmugBgpq3w/S0ig==} dependencies: - '@types/node': 20.3.2 + '@types/node': 20.4.8 dev: false /@types/normalize-package-data@2.4.1: @@ -3621,33 +6562,33 @@ packages: resolution: {integrity: sha512-Yh/RHkjN0ru6LVhSQtTkCRo6HXkfL9trot/2elzM/yXLJmbLm2v6kJc8yftTnwv1zvUob6TEtqI2cYjdqG3U0Q==} dependencies: types-ramda: 0.29.4 - dev: false + dev: true /@types/range-parser@1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: false - /@types/react-dom@18.2.6: - resolution: {integrity: sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A==} + /@types/react-dom@18.2.7: + resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} dependencies: - '@types/react': 18.2.14 + '@types/react': 18.2.21 dev: false - /@types/react@18.2.14: - resolution: {integrity: sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==} + /@types/react@18.2.21: + resolution: {integrity: sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==} dependencies: '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.2 - csstype: 3.1.1 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 dev: false /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.4.1 + '@types/node': 20.5.4 - /@types/scheduler@0.16.2: - resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} + /@types/scheduler@0.16.3: + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} dev: false /@types/semver@7.5.0: @@ -3658,162 +6599,164 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.4.1 + '@types/node': 20.5.4 dev: false - /@types/serve-static@1.15.0: - resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} + /@types/serve-static@1.15.2: + resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} dependencies: + '@types/http-errors': 2.0.1 '@types/mime': 3.0.1 - '@types/node': 20.4.1 + '@types/node': 20.5.4 dev: false /@types/ua-parser-js@0.7.36: resolution: {integrity: sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==} dev: false - /@types/unist@2.0.6: - resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + /@types/unist@2.0.7: + resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} dev: true - /@types/validator@13.7.17: - resolution: {integrity: sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==} + /@types/validator@13.9.0: + resolution: {integrity: sha512-NclP0IbzHj/4tJZKFqKh8E7kZdgss+MCUYV9G+TLltFfDA4lFgE4PKPpDIyS2FlcdANIfSx273emkupvChigbw==} dev: false - /@typescript-eslint/eslint-plugin@5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.44.0)(typescript@5.1.6): - resolution: {integrity: sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.1.6): + resolution: {integrity: sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.5.1 - '@typescript-eslint/parser': 5.60.1(eslint@8.44.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 5.60.1 - '@typescript-eslint/type-utils': 5.60.1(eslint@8.44.0)(typescript@5.1.6) - '@typescript-eslint/utils': 5.60.1(eslint@8.44.0)(typescript@5.1.6) + '@eslint-community/regexpp': 4.6.2 + '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/scope-manager': 6.4.1 + '@typescript-eslint/type-utils': 6.4.1(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 6.4.1 debug: 4.3.4 - eslint: 8.44.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.0 - natural-compare-lite: 1.4.0 - semver: 7.5.3 - tsutils: 3.21.0(typescript@5.1.6) + eslint: 8.47.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.1(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.60.1(eslint@8.44.0)(typescript@5.1.6): - resolution: {integrity: sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/parser@6.4.1(eslint@8.47.0)(typescript@5.1.6): + resolution: {integrity: sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.60.1 - '@typescript-eslint/types': 5.60.1 - '@typescript-eslint/typescript-estree': 5.60.1(typescript@5.1.6) + '@typescript-eslint/scope-manager': 6.4.1 + '@typescript-eslint/types': 6.4.1 + '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 6.4.1 debug: 4.3.4 - eslint: 8.44.0 + eslint: 8.47.0 typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@5.60.1: - resolution: {integrity: sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/scope-manager@6.4.1: + resolution: {integrity: sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 5.60.1 - '@typescript-eslint/visitor-keys': 5.60.1 + '@typescript-eslint/types': 6.4.1 + '@typescript-eslint/visitor-keys': 6.4.1 dev: true - /@typescript-eslint/type-utils@5.60.1(eslint@8.44.0)(typescript@5.1.6): - resolution: {integrity: sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/type-utils@6.4.1(eslint@8.47.0)(typescript@5.1.6): + resolution: {integrity: sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: '*' + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.60.1(typescript@5.1.6) - '@typescript-eslint/utils': 5.60.1(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.1.6) + '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.1.6) debug: 4.3.4 - eslint: 8.44.0 - tsutils: 3.21.0(typescript@5.1.6) + eslint: 8.47.0 + ts-api-utils: 1.0.1(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@5.60.1: - resolution: {integrity: sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/types@6.4.1: + resolution: {integrity: sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==} + engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@5.60.1(typescript@5.1.6): - resolution: {integrity: sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/typescript-estree@6.4.1(typescript@5.1.6): + resolution: {integrity: sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.60.1 - '@typescript-eslint/visitor-keys': 5.60.1 + '@typescript-eslint/types': 6.4.1 + '@typescript-eslint/visitor-keys': 6.4.1 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.3 - tsutils: 3.21.0(typescript@5.1.6) + semver: 7.5.4 + ts-api-utils: 1.0.1(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.60.1(eslint@8.44.0)(typescript@5.1.6): - resolution: {integrity: sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/utils@6.4.1(eslint@8.47.0)(typescript@5.1.6): + resolution: {integrity: sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) - '@types/json-schema': 7.0.11 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 5.60.1 - '@typescript-eslint/types': 5.60.1 - '@typescript-eslint/typescript-estree': 5.60.1(typescript@5.1.6) - eslint: 8.44.0 - eslint-scope: 5.1.1 - semver: 7.5.3 + '@typescript-eslint/scope-manager': 6.4.1 + '@typescript-eslint/types': 6.4.1 + '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.1.6) + eslint: 8.47.0 + semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@5.60.1: - resolution: {integrity: sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/visitor-keys@6.4.1: + resolution: {integrity: sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 5.60.1 - eslint-visitor-keys: 3.4.1 + '@typescript-eslint/types': 6.4.1 + eslint-visitor-keys: 3.4.2 dev: true /@vue/compiler-core@3.3.4: resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} dependencies: - '@babel/parser': 7.22.5 + '@babel/parser': 7.22.7 '@vue/shared': 3.3.4 estree-walker: 2.0.2 source-map-js: 1.0.2 @@ -3829,15 +6772,15 @@ packages: /@vue/compiler-sfc@3.3.4: resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} dependencies: - '@babel/parser': 7.22.5 + '@babel/parser': 7.22.7 '@vue/compiler-core': 3.3.4 '@vue/compiler-dom': 3.3.4 '@vue/compiler-ssr': 3.3.4 '@vue/reactivity-transform': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 - magic-string: 0.30.0 - postcss: 8.4.25 + magic-string: 0.30.2 + postcss: 8.4.28 source-map-js: 1.0.2 dev: false @@ -3851,11 +6794,11 @@ packages: /@vue/reactivity-transform@3.3.4: resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} dependencies: - '@babel/parser': 7.22.5 + '@babel/parser': 7.22.7 '@vue/compiler-core': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 - magic-string: 0.30.0 + magic-string: 0.30.2 dev: false /@vue/reactivity@3.3.4: @@ -3876,7 +6819,7 @@ packages: dependencies: '@vue/runtime-core': 3.3.4 '@vue/shared': 3.3.4 - csstype: 3.1.1 + csstype: 3.1.2 dev: false /@vue/server-renderer@3.3.4(vue@3.3.4): @@ -3984,7 +6927,7 @@ packages: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 - /@webundsoehne/nest-fastify-file-upload@2.1.0(@nestjs/common@10.0.5)(@nestjs/core@10.0.5)(@nestjs/platform-fastify@10.0.5): + /@webundsoehne/nest-fastify-file-upload@2.1.0(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(@nestjs/platform-fastify@10.2.1): resolution: {integrity: sha512-VtxfqG4WGW3fG1MD///HQRizYQNuY8YByeJdVKroFFZizXmj8XgLNAaTWDO/ff9hx2sPXF3vm6J8erq//DAODg==} engines: {node: '>=12'} peerDependencies: @@ -3992,9 +6935,9 @@ packages: '@nestjs/core': '>= 7 < 10' '@nestjs/platform-fastify': '>= 7 < 10' dependencies: - '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/platform-fastify': 10.0.5(@nestjs/common@10.0.5)(@nestjs/core@10.0.5) + '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/platform-fastify': 10.2.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1) fastify-multer: 2.0.3 dev: false @@ -4012,12 +6955,18 @@ packages: /@xtuc/long@4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - /@zag-js/element-size@0.3.2: - resolution: {integrity: sha512-bVvvigUGvAuj7PCkE5AbzvTJDTw5f3bg9nQdv+ErhVN8SfPPppLJEmmWdxqsRzrHXgx8ypJt/+Ty0kjtISVDsQ==} + /@zag-js/dom-query@0.10.5: + resolution: {integrity: sha512-zm6wA5+kqU48it6afNjaUhjVSixKZruTKB23z0V1xBqKbuiLOMMOZ5oK26cTPSXtZ5CPhDNZ2Qk4pliS5n9SVw==} + dev: false + + /@zag-js/element-size@0.10.5: + resolution: {integrity: sha512-uQre5IidULANvVkNOBQ1tfgwTQcGl4hliPSe69Fct1VfYb2Fd0jdAcGzqQgPhfrXFpR62MxLPB7erxJ/ngtL8w==} dev: false - /@zag-js/focus-visible@0.2.2: - resolution: {integrity: sha512-0j2gZq8HiZ51z4zNnSkF1iSkqlwRDvdH+son3wHdoz+7IUdMN/5Exd4TxMJ+gq2Of1DiXReYLL9qqh2PdQ4wgA==} + /@zag-js/focus-visible@0.10.5: + resolution: {integrity: sha512-EhDHKLutMtvLFCjBjyIY6h1JoJJNXG3KJz7Dj1sh4tj4LWAqo/TqLvgHyUTB29XMHwoslFHDJHKVWmLGMi+ULQ==} + dependencies: + '@zag-js/dom-query': 0.10.5 dev: false /JSONStream@1.3.5: @@ -4048,46 +6997,27 @@ packages: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} dev: false - /acorn-import-assertions@1.9.0(acorn@8.9.0): + /acorn-import-assertions@1.9.0(acorn@8.10.0): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.9.0 + acorn: 8.10.0 - /acorn-jsx@5.3.2(acorn@8.8.1): + /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.1 - dev: true - - /acorn-jsx@5.3.2(acorn@8.9.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.9.0 + acorn: 8.10.0 dev: true /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} - /acorn@8.8.0: - resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} - engines: {node: '>=0.4.0'} - hasBin: true - - /acorn@8.8.1: - resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /acorn@8.9.0: - resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true @@ -4113,15 +7043,11 @@ packages: - supports-color dev: true - /agentkeepalive@4.3.0: - resolution: {integrity: sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==} + /agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} dependencies: - debug: 4.3.4 - depd: 2.0.0 humanize-ms: 1.2.1 - transitivePeerDependencies: - - supports-color dev: true /aggregate-error@3.1.0: @@ -4183,6 +7109,13 @@ packages: dependencies: type-fest: 0.21.3 + /ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: true + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -4190,6 +7123,7 @@ packages: /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} + dev: true /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} @@ -4206,18 +7140,17 @@ packages: /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + dev: true /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false - /anymatch@3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: false /append-field@1.0.0: resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} @@ -4239,12 +7172,15 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: delegates: 1.0.0 - readable-stream: 3.6.0 + readable-stream: 3.6.2 dev: true /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -4252,9 +7188,16 @@ packages: resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} engines: {node: '>=10'} dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: true + /array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} dev: true @@ -4264,9 +7207,9 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - get-intrinsic: 1.1.3 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 is-string: 1.0.7 dev: true @@ -4277,14 +7220,26 @@ packages: /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + dev: true + + /array.prototype.findlastindex@1.2.2: + resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 + dev: true /array.prototype.flat@1.3.1: resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 dev: true @@ -4293,8 +7248,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 dev: true @@ -4303,8 +7258,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.22.1 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 dev: true @@ -4313,10 +7268,22 @@ packages: resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 + dev: true + + /arraybuffer.prototype.slice@1.0.1: + resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 dev: true /arrify@1.0.1: @@ -4332,12 +7299,7 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} dependencies: - tslib: 2.6.0 - dev: true - - /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} + tslib: 2.6.1 dev: true /async-retry@1.3.3: @@ -4346,6 +7308,12 @@ packages: retry: 0.13.1 dev: true + /asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + dependencies: + has-symbols: 1.0.3 + dev: true + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false @@ -4360,28 +7328,33 @@ packages: engines: {node: '>=8.0.0'} dev: false - /autoprefixer@10.4.14(postcss@8.4.25): - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + /autoprefixer@10.4.15(postcss@8.4.28): + resolution: {integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.21.9 - caniuse-lite: 1.0.30001509 + browserslist: 4.21.10 + caniuse-lite: 1.0.30001522 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.25 + postcss: 8.4.28 postcss-value-parser: 4.2.0 dev: false + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + /avvio@8.2.1: resolution: {integrity: sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==} dependencies: archy: 1.0.0 debug: 4.3.4 - fastq: 1.13.0 + fastq: 1.15.0 transitivePeerDependencies: - supports-color dev: false @@ -4389,7 +7362,7 @@ packages: /axios@1.4.0: resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} dependencies: - follow-redirects: 1.15.1 + follow-redirects: 1.15.2 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -4400,9 +7373,9 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.22.5 - cosmiconfig: 7.0.1 - resolve: 1.22.2 + '@babel/runtime': 7.22.6 + cosmiconfig: 7.1.0 + resolve: 1.22.4 dev: false /balanced-match@1.0.2: @@ -4446,7 +7419,7 @@ packages: engines: {node: '>=12'} dependencies: bin-version: 6.0.0 - semver: 7.5.3 + semver: 7.5.4 semver-truncate: 3.0.0 /bin-version@6.0.0: @@ -4459,33 +7432,32 @@ packages: /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - dev: false /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: buffer: 5.7.1 inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.2 /bl@5.1.0: resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} dependencies: buffer: 6.0.3 inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.2 dev: true /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: true - /boxen@7.0.0: - resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==} + /boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} engines: {node: '>=14.16'} dependencies: ansi-align: 3.0.1 - camelcase: 7.0.0 + camelcase: 7.0.1 chalk: 5.3.0 cli-boxes: 3.0.0 string-width: 5.1.2 @@ -4518,15 +7490,15 @@ packages: dependencies: fill-range: 7.0.1 - /browserslist@4.21.9: - resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001509 - electron-to-chromium: 1.4.445 - node-releases: 2.0.12 - update-browserslist-db: 1.0.11(browserslist@4.21.9) + caniuse-lite: 1.0.30001522 + electron-to-chromium: 1.4.485 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -4551,20 +7523,19 @@ packages: /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: - semver: 7.5.3 + semver: 7.5.4 dev: true - /bull@4.10.4: - resolution: {integrity: sha512-o9m/7HjS/Or3vqRd59evBlWCXd9Lp+ALppKseoSKHaykK46SmRjAilX98PgmOz1yeVaurt8D5UtvEt4bUjM3eA==} + /bull@4.11.3: + resolution: {integrity: sha512-DhS0XtiAuejkAY08iGOdDK35eex/yGNoezlWqGJTu9FqWFF/oBjUhpsusE9SXiI4culyDbOoFs+l3ar0VXhFqQ==} engines: {node: '>=12'} dependencies: - cron-parser: 4.6.0 - debuglog: 1.0.1 + cron-parser: 4.8.1 get-port: 5.1.1 ioredis: 5.3.2 lodash: 4.17.21 - msgpackr: 1.7.2 - semver: 7.5.3 + msgpackr: 1.9.6 + semver: 7.5.4 uuid: 8.3.2 transitivePeerDependencies: - supports-color @@ -4577,15 +7548,15 @@ packages: run-applescript: 5.0.0 dev: true - /bundle-require@4.0.1(esbuild@0.18.10): + /bundle-require@4.0.1(esbuild@0.18.19): resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.17' dependencies: - esbuild: 0.18.10 - load-tsconfig: 0.2.3 - dev: false + esbuild: 0.18.19 + load-tsconfig: 0.2.5 + dev: true /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} @@ -4597,7 +7568,7 @@ packages: /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - dev: false + dev: true /cacache@17.1.3: resolution: {integrity: sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==} @@ -4605,7 +7576,7 @@ packages: dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.2 - glob: 10.3.1 + glob: 10.3.3 lru-cache: 7.18.3 minipass: 5.0.0 minipass-collect: 1.0.2 @@ -4626,14 +7597,14 @@ packages: engines: {node: '>=14.16'} dev: true - /cacheable-request@10.2.12: - resolution: {integrity: sha512-qtWGB5kn2OLjx47pYUkWicyOpK1vy9XZhq8yRTXOy+KAmjjESSRLx6SiExnnaGGUP1NM6/vmygMu0fGylNh9tw==} + /cacheable-request@10.2.13: + resolution: {integrity: sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==} engines: {node: '>=14.16'} dependencies: '@types/http-cache-semantics': 4.0.1 get-stream: 6.0.1 http-cache-semantics: 4.1.1 - keyv: 4.5.2 + keyv: 4.5.3 mimic-response: 4.0.0 normalize-url: 8.0.0 responselike: 3.0.0 @@ -4646,7 +7617,7 @@ packages: clone-response: 1.0.3 get-stream: 5.2.0 http-cache-semantics: 4.1.1 - keyv: 4.5.2 + keyv: 4.5.3 lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 @@ -4660,13 +7631,17 @@ packages: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 dev: true /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} @@ -4681,13 +7656,17 @@ packages: engines: {node: '>=6'} dev: true - /camelcase@7.0.0: - resolution: {integrity: sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==} + /camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} dev: true - /caniuse-lite@1.0.30001509: - resolution: {integrity: sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA==} + /caniuse-lite@1.0.30001519: + resolution: {integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==} + dev: false + + /caniuse-lite@1.0.30001522: + resolution: {integrity: sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==} /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -4704,11 +7683,6 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.2.0: - resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - /chalk@5.3.0: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -4733,7 +7707,7 @@ packages: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: - anymatch: 3.1.2 + anymatch: 3.1.3 braces: 3.0.2 glob-parent: 5.1.2 is-binary-path: 2.1.0 @@ -4742,7 +7716,6 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.2 - dev: false /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} @@ -4765,9 +7738,15 @@ packages: /class-validator@0.14.0: resolution: {integrity: sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==} dependencies: - '@types/validator': 13.7.17 - libphonenumber-js: 1.10.37 - validator: 13.7.0 + '@types/validator': 13.9.0 + libphonenumber-js: 1.10.39 + validator: 13.11.0 + dev: false + + /class-variance-authority@0.7.0: + resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} + dependencies: + clsx: 2.0.0 dev: false /clean-regexp@1.0.0: @@ -4800,8 +7779,8 @@ packages: restore-cursor: 4.0.0 dev: true - /cli-spinners@2.7.0: - resolution: {integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==} + /cli-spinners@2.9.0: + resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} engines: {node: '>=6'} /cli-table3@0.6.3: @@ -4813,14 +7792,6 @@ packages: '@colors/colors': 1.5.0 dev: false - /cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} - dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 - dev: true - /cli-truncate@3.1.0: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4833,8 +7804,8 @@ packages: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} - /cli-width@4.0.0: - resolution: {integrity: sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==} + /cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} dev: true @@ -4873,8 +7844,13 @@ packages: engines: {node: '>=6'} dev: false - /cluster-key-slot@1.1.1: - resolution: {integrity: sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==} + /clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + dev: false + + /cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} dev: false @@ -4895,6 +7871,13 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + /color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true @@ -4904,8 +7887,16 @@ packages: resolution: {integrity: sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w==} dev: false - /colorette@2.0.19: - resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} @@ -4914,9 +7905,9 @@ packages: delayed-stream: 1.0.0 dev: false - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + /commander@11.0.0: + resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: '>=16'} dev: true /commander@2.20.3: @@ -4925,7 +7916,6 @@ packages: /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - dev: false /commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} @@ -4942,13 +7932,13 @@ packages: repeat-string: 1.6.1 dev: false - /commitizen@4.3.0(@swc/core@1.3.68): + /commitizen@4.3.0(@swc/core@1.3.78): resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(@swc/core@1.3.68) + cz-conventional-changelog: 3.3.0(@swc/core@1.3.78) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -4981,6 +7971,10 @@ packages: resolution: {integrity: sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g==} dev: false + /compute-scroll-into-view@3.0.3: + resolution: {integrity: sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==} + dev: false + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -4990,7 +7984,7 @@ packages: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.2 typedarray: 0.0.6 /config-chain@1.1.13: @@ -5005,7 +7999,7 @@ packages: engines: {node: '>=12'} dependencies: dot-prop: 6.0.1 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 unique-string: 3.0.0 write-file-atomic: 3.0.3 xdg-basedir: 5.1.0 @@ -5025,14 +8019,6 @@ packages: dependencies: safe-buffer: 5.2.1 - /conventional-changelog-angular@5.0.13: - resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} - engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - q: 1.5.1 - dev: true - /conventional-changelog-angular@6.0.0: resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==} engines: {node: '>=14'} @@ -5062,13 +8048,13 @@ packages: engines: {node: '>=14'} dependencies: add-stream: 1.0.0 - conventional-changelog-writer: 6.0.0 + conventional-changelog-writer: 6.0.1 conventional-commits-parser: 4.0.0 dateformat: 3.0.3 get-pkg-repo: 4.2.1 git-raw-commits: 3.0.0 git-remote-origin-url: 2.0.0 - git-semver-tags: 5.0.0 + git-semver-tags: 5.0.1 normalize-package-data: 3.0.3 read-pkg: 3.0.0 read-pkg-up: 3.0.0 @@ -5106,17 +8092,17 @@ packages: engines: {node: '>=14'} dev: true - /conventional-changelog-writer@6.0.0: - resolution: {integrity: sha512-8PyWTnn7zBIt9l4hj4UusFs1TyG+9Ulu1zlOAc72L7Sdv9Hsc8E86ot7htY3HXCVhXHB/NO0pVGvZpwsyJvFfw==} + /conventional-changelog-writer@6.0.1: + resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} engines: {node: '>=14'} hasBin: true dependencies: conventional-commits-filter: 3.0.0 dateformat: 3.0.3 - handlebars: 4.7.7 + handlebars: 4.7.8 json-stringify-safe: 5.0.1 meow: 8.1.2 - semver: 6.3.0 + semver: 7.5.4 split: 1.0.1 dev: true @@ -5144,22 +8130,9 @@ packages: /conventional-commits-filter@3.0.0: resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} engines: {node: '>=14'} - dependencies: - lodash.ismatch: 4.4.0 - modify-values: 1.0.1 - dev: true - - /conventional-commits-parser@3.2.4: - resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} - engines: {node: '>=10'} - hasBin: true - dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 dev: true /conventional-commits-parser@4.0.0: @@ -5183,7 +8156,7 @@ packages: conventional-commits-filter: 3.0.0 conventional-commits-parser: 4.0.0 git-raw-commits: 3.0.0 - git-semver-tags: 5.0.0 + git-semver-tags: 5.0.1 meow: 8.1.2 dev: true @@ -5205,23 +8178,39 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - /cosmiconfig-typescript-loader@4.2.0(@types/node@20.4.1)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6): - resolution: {integrity: sha512-NkANeMnaHrlaSSlpKGyvn2R4rqUDeE/9E5YHx+b4nwo0R8dZyAqcih8/gxpCZvqWP9Vf6xuLpMSzSgdVEIM78g==} - engines: {node: '>=12', npm: '>=6'} + /cosmiconfig-typescript-loader@4.4.0(@types/node@20.4.7)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6): + resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} + engines: {node: '>=v14.21.3'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=7' + ts-node: '>=10' + typescript: '>=4' + dependencies: + '@types/node': 20.4.7 + cosmiconfig: 8.2.0 + ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@20.4.7)(typescript@5.1.6) + typescript: 5.1.6 + dev: true + + /cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.4)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6): + resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} + engines: {node: '>=v14.21.3'} peerDependencies: '@types/node': '*' cosmiconfig: '>=7' ts-node: '>=10' - typescript: '>=3' + typescript: '>=4' dependencies: - '@types/node': 20.4.1 + '@types/node': 20.5.4 cosmiconfig: 8.2.0 - ts-node: 10.9.1(@swc/core@1.3.68)(@types/node@20.4.1)(typescript@5.1.6) + ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@20.5.4)(typescript@5.1.6) typescript: 5.1.6 dev: true + optional: true - /cosmiconfig@7.0.1: - resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: '@types/parse-json': 4.0.0 @@ -5244,15 +8233,21 @@ packages: /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - /cron-parser@4.6.0: - resolution: {integrity: sha512-guZNLMGUgg6z4+eGhmHGw7ft+v6OQeuHzd1gcLxCo9Yg/qoxmG3nindp2/uwGCLizEisf2H0ptqeVXeoCpP6FA==} + /cron-parser@4.8.1: + resolution: {integrity: sha512-jbokKWGcyU4gl6jAfX97E1gDpY12DJ1cLJZmoDzaAln/shZ+S3KBFBuA2Q6WeUN4gJf/8klnV1EfvhA2lK5IRQ==} engines: {node: '>=12.0.0'} dependencies: - luxon: 3.0.4 + luxon: 3.3.0 + dev: false + + /cron@2.4.0: + resolution: {integrity: sha512-Cx77ic1TyIAtUggr0oAhtS8MLzPBUqGNIvdDM7jE3oFIxfe8LXWI9q3iQN/H2CebAiMir53LQKWOhEKnzkJTAQ==} + dependencies: + luxon: 3.3.0 dev: false - /cron@2.3.1: - resolution: {integrity: sha512-1eRRlIT0UfIqauwbG9pkg3J6CX9A6My2ytJWqAXoK0T9oJnUZTzGBNPxao0zjodIbPgf8UQWjE62BMb9eVllSQ==} + /cron@2.4.1: + resolution: {integrity: sha512-ty0hUSPuENwDtIShDFxUxWEIsqiu2vhoFtt6Vwrbg4lHGtJX2/cV2p0hH6/qaEM9Pj+i6mQoau48BO5wBpkP4w==} dependencies: luxon: 3.3.0 dev: false @@ -5263,12 +8258,12 @@ packages: hasBin: true dependencies: cross-spawn: 7.0.3 - dev: false + dev: true - /cross-fetch@3.1.5: - resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} + /cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} dependencies: - node-fetch: 2.6.7 + node-fetch: 2.6.12 transitivePeerDependencies: - encoding dev: false @@ -5305,11 +8300,10 @@ packages: tiny-invariant: 1.3.1 dev: false - /css-in-js-utils@2.0.1: - resolution: {integrity: sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==} + /css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} dependencies: hyphenate-style-name: 1.0.4 - isobject: 3.0.1 dev: false /css-tree@1.1.3: @@ -5324,24 +8318,23 @@ packages: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true - dev: true - /csstype@3.1.1: - resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: false - /cz-conventional-changelog@3.3.0(@swc/core@1.3.68): + /cz-conventional-changelog@3.3.0(@swc/core@1.3.78): resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.3.0(@swc/core@1.3.68) + commitizen: 4.3.0(@swc/core@1.3.78) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 - word-wrap: 1.2.3 + word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 17.5.0(@swc/core@1.3.68) + '@commitlint/load': 17.6.7(@swc/core@1.3.78) transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -5352,8 +8345,8 @@ packages: engines: {node: '>=8'} dev: true - /data-uri-to-buffer@4.0.0: - resolution: {integrity: sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==} + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} dev: true @@ -5396,12 +8389,8 @@ packages: dependencies: ms: 2.1.2 - /debuglog@1.0.1: - resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} - dev: false - - /decamelize-keys@1.1.0: - resolution: {integrity: sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==} + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} dependencies: decamelize: 1.2.0 @@ -5432,8 +8421,8 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge@4.2.2: - resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} dev: false @@ -5451,7 +8440,7 @@ packages: dependencies: bundle-name: 3.0.0 default-browser-id: 3.0.0 - execa: 7.1.1 + execa: 7.2.0 titleize: 3.0.0 dev: true @@ -5469,8 +8458,8 @@ packages: engines: {node: '>=12'} dev: true - /define-properties@1.1.4: - resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: has-property-descriptors: 1.0.0 @@ -5481,14 +8470,13 @@ packages: resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} dev: true - /degenerator@4.0.3: - resolution: {integrity: sha512-2wY8vmCfxrQpe2PKGYdiWRre5HQRwsAXbAAWRbC+z2b80MEpnWc8A3a9k4TwqwN3Z/Fm3uhNm5vYUZIbMhyRxQ==} + /degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} dependencies: ast-types: 0.13.4 - escodegen: 1.14.3 + escodegen: 2.1.0 esprima: 4.0.1 - vm2: 3.9.19 dev: true /delayed-stream@1.0.0: @@ -5505,11 +8493,6 @@ packages: engines: {node: '>=0.10'} dev: false - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true - /deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} dev: true @@ -5533,6 +8516,9 @@ packages: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -5542,6 +8528,10 @@ packages: engines: {node: '>=8'} dependencies: path-type: 4.0.0 + dev: true + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} @@ -5557,33 +8547,6 @@ packages: esutils: 2.0.3 dev: true - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - dev: true - - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true - - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: true - - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dev: true - /dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -5603,34 +8566,40 @@ packages: engines: {node: '>=12'} dev: false - /downshift@7.6.0(react@18.2.0): - resolution: {integrity: sha512-VSoTVynTAsabou/hbZ6HJHUVhtBiVOjQoBsCPcQq5eAROIGP+9XKMp9asAKQ3cEcUP4oe0fFdD2pziUjhFY33Q==} + /downshift@8.1.0(react@18.2.0): + resolution: {integrity: sha512-e9EBBLZvB2G73qT272x3hExttGCH1q1usbjirm+1aMcFXuzSWhgBdbnAHPlFI2rEq61cU/kDrEIMrY+ozMhvmg==} peerDependencies: react: '>=16.12.0' dependencies: - '@babel/runtime': 7.20.0 + '@babel/runtime': 7.22.6 compute-scroll-into-view: 2.0.4 prop-types: 15.8.1 react: 18.2.0 react-is: 17.0.2 - tslib: 2.5.3 + tslib: 2.6.1 dev: false /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true /ee-first@1.1.1: - resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false - /electron-to-chromium@1.4.445: - resolution: {integrity: sha512-++DB+9VK8SBJwC+X1zlMfJ1tMA3F0ipi39GdEp+x3cV2TyBihqAgad8cNMWtLDEkbH39nlDQP7PfGrDr3Dr7HA==} + /electron-to-chromium@1.4.485: + resolution: {integrity: sha512-1ndQ5IBNEnFirPwvyud69GHL+31FkE09gH/CJ6m3KCbkx3i0EVOrjwz4UNxRmN9H8OVHbC6vMRZGN1yCvjSs9w==} + + /emoji-regex@10.2.1: + resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} + dev: true /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true /encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} @@ -5645,19 +8614,11 @@ packages: dependencies: once: 1.4.0 - /enhanced-resolve@5.10.0: - resolution: {integrity: sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.10 - tapable: 2.2.1 - dev: true - /enhanced-resolve@5.15.0: resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} engines: {node: '>=10.13.0'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 tapable: 2.2.1 /entities@3.0.1: @@ -5665,11 +8626,6 @@ packages: engines: {node: '>=0.12'} dev: false - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true - /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -5690,56 +8646,100 @@ packages: stackframe: 1.3.4 dev: false - /es-abstract@1.20.4: - resolution: {integrity: sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==} + /es-abstract@1.22.1: + resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} engines: {node: '>= 0.4'} dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.1 + available-typed-arrays: 1.0.5 call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 - function-bind: 1.1.1 function.prototype.name: 1.1.5 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 has: 1.0.3 has-property-descriptors: 1.0.0 + has-proto: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 is-callable: 1.2.7 is-negative-zero: 2.0.2 is-regex: 1.1.4 is-shared-array-buffer: 1.0.2 is-string: 1.0.7 + is-typed-array: 1.1.12 is-weakref: 1.0.2 object-inspect: 1.12.3 object-keys: 1.1.1 object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 + regexp.prototype.flags: 1.5.0 + safe-array-concat: 1.0.0 safe-regex-test: 1.0.0 - string.prototype.trimend: 1.0.5 - string.prototype.trimstart: 1.0.5 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 unbox-primitive: 1.0.2 + which-typed-array: 1.1.11 dev: true /es-array-method-boxes-properly@1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: true - /es-get-iterator@1.1.2: - resolution: {integrity: sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==} + /es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 has-symbols: 1.0.3 is-arguments: 1.1.1 is-map: 2.0.2 is-set: 2.0.2 is-string: 1.0.7 isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + dev: true + + /es-iterator-helpers@1.0.13: + resolution: {integrity: sha512-LK3VGwzvaPWobO8xzXXGRUOGw8Dcjyfk62CsY/wfHN75CwsJPbuypOYJxK6g5RyEL8YDjIWcl6jgd8foO6mmrA==} + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-set-tostringtag: 2.0.1 + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + globalthis: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + iterator.prototype: 1.1.0 + safe-array-concat: 1.0.0 dev: true /es-module-lexer@1.3.0: resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + /es-shim-unscopables@1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: @@ -5755,244 +8755,64 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild-android-64@0.15.12: - resolution: {integrity: sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /esbuild-android-arm64@0.15.12: - resolution: {integrity: sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /esbuild-darwin-64@0.15.12: - resolution: {integrity: sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /esbuild-darwin-arm64@0.15.12: - resolution: {integrity: sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /esbuild-freebsd-64@0.15.12: - resolution: {integrity: sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /esbuild-freebsd-arm64@0.15.12: - resolution: {integrity: sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /esbuild-linux-32@0.15.12: - resolution: {integrity: sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /esbuild-linux-64@0.15.12: - resolution: {integrity: sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /esbuild-linux-arm64@0.15.12: - resolution: {integrity: sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /esbuild-linux-arm@0.15.12: - resolution: {integrity: sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /esbuild-linux-mips64le@0.15.12: - resolution: {integrity: sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /esbuild-linux-ppc64le@0.15.12: - resolution: {integrity: sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /esbuild-linux-riscv64@0.15.12: - resolution: {integrity: sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /esbuild-linux-s390x@0.15.12: - resolution: {integrity: sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /esbuild-netbsd-64@0.15.12: - resolution: {integrity: sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: false - optional: true - - /esbuild-openbsd-64@0.15.12: - resolution: {integrity: sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: false - optional: true - - /esbuild-sunos-64@0.15.12: - resolution: {integrity: sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: false - optional: true - - /esbuild-windows-32@0.15.12: - resolution: {integrity: sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /esbuild-windows-64@0.15.12: - resolution: {integrity: sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /esbuild-windows-arm64@0.15.12: - resolution: {integrity: sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /esbuild@0.15.12: - resolution: {integrity: sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==} + /esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.15.12 - '@esbuild/linux-loong64': 0.15.12 - esbuild-android-64: 0.15.12 - esbuild-android-arm64: 0.15.12 - esbuild-darwin-64: 0.15.12 - esbuild-darwin-arm64: 0.15.12 - esbuild-freebsd-64: 0.15.12 - esbuild-freebsd-arm64: 0.15.12 - esbuild-linux-32: 0.15.12 - esbuild-linux-64: 0.15.12 - esbuild-linux-arm: 0.15.12 - esbuild-linux-arm64: 0.15.12 - esbuild-linux-mips64le: 0.15.12 - esbuild-linux-ppc64le: 0.15.12 - esbuild-linux-riscv64: 0.15.12 - esbuild-linux-s390x: 0.15.12 - esbuild-netbsd-64: 0.15.12 - esbuild-openbsd-64: 0.15.12 - esbuild-sunos-64: 0.15.12 - esbuild-windows-32: 0.15.12 - esbuild-windows-64: 0.15.12 - esbuild-windows-arm64: 0.15.12 - dev: false - - /esbuild@0.18.10: - resolution: {integrity: sha512-33WKo67auOXzZHBY/9DTJRo7kIvfU12S+D4sp2wIz39N88MDIaCGyCwbW01RR70pK6Iya0I74lHEpyLfFqOHPA==} + '@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 + dev: true + + /esbuild@0.18.19: + resolution: {integrity: sha512-ra3CaIKCzJp5bU5BDfrCc0FRqKj71fQi+gbld0aj6lN0ifuX2fWJYPgLVLGwPfA+ruKna+OWwOvf/yHj6n+i0g==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.18.10 - '@esbuild/android-arm64': 0.18.10 - '@esbuild/android-x64': 0.18.10 - '@esbuild/darwin-arm64': 0.18.10 - '@esbuild/darwin-x64': 0.18.10 - '@esbuild/freebsd-arm64': 0.18.10 - '@esbuild/freebsd-x64': 0.18.10 - '@esbuild/linux-arm': 0.18.10 - '@esbuild/linux-arm64': 0.18.10 - '@esbuild/linux-ia32': 0.18.10 - '@esbuild/linux-loong64': 0.18.10 - '@esbuild/linux-mips64el': 0.18.10 - '@esbuild/linux-ppc64': 0.18.10 - '@esbuild/linux-riscv64': 0.18.10 - '@esbuild/linux-s390x': 0.18.10 - '@esbuild/linux-x64': 0.18.10 - '@esbuild/netbsd-x64': 0.18.10 - '@esbuild/openbsd-x64': 0.18.10 - '@esbuild/sunos-x64': 0.18.10 - '@esbuild/win32-arm64': 0.18.10 - '@esbuild/win32-ia32': 0.18.10 - '@esbuild/win32-x64': 0.18.10 + '@esbuild/android-arm': 0.18.19 + '@esbuild/android-arm64': 0.18.19 + '@esbuild/android-x64': 0.18.19 + '@esbuild/darwin-arm64': 0.18.19 + '@esbuild/darwin-x64': 0.18.19 + '@esbuild/freebsd-arm64': 0.18.19 + '@esbuild/freebsd-x64': 0.18.19 + '@esbuild/linux-arm': 0.18.19 + '@esbuild/linux-arm64': 0.18.19 + '@esbuild/linux-ia32': 0.18.19 + '@esbuild/linux-loong64': 0.18.19 + '@esbuild/linux-mips64el': 0.18.19 + '@esbuild/linux-ppc64': 0.18.19 + '@esbuild/linux-riscv64': 0.18.19 + '@esbuild/linux-s390x': 0.18.19 + '@esbuild/linux-x64': 0.18.19 + '@esbuild/netbsd-x64': 0.18.19 + '@esbuild/openbsd-x64': 0.18.19 + '@esbuild/sunos-x64': 0.18.19 + '@esbuild/win32-arm64': 0.18.19 + '@esbuild/win32-ia32': 0.18.19 + '@esbuild/win32-x64': 0.18.19 /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -6015,46 +8835,35 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - /escodegen@1.14.3: - resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} - engines: {node: '>=4.0'} + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} hasBin: true dependencies: esprima: 4.0.1 - estraverse: 4.3.0 + estraverse: 5.3.0 esutils: 2.0.3 - optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 dev: true - /eslint-config-standard@17.1.0(eslint-plugin-import@2.27.5)(eslint-plugin-n@16.0.1)(eslint-plugin-promise@6.1.1)(eslint@8.44.0): - resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} - engines: {node: '>=12.0.0'} - peerDependencies: - eslint: ^8.0.1 - eslint-plugin-import: ^2.25.2 - eslint-plugin-n: '^15.0.0 || ^16.0.0 ' - eslint-plugin-promise: ^6.0.0 - dependencies: - eslint: 8.44.0 - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.1)(eslint@8.44.0) - eslint-plugin-n: 16.0.1(eslint@8.44.0) - eslint-plugin-promise: 6.1.1(eslint@8.44.0) + /eslint-define-config@1.23.0: + resolution: {integrity: sha512-4mMyu0JuBkQHsCtR+42irIQdFLmLIW+pMAVcyOV/gZRL4O1R8iuH0eMG3oL3Cbi1eo9fDAfT5CIHVHgdyxcf6w==} + engines: {node: ^16.13.0 || >=18.0.0, npm: '>=7.0.0', pnpm: '>= 8.6.0'} dev: true - /eslint-import-resolver-node@0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + /eslint-import-resolver-node@0.3.8: + resolution: {integrity: sha512-tEe+Pok22qIGaK3KoMP+N96GVDS66B/zreoVVmiavLvRUEmGRtvb4B8wO9jwnb8d2lvHtrkhZ7UD73dWBVnf/Q==} dependencies: debug: 3.2.7 - is-core-module: 2.12.1 - resolve: 1.22.2 + is-core-module: 2.13.0 + resolve: 1.22.4 transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint@8.44.0): - resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.8)(eslint@8.47.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -6074,44 +8883,37 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.60.1(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.1.6) debug: 3.2.7 - eslint: 8.44.0 - eslint-import-resolver-node: 0.3.7 + eslint: 8.47.0 + eslint-import-resolver-node: 0.3.8 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-es-x@7.1.0(eslint@8.44.0): - resolution: {integrity: sha512-AhiaF31syh4CCQ+C5ccJA0VG6+kJK8+5mXKKE7Qs1xcPRg02CDPOj3mWlQxuWS/AYtg7kxrDNgW9YW3vc0Q+Mw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' + /eslint-plugin-antfu@0.40.3(eslint@8.47.0)(typescript@5.1.6): + resolution: {integrity: sha512-1f0OifSyaIQNHAHNzh0wHfUKkc3cP3fDDOk51WtCBL7ffgd4dSEq95FJIRUyGKecq4CY3d3gHpOOUbClcHiV1w==} dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) - '@eslint-community/regexpp': 4.5.1 - eslint: 8.44.0 + '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.1.6) + transitivePeerDependencies: + - eslint + - supports-color + - typescript dev: true - /eslint-plugin-eslint-comments@3.2.0(eslint@8.44.0): + /eslint-plugin-eslint-comments@3.2.0(eslint@8.47.0): resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} peerDependencies: eslint: '>=4.19.1' dependencies: escape-string-regexp: 1.0.5 - eslint: 8.44.0 - ignore: 5.2.0 - dev: true - - /eslint-plugin-html@7.1.0: - resolution: {integrity: sha512-fNLRraV/e6j8e3XYOC9xgND4j+U7b1Rq+OygMlLcMg+wI/IpVbF+ubQa3R78EjKB9njT6TQOlcK5rFKBVVtdfg==} - dependencies: - htmlparser2: 8.0.2 + eslint: 8.47.0 + ignore: 5.2.4 dev: true - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.60.1)(eslint@8.44.0): - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0): + resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -6120,93 +8922,66 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.60.1(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.1.6) array-includes: 3.1.6 + array.prototype.findlastindex: 1.2.2 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.44.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint@8.44.0) + eslint: 8.47.0 + eslint-import-resolver-node: 0.3.8 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.8)(eslint@8.47.0) has: 1.0.3 - is-core-module: 2.12.1 + is-core-module: 2.13.0 is-glob: 4.0.3 minimatch: 3.1.2 + object.fromentries: 2.0.6 + object.groupby: 1.0.0 object.values: 1.1.6 - resolve: 1.22.1 - semver: 6.3.0 - tsconfig-paths: 3.14.1 + semver: 6.3.1 + tsconfig-paths: 3.14.2 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color dev: true - /eslint-plugin-jsonc@2.9.0(eslint@8.44.0): + /eslint-plugin-jsonc@2.9.0(eslint@8.47.0): resolution: {integrity: sha512-RK+LeONVukbLwT2+t7/OY54NJRccTXh/QbnXzPuTLpFMVZhPuq1C9E07+qWenGx7rrQl0kAalAWl7EmB+RjpGA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) - eslint: 8.44.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + eslint: 8.47.0 jsonc-eslint-parser: 2.3.0 natural-compare: 1.4.0 dev: true - /eslint-plugin-jsx@0.1.0: - resolution: {integrity: sha512-278HIClJgb3Gp1b89wbva7AGS7cxQzBNgKFysy6aEB44Acso2M8ARdoaLUnN7VTWf0vnSvtwugCmc/B8MSzY5g==} - dependencies: - eslint-plugin-react: 3.4.2 - html-tags: 1.2.0 - svg-tags: 1.0.0 - dev: true - - /eslint-plugin-markdown@3.0.0(eslint@8.44.0): - resolution: {integrity: sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==} + /eslint-plugin-markdown@3.0.1(eslint@8.47.0): + resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.44.0 + eslint: 8.47.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-n@16.0.1(eslint@8.44.0): - resolution: {integrity: sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==} - engines: {node: '>=16.0.0'} - peerDependencies: - eslint: '>=7.0.0' - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) - builtins: 5.0.1 - eslint: 8.44.0 - eslint-plugin-es-x: 7.1.0(eslint@8.44.0) - ignore: 5.2.4 - is-core-module: 2.12.1 - minimatch: 3.1.2 - resolve: 1.22.2 - semver: 7.5.3 - dev: true - - /eslint-plugin-promise@6.1.1(eslint@8.44.0): - resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /eslint-plugin-react-hooks@4.6.0(eslint@8.47.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.44.0 - dev: true - - /eslint-plugin-react@3.4.2: - resolution: {integrity: sha512-rIhweRuQMLxNOOHHl9pEkQR+6QiKt9wUHpBvjSefSzUg5qdhC08jc2rxsSm1TAXii9rxabhzK5MUu+YBJxn6sA==} + eslint: 8.47.0 dev: true - /eslint-plugin-react@7.32.2(eslint@8.44.0): - resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + /eslint-plugin-react@7.33.2(eslint@8.47.0): + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 @@ -6215,9 +8990,10 @@ packages: array.prototype.flatmap: 1.3.1 array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 - eslint: 8.44.0 + es-iterator-helpers: 1.0.13 + eslint: 8.47.0 estraverse: 5.3.0 - jsx-ast-utils: 3.3.3 + jsx-ast-utils: 3.3.5 minimatch: 3.1.2 object.entries: 1.1.6 object.fromentries: 2.0.6 @@ -6225,21 +9001,21 @@ packages: object.values: 1.1.6 prop-types: 15.8.1 resolve: 2.0.0-next.4 - semver: 6.3.0 + semver: 6.3.1 string.prototype.matchall: 4.0.8 dev: true - /eslint-plugin-unicorn@47.0.0(eslint@8.44.0): - resolution: {integrity: sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==} + /eslint-plugin-unicorn@48.0.1(eslint@8.47.0): + resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} engines: {node: '>=16'} peerDependencies: - eslint: '>=8.38.0' + eslint: '>=8.44.0' dependencies: '@babel/helper-validator-identifier': 7.22.5 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) ci-info: 3.8.0 clean-regexp: 1.0.0 - eslint: 8.44.0 + eslint: 8.47.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -6247,39 +9023,53 @@ packages: lodash: 4.17.21 pluralize: 8.0.0 read-pkg-up: 7.0.1 - regexp-tree: 0.1.24 + regexp-tree: 0.1.27 regjsparser: 0.10.0 - safe-regex: 2.1.1 - semver: 7.5.3 + semver: 7.5.4 strip-indent: 3.0.0 dev: true - /eslint-plugin-vue@9.15.1(eslint@8.44.0): - resolution: {integrity: sha512-CJE/oZOslvmAR9hf8SClTdQ9JLweghT6JCBQNrT2Iel1uVw0W0OLJxzvPd6CxmABKCvLrtyDnqGV37O7KQv6+A==} + /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0): + resolution: {integrity: sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^6.0.0 + eslint: ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.1.6) + eslint: 8.47.0 + eslint-rule-composer: 0.3.0 + dev: true + + /eslint-plugin-vue@9.17.0(eslint@8.47.0): + resolution: {integrity: sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) - eslint: 8.44.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + eslint: 8.47.0 natural-compare: 1.4.0 nth-check: 2.1.1 - postcss-selector-parser: 6.0.10 - semver: 7.5.3 - vue-eslint-parser: 9.3.1(eslint@8.44.0) + postcss-selector-parser: 6.0.13 + semver: 7.5.4 + vue-eslint-parser: 9.3.1(eslint@8.47.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-yml@1.8.0(eslint@8.44.0): + /eslint-plugin-yml@1.8.0(eslint@8.47.0): resolution: {integrity: sha512-fgBiJvXD0P2IN7SARDJ2J7mx8t0bLdG6Zcig4ufOqW5hOvSiFxeUyc2g5I1uIm8AExbo26NNYCcTGZT0MXTsyg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 - eslint: 8.44.0 + eslint: 8.47.0 lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.2 @@ -6287,6 +9077,11 @@ packages: - supports-color dev: true + /eslint-rule-composer@0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + dev: true + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -6294,28 +9089,33 @@ packages: esrecurse: 4.3.0 estraverse: 4.3.0 - /eslint-scope@7.2.0: - resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 dev: true - /eslint-visitor-keys@3.4.1: - resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} + /eslint-visitor-keys@3.4.2: + resolution: {integrity: sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.44.0: - resolution: {integrity: sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==} + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.47.0: + resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) - '@eslint-community/regexpp': 4.5.1 - '@eslint/eslintrc': 2.1.0 - '@eslint/js': 8.44.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@eslint-community/regexpp': 4.6.2 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.47.0 '@humanwhocodes/config-array': 0.11.10 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -6325,9 +9125,9 @@ packages: debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 - eslint-visitor-keys: 3.4.1 - espree: 9.6.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -6337,7 +9137,6 @@ packages: globals: 13.20.0 graphemer: 1.4.0 ignore: 5.2.4 - import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -6349,28 +9148,18 @@ packages: natural-compare: 1.4.0 optionator: 0.9.3 strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color dev: true - /espree@9.5.2: - resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.8.1 - acorn-jsx: 5.3.2(acorn@8.8.1) - eslint-visitor-keys: 3.4.1 - dev: true - - /espree@9.6.0: - resolution: {integrity: sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==} + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.9.0 - acorn-jsx: 5.3.2(acorn@8.9.0) - eslint-visitor-keys: 3.4.1 + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.3 dev: true /esprima@4.0.1: @@ -6413,6 +9202,10 @@ packages: engines: {node: '>=6'} dev: false + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -6458,8 +9251,8 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - /execa@7.1.1: - resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} dependencies: cross-spawn: 7.0.3 @@ -6515,8 +9308,8 @@ packages: resolution: {integrity: sha512-Xbc4XcysUXcsP5aHUU7Nq3OwvHq97C+WnbkeIefpeYLX+ryzFJlU6OStFJhs6Ol0LkUGpcK+wL0JwfM+FCU5IA==} dev: false - /fast-copy@3.0.0: - resolution: {integrity: sha512-4HzS+9pQ5Yxtv13Lhs1Z1unMXamBdn5nA4bEi1abYpDNSpSp7ODYQ1KPMF6nTatfEzgH6/zPvXKU1zvHiUjWlA==} + /fast-copy@3.0.1: + resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} dev: false /fast-decode-uri-component@1.0.1: @@ -6526,8 +9319,8 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -6539,14 +9332,14 @@ packages: /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - /fast-json-stringify@5.7.0: - resolution: {integrity: sha512-sBVPTgnAZseLu1Qgj6lUbQ0HfjFhZWXAmpZ5AaSGkyLh5gAXBga/uPJjQPHpDFjC9adWIpdOcCLSDTgrZ7snoQ==} + /fast-json-stringify@5.8.0: + resolution: {integrity: sha512-VVwK8CFMSALIvt14U8AvrSzQAwN/0vaVRiFFUVlpnXSnDGrSkOAO5MtzyN8oQNjLd5AqTW5OZRgyjoNuAuR3jQ==} dependencies: - '@fastify/deepmerge': 1.1.0 + '@fastify/deepmerge': 1.3.0 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) fast-deep-equal: 3.1.3 - fast-uri: 2.1.0 + fast-uri: 2.2.0 rfdc: 1.3.0 dev: false @@ -6554,14 +9347,18 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fast-querystring@1.0.0: - resolution: {integrity: sha512-3LQi62IhQoDlmt4ULCYmh17vRO2EtS7hTSsG4WwoKWgV7GLMKBOecEh+aiavASnLx8I2y89OD33AGLo0ccRhzA==} + /fast-loops@1.1.3: + resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} + dev: false + + /fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} dependencies: fast-decode-uri-component: 1.0.1 dev: false - /fast-redact@3.1.2: - resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} + /fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} engines: {node: '>=6'} dev: false @@ -6573,8 +9370,8 @@ packages: resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} dev: false - /fast-uri@2.1.0: - resolution: {integrity: sha512-qKRta6N7BWEFVlyonVY/V+BMLgFqktCUV0QjT259ekAIlbVrMaFnFLxJ4s/JPl4tou56S1BzPufI60bLe29fHA==} + /fast-uri@2.2.0: + resolution: {integrity: sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==} dev: false /fastest-stable-stringify@2.0.2: @@ -6585,7 +9382,7 @@ packages: resolution: {integrity: sha512-QnFqrRgxmUwWHTgX9uyQSu0C/hmVCfcxopqjApZ4uaZD5W9MJ+nHUlW4+9q7Yd3BRxDIuHvgiM5mjrh6XG8cAA==} engines: {node: '>=10.17.0'} dependencies: - '@fastify/busboy': 1.1.0 + '@fastify/busboy': 1.2.1 append-field: 1.0.0 concat-stream: 2.0.0 fastify-plugin: 2.3.4 @@ -6598,15 +9395,15 @@ packages: /fastify-plugin@2.3.4: resolution: {integrity: sha512-I+Oaj6p9oiRozbam30sh39BiuiqBda7yK2nmSPVwDCfIBlKnT8YB3MY+pRQc2Fcd07bf6KPGklHJaQ2Qu81TYQ==} dependencies: - semver: 7.5.3 + semver: 7.5.4 dev: false - /fastify-plugin@4.3.0: - resolution: {integrity: sha512-M3+i368lV0OYTJ5TfClIoPKEKSOF7112iiPdwgfSR0gN98BjA1Nk+c6oBHtfcVt9KiMxl+EQKHC1QNWo3ZOpYQ==} + /fastify-plugin@4.5.1: + resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} dev: false - /fastify@4.19.1: - resolution: {integrity: sha512-99r7xae02BUWI1H8exJidkFJXi/SUZpO18YIJ6SSWIB1bb5CN659ga0iB85oLD+C4D9LeTOKplOJ1/YcFsK7oQ==} + /fastify@4.21.0: + resolution: {integrity: sha512-tsu4bcwE4HetxqW8prA5fbC9bKHMYDp7jGEDWyzK1l90a3uOaLoIcQbdGcWeODNLVJviQnzh1wvIjTZE3MJFEg==} dependencies: '@fastify/ajv-compiler': 3.5.0 '@fastify/error': 3.3.0 @@ -6614,29 +9411,29 @@ packages: abstract-logging: 2.0.1 avvio: 8.2.1 fast-content-type-parse: 1.0.0 - fast-json-stringify: 5.7.0 + fast-json-stringify: 5.8.0 find-my-way: 7.6.2 light-my-request: 5.10.0 - pino: 8.14.1 + pino: 8.15.0 process-warning: 2.2.0 proxy-addr: 2.0.7 rfdc: 1.3.0 - secure-json-parse: 2.5.0 - semver: 7.5.3 + secure-json-parse: 2.7.0 + semver: 7.5.4 tiny-lru: 11.0.1 transitivePeerDependencies: - supports-color dev: false - /fastq@1.13.0: - resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 /fbemitter@3.0.0: resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} dependencies: - fbjs: 3.0.4 + fbjs: 3.0.5 transitivePeerDependencies: - encoding dev: false @@ -6645,16 +9442,16 @@ packages: resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} dev: false - /fbjs@3.0.4: - resolution: {integrity: sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==} + /fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} dependencies: - cross-fetch: 3.1.5 + cross-fetch: 3.1.8 fbjs-css-vars: 1.0.2 loose-envify: 1.4.0 object-assign: 4.1.1 promise: 7.3.1 setimmediate: 1.0.5 - ua-parser-js: 0.7.32 + ua-parser-js: 1.0.35 transitivePeerDependencies: - encoding dev: false @@ -6723,7 +9520,7 @@ packages: engines: {node: '>=14'} dependencies: fast-deep-equal: 3.1.3 - fast-querystring: 1.0.0 + fast-querystring: 1.1.2 safe-regex2: 2.0.0 dev: false @@ -6758,7 +9555,6 @@ packages: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true /find-versions@5.1.0: resolution: {integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==} @@ -6784,17 +9580,22 @@ packages: rimraf: 3.0.2 dev: true + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + dev: false + /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /flux@4.0.3(react@18.2.0): - resolution: {integrity: sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==} + /flux@4.0.4(react@18.2.0): + resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} peerDependencies: react: ^15.0.2 || ^16.0.0 || ^17.0.0 dependencies: fbemitter: 3.0.0 - fbjs: 3.0.4 + fbjs: 3.0.5 react: 18.2.0 transitivePeerDependencies: - encoding @@ -6804,11 +9605,11 @@ packages: resolution: {integrity: sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==} engines: {node: '>=10'} dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /follow-redirects@1.15.1: - resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==} + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -6817,14 +9618,21 @@ packages: optional: true dev: false + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + /foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} dependencies: cross-spawn: 7.0.3 - signal-exit: 4.0.2 + signal-exit: 4.1.0 + dev: true - /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.1.6)(webpack@5.88.1): + /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.1.6)(webpack@5.88.2): resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} engines: {node: '>=12.13.0', yarn: '>=1.0.0'} peerDependencies: @@ -6834,21 +9642,21 @@ packages: '@babel/code-frame': 7.22.5 chalk: 4.1.2 chokidar: 3.5.3 - cosmiconfig: 7.0.1 - deepmerge: 4.2.2 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 fs-extra: 10.1.0 - memfs: 3.4.9 + memfs: 3.5.3 minimatch: 3.1.2 - node-abort-controller: 3.0.1 + node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.5.3 + semver: 7.5.4 tapable: 2.2.1 typescript: 5.1.6 - webpack: 5.88.1(@swc/core@1.3.68)(esbuild@0.18.10) + webpack: 5.88.2(@swc/core@1.3.78)(esbuild@0.18.19) dev: false - /form-data-encoder@2.1.3: - resolution: {integrity: sha512-KqU0nnPMgIJcCOFTNJFEA8epcseEaoox4XZffTgy8jlI6pL/5EFyR54NRG7CnCJN0biY7q52DO3MH6/sJ/TKlQ==} + /form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} dev: true @@ -6877,8 +9685,8 @@ packages: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: false - /framer-motion@10.12.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-cfhiUpPbj+0eEWKjuD+5cz5cMqH71xOtMxGiS/cSGfHn2OlHIEAqFnFyzEMENw5PxWR9bMVhatzzpD6lexmHZQ==} + /framer-motion@10.16.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-K6TXr5mZtitC/dxQCBdg7xzdN0d5IAIrlaqCPKtIQVdzVPGC0qBuJKXggHX1vjnP5gPOFwB1KbCCTWcnFc3kWg==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 @@ -6890,7 +9698,7 @@ packages: dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - tslib: 2.6.0 + tslib: 2.6.1 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 dev: false @@ -6905,7 +9713,7 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 dev: false @@ -6914,7 +9722,7 @@ packages: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 dev: true @@ -6923,7 +9731,7 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 dev: true @@ -6933,7 +9741,7 @@ packages: engines: {node: '>=10'} dependencies: at-least-node: 1.0.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 dev: true @@ -6952,8 +9760,8 @@ packages: minipass: 5.0.0 dev: true - /fs-monkey@1.0.3: - resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} + /fs-monkey@1.0.4: + resolution: {integrity: sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==} dev: false /fs.realpath@1.0.0: @@ -6964,7 +9772,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true - dev: false optional: true /function-bind@1.1.1: @@ -6975,8 +9782,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.22.1 functions-have-names: 1.2.3 dev: true @@ -7002,11 +9809,12 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-intrinsic@1.1.3: - resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: function-bind: 1.1.1 has: 1.0.3 + has-proto: 1.0.1 has-symbols: 1.0.3 dev: true @@ -7050,14 +9858,14 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 dev: true /get-tsconfig@4.6.2: resolution: {integrity: sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==} dependencies: resolve-pkg-maps: 1.0.0 - dev: false + dev: true /get-uri@6.0.1: resolution: {integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==} @@ -7101,13 +9909,13 @@ packages: pify: 2.3.0 dev: true - /git-semver-tags@5.0.0: - resolution: {integrity: sha512-fZ+tmZ1O5aXW/T5nLzZLbxWAHdQTLLXalOECMNAmhoEQSfqZjtaeMjpsXH4C5qVhrICTkVQeQFujB1lKzIHljA==} + /git-semver-tags@5.0.1: + resolution: {integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==} engines: {node: '>=14'} hasBin: true dependencies: meow: 8.1.2 - semver: 6.3.0 + semver: 7.5.4 dev: true /git-up@7.0.0: @@ -7140,21 +9948,21 @@ packages: engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 - dev: true /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - /glob@10.3.1: - resolution: {integrity: sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw==} + /glob@10.3.3: + resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: foreground-child: 3.1.1 - jackspeak: 2.2.1 - minimatch: 9.0.2 - minipass: 6.0.2 - path-scurry: 1.10.0 + jackspeak: 2.2.2 + minimatch: 9.0.3 + minipass: 7.0.2 + path-scurry: 1.10.1 + dev: true /glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} @@ -7165,7 +9973,6 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: false /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -7177,14 +9984,14 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /glob@8.0.3: - resolution: {integrity: sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==} + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.1.0 + minimatch: 5.1.6 once: 1.4.0 dev: false @@ -7195,7 +10002,7 @@ packages: fs.realpath: 1.0.0 minimatch: 8.0.4 minipass: 4.2.8 - path-scurry: 1.10.0 + path-scurry: 1.10.1 dev: false /global-dirs@0.1.1: @@ -7205,8 +10012,8 @@ packages: ini: 1.3.8 dev: true - /global-dirs@3.0.0: - resolution: {integrity: sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==} + /global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} dependencies: ini: 2.0.0 @@ -7239,28 +10046,49 @@ packages: type-fest: 0.20.2 dev: true + /globals@13.21.0: + resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + dev: true + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.1 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 + dev: true - /globby@13.2.1: - resolution: {integrity: sha512-DPCBxctI7dN4EeIqjW2KGqgdcUMbrhJ9AzON+PlxCtvppWhubTLD4+a0GFxiym14ZvacUydTPjLPc2DlKz7EIg==} + /globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.1 ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 dev: true + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + dev: true + /got@11.8.6: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} engines: {node: '>=10.19.0'} @@ -7281,14 +10109,14 @@ packages: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} engines: {node: '>=14.16'} dependencies: - '@sindresorhus/is': 5.3.0 + '@sindresorhus/is': 5.6.0 '@szmarczak/http-timer': 5.0.1 cacheable-lookup: 7.0.0 - cacheable-request: 10.2.12 + cacheable-request: 10.2.13 decompress-response: 6.0.0 - form-data-encoder: 2.1.3 + form-data-encoder: 2.1.4 get-stream: 6.0.1 - http2-wrapper: 2.1.11 + http2-wrapper: 2.2.0 lowercase-keys: 3.0.0 p-cancelable: 3.0.0 responselike: 3.0.0 @@ -7298,14 +10126,14 @@ packages: resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} engines: {node: '>=16'} dependencies: - '@sindresorhus/is': 5.3.0 + '@sindresorhus/is': 5.6.0 '@szmarczak/http-timer': 5.0.1 cacheable-lookup: 7.0.0 - cacheable-request: 10.2.12 + cacheable-request: 10.2.13 decompress-response: 6.0.0 - form-data-encoder: 2.1.3 + form-data-encoder: 2.1.4 get-stream: 6.0.1 - http2-wrapper: 2.1.11 + http2-wrapper: 2.2.0 lowercase-keys: 3.0.0 p-cancelable: 3.0.0 responselike: 3.0.0 @@ -7313,21 +10141,21 @@ packages: /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true - /handlebars@4.7.7: - resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} hasBin: true dependencies: - minimist: 1.2.7 + minimist: 1.2.8 neo-async: 2.6.2 source-map: 0.6.1 wordwrap: 1.0.0 @@ -7360,7 +10188,12 @@ packages: /has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 + dev: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} dev: true /has-symbols@1.0.3: @@ -7390,11 +10223,11 @@ packages: dependencies: function-bind: 1.1.1 - /help-me@4.1.0: - resolution: {integrity: sha512-5HMrkOks2j8Fpu2j5nTLhrBhT7VwHwELpqnSnx802ckofys5MO2SkLpgSz3dgNFHV7IYFX2igm5CM75SmuYidw==} + /help-me@4.2.0: + resolution: {integrity: sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==} dependencies: - glob: 8.0.3 - readable-stream: 3.6.0 + glob: 8.1.0 + readable-stream: 3.6.2 dev: false /highcharts-react-official@3.2.0(highcharts@11.1.0)(react@18.2.0): @@ -7442,20 +10275,6 @@ packages: lru-cache: 7.18.3 dev: true - /html-tags@1.2.0: - resolution: {integrity: sha512-uVteDXUCs08M7QJx0eY6ue7qQztwIfknap81vAtNob2sdEPKa8PjPinx0vxbs2JONPamovZjMvKZWNW44/PBKg==} - engines: {node: '>=0.10.0'} - dev: true - - /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 - dev: true - /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -7487,8 +10306,8 @@ packages: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - /http2-wrapper@2.1.11: - resolution: {integrity: sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==} + /http2-wrapper@2.2.0: + resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==} engines: {node: '>=10.19.0'} dependencies: quick-lru: 5.1.1 @@ -7505,8 +10324,8 @@ packages: - supports-color dev: true - /https-proxy-agent@7.0.0: - resolution: {integrity: sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==} + /https-proxy-agent@7.0.1: + resolution: {integrity: sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==} engines: {node: '>= 14'} dependencies: agent-base: 7.1.0 @@ -7554,6 +10373,7 @@ packages: /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: safer-buffer: 2.1.2 dev: true @@ -7566,17 +10386,13 @@ packages: resolution: {integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - minimatch: 9.0.2 - dev: true - - /ignore@5.2.0: - resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} - engines: {node: '>= 4'} + minimatch: 9.0.3 dev: true /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} + dev: true /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -7623,10 +10439,11 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /inline-style-prefixer@6.0.1: - resolution: {integrity: sha512-AsqazZ8KcRzJ9YPN1wMH2aNM7lkWQ8tSPrW5uDk1ziYwiAPWSZnUsC7lfZq+BDqLqz0B4Pho5wscWcJzVvRzDQ==} + /inline-style-prefixer@6.0.4: + resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==} dependencies: - css-in-js-utils: 2.0.1 + css-in-js-utils: 3.1.0 + fast-loops: 1.1.3 dev: false /inquirer@8.2.4: @@ -7669,15 +10486,38 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 7.0.0 + dev: true + + /inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 6.2.0 + dev: false - /inquirer@9.2.7: - resolution: {integrity: sha512-Bf52lnfvNxGPJPltiNO2tLBp3zC339KNlGMqOkW+dsvNikBhcVDK5kqU2lVX2FTPzuXUFX5WJDlsw//w3ZwoTw==} + /inquirer@9.2.10: + resolution: {integrity: sha512-tVVNFIXU8qNHoULiazz612GFl+yqNfjMTbLuViNJE/d860Qxrd3NMrse8dm40VUQLOQeULvaQF8lpAhvysjeyA==} engines: {node: '>=14.18.0'} dependencies: + '@ljharb/through': 2.3.9 ansi-escapes: 4.3.2 chalk: 5.3.0 cli-cursor: 3.1.0 - cli-width: 4.0.0 + cli-width: 4.1.0 external-editor: 3.1.0 figures: 5.0.0 lodash: 4.17.21 @@ -7687,15 +10527,14 @@ packages: rxjs: 7.8.1 string-width: 4.2.3 strip-ansi: 6.0.1 - through: 2.3.8 wrap-ansi: 6.2.0 dev: true - /internal-slot@1.0.3: - resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 has: 1.0.3 side-channel: 1.0.4 dev: true @@ -7704,13 +10543,22 @@ packages: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} + /intl-messageformat@10.5.0: + resolution: {integrity: sha512-AvojYuOaRb6r2veOKfTVpxH9TrmjSdc5iR9R5RgBwrDZYSmAAFVT+QLbW3C4V7Qsg0OguMp67Q/EoUkxZzXRGw==} + dependencies: + '@formatjs/ecma402-abstract': 1.17.0 + '@formatjs/fast-memoize': 2.2.0 + '@formatjs/icu-messageformat-parser': 2.6.0 + tslib: 2.6.1 + dev: false + /intl-messageformat@9.13.0: resolution: {integrity: sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==} dependencies: '@formatjs/ecma402-abstract': 1.11.4 '@formatjs/fast-memoize': 1.2.1 '@formatjs/icu-messageformat-parser': 2.1.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false /invariant@2.2.4: @@ -7724,7 +10572,7 @@ packages: engines: {node: '>=12.22.0'} dependencies: '@ioredis/commands': 1.2.0 - cluster-key-slot: 1.1.1 + cluster-key-slot: 1.1.2 debug: 4.3.4 denque: 2.1.0 lodash.defaults: 4.2.0 @@ -7768,9 +10616,28 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: true + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -7782,7 +10649,6 @@ packages: engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - dev: false /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} @@ -7811,8 +10677,8 @@ packages: ci-info: 3.8.0 dev: true - /is-core-module@2.12.1: - resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} dependencies: has: 1.0.3 @@ -7843,6 +10709,12 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.2 + dev: true + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -7852,6 +10724,13 @@ packages: engines: {node: '>=12'} dev: true + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -7874,7 +10753,7 @@ packages: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} engines: {node: '>=10'} dependencies: - global-dirs: 3.0.0 + global-dirs: 3.0.1 is-path-inside: 3.0.3 dev: true @@ -7993,6 +10872,13 @@ packages: text-extensions: 1.9.0 dev: true + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + dev: true + /is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} dev: true @@ -8010,12 +10896,23 @@ packages: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} dev: true + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: true + /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -8028,8 +10925,8 @@ packages: is-docker: 2.2.1 dev: true - /is-yarn-global@0.4.0: - resolution: {integrity: sha512-HneQBCrXGBy15QnaDfcn6OLoU8AQPAa0Qn0IeJR/QCo4E8dNZaGGwxpCwWyEBQC5QvFonP8d6t60iGpAHVAfNA==} + /is-yarn-global@0.4.1: + resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} engines: {node: '>=12'} dev: true @@ -8044,11 +10941,6 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: false - /issue-parser@6.0.0: resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==} engines: {node: '>=10.13'} @@ -8072,51 +10964,64 @@ packages: /iterate-value@1.0.2: resolution: {integrity: sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==} dependencies: - es-get-iterator: 1.1.2 + es-get-iterator: 1.1.3 iterate-iterator: 1.0.2 dev: true - /jackspeak@2.2.1: - resolution: {integrity: sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==} + /iterator.prototype@1.1.0: + resolution: {integrity: sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==} + dependencies: + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + has-tostringtag: 1.0.0 + reflect.getprototypeof: 1.0.3 + dev: true + + /jackspeak@2.2.2: + resolution: {integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==} engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + dev: true /jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.4.1 + '@types/node': 20.5.4 merge-stream: 2.0.0 supports-color: 8.1.1 - /jiti@1.18.2: - resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} + /jiti@1.19.1: + resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} hasBin: true - dev: true /jose@4.14.4: resolution: {integrity: sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==} dev: false - /jotai@2.2.2(react@18.2.0): - resolution: {integrity: sha512-Cn8hnBg1sc5ppFwEgVGTfMR5WSM0hbAasd/bdAwIwTaum0j3OUPqBSC4tyk3jtB95vicML+RRWgKFOn6gtfN0A==} + /jotai@2.4.0(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-NUHJdAJe3C8Prf0DD6EzezCATjkNvfCNI7pgkaX7bCPPsqE0oK8L9RzZsEhz/UxFoGRayXwacTvAli0VEYKkqQ==} engines: {node: '>=12.20.0'} peerDependencies: + '@types/react': '>=17.0.0' react: '>=17.0.0' peerDependenciesMeta: + '@types/react': + optional: true react: optional: true dependencies: + '@types/react': 18.2.21 react: 18.2.0 dev: false /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - dev: false /js-cookie@2.2.1: resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} @@ -8171,11 +11076,11 @@ packages: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} dev: true - /json5@1.0.1: - resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true dependencies: - minimist: 1.2.7 + minimist: 1.2.8 dev: true /json5@2.2.3: @@ -8188,20 +11093,19 @@ packages: resolution: {integrity: sha512-9xZPKVYp9DxnM3sd1yAsh/d59iIaswDkai8oTxbursfKYbg/ibjX0IzFt35+VZ8iEW453TVTXztnRvYUQlAfUQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.1 - eslint-visitor-keys: 3.4.1 - espree: 9.5.2 - semver: 7.5.3 + acorn: 8.10.0 + eslint-visitor-keys: 3.4.2 + espree: 9.6.1 + semver: 7.5.4 dev: true /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: false /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /jsonfile@6.1.0: @@ -8209,23 +11113,25 @@ packages: dependencies: universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 /jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} dev: true - /jsx-ast-utils@3.3.3: - resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} dependencies: array-includes: 3.1.6 + array.prototype.flat: 1.3.1 object.assign: 4.1.4 + object.values: 1.1.6 dev: true - /keyv@4.5.2: - resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} + /keyv@4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} dependencies: json-buffer: 3.0.1 @@ -8239,19 +11145,15 @@ packages: engines: {node: '>=6'} dev: true + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: false + /latest-version@7.0.0: resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} engines: {node: '>=14.16'} dependencies: - package-json: 8.1.0 - dev: true - - /levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 + package-json: 8.1.1 dev: true /levn@0.4.1: @@ -8262,8 +11164,8 @@ packages: type-check: 0.4.0 dev: true - /libphonenumber-js@1.10.37: - resolution: {integrity: sha512-Z10PCaOCiAxbUxLyR31DNeeNugSVP6iv/m7UrSKS5JHziEMApJtgku4e9Q69pzzSC9LnQiM09sqsGf2ticZnMw==} + /libphonenumber-js@1.10.39: + resolution: {integrity: sha512-iPMM/NbSNIrdwbr94rAOos6krB7snhfzEptmk/DJUtTPs+P9gOhZ1YXVPcRgjpp3jJByclfm/Igvz45spfJK7g==} dev: false /light-my-request@5.10.0: @@ -8271,7 +11173,7 @@ packages: dependencies: cookie: 0.5.0 process-warning: 2.2.0 - set-cookie-parser: 2.5.1 + set-cookie-parser: 2.6.0 dev: false /lilconfig@2.1.0: @@ -8287,67 +11189,66 @@ packages: uc.micro: 1.0.6 dev: false - /lint-staged@13.2.3: - resolution: {integrity: sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==} - engines: {node: ^14.13.1 || >=16.0.0} + /lint-staged@14.0.1: + resolution: {integrity: sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==} + engines: {node: ^16.14.0 || >=18.0.0} hasBin: true dependencies: - chalk: 5.2.0 - cli-truncate: 3.1.0 - commander: 10.0.1 + chalk: 5.3.0 + commander: 11.0.0 debug: 4.3.4 - execa: 7.1.1 + execa: 7.2.0 lilconfig: 2.1.0 - listr2: 5.0.8 + listr2: 6.6.1 micromatch: 4.0.5 - normalize-path: 3.0.0 - object-inspect: 1.12.3 pidtree: 0.6.0 - string-argv: 0.3.1 + string-argv: 0.3.2 yaml: 2.3.1 transitivePeerDependencies: - enquirer - supports-color dev: true - /listr2@5.0.8: - resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} - engines: {node: ^14.13.1 || >=16.0.0} + /listr2@6.6.1: + resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} + engines: {node: '>=16.0.0'} peerDependencies: enquirer: '>= 2.3.0 < 3' peerDependenciesMeta: enquirer: optional: true dependencies: - cli-truncate: 2.1.0 - colorette: 2.0.19 - log-update: 4.0.0 - p-map: 4.0.0 + cli-truncate: 3.1.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 5.0.1 rfdc: 1.3.0 - rxjs: 7.8.1 - through: 2.3.8 - wrap-ansi: 7.0.0 + wrap-ansi: 8.1.0 dev: true /load-json-file@4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 dev: true - /load-tsconfig@0.2.3: - resolution: {integrity: sha512-iyT2MXws+dc2Wi6o3grCFtGXpeMvHmJqS27sMPGtV2eUu4PeFnG+33I8BlFK1t1NWMjOpcx9bridn5yxLDX2gQ==} + /load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false + dev: true /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + /locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} @@ -8368,7 +11269,6 @@ packages: engines: {node: '>=10'} dependencies: p-locate: 5.0.0 - dev: true /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} @@ -8394,6 +11294,14 @@ packages: resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} dev: false + /lodash.foreach@4.5.0: + resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==} + dev: false + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: false + /lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} dev: false @@ -8416,12 +11324,15 @@ packages: /lodash.kebabcase@4.1.1: resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - dev: true /lodash.map@4.6.0: resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} dev: true + /lodash.mapkeys@4.6.0: + resolution: {integrity: sha512-0Al+hxpYvONWtg+ZqHpa/GaVzxuN3V7Xeo2p+bY06EaK/n+Y9R7nBePPN2o1LxmL0TWQSwP8LYZ008/hc9JzhA==} + dev: false + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -8429,13 +11340,16 @@ packages: /lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + /lodash.omit@4.5.0: + resolution: {integrity: sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==} + dev: false + /lodash.snakecase@4.1.1: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} dev: true /lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: false /lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -8471,14 +11385,15 @@ packages: is-unicode-supported: 1.3.0 dev: true - /log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} + /log-update@5.0.1: + resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - ansi-escapes: 4.3.2 - cli-cursor: 3.1.0 - slice-ansi: 4.0.0 - wrap-ansi: 6.2.0 + ansi-escapes: 5.0.0 + cli-cursor: 4.0.0 + slice-ansi: 5.0.0 + strip-ansi: 7.1.0 + wrap-ansi: 8.1.0 dev: true /longest@2.0.1: @@ -8522,9 +11437,12 @@ packages: engines: {node: '>=12'} dev: true - /luxon@3.0.4: - resolution: {integrity: sha512-aV48rGUwP/Vydn8HT+5cdr26YYQiUZ42NM6ToMoaGKwYfWbfLeRkEu1wXWMHBZT6+KyLfcbbtVcoQFCbbPjKlw==} - engines: {node: '>=12'} + /lucide-react@0.268.0(react@18.2.0): + resolution: {integrity: sha512-XP/xY3ASJAViqNqVnDRcEfdxfRB7uNST8sqTLwZhL983ikmHMQ7qQak7ZxrnXOVhB3QDBawdr3ANq0P+iWHP/g==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 dev: false /luxon@3.3.0: @@ -8532,13 +11450,13 @@ packages: engines: {node: '>=12'} dev: false - /macos-release@2.5.0: - resolution: {integrity: sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==} + /macos-release@2.5.1: + resolution: {integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==} engines: {node: '>=6'} dev: false - /macos-release@3.1.0: - resolution: {integrity: sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA==} + /macos-release@3.2.0: + resolution: {integrity: sha512-fSErXALFNsnowREYZ49XCdOHF8wOPWuFOGQrAhP7x5J/BqQv+B02cNsTykGpDgRVx43EKg++6ANmTaGTtW+hUA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true @@ -8546,7 +11464,21 @@ packages: resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} engines: {node: '>=12'} dependencies: - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /magic-string@0.30.1: + resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /magic-string@0.30.2: + resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 dev: false /make-error@1.3.6: @@ -8556,7 +11488,7 @@ packages: resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - agentkeepalive: 4.3.0 + agentkeepalive: 4.5.0 cacache: 17.1.3 http-cache-semantics: 4.1.1 http-proxy-agent: 5.0.0 @@ -8599,7 +11531,7 @@ packages: /mdast-util-from-markdown@0.8.5: resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} dependencies: - '@types/mdast': 3.0.10 + '@types/mdast': 3.0.12 mdast-util-to-string: 2.0.0 micromark: 2.11.4 parse-entities: 2.0.0 @@ -8621,15 +11553,15 @@ packages: dev: false /media-typer@0.3.0: - resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} dev: false - /memfs@3.4.9: - resolution: {integrity: sha512-3rm8kbrzpUGRyPKSGuk387NZOwQ90O4rI9tsWQkzNW7BLSnKGp23RsEsKK8N8QVCrtJoAMqy3spxHC4os4G6PQ==} + /memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} dependencies: - fs-monkey: 1.0.3 + fs-monkey: 1.0.4 dev: false /meow@8.1.2: @@ -8638,7 +11570,7 @@ packages: dependencies: '@types/minimist': 1.2.2 camelcase-keys: 6.2.2 - decamelize-keys: 1.1.0 + decamelize-keys: 1.1.1 hard-rejection: 2.1.0 minimist-options: 4.1.0 normalize-package-data: 3.0.3 @@ -8718,8 +11650,8 @@ packages: dependencies: brace-expansion: 1.1.11 - /minimatch@5.1.0: - resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 @@ -8732,11 +11664,12 @@ packages: brace-expansion: 2.0.1 dev: false - /minimatch@9.0.2: - resolution: {integrity: sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==} + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: true /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} @@ -8749,6 +11682,10 @@ packages: /minimist@1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} /minipass-collect@1.0.2: resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} @@ -8813,8 +11750,8 @@ packages: engines: {node: '>=8'} dev: true - /minipass@6.0.2: - resolution: {integrity: sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==} + /minipass@7.0.2: + resolution: {integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==} engines: {node: '>=16 || 14 >=14.17'} /minizlib@2.1.2: @@ -8825,8 +11762,8 @@ packages: yallist: 4.0.0 dev: true - /mitt@3.0.0: - resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==} + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} dev: false /mkdirp@1.0.4: @@ -8834,6 +11771,15 @@ packages: engines: {node: '>=10'} hasBin: true + /mlly@1.4.0: + resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + dependencies: + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.2.0 + dev: true + /mnemonist@0.39.5: resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} dependencies: @@ -8852,26 +11798,26 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /msgpackr-extract@2.1.2: - resolution: {integrity: sha512-cmrmERQFb19NX2JABOGtrKdHMyI6RUyceaPBQ2iRz9GnDkjBWFjNJC0jyyoOfZl2U/LZE3tQCCQc4dlRyA8mcA==} + /msgpackr-extract@3.0.2: + resolution: {integrity: sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==} hasBin: true requiresBuild: true dependencies: - node-gyp-build-optional-packages: 5.0.3 + node-gyp-build-optional-packages: 5.0.7 optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 2.1.2 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 2.1.2 - '@msgpackr-extract/msgpackr-extract-linux-arm': 2.1.2 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 2.1.2 - '@msgpackr-extract/msgpackr-extract-linux-x64': 2.1.2 - '@msgpackr-extract/msgpackr-extract-win32-x64': 2.1.2 + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.2 dev: false optional: true - /msgpackr@1.7.2: - resolution: {integrity: sha512-mWScyHTtG6TjivXX9vfIy2nBtRupaiAj0HQ2mtmpmYujAmqZmaaEVPaSZ1NKLMvicaMLFzEaMk0ManxMRg8rMQ==} + /msgpackr@1.9.6: + resolution: {integrity: sha512-50rmb6+ZWvEm0vJn8R8CwI1Eavss3h5rgtKrcdUal3EkZcpqw82+xsmc7RoHb8fYB5V4EOU2NDaOitDAdO0t+w==} optionalDependencies: - msgpackr-extract: 2.1.2 + msgpackr-extract: 3.0.2 dev: false /mute-stream@0.0.8: @@ -8888,7 +11834,6 @@ packages: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: false /nano-css@5.3.5(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==} @@ -8897,26 +11842,21 @@ packages: react-dom: '*' dependencies: css-tree: 1.1.3 - csstype: 3.1.1 + csstype: 3.1.2 fastest-stable-stringify: 2.0.2 - inline-style-prefixer: 6.0.1 + inline-style-prefixer: 6.0.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rtl-css-js: 1.16.0 + rtl-css-js: 1.16.1 sourcemap-codec: 1.4.8 stacktrace-js: 2.0.2 - stylis: 4.1.1 + stylis: 4.3.0 dev: false /nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: false - - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -8929,16 +11869,16 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - /nestjs-pino@3.3.0(@nestjs/common@10.0.5)(pino-http@8.3.3): - resolution: {integrity: sha512-FVMbzz0wi7YKqtrifnAjcQejGmhIfxXY2q+jdW1bK7RxN9640UJ7pDeQa/FOQMSu1Ud0L0/eqI3Ha9NejJxIjQ==} + /nestjs-pino@3.4.0(@nestjs/common@10.2.1)(pino-http@8.4.0): + resolution: {integrity: sha512-L79tk+WqVJApGxD4K40srSHopwlBX8WVPoIJtVhWaxJUfk9ND6eZp7kmgdgwQw8PpYUeoeOhS1g2j0Ep3c0NJA==} engines: {node: '>= 14'} requiresBuild: true peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 dependencies: - '@nestjs/common': 10.0.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - pino-http: 8.3.3 + '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + pino-http: 8.4.0 dev: false /netmask@2.0.2: @@ -8953,8 +11893,8 @@ packages: type-fest: 2.19.0 dev: true - /next-auth@4.22.1(next@13.4.9)(nodemailer@6.9.3)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-NTR3f6W7/AWXKw8GSsgSyQcDW6jkslZLH8AiZa5PQ09w1kR8uHtR9rez/E9gAq/o17+p0JYHE8QjF3RoniiObA==} + /next-auth@4.23.1(next@13.4.19)(nodemailer@6.9.4)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-mL083z8KgRtlrIV6CDca2H1kduWJuK/3pTS0Fe2og15KOm4v2kkLGdSDfc2g+019aEBrJUT0pPW2Xx42ImN1WA==} peerDependencies: next: ^12.2.5 || ^13 nodemailer: ^6.6.5 @@ -8964,23 +11904,23 @@ packages: nodemailer: optional: true dependencies: - '@babel/runtime': 7.22.5 - '@panva/hkdf': 1.0.2 + '@babel/runtime': 7.22.6 + '@panva/hkdf': 1.1.1 cookie: 0.5.0 jose: 4.14.4 - next: 13.4.9(react-dom@18.2.0)(react@18.2.0) - nodemailer: 6.9.3 + next: 13.4.19(react-dom@18.2.0)(react@18.2.0) + nodemailer: 6.9.4 oauth: 0.9.15 - openid-client: 5.4.2 - preact: 10.11.2 - preact-render-to-string: 5.2.6(preact@10.11.2) + openid-client: 5.4.3 + preact: 10.16.0 + preact-render-to-string: 5.2.6(preact@10.16.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) uuid: 8.3.2 dev: false - /next-intl@2.17.5(next@13.4.9)(react@18.2.0): - resolution: {integrity: sha512-p/tit4/FN0eHLw6Mjwsx4ktiFZWq9VMcuY9hhkAlYWXCQgKq09PB0lZcMNw5xLvV9eor818BzXxdA+3bSvFMmw==} + /next-intl@2.20.0(next@13.4.19)(react@18.2.0): + resolution: {integrity: sha512-zeGod4WuS/j8dhDM1eLlt+GTCqqq1b09l/eHxUWQjGrK87BeN+crKasHjZWMNm38g0ddWpBW6i9KDZcTn8/p1A==} engines: {node: '>=10'} peerDependencies: next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 @@ -8988,33 +11928,42 @@ packages: dependencies: '@formatjs/intl-localematcher': 0.2.32 negotiator: 0.6.3 - next: 13.4.9(react-dom@18.2.0)(react@18.2.0) + next: 13.4.19(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + use-intl: 2.20.0(react@18.2.0) + dev: false + + /next-themes@0.2.1(next@13.4.19)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} + peerDependencies: + next: '*' + react: '*' + react-dom: '*' + dependencies: + next: 13.4.19(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 - use-intl: 2.17.5(react@18.2.0) + react-dom: 18.2.0(react@18.2.0) dev: false - /next@13.4.9(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-vtefFm/BWIi/eWOqf1GsmKG3cjKw1k3LjuefKRcL3iiLl3zWzFdPG3as6xtxrGO6gwTzzaO1ktL4oiHt/uvTjA==} + /next@13.4.19(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw==} engines: {node: '>=16.8.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 - fibers: '>= 3.1.0' react: ^18.2.0 react-dom: ^18.2.0 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': optional: true - fibers: - optional: true sass: optional: true dependencies: - '@next/env': 13.4.9 + '@next/env': 13.4.19 '@swc/helpers': 0.5.1 busboy: 1.6.0 - caniuse-lite: 1.0.30001509 + caniuse-lite: 1.0.30001519 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -9022,22 +11971,22 @@ packages: watchpack: 2.4.0 zod: 3.21.4 optionalDependencies: - '@next/swc-darwin-arm64': 13.4.9 - '@next/swc-darwin-x64': 13.4.9 - '@next/swc-linux-arm64-gnu': 13.4.9 - '@next/swc-linux-arm64-musl': 13.4.9 - '@next/swc-linux-x64-gnu': 13.4.9 - '@next/swc-linux-x64-musl': 13.4.9 - '@next/swc-win32-arm64-msvc': 13.4.9 - '@next/swc-win32-ia32-msvc': 13.4.9 - '@next/swc-win32-x64-msvc': 13.4.9 + '@next/swc-darwin-arm64': 13.4.19 + '@next/swc-darwin-x64': 13.4.19 + '@next/swc-linux-arm64-gnu': 13.4.19 + '@next/swc-linux-arm64-musl': 13.4.19 + '@next/swc-linux-x64-gnu': 13.4.19 + '@next/swc-linux-x64-musl': 13.4.19 + '@next/swc-win32-arm64-msvc': 13.4.19 + '@next/swc-win32-ia32-msvc': 13.4.19 + '@next/swc-win32-x64-msvc': 13.4.19 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros dev: false - /node-abort-controller@3.0.1: - resolution: {integrity: sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==} + /node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} dev: false /node-domexception@1.0.0: @@ -9051,8 +12000,8 @@ packages: lodash: 4.17.21 dev: false - /node-fetch@2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + /node-fetch@2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -9062,18 +12011,19 @@ packages: dependencies: whatwg-url: 5.0.0 - /node-fetch@3.3.1: - resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} + /node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - data-uri-to-buffer: 4.0.0 + data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 dev: true - /node-gyp-build-optional-packages@5.0.3: - resolution: {integrity: sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==} + /node-gyp-build-optional-packages@5.0.7: + resolution: {integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==} hasBin: true + requiresBuild: true dev: false optional: true @@ -9085,23 +12035,23 @@ packages: env-paths: 2.2.1 exponential-backoff: 3.1.1 glob: 7.2.3 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 make-fetch-happen: 11.1.1 nopt: 6.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.5.3 + semver: 7.5.4 tar: 6.1.15 which: 2.0.2 transitivePeerDependencies: - supports-color dev: true - /node-releases@2.0.12: - resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - /nodemailer@6.9.3: - resolution: {integrity: sha512-fy9v3NgTzBngrMFkDsKEj0r02U7jm6XfC3b52eoNV+GCrGj+s8pt5OqhiJdWKuw51zCTdiNR/IUD1z33LIIGpg==} + /nodemailer@6.9.4: + resolution: {integrity: sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==} engines: {node: '>=6.0.0'} dev: false @@ -9125,8 +12075,8 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.2 - semver: 5.7.1 + resolve: 1.22.4 + semver: 5.7.2 validate-npm-package-license: 3.0.4 dev: true @@ -9135,8 +12085,8 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.12.1 - semver: 7.5.3 + is-core-module: 2.13.0 + semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -9145,8 +12095,8 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: hosted-git-info: 6.1.1 - is-core-module: 2.12.1 - semver: 7.5.3 + is-core-module: 2.13.0 + semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -9179,7 +12129,7 @@ packages: resolution: {integrity: sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - semver: 7.5.3 + semver: 7.5.4 dev: true /npm-normalize-package-bin@3.0.1: @@ -9193,7 +12143,7 @@ packages: dependencies: hosted-git-info: 6.1.1 proc-log: 3.0.0 - semver: 7.5.3 + semver: 7.5.4 validate-npm-package-name: 5.0.0 dev: true @@ -9204,14 +12154,14 @@ packages: ignore-walk: 6.0.3 dev: true - /npm-pick-manifest@8.0.1: - resolution: {integrity: sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==} + /npm-pick-manifest@8.0.2: + resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: npm-install-checks: 6.1.1 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 - semver: 7.5.3 + semver: 7.5.4 dev: true /npm-registry-fetch@14.0.5: @@ -9281,6 +12231,10 @@ packages: engines: {node: '>= 6'} dev: false + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true @@ -9295,7 +12249,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.0 has-symbols: 1.0.3 object-keys: 1.1.1 dev: true @@ -9305,8 +12259,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.22.1 dev: true /object.fromentries@2.0.6: @@ -9314,15 +12268,24 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /object.groupby@1.0.0: + resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 dev: true /object.hasown@1.1.2: resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} dependencies: - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.22.1 dev: true /object.values@1.1.6: @@ -9330,8 +12293,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.22.1 dev: true /obliterator@2.0.4: @@ -9382,8 +12345,8 @@ packages: is-wsl: 2.2.0 dev: true - /openid-client@5.4.2: - resolution: {integrity: sha512-lIhsdPvJ2RneBm3nGBBhQchpe3Uka//xf7WPHTIglery8gnckvW7Bd9IaQzekzXJvWthCMyi/xVEyGW0RFPytw==} + /openid-client@5.4.3: + resolution: {integrity: sha512-sVQOvjsT/sbSfYsQI/9liWQGVZH/Pp3rrtlGEwgk/bbHfrUDZ24DN57lAagIwFtuEu+FM9Ev7r85s8S/yPjimQ==} dependencies: jose: 4.14.4 lru-cache: 6.0.0 @@ -9391,18 +12354,6 @@ packages: oidc-token-hash: 5.0.3 dev: false - /optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.3 - dev: true - /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -9422,26 +12373,26 @@ packages: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.7.0 + cli-spinners: 2.9.0 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - /ora@6.3.1: - resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /ora@7.0.1: + resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} + engines: {node: '>=16'} dependencies: chalk: 5.3.0 cli-cursor: 4.0.0 - cli-spinners: 2.7.0 + cli-spinners: 2.9.0 is-interactive: 2.0.0 is-unicode-supported: 1.3.0 log-symbols: 5.1.0 stdin-discarder: 0.1.0 - strip-ansi: 7.0.1 - wcwidth: 1.0.1 + string-width: 6.1.0 + strip-ansi: 7.1.0 dev: true /os-filter-obj@2.0.0: @@ -9454,7 +12405,7 @@ packages: resolution: {integrity: sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==} engines: {node: '>=10'} dependencies: - macos-release: 2.5.0 + macos-release: 2.5.1 windows-release: 4.0.0 dev: false @@ -9462,8 +12413,8 @@ packages: resolution: {integrity: sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - macos-release: 3.1.0 - windows-release: 5.0.1 + macos-release: 3.2.0 + windows-release: 5.1.1 dev: true /os-tmpdir@1.0.2: @@ -9502,7 +12453,6 @@ packages: engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 - dev: true /p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} @@ -9523,7 +12473,6 @@ packages: engines: {node: '>=10'} dependencies: p-limit: 3.1.0 - dev: true /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} @@ -9542,38 +12491,39 @@ packages: engines: {node: '>=6'} dev: true - /pac-proxy-agent@6.0.3: - resolution: {integrity: sha512-5Hr1KgPDoc21Vn3rsXBirwwDnF/iac1jN/zkpsOYruyT+ZgsUhUOgVwq3v9+ukjZd/yGm/0nzO1fDfl7rkGoHQ==} + /pac-proxy-agent@7.0.0: + resolution: {integrity: sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA==} engines: {node: '>= 14'} dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.0 debug: 4.3.4 get-uri: 6.0.1 http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.0 - pac-resolver: 6.0.1 + https-proxy-agent: 7.0.1 + pac-resolver: 7.0.0 socks-proxy-agent: 8.0.1 transitivePeerDependencies: - supports-color dev: true - /pac-resolver@6.0.1: - resolution: {integrity: sha512-dg497MhVT7jZegPRuOScQ/z0aV/5WR0gTdRu1md+Irs9J9o+ls5jIuxjo1WfaTG+eQQkxyn5HMGvWK+w7EIBkQ==} + /pac-resolver@7.0.0: + resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} engines: {node: '>= 14'} dependencies: - degenerator: 4.0.3 + degenerator: 5.0.1 ip: 1.1.8 netmask: 2.0.2 dev: true - /package-json@8.1.0: - resolution: {integrity: sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==} + /package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} dependencies: got: 12.6.1 - registry-auth-token: 5.0.1 + registry-auth-token: 5.0.2 registry-url: 6.0.1 - semver: 7.5.3 + semver: 7.5.4 dev: true /pacote@15.2.0: @@ -9590,13 +12540,13 @@ packages: minipass: 5.0.0 npm-package-arg: 10.1.0 npm-packlist: 7.0.4 - npm-pick-manifest: 8.0.1 + npm-pick-manifest: 8.0.2 npm-registry-fetch: 14.0.5 proc-log: 3.0.0 promise-retry: 2.0.1 read-package-json: 6.0.4 read-package-json-fast: 3.0.2 - sigstore: 1.6.0 + sigstore: 1.8.0 ssri: 10.0.4 tar: 6.1.15 transitivePeerDependencies: @@ -9663,7 +12613,6 @@ packages: /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - dev: true /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} @@ -9685,12 +12634,12 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /path-scurry@1.10.0: - resolution: {integrity: sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g==} + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 10.0.0 - minipass: 6.0.2 + minipass: 7.0.2 /path-to-regexp@3.2.0: resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} @@ -9711,6 +12660,10 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: true + /peek-readable@5.0.0: resolution: {integrity: sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==} engines: {node: '>=14.16'} @@ -9740,70 +12693,97 @@ packages: /pino-abstract-transport@1.0.0: resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} dependencies: - readable-stream: 4.2.0 - split2: 4.1.0 + readable-stream: 4.4.2 + split2: 4.2.0 dev: false - /pino-http@8.3.3: - resolution: {integrity: sha512-p4umsNIXXVu95HD2C8wie/vXH7db5iGRpc+yj1/ZQ3sRtTQLXNjoS6Be5+eI+rQbqCRxen/7k/KSN+qiZubGDw==} + /pino-http@8.4.0: + resolution: {integrity: sha512-9I1eRLxsujQJwLQTrHBU0wDlwnry2HzV2TlDwAsmZ9nT3Y2NQBLrz+DYp73L4i11vl/eudnFT8Eg0Kp62tMwEw==} dependencies: get-caller-file: 2.0.5 - pino: 8.14.1 - pino-std-serializers: 6.0.0 - process-warning: 2.0.0 + pino: 8.15.0 + pino-std-serializers: 6.2.2 + process-warning: 2.2.0 dev: false - /pino-pretty@10.0.1: - resolution: {integrity: sha512-yrn00+jNpkvZX/NrPVCPIVHAfTDy3ahF0PND9tKqZk4j9s+loK8dpzrJj4dGb7i+WLuR50ussuTAiWoMWU+qeA==} + /pino-pretty@10.2.0: + resolution: {integrity: sha512-tRvpyEmGtc2D+Lr3FulIZ+R1baggQ4S3xD2Ar93KixFEDx6SEAUP3W5aYuEw1C73d6ROrNcB2IXLteW8itlwhA==} hasBin: true dependencies: - colorette: 2.0.19 + colorette: 2.0.20 dateformat: 4.6.3 - fast-copy: 3.0.0 + fast-copy: 3.0.1 fast-safe-stringify: 2.1.1 - help-me: 4.1.0 + help-me: 4.2.0 joycon: 3.1.1 - minimist: 1.2.7 + minimist: 1.2.8 on-exit-leak-free: 2.1.0 pino-abstract-transport: 1.0.0 pump: 3.0.0 - readable-stream: 4.2.0 - secure-json-parse: 2.5.0 - sonic-boom: 3.2.0 + readable-stream: 4.4.2 + secure-json-parse: 2.7.0 + sonic-boom: 3.3.0 strip-json-comments: 3.1.1 dev: false - /pino-std-serializers@6.0.0: - resolution: {integrity: sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ==} + /pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} dev: false - /pino@8.14.1: - resolution: {integrity: sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==} + /pino@8.15.0: + resolution: {integrity: sha512-olUADJByk4twxccmAxb1RiGKOSvddHugCV3wkqjyv+3Sooa2KLrmXrKEWOKi0XPCLasRR5jBXxioE1jxUa4KzQ==} hasBin: true dependencies: atomic-sleep: 1.0.0 - fast-redact: 3.1.2 + fast-redact: 3.3.0 on-exit-leak-free: 2.1.0 pino-abstract-transport: 1.0.0 - pino-std-serializers: 6.0.0 - process-warning: 2.0.0 + pino-std-serializers: 6.2.2 + process-warning: 2.2.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 - safe-stable-stringify: 2.4.1 - sonic-boom: 3.2.0 - thread-stream: 2.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.3.0 + thread-stream: 2.3.0 dev: false - /pirates@4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - dev: false + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.0 + pathe: 1.1.1 + dev: true /pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - /postcss-load-config@4.0.1(ts-node@10.9.1): + /postcss-import@15.1.0(postcss@8.4.28): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.28 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.4 + + /postcss-js@4.0.1(postcss@8.4.28): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.28 + + /postcss-load-config@4.0.1(postcss@8.4.28)(ts-node@10.9.1): resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} engines: {node: '>= 14'} peerDependencies: @@ -9816,21 +12796,28 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - ts-node: 10.9.1(@swc/core@1.3.68)(@types/node@20.4.1)(typescript@5.1.6) + postcss: 8.4.28 + ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@20.5.4)(typescript@5.1.6) yaml: 2.3.1 - dev: false - /postcss-selector-parser@6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + /postcss-nested@6.0.1(postcss@8.4.28): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.28 + postcss-selector-parser: 6.0.13 + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: false /postcss@8.4.14: resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} @@ -9841,32 +12828,26 @@ packages: source-map-js: 1.0.2 dev: false - /postcss@8.4.25: - resolution: {integrity: sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==} + /postcss@8.4.28: + resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: false - /preact-render-to-string@5.2.6(preact@10.11.2): + /preact-render-to-string@5.2.6(preact@10.16.0): resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} peerDependencies: preact: '>=10' dependencies: - preact: 10.11.2 + preact: 10.16.0 pretty-format: 3.8.0 dev: false - /preact@10.11.2: - resolution: {integrity: sha512-skAwGDFmgxhq1DCBHke/9e12ewkhc7WYwjuhHB8HHS8zkdtITXLRmUMTeol2ldxvLwYtwbFeifZ9uDDWuyL4Iw==} - dev: false - - /prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - dev: true + /preact@10.16.0: + resolution: {integrity: sha512-XTSj3dJ4roKIC93pald6rWuB2qQJO9gO2iLLyTe87MrjQN+HklueLsmskbywEWqCHlclgz3/M4YLL2iBr9UmMA==} + dev: false /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -9877,14 +12858,13 @@ packages: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} dev: false - /prisma@5.0.0: - resolution: {integrity: sha512-KYWk83Fhi1FH59jSpavAYTt2eoMVW9YKgu8ci0kuUnt6Dup5Qy47pcB4/TLmiPAbhGrxxSz7gsSnJcCmkyPANA==} + /prisma@5.2.0: + resolution: {integrity: sha512-FfFlpjVCkZwrqxDnP4smlNYSH1so+CbfjgdpioFzGGqlQAEm6VHAYSzV7jJgC3ebtY9dNOhDMS2+4/1DDSM7bQ==} engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 5.0.0 - dev: false + '@prisma/engines': 5.2.0 /proc-log@3.0.0: resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} @@ -9895,10 +12875,6 @@ packages: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true - /process-warning@2.0.0: - resolution: {integrity: sha512-+MmoAXoUX+VTHAlwns0h+kFUWFs/3FZy+ZuchkgjyOu3oioLAo2LB5aCfKPh2+P9O18i3m43tUEv3YqttSy0Ww==} - dev: false - /process-warning@2.2.0: resolution: {integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==} dev: false @@ -9931,9 +12907,9 @@ packages: dependencies: array.prototype.map: 1.0.5 call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - get-intrinsic: 1.1.3 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 iterate-value: 1.0.2 dev: true @@ -9974,16 +12950,16 @@ packages: ipaddr.js: 1.9.1 dev: false - /proxy-agent@6.2.1: - resolution: {integrity: sha512-OIbBKlRAT+ycCm6wAYIzMwPejzRtjy8F3QiDX0eKOA3e4pe3U9F/IvzcHP42bmgQxVv97juG+J8/gx+JIeCX/Q==} + /proxy-agent@6.3.0: + resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==} engines: {node: '>= 14'} dependencies: agent-base: 7.1.0 debug: 4.3.4 http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.1 lru-cache: 7.18.3 - pac-proxy-agent: 6.0.3 + pac-proxy-agent: 7.0.0 proxy-from-env: 1.1.0 socks-proxy-agent: 8.0.1 transitivePeerDependencies: @@ -10002,8 +12978,8 @@ packages: end-of-stream: 1.4.4 once: 1.4.0 - /punycode@2.1.1: - resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} /pupa@3.1.0: @@ -10017,11 +12993,6 @@ packages: resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} dev: false - /q@1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: true - /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -10053,7 +13024,7 @@ packages: dependencies: deep-extend: 0.6.0 ini: 1.3.8 - minimist: 1.2.7 + minimist: 1.2.8 strip-json-comments: 2.0.1 dev: true @@ -10071,7 +13042,7 @@ packages: peerDependencies: react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.22.5 + '@babel/runtime': 7.22.6 react: 18.2.0 dev: false @@ -10089,8 +13060,8 @@ packages: resolution: {integrity: sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg==} dev: false - /react-focus-lock@2.9.4(@types/react@18.2.14)(react@18.2.0): - resolution: {integrity: sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg==} + /react-focus-lock@2.9.5(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-h6vrdgUbsH2HeD5I7I3Cx1PPrmwGuKYICS+kB9m+32X/9xHRrAbxgvaBpG7BFBN9h3tO+C3qX1QAVESmi4CiIA==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -10098,18 +13069,18 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.5 - '@types/react': 18.2.14 + '@babel/runtime': 7.22.6 + '@types/react': 18.2.21 focus-lock: 0.11.6 prop-types: 15.8.1 react: 18.2.0 react-clientside-effect: 1.2.6(react@18.2.0) - use-callback-ref: 1.3.0(@types/react@18.2.14)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.14)(react@18.2.0) + use-callback-ref: 1.3.0(@types/react@18.2.21)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.21)(react@18.2.0) dev: false - /react-hook-form@7.45.1(react@18.2.0): - resolution: {integrity: sha512-6dWoFJwycbuFfw/iKMcl+RdAOAOHDiF11KWYhNDRN/OkUt+Di5qsZHwA0OwsVnu9y135gkHpTw9DJA+WzCeR9w==} + /react-hook-form@7.45.4(react@18.2.0): + resolution: {integrity: sha512-HGDV1JOOBPZj10LB3+OZgfDBTn+IeEsNOKiq/cxbQAIbKaiJUe/KV8DBUzsx0Gx/7IG/orWqRRm736JwOfUSWQ==} engines: {node: '>=12.22.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 @@ -10132,18 +13103,18 @@ packages: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} dev: false - /react-json-view@1.21.3(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0): + /react-json-view@1.21.3(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} peerDependencies: react: ^17.0.0 || ^16.3.0 || ^15.5.4 react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 dependencies: - flux: 4.0.3(react@18.2.0) + flux: 4.0.4(react@18.2.0) react: 18.2.0 react-base16-styling: 0.6.0 react-dom: 18.2.0(react@18.2.0) react-lifecycles-compat: 3.0.4 - react-textarea-autosize: 8.3.4(@types/react@18.2.14)(react@18.2.0) + react-textarea-autosize: 8.5.2(@types/react@18.2.21)(react@18.2.0) transitivePeerDependencies: - '@types/react' - encoding @@ -10153,7 +13124,7 @@ packages: resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} dev: false - /react-remove-scroll-bar@2.3.4(@types/react@18.2.14)(react@18.2.0): + /react-remove-scroll-bar@2.3.4(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} peerDependencies: @@ -10163,13 +13134,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.14 + '@types/react': 18.2.21 react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.14)(react@18.2.0) - tslib: 2.6.0 + react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) + tslib: 2.6.1 dev: false - /react-remove-scroll@2.5.5(@types/react@18.2.14)(react@18.2.0): + /react-remove-scroll@2.5.5(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} peerDependencies: @@ -10179,16 +13150,35 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.14 + '@types/react': 18.2.21 react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.14)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.14)(react@18.2.0) - tslib: 2.6.0 - use-callback-ref: 1.3.0(@types/react@18.2.14)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.14)(react@18.2.0) + react-remove-scroll-bar: 2.3.4(@types/react@18.2.21)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) + tslib: 2.6.1 + use-callback-ref: 1.3.0(@types/react@18.2.21)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.21)(react@18.2.0) + dev: false + + /react-remove-scroll@2.5.6(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-bO856ad1uDYLefgArk559IzUNeQ6SWH4QnrevIUjH+GczV56giDfl3h0Idptf2oIKxQmd1p9BN25jleKodTALg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.21 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.21)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) + tslib: 2.6.1 + use-callback-ref: 1.3.0(@types/react@18.2.21)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.21)(react@18.2.0) dev: false - /react-style-singleton@2.2.1(@types/react@18.2.14)(react@18.2.0): + /react-style-singleton@2.2.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -10198,35 +13188,35 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.14 + '@types/react': 18.2.21 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /react-textarea-autosize@8.3.4(@types/react@18.2.14)(react@18.2.0): - resolution: {integrity: sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==} + /react-textarea-autosize@8.5.2(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-uOkyjkEl0ByEK21eCJMHDGBAAd/BoFQBawYK5XItjAmCTeSbjxghd8qnt7nzsLYzidjnoObu6M26xts0YGKsGg==} engines: {node: '>=10'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.20.0 + '@babel/runtime': 7.22.6 react: 18.2.0 use-composed-ref: 1.3.0(react@18.2.0) - use-latest: 1.2.1(@types/react@18.2.14)(react@18.2.0) + use-latest: 1.2.1(@types/react@18.2.21)(react@18.2.0) transitivePeerDependencies: - '@types/react' dev: false - /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.4.0): + /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.6.1): resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} peerDependencies: react: '*' tslib: '*' dependencies: react: 18.2.0 - tslib: 2.4.0 + tslib: 2.6.1 dev: false /react-use@17.4.0(react-dom@18.2.0)(react@18.2.0): @@ -10244,13 +13234,13 @@ packages: nano-css: 5.3.5(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.4.0) + react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.6.1) resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 set-harmonic-interval: 1.0.1 throttle-debounce: 3.0.1 ts-easing: 0.2.0 - tslib: 2.4.0 + tslib: 2.6.1 dev: false /react@16.14.0: @@ -10269,6 +13259,11 @@ packages: loose-envify: 1.4.0 dev: false + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + /read-package-json-fast@3.0.2: resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -10281,7 +13276,7 @@ packages: resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - glob: 10.3.1 + glob: 10.3.3 json-parse-even-better-errors: 3.0.0 normalize-package-data: 5.0.0 npm-normalize-package-bin: 3.0.1 @@ -10323,8 +13318,8 @@ packages: type-fest: 0.6.0 dev: true - /readable-stream@2.3.7: - resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -10335,36 +13330,36 @@ packages: util-deprecate: 1.0.2 dev: true - /readable-stream@3.6.0: - resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readable-stream@4.2.0: - resolution: {integrity: sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==} + /readable-stream@4.4.2: + resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: abort-controller: 3.0.0 buffer: 6.0.3 events: 3.3.0 process: 0.11.10 + string_decoder: 1.3.0 dev: false /readable-web-to-node-stream@3.0.2: resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} engines: {node: '>=8'} dependencies: - readable-stream: 3.6.0 + readable-stream: 3.6.2 /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - dev: false /real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} @@ -10375,7 +13370,7 @@ packages: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} dependencies: - resolve: 1.22.2 + resolve: 1.22.4 /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} @@ -10401,33 +13396,41 @@ packages: resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} dev: false - /regenerator-runtime@0.13.10: - resolution: {integrity: sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==} - dev: false + /reflect.getprototypeof@1.0.3: + resolution: {integrity: sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} dev: false - /regexp-tree@0.1.24: - resolution: {integrity: sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==} + /regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true dev: true - /regexp.prototype.flags@1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.0 functions-have-names: 1.2.3 dev: true - /registry-auth-token@5.0.1: - resolution: {integrity: sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==} + /registry-auth-token@5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} engines: {node: '>=14'} dependencies: - '@pnpm/npm-conf': 1.0.5 + '@pnpm/npm-conf': 2.2.2 dev: true /registry-url@6.0.1: @@ -10444,8 +13447,8 @@ packages: jsesc: 0.5.0 dev: true - /release-it@16.1.0: - resolution: {integrity: sha512-d2XpGtPAIUoN/v0nJkfdx9GyFkgTXRj+7HATaZRmS+a0IhnE/qRDQ4kMVuDh8UCX1CKV6SRiFdV/vEpKpzZzxA==} + /release-it@16.1.5: + resolution: {integrity: sha512-w/zCljPZBSYcCwR9fjDB1zaYwie1CAQganUrwNqjtXacXhrrsS5E6dDUNLcxm2ypu8GWAgZNMJfuBJqIO2E7fA==} engines: {node: '>=16'} hasBin: true dependencies: @@ -10454,23 +13457,23 @@ packages: async-retry: 1.3.3 chalk: 5.3.0 cosmiconfig: 8.2.0 - execa: 7.1.1 + execa: 7.2.0 git-url-parse: 13.1.0 - globby: 13.2.1 + globby: 13.2.2 got: 13.0.0 - inquirer: 9.2.7 + inquirer: 9.2.10 is-ci: 3.0.1 issue-parser: 6.0.0 lodash: 4.17.21 mime-types: 2.1.35 new-github-release-url: 2.0.0 - node-fetch: 3.3.1 + node-fetch: 3.3.2 open: 9.1.0 - ora: 6.3.1 + ora: 7.0.1 os-name: 5.1.0 promise.allsettled: 1.0.6 - proxy-agent: 6.2.1 - semver: 7.5.3 + proxy-agent: 6.3.0 + semver: 7.5.4 shelljs: 0.8.5 update-notifier: 6.0.2 url-join: 5.0.0 @@ -10517,6 +13520,7 @@ packages: /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + dev: true /resolve-global@1.0.0: resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} @@ -10527,22 +13531,13 @@ packages: /resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: false - - /resolve@1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} - hasBin: true - dependencies: - is-core-module: 2.12.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 dev: true - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} hasBin: true dependencies: - is-core-module: 2.12.1 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -10550,7 +13545,7 @@ packages: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} hasBin: true dependencies: - is-core-module: 2.12.1 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -10624,16 +13619,16 @@ packages: engines: {node: '>=14'} hasBin: true dependencies: - glob: 10.3.1 - dev: false + glob: 10.3.3 + dev: true - /rollup@3.25.3: - resolution: {integrity: sha512-ZT279hx8gszBj9uy5FfhoG4bZx8c+0A1sbqtr7Q3KNWIizpTdDEPZbV2xcbvHsnFp4MavCQYZyzApJ+virB8Yw==} + /rollup@3.27.2: + resolution: {integrity: sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: fsevents: 2.3.2 - dev: false + dev: true /rrdom@0.1.7: resolution: {integrity: sha512-ZLd8f14z9pUy2Hk9y636cNv5Y2BMnNEY99wxzW9tD2BLDfe1xFxtLjB4q/xCBYo6HRe0wofzKzjm4JojmpBfFw==} @@ -10648,35 +13643,31 @@ packages: rrweb: 2.0.0-alpha.4 dev: false - /rrweb-snapshot@2.0.0-alpha.4: - resolution: {integrity: sha512-KQ2OtPpXO5jLYqg1OnXS/Hf+EzqnZyP5A+XPqBCjYpj3XIje/Od4gdUwjbFo3cVuWq5Cw5Y1d3/xwgIS7/XpQQ==} - dev: false - - /rrweb-snapshot@2.0.0-alpha.8: - resolution: {integrity: sha512-3Rb7c+mnDEADQ8N9qn9SDH5PzCyHlZ1cwZC932qRyt9O8kJWLM11JLYqqEyQCa2FZVQbzH2iAaCgnyM7A32p7A==} + /rrweb-snapshot@2.0.0-alpha.10: + resolution: {integrity: sha512-RRkQcgYfpsv1zCmd4EeIr5m2brHwqL2HGQF5S4PgZa3+7iJ0VJOnpmFs+hu4h+et+ArjW8bl0b7aAhKkFAVEfg==} dev: false - /rrweb-snapshot@2.0.0-alpha.9: - resolution: {integrity: sha512-mHg1uUE2iUf0MXLE//4r5cMynkbduwmaOEis4gC7EuqkUAC1pYoLpcYYVt9lD6dgYIF6BmK6dgLLzMpD/tTyyA==} + /rrweb-snapshot@2.0.0-alpha.4: + resolution: {integrity: sha512-KQ2OtPpXO5jLYqg1OnXS/Hf+EzqnZyP5A+XPqBCjYpj3XIje/Od4gdUwjbFo3cVuWq5Cw5Y1d3/xwgIS7/XpQQ==} dev: false /rrweb@2.0.0-alpha.4: resolution: {integrity: sha512-wEHUILbxDPcNwkM3m4qgPgXAiBJyqCbbOHyVoNEVBJzHszWEFYyTbrZqUdeb1EfmTRC2PsumCIkVcomJ/xcOzA==} dependencies: - '@rrweb/types': 2.0.0-alpha.8 + '@rrweb/types': 2.0.0-alpha.10 '@types/css-font-loading-module': 0.0.7 '@xstate/fsm': 1.6.5 base64-arraybuffer: 1.0.2 fflate: 0.4.8 - mitt: 3.0.0 + mitt: 3.0.1 rrdom: 0.1.7 rrweb-snapshot: 2.0.0-alpha.4 dev: false - /rtl-css-js@1.16.0: - resolution: {integrity: sha512-Oc7PnzwIEU4M0K1J4h/7qUUaljXhQ0kCObRsZjxs2HjkpKsnoTMvSmvJ4sqgJZd0zBoEfAyTdnK/jMIYvrjySQ==} + /rtl-css-js@1.16.1: + resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} dependencies: - '@babel/runtime': 7.22.5 + '@babel/runtime': 7.22.6 dev: false /run-applescript@5.0.0: @@ -10703,7 +13694,17 @@ packages: /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.5.3 + tslib: 2.6.1 + + /safe-array-concat@1.0.0: + resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -10716,7 +13717,7 @@ packages: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 is-regex: 1.1.4 dev: true @@ -10726,14 +13727,8 @@ packages: ret: 0.2.2 dev: false - /safe-regex@2.1.1: - resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} - dependencies: - regexp-tree: 0.1.24 - dev: true - - /safe-stable-stringify@2.4.1: - resolution: {integrity: sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==} + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} engines: {node: '>=10'} dev: false @@ -10750,7 +13745,7 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.12 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) @@ -10759,15 +13754,21 @@ packages: engines: {node: '>=0.10.0'} dev: false - /secure-json-parse@2.5.0: - resolution: {integrity: sha512-ZQruFgZnIWH+WyO9t5rWt4ZEGqCKPwhiw+YbzTwpmT9elgLrLcfuyUiSnwwjUiVy9r4VM3urtbNF1xmEh9IL2w==} + /scroll-into-view-if-needed@3.0.10: + resolution: {integrity: sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg==} + dependencies: + compute-scroll-into-view: 3.0.3 + dev: false + + /secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} dev: false /semver-diff@4.0.0: resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} engines: {node: '>=12'} dependencies: - semver: 7.5.3 + semver: 7.5.4 dev: true /semver-regex@4.0.5: @@ -10778,15 +13779,15 @@ packages: resolution: {integrity: sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==} engines: {node: '>=12'} dependencies: - semver: 7.5.3 + semver: 7.5.4 - /semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true dev: true - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true dev: true @@ -10798,16 +13799,8 @@ packages: lru-cache: 6.0.0 dev: true - /semver@7.5.2: - resolution: {integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver@7.5.3: - resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} hasBin: true dependencies: @@ -10827,8 +13820,8 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /set-cookie-parser@2.5.1: - resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==} + /set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} dev: false /set-harmonic-interval@1.0.1: @@ -10873,30 +13866,37 @@ packages: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.1 object-inspect: 1.12.3 dev: true /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - /signal-exit@4.0.2: - resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + dev: true - /sigstore@1.6.0: - resolution: {integrity: sha512-QODKff/qW/TXOZI6V/Clqu74xnInAS6it05mufj4/fSewexLtfEntgLZZcBtUK44CDQyUE5TUXYy1ARYzlfG9g==} + /sigstore@1.8.0: + resolution: {integrity: sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true dependencies: - '@sigstore/protobuf-specs': 0.1.0 - '@sigstore/tuf': 1.0.0 + '@sigstore/bundle': 1.0.0 + '@sigstore/protobuf-specs': 0.2.0 + '@sigstore/tuf': 1.0.3 make-fetch-happen: 11.1.1 - tuf-js: 1.1.7 transitivePeerDependencies: - supports-color dev: true + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true @@ -10910,24 +13910,6 @@ packages: engines: {node: '>=12'} dev: true - /slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - /slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -10971,15 +13953,15 @@ packages: smart-buffer: 4.2.0 dev: true - /solid-js@1.7.7: - resolution: {integrity: sha512-SPdYVke/Z6Za24PBTbULyQYPrhGO1ZbPany76atO2zF2dmYn2pCotbsw1JtlgWnr9dK2JbwPGnA3ODTGPLhZNw==} + /solid-js@1.7.9: + resolution: {integrity: sha512-p1orXnauMQmwYULZtuPAXyKNRGEN2qh60kLX4YURa3jvulxAqjlh2kWEljXCtAVR6UZPC16NXdj9ASHcH383Fg==} dependencies: - csstype: 3.1.1 + csstype: 3.1.2 seroval: 0.5.1 dev: false - /sonic-boom@3.2.0: - resolution: {integrity: sha512-SbbZ+Kqj/XIunvIAgUZRlqd6CGQYq71tRRbXR92Za8J/R3Yh4Av+TWENiSiEgnlwckYLyP0YZQWVfyNC0dzLaA==} + /sonic-boom@3.3.0: + resolution: {integrity: sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==} dependencies: atomic-sleep: 1.0.0 dev: false @@ -10999,7 +13981,6 @@ packages: /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - dev: false /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -11039,17 +14020,17 @@ packages: engines: {node: '>= 8'} dependencies: whatwg-url: 7.1.0 - dev: false /sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead dev: false - /spdx-correct@3.1.1: - resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.12 + spdx-license-ids: 3.0.13 dev: true /spdx-exceptions@2.3.0: @@ -11060,21 +14041,21 @@ packages: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.12 + spdx-license-ids: 3.0.13 dev: true - /spdx-license-ids@3.0.12: - resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} dev: true /split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: - readable-stream: 3.6.0 + readable-stream: 3.6.2 dev: true - /split2@4.1.0: - resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} dev: false @@ -11127,13 +14108,20 @@ packages: bl: 5.1.0 dev: true + /stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + dependencies: + internal-slot: 1.0.5 + dev: true + /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} dev: false - /string-argv@0.3.1: - resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} dev: true @@ -11151,35 +14139,54 @@ packages: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 + dev: true + + /string-width@6.1.0: + resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} + engines: {node: '>=16'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 10.2.1 + strip-ansi: 7.1.0 + dev: true /string.prototype.matchall@4.0.8: resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - get-intrinsic: 1.1.3 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 has-symbols: 1.0.3 - internal-slot: 1.0.3 - regexp.prototype.flags: 1.4.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.5.0 side-channel: 1.0.4 dev: true - /string.prototype.trimend@1.0.5: - resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} + /string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: true + + /string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.22.1 dev: true - /string.prototype.trimstart@1.0.5: - resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} + /string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.22.1 dev: true /string_decoder@1.1.1: @@ -11199,11 +14206,12 @@ packages: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.0.1: - resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 + dev: true /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} @@ -11271,26 +14279,26 @@ packages: react: 18.2.0 dev: false - /stylis@4.1.1: - resolution: {integrity: sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ==} - dev: false - /stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} dev: false - /sucrase@3.28.0: - resolution: {integrity: sha512-TK9600YInjuiIhVM3729rH4ZKPOsGeyXUwY+Ugu9eilNbdTFyHr6XcAGYbRVZPDgWj6tgI7bx95aaJjHnbffag==} + /stylis@4.3.0: + resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} + dev: false + + /sucrase@3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} engines: {node: '>=8'} hasBin: true dependencies: + '@jridgewell/gen-mapping': 0.3.3 commander: 4.1.1 glob: 7.1.6 lines-and-columns: 1.2.4 mz: 2.7.0 - pirates: 4.0.5 + pirates: 4.0.6 ts-interface-checker: 0.1.13 - dev: false /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} @@ -11314,12 +14322,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svg-tags@1.0.0: - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - dev: true - - /swagger-ui-dist@5.1.0: - resolution: {integrity: sha512-c1KmAjuVODxw+vwkNLALQZrgdlBAuBbr2xSPfYrJgseEi7gFKcTvShysPmyuDI4kcUa1+5rFpjWvXdusKY74mg==} + /swagger-ui-dist@5.3.1: + resolution: {integrity: sha512-El78OvXp9zMasfPrshtkW1CRx8AugAKoZuGGOTW+8llJzOV1RtDJYqQRz/6+2OakjeWWnZuRlN2Qj1Y0ilux3w==} dev: false /symbol-observable@4.0.0: @@ -11327,6 +14331,58 @@ packages: engines: {node: '>=0.10'} dev: false + /tailwind-merge@1.14.0: + resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} + dev: false + + /tailwind-variants@0.1.13(tailwindcss@3.3.3): + resolution: {integrity: sha512-G2M7M74hjq0nAo6QdEfUJgF+0t9DecFUw91GC1P9YTnwMcfB3uChT5U5e2DuNU42xoOz15lzo7r0mPdMzZkylg==} + engines: {node: '>=16.x', pnpm: '>=7.x'} + peerDependencies: + tailwindcss: '*' + dependencies: + tailwind-merge: 1.14.0 + tailwindcss: 3.3.3(ts-node@10.9.1) + dev: false + + /tailwindcss-animate@1.0.6(tailwindcss@3.3.3): + resolution: {integrity: sha512-4WigSGMvbl3gCCact62ZvOngA+PRqhAn7si3TQ3/ZuPuQZcIEtVap+ENSXbzWhpojKB8CpvnIsrwBu8/RnHtuw==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + tailwindcss: 3.3.3(ts-node@10.9.1) + dev: false + + /tailwindcss@3.3.3(ts-node@10.9.1): + resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} + engines: {node: '>=14.0.0'} + hasBin: true + 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.3.1 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.19.1 + 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.28 + postcss-import: 15.1.0(postcss@8.4.28) + postcss-js: 4.0.1(postcss@8.4.28) + postcss-load-config: 4.0.1(postcss@8.4.28)(ts-node@10.9.1) + postcss-nested: 6.0.1(postcss@8.4.28) + postcss-selector-parser: 6.0.13 + resolve: 1.22.4 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -11347,21 +14403,21 @@ packages: resolution: {integrity: sha512-HM4chXXDaHCAl1AFbSlyHUFjoaEKTewVE0j6ni5S5mRdPdJdva4AfcmXgBZYnRBiJagl6QuVtsqLjqHUiiO20A==} hasBin: true dependencies: - '@antfu/ni': 0.21.4 + '@antfu/ni': 0.21.6 '@npmcli/config': 6.2.1 detect-indent: 7.0.1 - execa: 7.1.1 + execa: 7.2.0 pacote: 15.2.0 prompts: 2.4.2 - semver: 7.5.3 - unconfig: 0.3.9 + semver: 7.5.4 + unconfig: 0.3.10 yargs: 17.7.2 transitivePeerDependencies: - bluebird - supports-color dev: true - /terser-webpack-plugin@5.3.9(@swc/core@1.3.68)(esbuild@0.18.10)(webpack@5.88.1): + /terser-webpack-plugin@5.3.9(@swc/core@1.3.78)(esbuild@0.18.19)(webpack@5.88.2): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -11377,22 +14433,22 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.17 - '@swc/core': 1.3.68 - esbuild: 0.18.10 + '@jridgewell/trace-mapping': 0.3.18 + '@swc/core': 1.3.78 + esbuild: 0.18.19 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.18.2 - webpack: 5.88.1(@swc/core@1.3.68)(esbuild@0.18.10) + terser: 5.19.2 + webpack: 5.88.2(@swc/core@1.3.78)(esbuild@0.18.19) - /terser@5.18.2: - resolution: {integrity: sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==} + /terser@5.19.2: + resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} engines: {node: '>=10'} hasBin: true dependencies: - '@jridgewell/source-map': 0.3.3 - acorn: 8.9.0 + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -11414,16 +14470,14 @@ packages: engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 - dev: false /thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 - dev: false - /thread-stream@2.2.0: - resolution: {integrity: sha512-rUkv4/fnb4rqy/gGy7VuqK6wE1+1DOCOWy4RMeaV69ZHMP11tQKZvZSip1yTgrKCMZzEMcCL/bKfHvSfDHx+iQ==} + /thread-stream@2.3.0: + resolution: {integrity: sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==} dependencies: real-require: 0.2.0 dev: false @@ -11436,14 +14490,14 @@ packages: /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: - readable-stream: 2.3.7 + readable-stream: 2.3.8 xtend: 4.0.2 dev: true /through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: - readable-stream: 3.6.0 + readable-stream: 3.6.2 dev: true /through@2.3.8: @@ -11496,13 +14550,11 @@ packages: /tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: - punycode: 2.1.1 - dev: false + punycode: 2.3.0 /tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - dev: false /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} @@ -11515,15 +14567,23 @@ packages: dependencies: escape-string-regexp: 5.0.0 + /ts-api-utils@1.0.1(typescript@5.1.6): + resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.1.6 + dev: true + /ts-easing@0.2.0: resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} dev: false /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: false - /ts-loader@9.4.4(typescript@5.1.6)(webpack@5.88.1): + /ts-loader@9.4.4(typescript@5.1.6)(webpack@5.88.2): resolution: {integrity: sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==} engines: {node: '>=12.0.0'} peerDependencies: @@ -11531,14 +14591,46 @@ packages: webpack: ^5.0.0 dependencies: chalk: 4.1.2 - enhanced-resolve: 5.10.0 + enhanced-resolve: 5.15.0 micromatch: 4.0.5 - semver: 7.5.3 + semver: 7.5.4 + typescript: 5.1.6 + webpack: 5.88.2(@swc/core@1.3.78)(esbuild@0.18.19) + dev: true + + /ts-node@10.9.1(@swc/core@1.3.78)(@types/node@20.4.7)(typescript@5.1.6): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@swc/core': 1.3.78 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.4.7 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 typescript: 5.1.6 - webpack: 5.88.1(@swc/core@1.3.68)(esbuild@0.18.10) + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 dev: true - /ts-node@10.9.1(@swc/core@1.3.68)(@types/node@20.4.1)(typescript@5.1.6): + /ts-node@10.9.1(@swc/core@1.3.78)(@types/node@20.5.4)(typescript@5.1.6): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -11553,13 +14645,13 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.3.68 + '@swc/core': 1.3.78 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 20.4.1 - acorn: 8.8.0 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.5.4 + acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -11571,10 +14663,10 @@ packages: /ts-toolbelt@9.6.0: resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} - dev: false + dev: true - /tsconfig-paths-webpack-plugin@4.0.1: - resolution: {integrity: sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==} + /tsconfig-paths-webpack-plugin@4.1.0: + resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} engines: {node: '>=10.13.0'} dependencies: chalk: 4.1.2 @@ -11582,12 +14674,12 @@ packages: tsconfig-paths: 4.2.0 dev: false - /tsconfig-paths@3.14.1: - resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} + /tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: '@types/json5': 0.0.29 - json5: 1.0.1 - minimist: 1.2.7 + json5: 1.0.2 + minimist: 1.2.8 strip-bom: 3.0.0 dev: true @@ -11596,26 +14688,23 @@ packages: engines: {node: '>=6'} dependencies: json5: 2.2.3 - minimist: 1.2.7 + minimist: 1.2.8 strip-bom: 3.0.0 dev: false - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - /tslib@2.4.0: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} dev: false - /tslib@2.5.3: - resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} - /tslib@2.6.0: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} + dev: false + + /tslib@2.6.1: + resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} - /tsup@7.1.0(@swc/core@1.3.68)(ts-node@10.9.1)(typescript@5.1.6): - resolution: {integrity: sha512-mazl/GRAk70j8S43/AbSYXGgvRP54oQeX8Un4iZxzATHt0roW0t6HYDVZIXMw0ZQIpvr1nFMniIVnN5186lW7w==} + /tsup@7.2.0(@swc/core@1.3.78)(ts-node@10.9.1)(typescript@5.1.6): + resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} engines: {node: '>=16.14'} hasBin: true peerDependencies: @@ -11630,35 +14719,25 @@ packages: typescript: optional: true dependencies: - '@swc/core': 1.3.68 - bundle-require: 4.0.1(esbuild@0.18.10) + '@swc/core': 1.3.78 + bundle-require: 4.0.1(esbuild@0.18.19) cac: 6.7.14 chokidar: 3.5.3 debug: 4.3.4 - esbuild: 0.18.10 + esbuild: 0.18.19 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.1(ts-node@10.9.1) + postcss-load-config: 4.0.1(postcss@8.4.28)(ts-node@10.9.1) resolve-from: 5.0.0 - rollup: 3.25.3 + rollup: 3.27.2 source-map: 0.8.0-beta.0 - sucrase: 3.28.0 + sucrase: 3.34.0 tree-kill: 1.2.2 typescript: 5.1.6 transitivePeerDependencies: - supports-color - ts-node - dev: false - - /tsutils@3.21.0(typescript@5.1.6): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.1.6 dev: true /tsx@3.12.7: @@ -11666,11 +14745,11 @@ packages: hasBin: true dependencies: '@esbuild-kit/cjs-loader': 2.4.2 - '@esbuild-kit/core-utils': 3.0.0 + '@esbuild-kit/core-utils': 3.1.0 '@esbuild-kit/esm-loader': 2.5.5 optionalDependencies: fsevents: 2.3.2 - dev: false + dev: true /tuf-js@1.1.7: resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} @@ -11683,13 +14762,6 @@ packages: - supports-color dev: true - /type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - dev: true - /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -11739,6 +14811,44 @@ packages: mime-types: 2.1.35 dev: false + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: true + /typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: @@ -11752,17 +14862,13 @@ packages: resolution: {integrity: sha512-XO/820iRsCDwqLjE8XE+b57cVGPyk1h+U9lBGpDWvbEky+NQChvHVwaKM05WnW1c5z3EVQh8NhXFmh2E/1YazQ==} dependencies: ts-toolbelt: 9.6.0 - dev: false + dev: true /typescript@5.1.6: resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} engines: {node: '>=14.17'} hasBin: true - /ua-parser-js@0.7.32: - resolution: {integrity: sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==} - dev: false - /ua-parser-js@1.0.35: resolution: {integrity: sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==} dev: false @@ -11771,6 +14877,10 @@ packages: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} dev: false + /ufo@1.2.0: + resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} + dev: true + /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} @@ -11795,12 +14905,13 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /unconfig@0.3.9: - resolution: {integrity: sha512-8yhetFd48M641mxrkWA+C/lZU4N0rCOdlo3dFsyFPnBHBjMJfjT/3eAZBRT2RxCRqeBMAKBVgikejdS6yeBjMw==} + /unconfig@0.3.10: + resolution: {integrity: sha512-tj317lhIq2iZF/NXrJnU1t2UaGUKKz1eL1sK2t63Oq66V9BxqvZV12m55fp/fpQJ+DDmVlLgo7cnLVOZkhlO/A==} dependencies: - '@antfu/utils': 0.7.4 + '@antfu/utils': 0.7.5 defu: 6.1.2 - jiti: 1.18.2 + jiti: 1.19.1 + mlly: 1.4.0 dev: true /unique-filename@3.0.0: @@ -11827,7 +14938,7 @@ packages: /unist-util-stringify-position@2.0.3: resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 dev: true /universal-user-agent@6.0.0: @@ -11848,13 +14959,13 @@ packages: engines: {node: '>=8'} dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.9): + /update-browserslist-db@1.0.11(browserslist@4.21.10): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.9 + browserslist: 4.21.10 escalade: 3.1.1 picocolors: 1.0.0 @@ -11862,7 +14973,7 @@ packages: resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} engines: {node: '>=14.16'} dependencies: - boxen: 7.0.0 + boxen: 7.1.1 chalk: 5.3.0 configstore: 6.0.0 has-yarn: 3.0.0 @@ -11870,10 +14981,10 @@ packages: is-ci: 3.0.1 is-installed-globally: 0.4.0 is-npm: 6.0.0 - is-yarn-global: 0.4.0 + is-yarn-global: 0.4.1 latest-version: 7.0.0 pupa: 3.1.0 - semver: 7.5.3 + semver: 7.5.4 semver-diff: 4.0.0 xdg-basedir: 5.1.0 dev: true @@ -11881,14 +14992,14 @@ packages: /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.1.1 + punycode: 2.3.0 /url-join@5.0.0: resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /use-callback-ref@1.3.0(@types/react@18.2.14)(react@18.2.0): + /use-callback-ref@1.3.0(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} peerDependencies: @@ -11898,9 +15009,9 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.14 + '@types/react': 18.2.21 react: 18.2.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false /use-composed-ref@1.3.0(react@18.2.0): @@ -11911,18 +15022,18 @@ packages: react: 18.2.0 dev: false - /use-intl@2.17.5(react@18.2.0): - resolution: {integrity: sha512-pkTRoGZsOyHImBFgV23z7g/Hzt1auap+cWvsiWzHpc70NK7Rm9R3LNI3wm3FnYEWNF8N3+CZKV+SCTrHwcNK1w==} + /use-intl@2.20.0(react@18.2.0): + resolution: {integrity: sha512-h9aOveHyqUSNshPvWSx88f0ny0w/F4kTG3oM1lGZYTlfK7vE6Ic9vVM7TDn/7idD3v6b2Vasp7q0le/opn6j/Q==} engines: {node: '>=10'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@formatjs/ecma402-abstract': 1.13.0 + '@formatjs/ecma402-abstract': 1.17.0 intl-messageformat: 9.13.0 react: 18.2.0 dev: false - /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.14)(react@18.2.0): + /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} peerDependencies: '@types/react': '*' @@ -11931,11 +15042,11 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.14 + '@types/react': 18.2.21 react: 18.2.0 dev: false - /use-latest@1.2.1(@types/react@18.2.14)(react@18.2.0): + /use-latest@1.2.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} peerDependencies: '@types/react': '*' @@ -11944,12 +15055,12 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.14 + '@types/react': 18.2.21 react: 18.2.0 - use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.14)(react@18.2.0) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.21)(react@18.2.0) dev: false - /use-sidecar@1.1.2(@types/react@18.2.14)(react@18.2.0): + /use-sidecar@1.1.2(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -11959,10 +15070,10 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.14 + '@types/react': 18.2.21 detect-node-es: 1.1.0 react: 18.2.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false /use-sync-external-store@1.2.0(react@18.2.0): @@ -11992,7 +15103,7 @@ packages: /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: - spdx-correct: 3.1.1 + spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 dev: true @@ -12003,35 +15114,25 @@ packages: builtins: 5.0.1 dev: true - /validator@13.7.0: - resolution: {integrity: sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==} + /validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} engines: {node: '>= 0.10'} dev: false - /vm2@3.9.19: - resolution: {integrity: sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==} - engines: {node: '>=6.0'} - deprecated: The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm. - hasBin: true - dependencies: - acorn: 8.9.0 - acorn-walk: 8.2.0 - dev: true - - /vue-eslint-parser@9.3.1(eslint@8.44.0): + /vue-eslint-parser@9.3.1(eslint@8.47.0): resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 - eslint: 8.44.0 - eslint-scope: 7.2.0 - eslint-visitor-keys: 3.4.1 - espree: 9.5.2 + eslint: 8.47.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.2 + espree: 9.6.1 esquery: 1.5.0 lodash: 4.17.21 - semver: 7.5.3 + semver: 7.5.4 transitivePeerDependencies: - supports-color dev: true @@ -12055,7 +15156,7 @@ packages: engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -12076,7 +15177,6 @@ packages: /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: false /webpack-node-externals@3.0.0: resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} @@ -12087,8 +15187,8 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack@5.88.1(@swc/core@1.3.68)(esbuild@0.18.10): - resolution: {integrity: sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==} + /webpack@5.88.2(@swc/core@1.3.78)(esbuild@0.18.19): + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -12102,23 +15202,23 @@ packages: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.9.0 - acorn-import-assertions: 1.9.0(acorn@8.9.0) - browserslist: 4.21.9 + acorn: 8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) + browserslist: 4.21.10 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 1.3.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(@swc/core@1.3.68)(esbuild@0.18.10)(webpack@5.88.1) + terser-webpack-plugin: 5.3.9(@swc/core@1.3.78)(esbuild@0.18.19)(webpack@5.88.2) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -12138,7 +15238,6 @@ packages: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 - dev: false /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -12150,6 +15249,44 @@ packages: is-symbol: 1.0.4 dev: true + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.5 + has-tostringtag: 1.0.0 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.11 + dev: true + + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: true + + /which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -12195,15 +15332,15 @@ packages: execa: 4.1.0 dev: false - /windows-release@5.0.1: - resolution: {integrity: sha512-y1xFdFvdMiDXI3xiOhMbJwt1Y7dUxidha0CWPs1NgjZIjZANTcX7+7bMqNjuezhzb8s5JGEiBAbQjQQYYy7ulw==} + /windows-release@5.1.1: + resolution: {integrity: sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: execa: 5.1.1 dev: true - /word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} dev: true @@ -12218,7 +15355,6 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -12234,7 +15370,8 @@ packages: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 - strip-ansi: 7.0.1 + strip-ansi: 7.1.0 + dev: true /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -12277,7 +15414,7 @@ packages: resolution: {integrity: sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==} engines: {node: ^14.17.0 || >=16.0.0} dependencies: - eslint-visitor-keys: 3.4.1 + eslint-visitor-keys: 3.4.2 lodash: 4.17.21 yaml: 2.3.1 dev: true @@ -12333,24 +15470,27 @@ packages: /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - dev: true /zod@3.21.4: resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} dev: false - /zustand@4.3.9(react@18.2.0): - resolution: {integrity: sha512-Tat5r8jOMG1Vcsj8uldMyqYKC5IZvQif8zetmLHs9WoZlntTHmIoNM8TpLRY31ExncuUvUOXehd0kvahkuHjDw==} + /zustand@4.4.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} engines: {node: '>=12.7.0'} peerDependencies: + '@types/react': '>=16.8' immer: '>=9.0' react: '>=16.8' peerDependenciesMeta: + '@types/react': + optional: true immer: optional: true react: optional: true dependencies: + '@types/react': 18.2.21 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false From 11b82cad48e36e4a1066c8b521daff443d0de78a Mon Sep 17 00:00:00 2001 From: chenyueban <jasonchan0527@gmail.com> Date: Sat, 26 Aug 2023 23:07:27 +0800 Subject: [PATCH 05/23] feat: finish signin page --- package.json | 10 +- packages/server/.eslintrc | 6 - packages/server/package.json | 3 +- packages/server/src/common/constants/index.ts | 2 +- .../constants/{status.json => status.ts} | 2 +- .../web/app/[locale]/auth/signin/signin.tsx | 321 ++++---- .../create-project/create-project.tsx | 157 ++-- packages/web/app/[locale]/home.tsx | 6 +- packages/web/app/[locale]/providers.tsx | 6 +- packages/web/components/ui/avatar.tsx | 50 ++ packages/web/components/ui/form.tsx | 176 +++++ packages/web/components/ui/input.tsx | 25 + packages/web/components/ui/label.tsx | 26 + packages/web/components/ui/select.tsx | 121 +++ packages/web/components/ui/separator.tsx | 31 + packages/web/components/ui/toast.tsx | 127 +++ packages/web/components/ui/toaster.tsx | 35 + packages/web/components/ui/use-toast.ts | 192 +++++ packages/web/package.json | 12 +- packages/web/styles/globals.css | 82 ++ packages/web/tailwind.config.js | 2 - pnpm-lock.yaml | 748 +++++++++++------- 22 files changed, 1588 insertions(+), 552 deletions(-) delete mode 100644 packages/server/.eslintrc rename packages/server/src/common/constants/{status.json => status.ts} (96%) create mode 100644 packages/web/components/ui/avatar.tsx create mode 100644 packages/web/components/ui/form.tsx create mode 100644 packages/web/components/ui/input.tsx create mode 100644 packages/web/components/ui/label.tsx create mode 100644 packages/web/components/ui/select.tsx create mode 100644 packages/web/components/ui/separator.tsx create mode 100644 packages/web/components/ui/toast.tsx create mode 100644 packages/web/components/ui/toaster.tsx create mode 100644 packages/web/components/ui/use-toast.ts diff --git a/package.json b/package.json index 2974a15..951505a 100644 --- a/package.json +++ b/package.json @@ -52,20 +52,20 @@ }, "devDependencies": { "@antfu/ni": "^0.21.6", - "@babel/types": "^7.22.10", + "@babel/types": "^7.22.11", "@chenyueban/eslint-config": "^3.0.5", "@chenyueban/tsconfig": "^3.0.5", "@commitlint/cli": "^17.7.1", "@release-it/conventional-changelog": "^7.0.0", "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.78", + "@swc/core": "^1.3.80", "@types/js-yaml": "^4.0.5", - "@types/node": "^20.5.4", + "@types/node": "^20.5.6", "@types/ramda": "^0.29.3", "commitizen": "^4.3.0", "cross-env": "^7.0.3", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.47.0", + "eslint": "^8.48.0", "husky": "^8.0.3", "lint-staged": "^14.0.1", "prisma": "^5.2.0", @@ -74,7 +74,7 @@ "taze": "^0.11.2", "tsup": "^7.2.0", "tsx": "^3.12.7", - "typescript": "^5.1.6" + "typescript": "^5.2.2" }, "prisma": { "seed": "npx tsx prisma/seed.ts" diff --git a/packages/server/.eslintrc b/packages/server/.eslintrc deleted file mode 100644 index 45e900a..0000000 --- a/packages/server/.eslintrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "@chenyueban", - "rules": { - "@typescript-eslint/consistent-type-imports": "off" - } -} diff --git a/packages/server/package.json b/packages/server/package.json index e3a98cf..69f5d7b 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -14,7 +14,7 @@ "dependencies": { "@nestjs/axios": "^3.0.0", "@nestjs/bull": "^10.0.1", - "@nestjs/cli": "^10.1.14", + "@nestjs/cli": "^10.1.16", "@nestjs/common": "^10.2.1", "@nestjs/core": "^10.2.1", "@nestjs/mapped-types": "^2.0.2", @@ -33,6 +33,7 @@ "class-validator": "^0.14.0", "common": "workspace:*", "config": "workspace:*", + "cron": "^2.4.1", "dotenv": "^16.3.1", "fastify-multer": "^2.0.3", "markdown-it": "^13.0.1", diff --git a/packages/server/src/common/constants/index.ts b/packages/server/src/common/constants/index.ts index 5f99de5..51709ab 100644 --- a/packages/server/src/common/constants/index.ts +++ b/packages/server/src/common/constants/index.ts @@ -1,3 +1,3 @@ -import status from './status.json' +import status from './status' export { status } diff --git a/packages/server/src/common/constants/status.json b/packages/server/src/common/constants/status.ts similarity index 96% rename from packages/server/src/common/constants/status.json rename to packages/server/src/common/constants/status.ts index f421fcd..f3a31e2 100644 --- a/packages/server/src/common/constants/status.json +++ b/packages/server/src/common/constants/status.ts @@ -1,4 +1,4 @@ -{ +export default { "4001000": "preprocessing event failed", "4001001": "event an error occurred during aggregation", "4001002": "event an error occurred during task scheduling", diff --git a/packages/web/app/[locale]/auth/signin/signin.tsx b/packages/web/app/[locale]/auth/signin/signin.tsx index ad3bdd3..ea40010 100644 --- a/packages/web/app/[locale]/auth/signin/signin.tsx +++ b/packages/web/app/[locale]/auth/signin/signin.tsx @@ -1,6 +1,5 @@ 'use client' -import { Avatar, Button, Center, Divider, FormControl, FormErrorMessage, Heading, Icon, Input, Stack, useToast } from '@chakra-ui/react' import type { SignInResponse } from 'next-auth/react' import { getSession, signIn } from 'next-auth/react' import { useTranslations } from 'next-intl' @@ -8,11 +7,18 @@ import { useRouter } from 'next-intl/client' import type { Dispatch, FC, SetStateAction } from 'react' import { useCallback, useEffect, useMemo, useState } from 'react' import { useForm } from 'react-hook-form' -import { RiGithubFill, RiLoginBoxLine, RiMailLine } from 'react-icons/ri' import type { Project, User } from '@prisma/client' import { useAtom } from 'jotai' import { useMount } from 'react-use' +import { zodResolver } from "@hookform/resolvers/zod" +import * as z from "zod" import { inviteAtom } from '~/atoms/invite' +import { Button } from '~/components/ui/button' +import { Input } from '~/components/ui/input' +import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '~/components/ui/form' +import { useToast } from '~/components/ui/use-toast' +import { Avatar, AvatarFallback, AvatarImage } from '~/components/ui/avatar' +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '~/components/ui/card' type ProviderType = 'email' | 'github' | 'credentials' @@ -36,69 +42,53 @@ interface EmailSignInData { email: string } + + const EmailSignIn: FC<{ setStep: Dispatch<SetStateAction<number>> onSignIn: (type: string, options: Record<string, any>) => void }> = ({ setStep, onSignIn }) => { const ct = useTranslations('Common') - const { handleSubmit, register, formState: { errors } } = useForm<EmailSignInData>() + const formSchema = z.object({ + email: z.string().email().min(2, { + message: ct('mustBeTheCorrectEmailAddress'), + }), + }) + const form = useForm<z.infer<typeof formSchema>>({resolver: zodResolver(formSchema)}) const onSubmit = useCallback((data: EmailSignInData) => { onSignIn('email', { callbackUrl: '/', email: data.email }) }, []) return ( - <form onSubmit={handleSubmit(onSubmit)}> - <Stack spacing="6"> - <Center - display="flex" - flexDirection="column" - gap="4" - > - <FormControl - isInvalid={!!errors.email} - w="300px" - > - <Input - id="email" - placeholder="Email Address" - type="email" - {...register('email', { - required: ct('thisIsRequired'), - pattern: { - value: /\S+@\S+\.\S+/, - message: ct('mustBeTheCorrectEmailAddress'), - }, - })} - /> - <FormErrorMessage w="full"> - {errors.email && errors.email.message} - </FormErrorMessage> - </FormControl> + <Form {...form}> + <form onSubmit={form.handleSubmit(onSubmit)} className="flex flex-col gap-4"> + <FormField + control={form.control} + name="email" + render={({ field }) => ( + <FormItem> + <FormLabel>Email</FormLabel> + <FormControl> + <Input placeholder="Email Address" {...field} /> + </FormControl> + <FormMessage /> + </FormItem> + )} + /> <Button - leftIcon={ - ( - <Icon - as={RiMailLine} - h="5" - w="5" - /> - ) - } type="submit" - variant="solid" - w="300px" + className='w-full' + > + <i className='i-ri-mail-line mr-2'></i> Sign in with Email + </Button> + <Button + onClick={() => { setStep(s => s - 1) }} + variant="link" > - Sign in with Email + ← Other Login Options </Button> - </Center> - <Button - onClick={() => { setStep(s => s - 1) }} - variant="link" - > - ← Other Login Options - </Button> - </Stack> - </form> + </form> + </Form> ) } @@ -111,20 +101,10 @@ const GithubSignIn: FC<Props & { return ( <Button - leftIcon={ - ( - <Icon - as={RiGithubFill} - h="5" - w="5" - /> - ) - } onClick={handleSignInGithub} - variant="solid" - w="300px" + variant="outline" > - Sign in with {providers.github.name} + <i className='i-ri-github-fill mr-2'></i> {providers.github.name} </Button> ) } @@ -138,8 +118,14 @@ const AccountSignIn: FC<{ }> = ({ onSignIn }) => { const ct = useTranslations('Common') const router = useRouter() - const { handleSubmit, register, formState: { errors } } = useForm<AccountSignInData>() - const toast = useToast() + const formSchema = z.object({ + email: z.string().email().min(2, { + message: ct('mustBeTheCorrectEmailAddress'), + }), + password: z.string().max(24).min(8) + }) + const form = useForm<z.infer<typeof formSchema>>({resolver: zodResolver(formSchema)}) + const {toast} = useToast() const onSubmit = useCallback(async(data: AccountSignInData) => { const res = await onSignIn('credentials', { redirect: false, ...data }) if (res?.ok) { @@ -149,83 +135,48 @@ const AccountSignIn: FC<{ toast({ title: 'SignIn Error', description: ct('signInError'), - status: 'error', - isClosable: true, + variant: 'destructive', }) } }, []) return ( - <form onSubmit={handleSubmit(onSubmit)}> - <Stack spacing="6"> - <Center - display="flex" - flexDirection="column" - gap="4" - > - <FormControl - isInvalid={!!errors.email} - w="300px" - > - <Input - id="email" - placeholder="Email Address" - type="email" - {...register('email', { - required: ct('thisIsRequired'), - pattern: { - value: /\S+@\S+\.\S+/, - message: ct('mustBeTheCorrectEmailAddress'), - }, - })} - /> - <FormErrorMessage w="full"> - {errors.email && errors.email.message} - </FormErrorMessage> - </FormControl> - <FormControl - isInvalid={!!errors.password} - w="300px" - > - <Input - id="password" - placeholder="Password" - type="password" - {...register('password', { - required: ct('thisIsRequired'), - maxLength: { - value: 24, - message: 'Max length 24', - }, - minLength: { - value: 8, - message: 'Min length 8', - }, - })} - /> - <FormErrorMessage w="full"> - {errors.password && errors.password.message} - </FormErrorMessage> - </FormControl> + <Form {...form}> + <form onSubmit={form.handleSubmit(onSubmit)} className="flex flex-col gap-4"> + <FormField + control={form.control} + name="email" + render={({ field }) => ( + <FormItem> + <FormLabel>Email</FormLabel> + <FormControl> + <Input placeholder="Email Address" {...field} /> + </FormControl> + <FormMessage /> + </FormItem> + )} + /> + <FormField + control={form.control} + name="email" + render={({ field }) => ( + <FormItem> + <FormLabel>Password</FormLabel> + <FormControl> + <Input placeholder="Password" type="password" {...field} /> + </FormControl> + <FormMessage /> + </FormItem> + )} + /> <Button - leftIcon={ - ( - <Icon - as={RiLoginBoxLine} - h="5" - w="5" - /> - ) - } type="submit" - variant="solid" - w="300px" + className='w-full' > - Sign in + <i className='i-ri-login-box-line mr-2'></i> Sign in </Button> - </Center> - </Stack> - </form> + </form> + </Form> ) } @@ -240,18 +191,18 @@ export default function SignIn({ providers, inviter }: Props) { const [step, setStep] = useState(1) const title = useMemo(() => { if (inviter && inviter.project && inviter.user) { + const name = inviter.user.name || inviter.user.email || '' return ( - <Heading mb="4"> - <Avatar - name={inviter.user.name || inviter.user.email || ''} - size="sm" - src={inviter.user?.image ?? ''} - /> + <h2 className='font-bold text-3xl'> + <Avatar> + <AvatarImage src={inviter.user?.image ?? ''} alt={name} /> + <AvatarFallback>{name}</AvatarFallback> + </Avatar> {`${inviter.user.name || inviter.user.email || ''} invited you to join the ${inviter.project.name}`} - </Heading> + </h2> ) } - return <Heading mb="4">Sign in to Ohbug</Heading> + return <h2 className='font-bold text-3xl'>Sign in to Ohbug</h2> }, [inviter]) const [, setInviteValue] = useAtom(inviteAtom) useEffect(() => { @@ -264,44 +215,67 @@ export default function SignIn({ providers, inviter }: Props) { }, [router]) return ( - <Center h="100vh"> - <Stack spacing="6"> - {title} - <Center - display="flex" - flexDirection="column" - gap="4" - > - { - (providers.credentials && step === 1) && ( - <AccountSignIn - onSignIn={signIn} - /> - ) - } - <Divider /> + <section className='h-screen flex items-center justify-center'> + <Card className='w-[450px]'> + <CardHeader className="space-y-1"> + <CardTitle className="text-2xl">{title}</CardTitle> + <CardDescription> + Choose a way to log in to your account + </CardDescription> + </CardHeader> + <CardContent className="grid gap-4"> { - (providers.github && step === 1) && ( - <GithubSignIn - onSignIn={signIn} - providers={providers} - /> + step === 1 && ( + <> + <div className="grid grid-cols-2 gap-6"> + { + (providers.github) && ( + <GithubSignIn + onSignIn={signIn} + providers={providers} + /> + ) + } + { + (providers.email) && ( + <Button + onClick={() => setStep(s => s + 1)} + variant="outline" + > + <i className='i-ri-mail-line mr-2'></i> Email + </Button> + ) + } + </div> + <div className="relative"> + <div className="absolute inset-0 flex items-center"> + <span className="w-full border-t" /> + </div> + <div className="relative flex justify-center text-xs uppercase"> + <span className="bg-background px-2 text-muted-foreground"> + Or continue with + </span> + </div> + </div> + </> ) } - </Center> { - providers.email && ( + step === 1 && ( <> { - step === 1 && ( - <Button - onClick={() => setStep(s => s + 1)} - variant="link" - > - Continue with Email → - </Button> + (providers.credentials) && ( + <AccountSignIn + onSignIn={signIn} + /> ) } + </> + ) + } + { + providers.email && ( + <> { (step === 2) && ( <EmailSignIn @@ -313,7 +287,8 @@ export default function SignIn({ providers, inviter }: Props) { </> ) } - </Stack> - </Center> + </CardContent> + </Card> + </section> ) } diff --git a/packages/web/app/[locale]/create-project/create-project.tsx b/packages/web/app/[locale]/create-project/create-project.tsx index 86c56f2..bdbfee3 100644 --- a/packages/web/app/[locale]/create-project/create-project.tsx +++ b/packages/web/app/[locale]/create-project/create-project.tsx @@ -1,9 +1,22 @@ 'use client' -import { Box, Button, Center, FormControl, FormErrorMessage, FormLabel, Input, Select } from '@chakra-ui/react' import type { Project } from '@prisma/client' import { useTranslations } from 'next-intl' import { useForm } from 'react-hook-form' +import { zodResolver } from "@hookform/resolvers/zod" +import * as z from "zod" +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "~/components/ui/form" +import { Input } from '~/components/ui/input' +import { Button } from '~/components/ui/button' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '~/components/ui/select' +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '~/components/ui/card' type OmitProject = Omit<Project, 'id' | 'apiKey' | 'createdAt' | 'updatedAt'> @@ -12,72 +25,92 @@ const projectTypes = [ label: 'JavaScript', value: 'javascript', }, -] +] as const + +const formSchema = z.object({ + name: z.string().min(2).max(50), + type: z.enum(['javascript'] as const) +}) export default function CreateProject() { const ct = useTranslations('Common') const t = useTranslations('CreateProject') - const { handleSubmit, register, formState: { errors } } = useForm<OmitProject>() - - return ( - <Center h="100vh"> - <Box - p="3" - shadow="md" - w="lg" - > - <form - method="POST" - onSubmit={handleSubmit((_, e) => e?.target.submit())} - > - <FormControl isInvalid={!!errors.name}> - <FormLabel htmlFor="name">{t('projectName')}</FormLabel> - <Input - id="name" - placeholder={t('projectNamePlaceholder')} - type="text" - {...register('name', { required: ct('thisIsRequired') })} - /> - <FormErrorMessage> - {errors.name && errors.name.message} - </FormErrorMessage> - </FormControl> - <FormControl - isInvalid={!!errors.type} - mt="3" - > - <FormLabel htmlFor="type">{t('projectType')}</FormLabel> - <Select - id="type" - {...register('type', { required: ct('thisIsRequired') })} - > - { - projectTypes.map(({ label, value }) => ( - <option - key={value} - value={value} - > - {label} - </option> - )) - } - </Select> - <FormErrorMessage> - {errors.type && errors.type.message} - </FormErrorMessage> - </FormControl> + const form = useForm<z.infer<typeof formSchema>>({ + resolver: zodResolver(formSchema), + defaultValues: { + name: "", + type: "javascript" + }, + }) + function onSubmit(values: z.infer<typeof formSchema>) { + // Do something with the form values. + // ✅ This will be type-safe and validated. + console.log(values) + } - <Box mt="6"> - <Button - type="submit" - w="full" - > - {t('createProject')} - </Button> - </Box> - </form> - </Box> - </Center> + return ( + <div className='flex items-center justify-center h-screen'> + <Card className='w-80'> + <CardHeader> + <CardTitle>Create project</CardTitle> + <CardDescription>Deploy your new project in one-click.</CardDescription> + </CardHeader> + <CardContent> + <Form {...form}> + <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6"> + <FormField + control={form.control} + name="name" + render={({ field }) => ( + <FormItem> + <FormLabel>{t('projectName')}</FormLabel> + <FormControl> + <Input placeholder={t('projectNamePlaceholder')} {...field} /> + </FormControl> + <FormMessage /> + </FormItem> + )} + /> + <FormField + control={form.control} + name="type" + render={({ field }) => ( + <FormItem> + <FormLabel>{t('projectType')}</FormLabel> + <Select onValueChange={field.onChange} defaultValue={field.value}> + <FormControl> + <SelectTrigger> + <SelectValue placeholder="Select a verified email to display" /> + </SelectTrigger> + </FormControl> + <SelectContent> + { + projectTypes.map(({ label, value }) => ( + <SelectItem + key={value} + value={value} + > + {label} + </SelectItem> + )) + } + </SelectContent> + </Select> + <FormMessage /> + </FormItem> + )} + /> + <Button + className='w-full' + type="submit" + > + {t('createProject')} + </Button> + </form> + </Form> + </CardContent> + </Card> + </div> ) } diff --git a/packages/web/app/[locale]/home.tsx b/packages/web/app/[locale]/home.tsx index 0155eb6..d36da21 100644 --- a/packages/web/app/[locale]/home.tsx +++ b/packages/web/app/[locale]/home.tsx @@ -25,10 +25,8 @@ export default function Home() { <Wrapper> <div className="flex justify-end"> <Link href="/create-project"> - <Button - startContent={<i className="i-ri-add-line" />} - > - {t('createProject')} + <Button> + <i className="i-ri-add-line mr-2" /> {t('createProject')} </Button> </Link> </div> diff --git a/packages/web/app/[locale]/providers.tsx b/packages/web/app/[locale]/providers.tsx index 8ee43f8..94fef0d 100644 --- a/packages/web/app/[locale]/providers.tsx +++ b/packages/web/app/[locale]/providers.tsx @@ -19,6 +19,7 @@ import theme from '~/styles/theme' import { serviceGetProjects } from '~/services/projects' import { useQuery } from '~/hooks/use-query' import '~/styles/nprogress.css' +import { Toaster } from '~/components/ui/toaster' const TopProgressBar = dynamic( () => { @@ -45,10 +46,10 @@ function Controller({ children }: { children: ReactElement }) { } }, [pathname, session]) useEffect(() => { - if (projects && projects.length === 0) { + if (session.status === 'authenticated' && projects && projects.length === 0) { router.replace('/create-project') } - }, [projects]) + }, [session, projects]) return children } @@ -65,6 +66,7 @@ export function Providers({ children, session }: Props) { <CacheProvider> <NextUIProvider> <ChakraProvider theme={theme}> + <Toaster /> <ColorModeScript /> <TopProgressBar /> <Layout> diff --git a/packages/web/components/ui/avatar.tsx b/packages/web/components/ui/avatar.tsx new file mode 100644 index 0000000..c98a737 --- /dev/null +++ b/packages/web/components/ui/avatar.tsx @@ -0,0 +1,50 @@ +"use client" + +import * as React from "react" +import * as AvatarPrimitive from "@radix-ui/react-avatar" + +import { cn } from "~/libs/utils" + +const Avatar = React.forwardRef< + React.ElementRef<typeof AvatarPrimitive.Root>, + React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root> +>(({ className, ...props }, ref) => ( + <AvatarPrimitive.Root + ref={ref} + className={cn( + "relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full", + className + )} + {...props} + /> +)) +Avatar.displayName = AvatarPrimitive.Root.displayName + +const AvatarImage = React.forwardRef< + React.ElementRef<typeof AvatarPrimitive.Image>, + React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image> +>(({ className, ...props }, ref) => ( + <AvatarPrimitive.Image + ref={ref} + className={cn("aspect-square h-full w-full", className)} + {...props} + /> +)) +AvatarImage.displayName = AvatarPrimitive.Image.displayName + +const AvatarFallback = React.forwardRef< + React.ElementRef<typeof AvatarPrimitive.Fallback>, + React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback> +>(({ className, ...props }, ref) => ( + <AvatarPrimitive.Fallback + ref={ref} + className={cn( + "flex h-full w-full items-center justify-center rounded-full bg-muted", + className + )} + {...props} + /> +)) +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName + +export { Avatar, AvatarImage, AvatarFallback } diff --git a/packages/web/components/ui/form.tsx b/packages/web/components/ui/form.tsx new file mode 100644 index 0000000..5382c47 --- /dev/null +++ b/packages/web/components/ui/form.tsx @@ -0,0 +1,176 @@ +import * as React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { Slot } from "@radix-ui/react-slot" +import { + Controller, + ControllerProps, + FieldPath, + FieldValues, + FormProvider, + useFormContext, +} from "react-hook-form" + +import { cn } from "~/libs/utils" +import { Label } from "~/components/ui/label" + +const Form = FormProvider + +type FormFieldContextValue< + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> +> = { + name: TName +} + +const FormFieldContext = React.createContext<FormFieldContextValue>( + {} as FormFieldContextValue +) + +const FormField = < + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> +>({ + ...props +}: ControllerProps<TFieldValues, TName>) => { + return ( + <FormFieldContext.Provider value={{ name: props.name }}> + <Controller {...props} /> + </FormFieldContext.Provider> + ) +} + +const useFormField = () => { + const fieldContext = React.useContext(FormFieldContext) + const itemContext = React.useContext(FormItemContext) + const { getFieldState, formState } = useFormContext() + + const fieldState = getFieldState(fieldContext.name, formState) + + if (!fieldContext) { + throw new Error("useFormField should be used within <FormField>") + } + + const { id } = itemContext + + return { + id, + name: fieldContext.name, + formItemId: `${id}-form-item`, + formDescriptionId: `${id}-form-item-description`, + formMessageId: `${id}-form-item-message`, + ...fieldState, + } +} + +type FormItemContextValue = { + id: string +} + +const FormItemContext = React.createContext<FormItemContextValue>( + {} as FormItemContextValue +) + +const FormItem = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes<HTMLDivElement> +>(({ className, ...props }, ref) => { + const id = React.useId() + + return ( + <FormItemContext.Provider value={{ id }}> + <div ref={ref} className={cn("space-y-2", className)} {...props} /> + </FormItemContext.Provider> + ) +}) +FormItem.displayName = "FormItem" + +const FormLabel = React.forwardRef< + React.ElementRef<typeof LabelPrimitive.Root>, + React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> +>(({ className, ...props }, ref) => { + const { error, formItemId } = useFormField() + + return ( + <Label + ref={ref} + className={cn(error && "text-destructive", className)} + htmlFor={formItemId} + {...props} + /> + ) +}) +FormLabel.displayName = "FormLabel" + +const FormControl = React.forwardRef< + React.ElementRef<typeof Slot>, + React.ComponentPropsWithoutRef<typeof Slot> +>(({ ...props }, ref) => { + const { error, formItemId, formDescriptionId, formMessageId } = useFormField() + + return ( + <Slot + ref={ref} + id={formItemId} + aria-describedby={ + !error + ? `${formDescriptionId}` + : `${formDescriptionId} ${formMessageId}` + } + aria-invalid={!!error} + {...props} + /> + ) +}) +FormControl.displayName = "FormControl" + +const FormDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes<HTMLParagraphElement> +>(({ className, ...props }, ref) => { + const { formDescriptionId } = useFormField() + + return ( + <p + ref={ref} + id={formDescriptionId} + className={cn("text-sm text-muted-foreground", className)} + {...props} + /> + ) +}) +FormDescription.displayName = "FormDescription" + +const FormMessage = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes<HTMLParagraphElement> +>(({ className, children, ...props }, ref) => { + const { error, formMessageId } = useFormField() + const body = error ? String(error?.message) : children + + if (!body) { + return null + } + + return ( + <p + ref={ref} + id={formMessageId} + className={cn("text-sm font-medium text-destructive", className)} + {...props} + > + {body} + </p> + ) +}) +FormMessage.displayName = "FormMessage" + +export { + useFormField, + Form, + FormItem, + FormLabel, + FormControl, + FormDescription, + FormMessage, + FormField, +} diff --git a/packages/web/components/ui/input.tsx b/packages/web/components/ui/input.tsx new file mode 100644 index 0000000..c214019 --- /dev/null +++ b/packages/web/components/ui/input.tsx @@ -0,0 +1,25 @@ +import * as React from "react" + +import { cn } from "~/libs/utils" + +export interface InputProps + extends React.InputHTMLAttributes<HTMLInputElement> {} + +const Input = React.forwardRef<HTMLInputElement, InputProps>( + ({ className, type, ...props }, ref) => { + return ( + <input + type={type} + className={cn( + "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50", + className + )} + ref={ref} + {...props} + /> + ) + } +) +Input.displayName = "Input" + +export { Input } diff --git a/packages/web/components/ui/label.tsx b/packages/web/components/ui/label.tsx new file mode 100644 index 0000000..249e1fc --- /dev/null +++ b/packages/web/components/ui/label.tsx @@ -0,0 +1,26 @@ +"use client" + +import * as React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "~/libs/utils" + +const labelVariants = cva( + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" +) + +const Label = React.forwardRef< + React.ElementRef<typeof LabelPrimitive.Root>, + React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & + VariantProps<typeof labelVariants> +>(({ className, ...props }, ref) => ( + <LabelPrimitive.Root + ref={ref} + className={cn(labelVariants(), className)} + {...props} + /> +)) +Label.displayName = LabelPrimitive.Root.displayName + +export { Label } diff --git a/packages/web/components/ui/select.tsx b/packages/web/components/ui/select.tsx new file mode 100644 index 0000000..65b7a8a --- /dev/null +++ b/packages/web/components/ui/select.tsx @@ -0,0 +1,121 @@ +"use client" + +import * as React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { Check, ChevronDown } from "lucide-react" + +import { cn } from "~/libs/utils" + +const Select = SelectPrimitive.Root + +const SelectGroup = SelectPrimitive.Group + +const SelectValue = SelectPrimitive.Value + +const SelectTrigger = React.forwardRef< + React.ElementRef<typeof SelectPrimitive.Trigger>, + React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger> +>(({ className, children, ...props }, ref) => ( + <SelectPrimitive.Trigger + ref={ref} + className={cn( + "flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50", + className + )} + {...props} + > + {children} + <SelectPrimitive.Icon asChild> + <ChevronDown className="h-4 w-4 opacity-50" /> + </SelectPrimitive.Icon> + </SelectPrimitive.Trigger> +)) +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName + +const SelectContent = React.forwardRef< + React.ElementRef<typeof SelectPrimitive.Content>, + React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content> +>(({ className, children, position = "popper", ...props }, ref) => ( + <SelectPrimitive.Portal> + <SelectPrimitive.Content + ref={ref} + className={cn( + "relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", + position === "popper" && + "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", + className + )} + position={position} + {...props} + > + <SelectPrimitive.Viewport + className={cn( + "p-1", + position === "popper" && + "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]" + )} + > + {children} + </SelectPrimitive.Viewport> + </SelectPrimitive.Content> + </SelectPrimitive.Portal> +)) +SelectContent.displayName = SelectPrimitive.Content.displayName + +const SelectLabel = React.forwardRef< + React.ElementRef<typeof SelectPrimitive.Label>, + React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label> +>(({ className, ...props }, ref) => ( + <SelectPrimitive.Label + ref={ref} + className={cn("py-1.5 pl-8 pr-2 text-sm font-semibold", className)} + {...props} + /> +)) +SelectLabel.displayName = SelectPrimitive.Label.displayName + +const SelectItem = React.forwardRef< + React.ElementRef<typeof SelectPrimitive.Item>, + React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item> +>(({ className, children, ...props }, ref) => ( + <SelectPrimitive.Item + ref={ref} + className={cn( + "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", + className + )} + {...props} + > + <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center"> + <SelectPrimitive.ItemIndicator> + <Check className="h-4 w-4" /> + </SelectPrimitive.ItemIndicator> + </span> + + <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText> + </SelectPrimitive.Item> +)) +SelectItem.displayName = SelectPrimitive.Item.displayName + +const SelectSeparator = React.forwardRef< + React.ElementRef<typeof SelectPrimitive.Separator>, + React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator> +>(({ className, ...props }, ref) => ( + <SelectPrimitive.Separator + ref={ref} + className={cn("-mx-1 my-1 h-px bg-muted", className)} + {...props} + /> +)) +SelectSeparator.displayName = SelectPrimitive.Separator.displayName + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, +} diff --git a/packages/web/components/ui/separator.tsx b/packages/web/components/ui/separator.tsx new file mode 100644 index 0000000..2e657a9 --- /dev/null +++ b/packages/web/components/ui/separator.tsx @@ -0,0 +1,31 @@ +"use client" + +import * as React from "react" +import * as SeparatorPrimitive from "@radix-ui/react-separator" + +import { cn } from "~/libs/utils" + +const Separator = React.forwardRef< + React.ElementRef<typeof SeparatorPrimitive.Root>, + React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root> +>( + ( + { className, orientation = "horizontal", decorative = true, ...props }, + ref + ) => ( + <SeparatorPrimitive.Root + ref={ref} + decorative={decorative} + orientation={orientation} + className={cn( + "shrink-0 bg-border", + orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]", + className + )} + {...props} + /> + ) +) +Separator.displayName = SeparatorPrimitive.Root.displayName + +export { Separator } diff --git a/packages/web/components/ui/toast.tsx b/packages/web/components/ui/toast.tsx new file mode 100644 index 0000000..7b31566 --- /dev/null +++ b/packages/web/components/ui/toast.tsx @@ -0,0 +1,127 @@ +import * as React from "react" +import * as ToastPrimitives from "@radix-ui/react-toast" +import { cva, type VariantProps } from "class-variance-authority" +import { X } from "lucide-react" + +import { cn } from "~/libs/utils" + +const ToastProvider = ToastPrimitives.Provider + +const ToastViewport = React.forwardRef< + React.ElementRef<typeof ToastPrimitives.Viewport>, + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport> +>(({ className, ...props }, ref) => ( + <ToastPrimitives.Viewport + ref={ref} + className={cn( + "fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]", + className + )} + {...props} + /> +)) +ToastViewport.displayName = ToastPrimitives.Viewport.displayName + +const toastVariants = cva( + "group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full", + { + variants: { + variant: { + default: "border bg-background text-foreground", + destructive: + "destructive group border-destructive bg-destructive text-destructive-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +const Toast = React.forwardRef< + React.ElementRef<typeof ToastPrimitives.Root>, + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> & + VariantProps<typeof toastVariants> +>(({ className, variant, ...props }, ref) => { + return ( + <ToastPrimitives.Root + ref={ref} + className={cn(toastVariants({ variant }), className)} + {...props} + /> + ) +}) +Toast.displayName = ToastPrimitives.Root.displayName + +const ToastAction = React.forwardRef< + React.ElementRef<typeof ToastPrimitives.Action>, + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action> +>(({ className, ...props }, ref) => ( + <ToastPrimitives.Action + ref={ref} + className={cn( + "inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive", + className + )} + {...props} + /> +)) +ToastAction.displayName = ToastPrimitives.Action.displayName + +const ToastClose = React.forwardRef< + React.ElementRef<typeof ToastPrimitives.Close>, + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close> +>(({ className, ...props }, ref) => ( + <ToastPrimitives.Close + ref={ref} + className={cn( + "absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600", + className + )} + toast-close="" + {...props} + > + <X className="h-4 w-4" /> + </ToastPrimitives.Close> +)) +ToastClose.displayName = ToastPrimitives.Close.displayName + +const ToastTitle = React.forwardRef< + React.ElementRef<typeof ToastPrimitives.Title>, + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title> +>(({ className, ...props }, ref) => ( + <ToastPrimitives.Title + ref={ref} + className={cn("text-sm font-semibold", className)} + {...props} + /> +)) +ToastTitle.displayName = ToastPrimitives.Title.displayName + +const ToastDescription = React.forwardRef< + React.ElementRef<typeof ToastPrimitives.Description>, + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description> +>(({ className, ...props }, ref) => ( + <ToastPrimitives.Description + ref={ref} + className={cn("text-sm opacity-90", className)} + {...props} + /> +)) +ToastDescription.displayName = ToastPrimitives.Description.displayName + +type ToastProps = React.ComponentPropsWithoutRef<typeof Toast> + +type ToastActionElement = React.ReactElement<typeof ToastAction> + +export { + type ToastProps, + type ToastActionElement, + ToastProvider, + ToastViewport, + Toast, + ToastTitle, + ToastDescription, + ToastClose, + ToastAction, +} diff --git a/packages/web/components/ui/toaster.tsx b/packages/web/components/ui/toaster.tsx new file mode 100644 index 0000000..8b67a2d --- /dev/null +++ b/packages/web/components/ui/toaster.tsx @@ -0,0 +1,35 @@ +"use client" + +import { + Toast, + ToastClose, + ToastDescription, + ToastProvider, + ToastTitle, + ToastViewport, +} from "~/components/ui/toast" +import { useToast } from "~/components/ui/use-toast" + +export function Toaster() { + const { toasts } = useToast() + + return ( + <ToastProvider> + {toasts.map(function ({ id, title, description, action, ...props }) { + return ( + <Toast key={id} {...props}> + <div className="grid gap-1"> + {title && <ToastTitle>{title}</ToastTitle>} + {description && ( + <ToastDescription>{description}</ToastDescription> + )} + </div> + {action} + <ToastClose /> + </Toast> + ) + })} + <ToastViewport /> + </ToastProvider> + ) +} diff --git a/packages/web/components/ui/use-toast.ts b/packages/web/components/ui/use-toast.ts new file mode 100644 index 0000000..b742263 --- /dev/null +++ b/packages/web/components/ui/use-toast.ts @@ -0,0 +1,192 @@ +// Inspired by react-hot-toast library +import * as React from "react" + +import type { + ToastActionElement, + ToastProps, +} from "~/components/ui/toast" + +const TOAST_LIMIT = 1 +const TOAST_REMOVE_DELAY = 1000000 + +type ToasterToast = ToastProps & { + id: string + title?: React.ReactNode + description?: React.ReactNode + action?: ToastActionElement +} + +const actionTypes = { + ADD_TOAST: "ADD_TOAST", + UPDATE_TOAST: "UPDATE_TOAST", + DISMISS_TOAST: "DISMISS_TOAST", + REMOVE_TOAST: "REMOVE_TOAST", +} as const + +let count = 0 + +function genId() { + count = (count + 1) % Number.MAX_VALUE + return count.toString() +} + +type ActionType = typeof actionTypes + +type Action = + | { + type: ActionType["ADD_TOAST"] + toast: ToasterToast + } + | { + type: ActionType["UPDATE_TOAST"] + toast: Partial<ToasterToast> + } + | { + type: ActionType["DISMISS_TOAST"] + toastId?: ToasterToast["id"] + } + | { + type: ActionType["REMOVE_TOAST"] + toastId?: ToasterToast["id"] + } + +interface State { + toasts: ToasterToast[] +} + +const toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>() + +const addToRemoveQueue = (toastId: string) => { + if (toastTimeouts.has(toastId)) { + return + } + + const timeout = setTimeout(() => { + toastTimeouts.delete(toastId) + dispatch({ + type: "REMOVE_TOAST", + toastId: toastId, + }) + }, TOAST_REMOVE_DELAY) + + toastTimeouts.set(toastId, timeout) +} + +export const reducer = (state: State, action: Action): State => { + switch (action.type) { + case "ADD_TOAST": + return { + ...state, + toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT), + } + + case "UPDATE_TOAST": + return { + ...state, + toasts: state.toasts.map((t) => + t.id === action.toast.id ? { ...t, ...action.toast } : t + ), + } + + case "DISMISS_TOAST": { + const { toastId } = action + + // ! Side effects ! - This could be extracted into a dismissToast() action, + // but I'll keep it here for simplicity + if (toastId) { + addToRemoveQueue(toastId) + } else { + state.toasts.forEach((toast) => { + addToRemoveQueue(toast.id) + }) + } + + return { + ...state, + toasts: state.toasts.map((t) => + t.id === toastId || toastId === undefined + ? { + ...t, + open: false, + } + : t + ), + } + } + case "REMOVE_TOAST": + if (action.toastId === undefined) { + return { + ...state, + toasts: [], + } + } + return { + ...state, + toasts: state.toasts.filter((t) => t.id !== action.toastId), + } + } +} + +const listeners: Array<(state: State) => void> = [] + +let memoryState: State = { toasts: [] } + +function dispatch(action: Action) { + memoryState = reducer(memoryState, action) + listeners.forEach((listener) => { + listener(memoryState) + }) +} + +type Toast = Omit<ToasterToast, "id"> + +function toast({ ...props }: Toast) { + const id = genId() + + const update = (props: ToasterToast) => + dispatch({ + type: "UPDATE_TOAST", + toast: { ...props, id }, + }) + const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id }) + + dispatch({ + type: "ADD_TOAST", + toast: { + ...props, + id, + open: true, + onOpenChange: (open) => { + if (!open) dismiss() + }, + }, + }) + + return { + id: id, + dismiss, + update, + } +} + +function useToast() { + const [state, setState] = React.useState<State>(memoryState) + + React.useEffect(() => { + listeners.push(setState) + return () => { + const index = listeners.indexOf(setState) + if (index > -1) { + listeners.splice(index, 1) + } + } + }, [state]) + + return { + ...state, + toast, + dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }), + } +} + +export { useToast, toast } diff --git a/packages/web/package.json b/packages/web/package.json index 75e8bc8..48cf7b8 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -8,13 +8,14 @@ "lint": "tsc && eslint . --fix" }, "dependencies": { - "@chakra-ui/next-js": "^2.1.4", + "@chakra-ui/next-js": "^2.1.5", "@chakra-ui/react": "^2.8.0", "@chakra-ui/theme-tools": "^2.1.0", "@chakra-ui/utils": "^2.0.14", "@egoist/tailwindcss-icons": "^1.1.0", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", + "@hookform/resolvers": "^3.3.0", "@iconify-json/ri": "^1.1.12", "@next-auth/prisma-adapter": "^1.0.7", "@nextui-org/react": "^2.1.5", @@ -24,10 +25,14 @@ "@ohbug/extension-uuid": "^2.1.1", "@ohbug/extension-view": "^0.1.1", "@ohbug/extension-web-vitals": "^0.2.1", + "@radix-ui/react-avatar": "^1.0.3", "@radix-ui/react-dropdown-menu": "^2.0.5", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-select": "^1.2.2", + "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-toast": "^1.1.4", "@tanstack/react-table": "^8.9.3", - "@types/node": "^20.5.4", "@types/nprogress": "^0.2.0", "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", @@ -42,7 +47,7 @@ "highcharts": "^11.1.0", "highcharts-react-official": "^3.2.0", "jotai": "^2.4.0", - "lucide-react": "^0.268.0", + "lucide-react": "^0.269.0", "next": "^13.4.19", "next-auth": "^4.23.1", "next-intl": "^2.20.0", @@ -62,6 +67,7 @@ "tailwindcss-animate": "^1.0.6", "ua-parser-js": "^1.0.35", "web-vitals": "^3.4.0", + "zod": "^3.22.2", "zustand": "^4.4.1" }, "devDependencies": { diff --git a/packages/web/styles/globals.css b/packages/web/styles/globals.css index b5c61c9..67a2820 100644 --- a/packages/web/styles/globals.css +++ b/packages/web/styles/globals.css @@ -1,3 +1,85 @@ @tailwind base; @tailwind components; @tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 47.4% 11.2%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + + --card: 0 0% 100%; + --card-foreground: 222.2 47.4% 11.2%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 100% 50%; + --destructive-foreground: 210 40% 98%; + + --ring: 215 20.2% 65.1%; + + --radius: 0.5rem; + } + + .dark { + --background: 224 71% 4%; + --foreground: 213 31% 91%; + + --muted: 223 47% 11%; + --muted-foreground: 215.4 16.3% 56.9%; + + --accent: 216 34% 17%; + --accent-foreground: 210 40% 98%; + + --popover: 224 71% 4%; + --popover-foreground: 215 20.2% 65.1%; + + --border: 216 34% 17%; + --input: 216 34% 17%; + + --card: 224 71% 4%; + --card-foreground: 213 31% 91%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 1.2%; + + --secondary: 222.2 47.4% 11.2%; + --secondary-foreground: 210 40% 98%; + + --destructive: 0 63% 31%; + --destructive-foreground: 210 40% 98%; + + --ring: 216 34% 17%; + + --radius: 0.5rem; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + font-feature-settings: "rlig" 1, "calt" 1; + } + i { + width: 1.2em !important; + height: 1.2em !important; + } +} diff --git a/packages/web/tailwind.config.js b/packages/web/tailwind.config.js index cdfb0db..f0613ef 100644 --- a/packages/web/tailwind.config.js +++ b/packages/web/tailwind.config.js @@ -4,10 +4,8 @@ const { iconsPlugin, getIconCollections } = require('@egoist/tailwindcss-icons') module.exports = { darkMode: ['class'], content: [ - './pages/**/*.{ts,tsx}', './components/**/*.{ts,tsx}', './app/**/*.{ts,tsx}', - './src/**/*.{ts,tsx}', ], theme: { container: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e8083bd..0c8b9d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,47 +46,47 @@ importers: specifier: ^0.21.6 version: 0.21.6 '@babel/types': - specifier: ^7.22.10 - version: 7.22.10 + specifier: ^7.22.11 + version: 7.22.11 '@chenyueban/eslint-config': specifier: ^3.0.5 - version: 3.0.5(eslint@8.47.0)(typescript@5.1.6) + version: 3.0.5(eslint@8.48.0)(typescript@5.2.2) '@chenyueban/tsconfig': specifier: ^3.0.5 - version: 3.0.5(typescript@5.1.6) + version: 3.0.5(typescript@5.2.2) '@commitlint/cli': specifier: ^17.7.1 - version: 17.7.1(@swc/core@1.3.78) + version: 17.7.1(@swc/core@1.3.80) '@release-it/conventional-changelog': specifier: ^7.0.0 version: 7.0.0(release-it@16.1.5) '@swc/cli': specifier: ^0.1.62 - version: 0.1.62(@swc/core@1.3.78) + version: 0.1.62(@swc/core@1.3.80) '@swc/core': - specifier: ^1.3.78 - version: 1.3.78 + specifier: ^1.3.80 + version: 1.3.80 '@types/js-yaml': specifier: ^4.0.5 version: 4.0.5 '@types/node': - specifier: ^20.5.4 - version: 20.5.4 + specifier: ^20.5.6 + version: 20.5.6 '@types/ramda': specifier: ^0.29.3 version: 0.29.3 commitizen: specifier: ^4.3.0 - version: 4.3.0(@swc/core@1.3.78) + version: 4.3.0(@swc/core@1.3.80) cross-env: specifier: ^7.0.3 version: 7.0.3 cz-conventional-changelog: specifier: ^3.3.0 - version: 3.3.0(@swc/core@1.3.78) + version: 3.3.0(@swc/core@1.3.80) eslint: - specifier: ^8.47.0 - version: 8.47.0 + specifier: ^8.48.0 + version: 8.48.0 husky: specifier: ^8.0.3 version: 8.0.3 @@ -107,13 +107,13 @@ importers: version: 0.11.2 tsup: specifier: ^7.2.0 - version: 7.2.0(@swc/core@1.3.78)(ts-node@10.9.1)(typescript@5.1.6) + version: 7.2.0(@swc/core@1.3.80)(ts-node@10.9.1)(typescript@5.2.2) tsx: specifier: ^3.12.7 version: 3.12.7 typescript: - specifier: ^5.1.6 - version: 5.1.6 + specifier: ^5.2.2 + version: 5.2.2 packages/common: dependencies: @@ -136,8 +136,8 @@ importers: specifier: ^10.0.1 version: 10.0.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(bull@4.11.3) '@nestjs/cli': - specifier: ^10.1.14 - version: 10.1.14(@swc/cli@0.1.62)(@swc/core@1.3.78)(esbuild@0.18.19) + specifier: ^10.1.16 + version: 10.1.16(@swc/cli@0.1.62)(@swc/core@1.3.80)(esbuild@0.18.19) '@nestjs/common': specifier: ^10.2.1 version: 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) @@ -155,7 +155,7 @@ importers: version: 3.0.3(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(reflect-metadata@0.1.13) '@nestjs/schematics': specifier: ^10.0.2 - version: 10.0.2(chokidar@3.5.3)(typescript@5.1.6) + version: 10.0.2(typescript@5.2.2) '@nestjs/swagger': specifier: ^7.1.8 version: 7.1.8(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) @@ -192,6 +192,9 @@ importers: config: specifier: workspace:* version: link:../config + cron: + specifier: ^2.4.1 + version: 2.4.1 dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -228,16 +231,16 @@ importers: version: 0.5.21 ts-loader: specifier: ^9.4.4 - version: 9.4.4(typescript@5.1.6)(webpack@5.88.2) + version: 9.4.4(typescript@5.2.2)(webpack@5.88.2) ts-node: specifier: ^10.9.1 - version: 10.9.1(@swc/core@1.3.78)(@types/node@20.5.4)(typescript@5.1.6) + version: 10.9.1(@swc/core@1.3.80)(@types/node@20.5.6)(typescript@5.2.2) packages/web: dependencies: '@chakra-ui/next-js': - specifier: ^2.1.4 - version: 2.1.4(@chakra-ui/react@2.8.0)(@emotion/react@11.11.1)(next@13.4.19)(react@18.2.0) + specifier: ^2.1.5 + version: 2.1.5(@chakra-ui/react@2.8.0)(@emotion/react@11.11.1)(next@13.4.19)(react@18.2.0) '@chakra-ui/react': specifier: ^2.8.0 version: 2.8.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0) @@ -256,6 +259,9 @@ importers: '@emotion/styled': specifier: ^11.11.0 version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.21)(react@18.2.0) + '@hookform/resolvers': + specifier: ^3.3.0 + version: 3.3.0(react-hook-form@7.45.4) '@iconify-json/ri': specifier: ^1.1.12 version: 1.1.12 @@ -283,18 +289,30 @@ importers: '@ohbug/extension-web-vitals': specifier: ^0.2.1 version: 0.2.1(web-vitals@3.4.0) + '@radix-ui/react-avatar': + specifier: ^1.0.3 + version: 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-dropdown-menu': specifier: ^2.0.5 version: 2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-label': + specifier: ^2.0.2 + version: 2.0.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-select': + specifier: ^1.2.2 + version: 1.2.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-separator': + specifier: ^1.0.3 + version: 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-slot': specifier: ^1.0.2 version: 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-toast': + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-table': specifier: ^8.9.3 version: 8.9.3(react-dom@18.2.0)(react@18.2.0) - '@types/node': - specifier: ^20.5.4 - version: 20.5.4 '@types/nprogress': specifier: ^0.2.0 version: 0.2.0 @@ -338,8 +356,8 @@ importers: specifier: ^2.4.0 version: 2.4.0(@types/react@18.2.21)(react@18.2.0) lucide-react: - specifier: ^0.268.0 - version: 0.268.0(react@18.2.0) + specifier: ^0.269.0 + version: 0.269.0(react@18.2.0) next: specifier: ^13.4.19 version: 13.4.19(react-dom@18.2.0)(react@18.2.0) @@ -397,6 +415,9 @@ importers: web-vitals: specifier: ^3.4.0 version: 3.4.0 + zod: + specifier: ^3.22.2 + version: 3.22.2 zustand: specifier: ^4.4.1 version: 4.4.1(@types/react@18.2.21)(react@18.2.0) @@ -516,7 +537,7 @@ packages: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.22.11 dev: false /@babel/helper-string-parser@7.22.5: @@ -540,7 +561,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.22.11 dev: false /@babel/runtime@7.22.6: @@ -550,8 +571,8 @@ packages: regenerator-runtime: 0.13.11 dev: false - /@babel/types@7.22.10: - resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} + /@babel/types@7.22.11: + resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.22.5 @@ -943,8 +964,8 @@ packages: - '@types/react' dev: false - /@chakra-ui/next-js@2.1.4(@chakra-ui/react@2.8.0)(@emotion/react@11.11.1)(next@13.4.19)(react@18.2.0): - resolution: {integrity: sha512-qPmpZSA6ONozcD8gC8fyuEPqweZqk1Y4ar/hbfUDLMdCCRsU+aigN6ay2HBBn3kPzzMOE6BUlkgvij8uB8smxQ==} + /@chakra-ui/next-js@2.1.5(@chakra-ui/react@2.8.0)(@emotion/react@11.11.1)(next@13.4.19)(react@18.2.0): + resolution: {integrity: sha512-bBd8zeXlAuVwDsjGN0/5ZZJknSbFeiZgJiGdbJo91v2lxKkOwo26b4ggc1ck1t+JR+daU6SrGBjlbQqSuWzyaA==} peerDependencies: '@chakra-ui/react': '>=2.4.0' '@emotion/react': '>=11' @@ -1669,32 +1690,32 @@ packages: react: 18.2.0 dev: false - /@chenyueban/eslint-config@3.0.5(eslint@8.47.0)(typescript@5.1.6): + /@chenyueban/eslint-config@3.0.5(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-whFg8PUas0gBw6wF+bO2l7YhWuGMoaA19MKPGxlgWRTJ5GlmIeo1Qa58swy6tewCBKScpUyatwgXl04PWVn/Cw==} engines: {node: '>=16', npm: '>=7'} peerDependencies: eslint: ^8.0.0 dependencies: '@eslint/js': 8.47.0 - '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.1.6) - '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.1.6) - eslint: 8.47.0 + '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.4.1(eslint@8.48.0)(typescript@5.2.2) + eslint: 8.48.0 eslint-define-config: 1.23.0 - eslint-plugin-antfu: 0.40.3(eslint@8.47.0)(typescript@5.1.6) - eslint-plugin-eslint-comments: 3.2.0(eslint@8.47.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0) - eslint-plugin-jsonc: 2.9.0(eslint@8.47.0) - eslint-plugin-markdown: 3.0.1(eslint@8.47.0) - eslint-plugin-react: 7.33.2(eslint@8.47.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.47.0) - eslint-plugin-unicorn: 48.0.1(eslint@8.47.0) - eslint-plugin-unused-imports: 3.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0) - eslint-plugin-vue: 9.17.0(eslint@8.47.0) - eslint-plugin-yml: 1.8.0(eslint@8.47.0) + eslint-plugin-antfu: 0.40.3(eslint@8.48.0)(typescript@5.2.2) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.48.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.48.0) + eslint-plugin-jsonc: 2.9.0(eslint@8.48.0) + eslint-plugin-markdown: 3.0.1(eslint@8.48.0) + eslint-plugin-react: 7.33.2(eslint@8.48.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.48.0) + eslint-plugin-unicorn: 48.0.1(eslint@8.48.0) + eslint-plugin-unused-imports: 3.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.48.0) + eslint-plugin-vue: 9.17.0(eslint@8.48.0) + eslint-plugin-yml: 1.8.0(eslint@8.48.0) globals: 13.21.0 jsonc-eslint-parser: 2.3.0 local-pkg: 0.4.3 - vue-eslint-parser: 9.3.1(eslint@8.47.0) + vue-eslint-parser: 9.3.1(eslint@8.48.0) yaml-eslint-parser: 1.2.2 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -1703,13 +1724,13 @@ packages: - typescript dev: true - /@chenyueban/tsconfig@3.0.5(typescript@5.1.6): + /@chenyueban/tsconfig@3.0.5(typescript@5.2.2): resolution: {integrity: sha512-6MfWp0G3XWJwgpx6OIm62JM3S4kaIYehxdUEn+UX1zXbvny1Zmj8j4jq5holO5aGsrkodw5nGBFlGAQ9Hu79AQ==} engines: {node: '>=16', npm: '>=7'} peerDependencies: typescript: ^4.4.2 dependencies: - typescript: 5.1.6 + typescript: 5.2.2 dev: true /@colors/colors@1.5.0: @@ -1719,14 +1740,14 @@ packages: dev: false optional: true - /@commitlint/cli@17.7.1(@swc/core@1.3.78): + /@commitlint/cli@17.7.1(@swc/core@1.3.80): resolution: {integrity: sha512-BCm/AT06SNCQtvFv921iNhudOHuY16LswT0R3OeolVGLk8oP+Rk9TfQfgjH7QPMjhvp76bNqGFEcpKojxUNW1g==} engines: {node: '>=v14'} hasBin: true dependencies: '@commitlint/format': 17.4.4 '@commitlint/lint': 17.7.0 - '@commitlint/load': 17.7.1(@swc/core@1.3.78) + '@commitlint/load': 17.7.1(@swc/core@1.3.80) '@commitlint/read': 17.5.1 '@commitlint/types': 17.4.4 execa: 5.1.1 @@ -1742,6 +1763,7 @@ packages: /@commitlint/config-validator@17.6.7: resolution: {integrity: sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==} engines: {node: '>=v14'} + requiresBuild: true dependencies: '@commitlint/types': 17.4.4 ajv: 8.12.0 @@ -1762,6 +1784,7 @@ packages: /@commitlint/execute-rule@17.4.0: resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} engines: {node: '>=v14'} + requiresBuild: true dev: true /@commitlint/format@17.4.4: @@ -1790,32 +1813,7 @@ packages: '@commitlint/types': 17.4.4 dev: true - /@commitlint/load@17.6.7(@swc/core@1.3.78): - resolution: {integrity: sha512-QZ2rJTbX55BQdYrCm/p6+hh/pFBgC9nTJxfsrK6xRPe2thiQzHN0AQDBqBwAirn6gIkHrjIbCbtAE6kiDYLjrw==} - engines: {node: '>=v14'} - requiresBuild: true - dependencies: - '@commitlint/config-validator': 17.6.7 - '@commitlint/execute-rule': 17.4.0 - '@commitlint/resolve-extends': 17.6.7 - '@commitlint/types': 17.4.4 - '@types/node': 20.5.4 - chalk: 4.1.2 - cosmiconfig: 8.2.0 - cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.4)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - resolve-from: 5.0.0 - ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@20.5.4)(typescript@5.1.6) - typescript: 5.1.6 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - dev: true - optional: true - - /@commitlint/load@17.7.1(@swc/core@1.3.78): + /@commitlint/load@17.7.1(@swc/core@1.3.80): resolution: {integrity: sha512-S/QSOjE1ztdogYj61p6n3UbkUvweR17FQ0zDbNtoTLc+Hz7vvfS7ehoTMQ27hPSjVBpp7SzEcOQu081RLjKHJQ==} engines: {node: '>=v14'} dependencies: @@ -1826,13 +1824,13 @@ packages: '@types/node': 20.4.7 chalk: 4.1.2 cosmiconfig: 8.2.0 - cosmiconfig-typescript-loader: 4.4.0(@types/node@20.4.7)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6) + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.4.7)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.2.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@20.4.7)(typescript@5.1.6) - typescript: 5.1.6 + ts-node: 10.9.1(@swc/core@1.3.80)(@types/node@20.5.6)(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -1866,6 +1864,7 @@ packages: /@commitlint/resolve-extends@17.6.7: resolution: {integrity: sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==} engines: {node: '>=v14'} + requiresBuild: true dependencies: '@commitlint/config-validator': 17.6.7 '@commitlint/types': 17.4.4 @@ -2447,13 +2446,13 @@ packages: requiresBuild: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.47.0 + eslint: 8.48.0 eslint-visitor-keys: 3.4.3 dev: true @@ -2469,7 +2468,7 @@ packages: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.20.0 + globals: 13.21.0 ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -2484,6 +2483,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@eslint/js@8.48.0: + resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@fastify/ajv-compiler@3.5.0: resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} dependencies: @@ -2638,6 +2642,14 @@ packages: tslib: 2.6.1 dev: false + /@hookform/resolvers@3.3.0(react-hook-form@7.45.4): + resolution: {integrity: sha512-tgK3nWlfFLlqhqpXZmFMP3RN5E7mlbGfnM2h2ILVsW1TNGuFSod0ePW0grlIY2GAbL4pJdtmOT4HQSZsTwOiKg==} + peerDependencies: + react-hook-form: ^7.0.0 + dependencies: + react-hook-form: 7.45.4(react@18.2.0) + dev: false + /@humanwhocodes/config-array@0.11.10: resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} engines: {node: '>=10.10.0'} @@ -2885,8 +2897,8 @@ packages: tslib: 2.6.0 dev: false - /@nestjs/cli@10.1.14(@swc/cli@0.1.62)(@swc/core@1.3.78)(esbuild@0.18.19): - resolution: {integrity: sha512-oxfoebzrq6g+MKc6FRx2O8D86Vk0ViEmlP4B1E3dzwC3X5yjxlA1IDulLrVz3VIpGjuyuXmrQjjd8l0NUVZiKg==} + /@nestjs/cli@10.1.16(@swc/cli@0.1.62)(@swc/core@1.3.80)(esbuild@0.18.19): + resolution: {integrity: sha512-nZ9vs7D0BMOW9XrN7hN7BJl2Z0s+CRFwhDPVmJP2lc50mDsAcnWDLFuttupPc/AknO570Xqoxf1Q2cQ5YSgjpA==} engines: {node: '>= 16'} hasBin: true peerDependencies: @@ -2902,8 +2914,8 @@ packages: '@angular-devkit/schematics': 16.2.0(chokidar@3.5.3) '@angular-devkit/schematics-cli': 16.2.0(chokidar@3.5.3) '@nestjs/schematics': 10.0.2(chokidar@3.5.3)(typescript@5.1.6) - '@swc/cli': 0.1.62(@swc/core@1.3.78) - '@swc/core': 1.3.78 + '@swc/cli': 0.1.62(@swc/core@1.3.80) + '@swc/core': 1.3.80 chalk: 4.1.2 chokidar: 3.5.3 cli-table3: 0.6.3 @@ -2920,7 +2932,7 @@ packages: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.1.6 - webpack: 5.88.2(@swc/core@1.3.78)(esbuild@0.18.19) + webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.18.19) webpack-node-externals: 3.0.0 transitivePeerDependencies: - esbuild @@ -3055,6 +3067,21 @@ packages: - chokidar dev: false + /@nestjs/schematics@10.0.2(typescript@5.2.2): + resolution: {integrity: sha512-DaZZjymYoIfRqC5W62lnYXIIods1PDY6CGc8+IpRwyinzffjKxZ3DF3exu+mdyvllzkXo9DTXkoX4zOPSJHCkw==} + peerDependencies: + typescript: '>=4.8.2' + dependencies: + '@angular-devkit/core': 16.1.8(chokidar@3.5.3) + '@angular-devkit/schematics': 16.1.8(chokidar@3.5.3) + comment-json: 4.2.3 + jsonc-parser: 3.2.0 + pluralize: 8.0.0 + typescript: 5.2.2 + transitivePeerDependencies: + - chokidar + dev: false + /@nestjs/swagger@7.1.8(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): resolution: {integrity: sha512-Jpl3laGAqvyWccc3auLU0mMjl5hJ2kqzzDb63ynJi5NMbFlgBwrR8FCGBVstSsqL9YSJWLR4L1BZzVmVExcY+g==} peerDependencies: @@ -4585,7 +4612,7 @@ packages: resolution: {integrity: sha512-eAhFr8c+7Q6MtxvkwgEGAg91XZXoZzASIsUzoGQAqt/hlMIPHlsN9CO2Lxr012jBU/I/pnQteopq+sQbZQjKIA==} dependencies: '@ohbug/types': 2.2.1 - '@types/node': 20.5.4 + '@types/node': 20.5.6 dev: false /@ohbug/vue@2.0.10(vue@3.3.4): @@ -4656,6 +4683,12 @@ packages: resolution: {integrity: sha512-dT7FOLUCdZmq+AunLqB1Iz+ZH/IIS1Fz2THmKZQ6aFONrQD/BQ5ecJ7g2wGS2OgyUFf4OaLam6/bxmgdOBDqig==} requiresBuild: true + /@radix-ui/number@1.0.1: + resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} + dependencies: + '@babel/runtime': 7.22.6 + dev: false + /@radix-ui/primitive@1.0.1: resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: @@ -4683,6 +4716,30 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-avatar@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9ToF7YNex3Ste45LrAeTlKtONI9yVRt/zOS158iilIkW5K/Apeyb/TUQlcEFTEFvWr8Kzdi2ZYrm1/suiXPajQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: @@ -4853,6 +4910,27 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-menu@2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Gw4f9pwdH+w5w+49k0gLjN0PfRDHvxmAgG16AbyJZ7zhwZ6PBHKtWohvnSwfusfnK3L68dpBREHpVkj8wEM7ZA==} peerDependencies: @@ -5014,6 +5092,68 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-select@1.2.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) + dev: false + + /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-slot@1.0.2(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: @@ -5029,6 +5169,38 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-toast@1.1.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wf+fc8DOywrpRK3jlPlWVe+ELYGHdKDaaARJZNuUTWyWYq7+ANCFLp4rTjZ/mcGkJJQ/vZ949Zis9xxEpfq9OA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: @@ -5087,6 +5259,20 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} peerDependencies: @@ -5117,6 +5303,27 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/rect@1.0.1: resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} dependencies: @@ -6107,7 +6314,7 @@ packages: engines: {node: '>=14.16'} dev: true - /@swc/cli@0.1.62(@swc/core@1.3.78): + /@swc/cli@0.1.62(@swc/core@1.3.80): resolution: {integrity: sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==} engines: {node: '>= 12.13'} hasBin: true @@ -6119,95 +6326,95 @@ packages: optional: true dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.3.78 + '@swc/core': 1.3.80 commander: 7.2.0 fast-glob: 3.3.1 semver: 7.5.4 slash: 3.0.0 source-map: 0.7.4 - /@swc/core-darwin-arm64@1.3.78: - resolution: {integrity: sha512-596KRua/d5Gx1buHKKchSyHuwoIL4S1BRD/wCvYNLNZ3xOzcuBBmXOjrDVigKi1ztNDeS07p30RO5UyYur0XAA==} + /@swc/core-darwin-arm64@1.3.80: + resolution: {integrity: sha512-rhoFTcQMUGfO7IkfOnopPSF6O0/aVJ58B7KueIKbvrMe6YvSfFj9QfObELFjYCcrJZTvUWBhig0QrsfPIiUphA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@swc/core-darwin-x64@1.3.78: - resolution: {integrity: sha512-w0RsD1onQAj0vuLAoOVi48HgnW6D6oBEIZP17l0HYejCDBZ+FRZLjml7wgNAWMqHcd2qNRqgtZ+v7aLza2JtBQ==} + /@swc/core-darwin-x64@1.3.80: + resolution: {integrity: sha512-0dOLedFpVXe+ugkKHXsqSxMKqvQYfFtibWbrZ7j8wOaErzSGPr0VpyWvepNVb9s046725kPXSw+fsGhqZR8wrw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.78: - resolution: {integrity: sha512-v1CpRn+H6fha1WIqmdRvJM40pFdjUHrGfhf4Ygci72nlAU41l5XimN8Iwkm8FgIwf2wnv0lLzedSM4IHvpq/yA==} + /@swc/core-linux-arm-gnueabihf@1.3.80: + resolution: {integrity: sha512-QIjwP3PtDeHBDkwF6+ZZqdUsqAhORbMpxrw2jq3mHe4lQrxBttSFTq018vlMRo2mFEorOvXdadzaD9m+NymPrw==} engines: {node: '>=10'} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-gnu@1.3.78: - resolution: {integrity: sha512-Sis17dz9joJRFVvR/gteOZSUNrrrioo81RQzani0Zr5ZZOfWLMTB9DA+0MVlfnVa2taYcsJHJZFoAv9JkLwbzg==} + /@swc/core-linux-arm64-gnu@1.3.80: + resolution: {integrity: sha512-cg8WriIueab58ZwkzXmIACnjSzFLzOBwxlC9k65gPXMNgCjab2YbqEYvAbjBqneuqaao02gW6tad2uhjgYaExw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-musl@1.3.78: - resolution: {integrity: sha512-E5F8/qp+QupnfBnsP4vN1PKyCmAHYHDG1GMyPE/zLFOUYLgw+jK4C9rfyLBR0o2bWo1ay2WCIjusBZD9XHGOSA==} + /@swc/core-linux-arm64-musl@1.3.80: + resolution: {integrity: sha512-AhdCQ7QKx5mWrtpaOA1mFRiWWvuiiUtspvo0QSpspDetRKTND1rlf/3UB5+gp0kCeCNUTsVmJWU7fIA9ICZtXA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-gnu@1.3.78: - resolution: {integrity: sha512-iDxa+RknnTQlyy+WfPor1FM6y44ERNI2E0xiUV6gV6uPwegCngi8LFC+E7IvP6+p+yXtAkesunAaiZ8nn0s+rw==} + /@swc/core-linux-x64-gnu@1.3.80: + resolution: {integrity: sha512-+2e5oni1vOrLIjM5Q2/GIzK/uS2YEtuJqnjPvCK8SciRJsSl8OgVsRvyCDbmKeZNtJ2Q+o/O2AQ2w1qpAJG6jg==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-musl@1.3.78: - resolution: {integrity: sha512-dWtIYUFL5sMTE2UKshkXTusHcK8+zAhhGzvqWq1wJS45pqTlrAbzpyqB780fle880x3A6DMitWmsAFARdNzpuQ==} + /@swc/core-linux-x64-musl@1.3.80: + resolution: {integrity: sha512-8OK9IlI1zpWOm7vIp1iXmZSEzLAwFpqhsGSEhxPavpOx2m54kLFdPcw/Uv3n461f6TCtszIxkGq1kSqBUdfUBA==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-win32-arm64-msvc@1.3.78: - resolution: {integrity: sha512-CXFaGEc2M9Su3UoUMC8AnzKb9g+GwPxXfakLWZsjwS448h6jcreExq3nwtBNdVGzQ26xqeVLMFfb1l/oK99Hwg==} + /@swc/core-win32-arm64-msvc@1.3.80: + resolution: {integrity: sha512-RKhatwiAGlffnF6z2Mm3Ddid0v3KB+uf5m/Gc7N9zO/EUAV0PnHRuYuZSGyqodHmGFC+mK8YrCooFCEmHL9n+w==} engines: {node: '>=10'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-ia32-msvc@1.3.78: - resolution: {integrity: sha512-FaH1jwWnJpWkdImpMoiZpMg9oy9UUyZwltzN7hFwjR48e3Li82cRFb+9PifIBHCUSBM+CrrsJXbHP213IMVAyw==} + /@swc/core-win32-ia32-msvc@1.3.80: + resolution: {integrity: sha512-3jiiZzU/kaw7k4zUp1yMq1QiUe4wJVtCEXIhf+fKuBsIwm7rdvyK/+PIx5KHnZy4TGQnYczKBRhJA5nuBcrUCQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-x64-msvc@1.3.78: - resolution: {integrity: sha512-oYxa+tPdhlx1aH14AIoF6kvVjo49tEOW0drNqoEaVHufvgH0y43QU2Jum3b2+xXztmMRtzK2CSN3GPOAXDKKKg==} + /@swc/core-win32-x64-msvc@1.3.80: + resolution: {integrity: sha512-2eZtIoIWQBWqykfms92Zd37lveYOBWQTZjdooBGlsLHtcoQLkNpf1NXmR6TKY0yy8q6Yl3OhPvY+izjmO08MSg==} engines: {node: '>=10'} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@swc/core@1.3.78: - resolution: {integrity: sha512-y6DQP571v7fbUUY7nz5G4lNIRGofuO48K5pGhD9VnuOCTuptfooCdi8wnigIrIhM/M4zQ53m/YCMDCbOtDgEww==} + /@swc/core@1.3.80: + resolution: {integrity: sha512-yX2xV5I/lYswHHR+44TPvzBgq3/Y8N1YWpTQADYuvSiX3Jxyvemk5Jpx3rRtigYb8WBkWAAf2i5d5ZJ2M7hhgw==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -6215,17 +6422,19 @@ packages: peerDependenciesMeta: '@swc/helpers': optional: true + dependencies: + '@swc/types': 0.1.4 optionalDependencies: - '@swc/core-darwin-arm64': 1.3.78 - '@swc/core-darwin-x64': 1.3.78 - '@swc/core-linux-arm-gnueabihf': 1.3.78 - '@swc/core-linux-arm64-gnu': 1.3.78 - '@swc/core-linux-arm64-musl': 1.3.78 - '@swc/core-linux-x64-gnu': 1.3.78 - '@swc/core-linux-x64-musl': 1.3.78 - '@swc/core-win32-arm64-msvc': 1.3.78 - '@swc/core-win32-ia32-msvc': 1.3.78 - '@swc/core-win32-x64-msvc': 1.3.78 + '@swc/core-darwin-arm64': 1.3.80 + '@swc/core-darwin-x64': 1.3.80 + '@swc/core-linux-arm-gnueabihf': 1.3.80 + '@swc/core-linux-arm64-gnu': 1.3.80 + '@swc/core-linux-arm64-musl': 1.3.80 + '@swc/core-linux-x64-gnu': 1.3.80 + '@swc/core-linux-x64-musl': 1.3.80 + '@swc/core-win32-arm64-msvc': 1.3.80 + '@swc/core-win32-ia32-msvc': 1.3.80 + '@swc/core-win32-x64-msvc': 1.3.80 /@swc/helpers@0.4.14: resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} @@ -6246,6 +6455,9 @@ packages: tslib: 2.6.1 dev: false + /@swc/types@0.1.4: + resolution: {integrity: sha512-z/G02d+59gyyUb7KYhKi9jOhicek6QD2oMaotUyG+lUkybpXoV49dY9bj7Ah5Q+y7knK2jU67UTX9FyfGzaxQg==} + /@szmarczak/http-timer@4.0.6: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} @@ -6321,7 +6533,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.5.4 + '@types/node': 20.5.6 dev: false /@types/bull@4.10.0: @@ -6338,7 +6550,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 20.5.4 + '@types/node': 20.5.6 '@types/responselike': 1.0.0 /@types/color-convert@2.0.0: @@ -6360,14 +6572,14 @@ packages: /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.5.4 + '@types/node': 20.5.6 dev: false /@types/cron@2.4.0: resolution: {integrity: sha512-5bBaAkqvSFBX8JMi/xCofNzG5E594TNsApMz68dLd/sQYz/HGQqgcxGHTRjOvD4G3Y+YF1Oo3S7QdCvKt1KAJQ==} deprecated: This is a stub types definition. cron provides its own type definitions, so you do not need this installed. dependencies: - cron: 2.4.0 + cron: 2.4.1 dev: false /@types/crypto-js@4.1.1: @@ -6396,7 +6608,7 @@ packages: /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 20.5.4 + '@types/node': 20.5.6 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -6440,7 +6652,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.5.4 + '@types/node': 20.5.6 /@types/linkify-it@3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} @@ -6523,14 +6735,15 @@ packages: /@types/node@20.4.7: resolution: {integrity: sha512-bUBrPjEry2QUTsnuEjzjbS7voGWCc30W0qzgMf90GPeDGFRakvrz47ju+oqDAKCXLUCe39u57/ORMl/O/04/9g==} + requiresBuild: true dev: true /@types/node@20.4.8: resolution: {integrity: sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg==} dev: false - /@types/node@20.5.4: - resolution: {integrity: sha512-Y9vbIAoM31djQZrPYjpTLo0XlaSwOIsrlfE3LpulZeRblttsLQRFRlBAppW0LOxyT3ALj2M5vU1ucQQayQH3jA==} + /@types/node@20.5.6: + resolution: {integrity: sha512-Gi5wRGPbbyOTX+4Y2iULQ27oUPrefaB0PxGQJnfyWN3kvEDGM3mIB5M/gQLmitZf7A9FmLeaqxD3L1CXpm3VKQ==} /@types/nodemailer@6.4.9: resolution: {integrity: sha512-XYG8Gv+sHjaOtUpiuytahMy2mM3rectgroNbs6R3djZEKmPNiIJwe9KqOJBGzKKnNZNKvnuvmugBgpq3w/S0ig==} @@ -6585,7 +6798,7 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.5.4 + '@types/node': 20.5.6 /@types/scheduler@0.16.3: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} @@ -6599,7 +6812,7 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.5.4 + '@types/node': 20.5.6 dev: false /@types/serve-static@1.15.2: @@ -6607,7 +6820,7 @@ packages: dependencies: '@types/http-errors': 2.0.1 '@types/mime': 3.0.1 - '@types/node': 20.5.4 + '@types/node': 20.5.6 dev: false /@types/ua-parser-js@0.7.36: @@ -6622,7 +6835,7 @@ packages: resolution: {integrity: sha512-NclP0IbzHj/4tJZKFqKh8E7kZdgss+MCUYV9G+TLltFfDA4lFgE4PKPpDIyS2FlcdANIfSx273emkupvChigbw==} dev: false - /@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.1.6): + /@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -6634,24 +6847,24 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.4.1(eslint@8.48.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 6.4.1 - '@typescript-eslint/type-utils': 6.4.1(eslint@8.47.0)(typescript@5.1.6) - '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/type-utils': 6.4.1(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.4.1(eslint@8.48.0)(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.4.1 debug: 4.3.4 - eslint: 8.47.0 + eslint: 8.48.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.1.6) - typescript: 5.1.6 + ts-api-utils: 1.0.1(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.4.1(eslint@8.47.0)(typescript@5.1.6): + /@typescript-eslint/parser@6.4.1(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -6663,11 +6876,11 @@ packages: dependencies: '@typescript-eslint/scope-manager': 6.4.1 '@typescript-eslint/types': 6.4.1 - '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.4.1 debug: 4.3.4 - eslint: 8.47.0 - typescript: 5.1.6 + eslint: 8.48.0 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true @@ -6680,7 +6893,7 @@ packages: '@typescript-eslint/visitor-keys': 6.4.1 dev: true - /@typescript-eslint/type-utils@6.4.1(eslint@8.47.0)(typescript@5.1.6): + /@typescript-eslint/type-utils@6.4.1(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -6690,12 +6903,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.1.6) - '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2) + '@typescript-eslint/utils': 6.4.1(eslint@8.48.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.47.0 - ts-api-utils: 1.0.1(typescript@5.1.6) - typescript: 5.1.6 + eslint: 8.48.0 + ts-api-utils: 1.0.1(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true @@ -6705,7 +6918,7 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.4.1(typescript@5.1.6): + /@typescript-eslint/typescript-estree@6.4.1(typescript@5.2.2): resolution: {integrity: sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -6720,25 +6933,25 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.1.6) - typescript: 5.1.6 + ts-api-utils: 1.0.1(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@6.4.1(eslint@8.47.0)(typescript@5.1.6): + /@typescript-eslint/utils@6.4.1(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 6.4.1 '@typescript-eslint/types': 6.4.1 - '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.1.6) - eslint: 8.47.0 + '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2) + eslint: 8.48.0 semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -7932,13 +8145,13 @@ packages: repeat-string: 1.6.1 dev: false - /commitizen@4.3.0(@swc/core@1.3.78): + /commitizen@4.3.0(@swc/core@1.3.80): resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(@swc/core@1.3.78) + cz-conventional-changelog: 3.3.0(@swc/core@1.3.80) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -8178,9 +8391,10 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - /cosmiconfig-typescript-loader@4.4.0(@types/node@20.4.7)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6): + /cosmiconfig-typescript-loader@4.4.0(@types/node@20.4.7)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.2.2): resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} engines: {node: '>=v14.21.3'} + requiresBuild: true peerDependencies: '@types/node': '*' cosmiconfig: '>=7' @@ -8189,25 +8403,9 @@ packages: dependencies: '@types/node': 20.4.7 cosmiconfig: 8.2.0 - ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@20.4.7)(typescript@5.1.6) - typescript: 5.1.6 - dev: true - - /cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.4)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6): - resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} - engines: {node: '>=v14.21.3'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=7' - ts-node: '>=10' - typescript: '>=4' - dependencies: - '@types/node': 20.5.4 - cosmiconfig: 8.2.0 - ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@20.5.4)(typescript@5.1.6) - typescript: 5.1.6 + ts-node: 10.9.1(@swc/core@1.3.80)(@types/node@20.5.6)(typescript@5.2.2) + typescript: 5.2.2 dev: true - optional: true /cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} @@ -8240,12 +8438,6 @@ packages: luxon: 3.3.0 dev: false - /cron@2.4.0: - resolution: {integrity: sha512-Cx77ic1TyIAtUggr0oAhtS8MLzPBUqGNIvdDM7jE3oFIxfe8LXWI9q3iQN/H2CebAiMir53LQKWOhEKnzkJTAQ==} - dependencies: - luxon: 3.3.0 - dev: false - /cron@2.4.1: resolution: {integrity: sha512-ty0hUSPuENwDtIShDFxUxWEIsqiu2vhoFtt6Vwrbg4lHGtJX2/cV2p0hH6/qaEM9Pj+i6mQoau48BO5wBpkP4w==} dependencies: @@ -8323,18 +8515,18 @@ packages: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: false - /cz-conventional-changelog@3.3.0(@swc/core@1.3.78): + /cz-conventional-changelog@3.3.0(@swc/core@1.3.80): resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.3.0(@swc/core@1.3.78) + commitizen: 4.3.0(@swc/core@1.3.80) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 17.6.7(@swc/core@1.3.78) + '@commitlint/load': 17.7.1(@swc/core@1.3.80) transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -8862,7 +9054,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.8)(eslint@8.47.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.8)(eslint@8.48.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -8883,36 +9075,36 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.4.1(eslint@8.48.0)(typescript@5.2.2) debug: 3.2.7 - eslint: 8.47.0 + eslint: 8.48.0 eslint-import-resolver-node: 0.3.8 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-antfu@0.40.3(eslint@8.47.0)(typescript@5.1.6): + /eslint-plugin-antfu@0.40.3(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-1f0OifSyaIQNHAHNzh0wHfUKkc3cP3fDDOk51WtCBL7ffgd4dSEq95FJIRUyGKecq4CY3d3gHpOOUbClcHiV1w==} dependencies: - '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/utils': 6.4.1(eslint@8.48.0)(typescript@5.2.2) transitivePeerDependencies: - eslint - supports-color - typescript dev: true - /eslint-plugin-eslint-comments@3.2.0(eslint@8.47.0): + /eslint-plugin-eslint-comments@3.2.0(eslint@8.48.0): resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} peerDependencies: eslint: '>=4.19.1' dependencies: escape-string-regexp: 1.0.5 - eslint: 8.47.0 + eslint: 8.48.0 ignore: 5.2.4 dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0): + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.48.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: @@ -8922,16 +9114,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.4.1(eslint@8.48.0)(typescript@5.2.2) array-includes: 3.1.6 array.prototype.findlastindex: 1.2.2 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.47.0 + eslint: 8.48.0 eslint-import-resolver-node: 0.3.8 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.8)(eslint@8.47.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.8)(eslint@8.48.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -8947,40 +9139,40 @@ packages: - supports-color dev: true - /eslint-plugin-jsonc@2.9.0(eslint@8.47.0): + /eslint-plugin-jsonc@2.9.0(eslint@8.48.0): resolution: {integrity: sha512-RK+LeONVukbLwT2+t7/OY54NJRccTXh/QbnXzPuTLpFMVZhPuq1C9E07+qWenGx7rrQl0kAalAWl7EmB+RjpGA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - eslint: 8.47.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + eslint: 8.48.0 jsonc-eslint-parser: 2.3.0 natural-compare: 1.4.0 dev: true - /eslint-plugin-markdown@3.0.1(eslint@8.47.0): + /eslint-plugin-markdown@3.0.1(eslint@8.48.0): resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.47.0 + eslint: 8.48.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.47.0): + /eslint-plugin-react-hooks@4.6.0(eslint@8.48.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.47.0 + eslint: 8.48.0 dev: true - /eslint-plugin-react@7.33.2(eslint@8.47.0): + /eslint-plugin-react@7.33.2(eslint@8.48.0): resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} peerDependencies: @@ -8991,7 +9183,7 @@ packages: array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 es-iterator-helpers: 1.0.13 - eslint: 8.47.0 + eslint: 8.48.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 @@ -9005,17 +9197,17 @@ packages: string.prototype.matchall: 4.0.8 dev: true - /eslint-plugin-unicorn@48.0.1(eslint@8.47.0): + /eslint-plugin-unicorn@48.0.1(eslint@8.48.0): resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} engines: {node: '>=16'} peerDependencies: eslint: '>=8.44.0' dependencies: '@babel/helper-validator-identifier': 7.22.5 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) ci-info: 3.8.0 clean-regexp: 1.0.0 - eslint: 8.47.0 + eslint: 8.48.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -9029,7 +9221,7 @@ packages: strip-indent: 3.0.0 dev: true - /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.47.0): + /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.48.0): resolution: {integrity: sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -9039,37 +9231,37 @@ packages: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.1.6) - eslint: 8.47.0 + '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.48.0)(typescript@5.2.2) + eslint: 8.48.0 eslint-rule-composer: 0.3.0 dev: true - /eslint-plugin-vue@9.17.0(eslint@8.47.0): + /eslint-plugin-vue@9.17.0(eslint@8.48.0): resolution: {integrity: sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - eslint: 8.47.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + eslint: 8.48.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.0.13 semver: 7.5.4 - vue-eslint-parser: 9.3.1(eslint@8.47.0) + vue-eslint-parser: 9.3.1(eslint@8.48.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-yml@1.8.0(eslint@8.47.0): + /eslint-plugin-yml@1.8.0(eslint@8.48.0): resolution: {integrity: sha512-fgBiJvXD0P2IN7SARDJ2J7mx8t0bLdG6Zcig4ufOqW5hOvSiFxeUyc2g5I1uIm8AExbo26NNYCcTGZT0MXTsyg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 - eslint: 8.47.0 + eslint: 8.48.0 lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.2 @@ -9107,15 +9299,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.47.0: - resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} + /eslint@8.48.0: + resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) '@eslint-community/regexpp': 4.6.2 '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.47.0 + '@eslint/js': 8.48.0 '@humanwhocodes/config-array': 0.11.10 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -9134,7 +9326,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.20.0 + globals: 13.21.0 graphemer: 1.4.0 ignore: 5.2.4 imurmurhash: 0.1.4 @@ -9652,7 +9844,7 @@ packages: semver: 7.5.4 tapable: 2.2.1 typescript: 5.1.6 - webpack: 5.88.2(@swc/core@1.3.78)(esbuild@0.18.19) + webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.18.19) dev: false /form-data-encoder@2.1.4: @@ -10039,13 +10231,6 @@ packages: which: 1.3.1 dev: true - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - /globals@13.21.0: resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} engines: {node: '>=8'} @@ -10991,7 +11176,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.5.4 + '@types/node': 20.5.6 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -11357,6 +11542,7 @@ packages: /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + requiresBuild: true dev: true /lodash.uniqby@4.7.0: @@ -11437,8 +11623,8 @@ packages: engines: {node: '>=12'} dev: true - /lucide-react@0.268.0(react@18.2.0): - resolution: {integrity: sha512-XP/xY3ASJAViqNqVnDRcEfdxfRB7uNST8sqTLwZhL983ikmHMQ7qQak7ZxrnXOVhB3QDBawdr3ANq0P+iWHP/g==} + /lucide-react@0.269.0(react@18.2.0): + resolution: {integrity: sha512-+ViEb/2eJJt43/CtxpTfvqu/8gzK49cSUdeuqRuFYiZmX9AvwfumtETM4plhXHymfHb6/mVbHg9uIlc13y+uew==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 dependencies: @@ -12797,7 +12983,7 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.28 - ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@20.5.4)(typescript@5.1.6) + ts-node: 10.9.1(@swc/core@1.3.80)(@types/node@20.5.6)(typescript@5.2.2) yaml: 2.3.1 /postcss-nested@6.0.1(postcss@8.4.28): @@ -14417,7 +14603,7 @@ packages: - supports-color dev: true - /terser-webpack-plugin@5.3.9(@swc/core@1.3.78)(esbuild@0.18.19)(webpack@5.88.2): + /terser-webpack-plugin@5.3.9(@swc/core@1.3.80)(esbuild@0.18.19)(webpack@5.88.2): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -14434,13 +14620,13 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.18 - '@swc/core': 1.3.78 + '@swc/core': 1.3.80 esbuild: 0.18.19 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.19.2 - webpack: 5.88.2(@swc/core@1.3.78)(esbuild@0.18.19) + webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.18.19) /terser@5.19.2: resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} @@ -14567,13 +14753,13 @@ packages: dependencies: escape-string-regexp: 5.0.0 - /ts-api-utils@1.0.1(typescript@5.1.6): + /ts-api-utils@1.0.1(typescript@5.2.2): resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.1.6 + typescript: 5.2.2 dev: true /ts-easing@0.2.0: @@ -14583,7 +14769,7 @@ packages: /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - /ts-loader@9.4.4(typescript@5.1.6)(webpack@5.88.2): + /ts-loader@9.4.4(typescript@5.2.2)(webpack@5.88.2): resolution: {integrity: sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==} engines: {node: '>=12.0.0'} peerDependencies: @@ -14594,11 +14780,11 @@ packages: enhanced-resolve: 5.15.0 micromatch: 4.0.5 semver: 7.5.4 - typescript: 5.1.6 - webpack: 5.88.2(@swc/core@1.3.78)(esbuild@0.18.19) + typescript: 5.2.2 + webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.18.19) dev: true - /ts-node@10.9.1(@swc/core@1.3.78)(@types/node@20.4.7)(typescript@5.1.6): + /ts-node@10.9.1(@swc/core@1.3.80)(@types/node@20.5.6)(typescript@5.2.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -14613,51 +14799,19 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.3.78 + '@swc/core': 1.3.80 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.4.7 + '@types/node': 20.5.6 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.1.6 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /ts-node@10.9.1(@swc/core@1.3.78)(@types/node@20.5.4)(typescript@5.1.6): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.3.78 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.5.4 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.1.6 + typescript: 5.2.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -14703,7 +14857,7 @@ packages: /tslib@2.6.1: resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} - /tsup@7.2.0(@swc/core@1.3.78)(ts-node@10.9.1)(typescript@5.1.6): + /tsup@7.2.0(@swc/core@1.3.80)(ts-node@10.9.1)(typescript@5.2.2): resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} engines: {node: '>=16.14'} hasBin: true @@ -14719,7 +14873,7 @@ packages: typescript: optional: true dependencies: - '@swc/core': 1.3.78 + '@swc/core': 1.3.80 bundle-require: 4.0.1(esbuild@0.18.19) cac: 6.7.14 chokidar: 3.5.3 @@ -14734,7 +14888,7 @@ packages: source-map: 0.8.0-beta.0 sucrase: 3.34.0 tree-kill: 1.2.2 - typescript: 5.1.6 + typescript: 5.2.2 transitivePeerDependencies: - supports-color - ts-node @@ -14868,6 +15022,12 @@ packages: resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} engines: {node: '>=14.17'} hasBin: true + dev: false + + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true /ua-parser-js@1.0.35: resolution: {integrity: sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==} @@ -15119,14 +15279,14 @@ packages: engines: {node: '>= 0.10'} dev: false - /vue-eslint-parser@9.3.1(eslint@8.47.0): + /vue-eslint-parser@9.3.1(eslint@8.48.0): resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 - eslint: 8.47.0 + eslint: 8.48.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.2 espree: 9.6.1 @@ -15187,7 +15347,7 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack@5.88.2(@swc/core@1.3.78)(esbuild@0.18.19): + /webpack@5.88.2(@swc/core@1.3.80)(esbuild@0.18.19): resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -15218,7 +15378,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(@swc/core@1.3.78)(esbuild@0.18.19)(webpack@5.88.2) + terser-webpack-plugin: 5.3.9(@swc/core@1.3.80)(esbuild@0.18.19)(webpack@5.88.2) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -15475,6 +15635,10 @@ packages: resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} dev: false + /zod@3.22.2: + resolution: {integrity: sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==} + dev: false + /zustand@4.4.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} engines: {node: '>=12.7.0'} From a216e3332ca5820b01f9084632d0d817f799c154 Mon Sep 17 00:00:00 2001 From: chenyueban <jasonchan0527@gmail.com> Date: Mon, 28 Aug 2023 09:35:04 +0800 Subject: [PATCH 06/23] chore: refactoring --- .npmrc | 1 - .../[projectId]/alerts/[alertId]/alertId.tsx | 127 +- .../alerts/[alertId]/edit/edit.tsx | 31 +- .../[projectId]/alerts/create/page.tsx | 25 +- .../app/[locale]/[projectId]/alerts/page.tsx | 41 +- .../feedbacks/[feedbackId]/feedback-id.tsx | 19 +- .../[locale]/[projectId]/feedbacks/page.tsx | 22 +- .../[projectId]/issues/[issueId]/issueId.tsx | 8 +- .../app/[locale]/[projectId]/metrics/page.tsx | 30 +- .../[locale]/[projectId]/mock/frame/Ajax.tsx | 6 +- .../[projectId]/mock/frame/Config.tsx | 154 +- .../[projectId]/mock/frame/CustomReport.tsx | 6 +- .../[locale]/[projectId]/mock/frame/Error.tsx | 6 +- .../[projectId]/mock/frame/HashChange.tsx | 5 +- .../[projectId]/mock/frame/History.tsx | 6 +- .../[projectId]/mock/frame/InsertRes.tsx | 6 +- .../[projectId]/mock/frame/PromiseError.tsx | 6 +- .../[locale]/[projectId]/mock/frame/index.tsx | 13 +- .../app/[locale]/[projectId]/profile/page.tsx | 1 - .../[locale]/[projectId]/profile/profile.tsx | 154 +- .../[releaseId]/sourceMaps/sourceMaps.tsx | 72 +- .../[locale]/[projectId]/releases/page.tsx | 44 +- .../[locale]/[projectId]/settings/page.tsx | 131 +- .../[projectId]/users/[userId]/userId.tsx | 77 +- .../app/[locale]/[projectId]/users/page.tsx | 5 +- packages/web/app/[locale]/providers.tsx | 25 +- packages/web/components.json | 2 +- packages/web/components/alert-list.tsx | 78 +- packages/web/components/breadcrumbs.tsx | 13 +- packages/web/components/card-section.tsx | 65 +- packages/web/components/card.tsx | 5 +- packages/web/components/edit-alert.tsx | 423 +- .../web/components/event-detail-action.tsx | 116 +- .../web/components/event-detail-profile.tsx | 2 +- .../web/components/event-detail-stack.tsx | 2 +- .../web/components/event-detail-trend.tsx | 2 +- packages/web/components/event-detail-user.tsx | 2 +- packages/web/components/events-list.tsx | 44 +- packages/web/components/feedbacks-list.tsx | 62 +- packages/web/components/intl.tsx | 44 +- packages/web/components/issue-list.tsx | 311 +- .../web/components/issue-related-metadata.tsx | 2 +- packages/web/components/layout.tsx | 2 +- packages/web/components/load-more-button.tsx | 3 +- packages/web/components/logo.tsx | 7 +- packages/web/components/nav-container.tsx | 2 +- packages/web/components/nav-menu.tsx | 33 +- packages/web/components/pagination.tsx | 53 +- packages/web/components/project-card.tsx | 37 +- packages/web/components/project.tsx | 125 +- packages/web/components/release-list.tsx | 118 +- packages/web/components/spinning.tsx | 6 +- packages/web/components/theme.tsx | 4 +- packages/web/components/title.tsx | 4 +- packages/web/components/ui/accordion.tsx | 60 + packages/web/components/ui/badge.tsx | 36 + packages/web/components/ui/checkbox.tsx | 30 + packages/web/components/ui/command.tsx | 155 + packages/web/components/ui/dialog.tsx | 123 + packages/web/components/ui/popover.tsx | 31 + packages/web/components/ui/skeleton.tsx | 15 + packages/web/components/ui/switch.tsx | 29 + packages/web/components/ui/tabs.tsx | 55 + packages/web/components/ui/tooltip.tsx | 30 + packages/web/components/user.tsx | 83 +- packages/web/components/users-list.tsx | 23 +- packages/web/libs/utils.tsx | 25 +- packages/web/package.json | 10 +- pnpm-lock.yaml | 4011 +++++------------ 69 files changed, 2994 insertions(+), 4310 deletions(-) create mode 100644 packages/web/components/ui/accordion.tsx create mode 100644 packages/web/components/ui/badge.tsx create mode 100644 packages/web/components/ui/checkbox.tsx create mode 100644 packages/web/components/ui/command.tsx create mode 100644 packages/web/components/ui/dialog.tsx create mode 100644 packages/web/components/ui/popover.tsx create mode 100644 packages/web/components/ui/skeleton.tsx create mode 100644 packages/web/components/ui/switch.tsx create mode 100644 packages/web/components/ui/tabs.tsx create mode 100644 packages/web/components/ui/tooltip.tsx diff --git a/.npmrc b/.npmrc index acd5774..6c59086 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1 @@ enable-pre-post-scripts=true -public-hoist-pattern[]=*@nextui-org/theme* diff --git a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alertId.tsx b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alertId.tsx index 444ca0e..4edec3d 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alertId.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alertId.tsx @@ -1,6 +1,5 @@ 'use client' -import { Badge, Box, Button, Code, Flex, Tag, Text, Tooltip } from '@chakra-ui/react' import Link from 'next/link' import { useMemo } from 'react' import { type Action, type ConditionOption, type FilterOption } from 'common' @@ -13,8 +12,11 @@ import CardSection from '~/components/card-section' import Title from '~/components/title' import useCurrentProject from '~/hooks/use-current-project' import EventsList from '~/components/events-list' -import { ConditionOptions, FilterOptions } from '~/components/editAlert' -import TrendChart from '~/components/trendChart' +import { ConditionOptions, FilterOptions } from '~/components/edit-alert' +import TrendChart from '~/components/trend-chart' +import { Button } from '~/components/ui/button' +import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' +import { Badge } from '~/components/ui/badge' interface Props { alert: Alert @@ -30,12 +32,12 @@ export default function AlertId({ alert, alertEvents, alertEventTrends }: Props) const events = useMemo(() => alertEvents.map(item => item.event), [alertEvents]) return ( - <Flex flexDirection="column"> + <div className='flex flex-col'> <Title rightNodes={ ( <Link href={`/${projectId}/alerts/${alert.id}/edit`}> - <Button variant="solid">Edit Alert</Button> + <Button variant="outline">Edit Alert</Button> </Link> ) } @@ -44,106 +46,81 @@ export default function AlertId({ alert, alertEvents, alertEventTrends }: Props) - - + + { alert.recentlyAt && ( - - - {dayjs(alert.recentlyAt).fromNow()} - - + + + {dayjs(alert.recentlyAt).fromNow()} + + + {dayjs(alert.recentlyAt).format('YYYY-MM-DD HH:mm:ss')} + + ) } - - - +
+
+ WHEN - an event is captured by Ohbug and {alert.conditionMatch} of the following happens - + an event is captured by Ohbug and {alert.conditionMatch} of the following happens +
{ (alert.conditions as unknown as ConditionOption[])?.map((condition) => { return ( - - +
+ {ConditionOptions.find(item => item.topic === condition.topic)?.name} - - + +
) }) } -
- - - +
+
+
+ IF - {alert.filterMatch} of these filters match - + {alert.filterMatch} of these filters match +
{ (alert.filters as unknown as FilterOption[])?.map((filter) => { return ( - - +
+ {FilterOptions.find(item => item.topic === filter.topic)?.name} - - + +
) }) } -
- - - +
+
+
+ THEN - {alert.filterMatch} of these filters match - + {alert.filterMatch} of these filters match +
{ (alert.actions as unknown as Action[])?.map((action) => { return ( - - +
+ {action.type}: {action.uri} - - + +
) }) } -
- - {alert.level} - interval: {alert.interval} - +
+
+ {alert.level} + interval: {alert.interval} +
@@ -160,6 +137,6 @@ export default function AlertId({ alert, alertEvents, alertEventTrends }: Props)
-
+
) } diff --git a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/edit.tsx b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/edit.tsx index 1e9606d..689d315 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/edit.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/edit.tsx @@ -1,15 +1,14 @@ 'use client' -import { Box, useToast } from '@chakra-ui/react' import { useCallback } from 'react' import type { OmitAlert } from 'common' import { useRouter } from 'next-intl/client' import { useSearchParams } from 'next/navigation' -import Card from '~/components/card' import Title from '~/components/title' import Wrapper from '~/components/wrapper' -import EditAlert from '~/components/editAlert' +import EditAlert from '~/components/edit-alert' import { serviceUpdateAlert } from '~/services/alerts' +import { useToast } from '~/components/ui/use-toast' interface Props { alert: OmitAlert @@ -19,14 +18,13 @@ export default function Edit({ alert }: Props) { const router = useRouter() const searchParams = useSearchParams() const alertId = searchParams.get('alertId') - const toast = useToast() + const {toast} = useToast() const onSubmit = useCallback((value: OmitAlert) => { serviceUpdateAlert(parseInt(alertId as string), value) .then(() => { toast({ title: 'Alert Edited!', description: 'Your alert has been edited!', - status: 'success', }) router.back() }) @@ -34,28 +32,21 @@ export default function Edit({ alert }: Props) { toast({ title: 'Alert Edit Error', description: error.message, - status: 'error', + variant: 'destructive', }) }) }, [alertId]) return ( - +
Edit Alerts - - - - + + - +
) } diff --git a/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx b/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx index b56ffc6..5c71374 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx @@ -1,29 +1,27 @@ 'use client' -import { Box, useToast } from '@chakra-ui/react' import { useCallback } from 'react' import type { OmitAlert } from 'common' import { useRouter } from 'next-intl/client' import { useTranslations } from 'next-intl' -import Card from '~/components/card' import Title from '~/components/title' import Wrapper from '~/components/wrapper' import useCurrentProject from '~/hooks/use-current-project' -import EditAlert from '~/components/editAlert' +import EditAlert from '~/components/edit-alert' import { serviceCreateAlert } from '~/services/alerts' +import { useToast } from '~/components/ui/use-toast' export default function CreatePage() { const t = useTranslations('Alerts') const router = useRouter() const { projectId } = useCurrentProject() - const toast = useToast() + const {toast} = useToast() const onSubmit = useCallback((value: OmitAlert) => { serviceCreateAlert({ ...value, projectId: projectId! }) .then(() => { toast({ title: 'Alert Created!', description: 'Your alert has been created!', - status: 'success', }) router.back() }) @@ -31,25 +29,18 @@ export default function CreatePage() { toast({ title: 'Alert Create Error', description: error.message, - status: 'error', + variant: 'destructive', }) }) }, [projectId]) return ( - +
{t('createAlert')} - - - - + + - +
) } diff --git a/packages/web/app/[locale]/[projectId]/alerts/page.tsx b/packages/web/app/[locale]/[projectId]/alerts/page.tsx index 64ba9e7..581b7c4 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/page.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/page.tsx @@ -1,10 +1,8 @@ 'use client' -import { Box, Button } from '@chakra-ui/react' import Link from 'next/link' import { useTranslations } from 'next-intl' import { type Alert } from '@prisma/client' -import Card from '~/components/card' import AlertsList from '~/components/alert-list' import Title from '~/components/title' import Wrapper from '~/components/wrapper' @@ -12,6 +10,8 @@ import useCurrentProject from '~/hooks/use-current-project' import { useInfinite } from '~/hooks/use-infinite' import LoadingMoreButton from '~/components/load-more-button' import { serviceGetAlerts } from '~/services/alerts' +import { Box } from '~/components/ui/box' +import { Button } from '~/components/ui/button' const Alerts = () => { const t = useTranslations('Alerts') @@ -33,7 +33,7 @@ const Alerts = () => { rightNodes={ ( - + ) } @@ -41,27 +41,20 @@ const Alerts = () => { Alerts - - - { - data && ( - - ) - } - setSize(size + 1)} - /> - + + { + data && ( + + ) + } + setSize(size + 1)} + />
) diff --git a/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedback-id.tsx b/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedback-id.tsx index c851d4a..16846c5 100644 --- a/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedback-id.tsx +++ b/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedback-id.tsx @@ -1,8 +1,6 @@ 'use client' -import { Flex, HStack, VStack } from '@chakra-ui/react' import { useMemo } from 'react' -import { Snippet } from '@nextui-org/react' import EventDetailActions from '~/components/event-detail-action' import EventDetailProfile from '~/components/event-detail-profile' import EventDetailUser from '~/components/event-detail-user' @@ -18,10 +16,7 @@ export default function FeedbackId({ feedback }: Props) { const detail = useMemo(() => feedback.detail as any ?? {}, [feedback]) return ( - +
@@ -29,11 +24,11 @@ export default function FeedbackId({ feedback }: Props) { - - {detail.feedback && Feedback:{detail.feedback}} - {detail.selector && Selector:{detail.selector}} - {detail.outerHTML && outerHTML:{detail.outerHTML}} - +
+ {detail.feedback &&
Feedback:{detail.feedback}
} + {detail.selector &&
Selector:{detail.selector}
} + {detail.outerHTML &&
outerHTML:{detail.outerHTML}
} +
@@ -41,6 +36,6 @@ export default function FeedbackId({ feedback }: Props) { - +
) } diff --git a/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx b/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx index b331998..664eec6 100644 --- a/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx +++ b/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx @@ -1,8 +1,6 @@ 'use client' -import { Button, Icon, Link } from '@chakra-ui/react' import { useTranslations } from 'next-intl' -import { RiQuestionLine } from 'react-icons/ri' import { type EventUser, type Feedback } from '@prisma/client' import FeedbacksList from '~/components/feedbacks-list' import { Box } from '~/components/ui/box' @@ -11,6 +9,8 @@ import Wrapper from '~/components/wrapper' import useCurrentProject from '~/hooks/use-current-project' import { useInfinite } from '~/hooks/use-infinite' import { serviceGetFeedbacks } from '~/services/feedbacks' +import Link from 'next/link' +import { Button } from '~/components/ui/button' export default function FeedbacksPage() { const ct = useTranslations('Common') @@ -27,7 +27,7 @@ export default function FeedbacksPage() { ) return ( - + <Button - leftIcon={ - ( - <Icon - as={RiQuestionLine} - h="5" - w="5" - /> - ) - } - variant="ghost" + variant="outline" > - {ct('integration')} + <i className='i-ri-question-line mr-2'></i> {ct('integration')} </Button> </Link> ) @@ -59,12 +50,11 @@ export default function FeedbacksPage() { <Wrapper> <FeedbacksList feedbacks={feedbacks} /> <Button + className='w-full mt-6' disabled={isLoading || isReachingEnd} - mt="6" onClick={() => setSize(size + 1)} size="sm" variant="outline" - w="full" > { isLoading diff --git a/packages/web/app/[locale]/[projectId]/issues/[issueId]/issueId.tsx b/packages/web/app/[locale]/[projectId]/issues/[issueId]/issueId.tsx index 34afc9b..ae75c25 100644 --- a/packages/web/app/[locale]/[projectId]/issues/[issueId]/issueId.tsx +++ b/packages/web/app/[locale]/[projectId]/issues/[issueId]/issueId.tsx @@ -1,6 +1,5 @@ 'use client' -import { Flex } from '@chakra-ui/react' import { useSearchParams } from 'next/navigation' import { useMemo } from 'react' import dynamic from 'next/dynamic' @@ -73,16 +72,13 @@ export default function IssueId({ issue, event, trends }: Props) { }, [tab, event, issue, trends]) return ( - <Flex - flexDirection="column" - gap="6" - > + <div className="flex flex-col gap-6"> <IssueDetailTitle event={event} issue={issue} /> {nodes} - </Flex> + </div> ) } diff --git a/packages/web/app/[locale]/[projectId]/metrics/page.tsx b/packages/web/app/[locale]/[projectId]/metrics/page.tsx index 8334c1a..dfcf6a3 100644 --- a/packages/web/app/[locale]/[projectId]/metrics/page.tsx +++ b/packages/web/app/[locale]/[projectId]/metrics/page.tsx @@ -1,10 +1,7 @@ 'use client' -import { Button, Icon, Link } from '@chakra-ui/react' import { useTranslations } from 'next-intl' -import { RiQuestionLine } from 'react-icons/ri' import IntroduceChart from '~/components/introduce-chart' -import { Box } from '~/components/ui/box' import Title from '~/components/title' import TrendChart from '~/components/trend-chart' import Wrapper from '~/components/wrapper' @@ -12,6 +9,8 @@ import useCurrentProject from '~/hooks/use-current-project' import { average } from '~/libs/utils' import { serviceGetMetricsTrends } from '~/services/metrics' import { useQuery } from '~/hooks/use-query' +import Link from 'next/link' +import { Button } from '~/components/ui/button' const CLS_THRESHOLD = [0.1, 0.25] const FID_THRESHOLD = [100, 300] @@ -74,7 +73,7 @@ export default function MetricsPage() { ) return ( - <Box > + <div> <Title rightNodes={ ( @@ -82,19 +81,8 @@ export default function MetricsPage() { href="https://ohbug.net/guide/metrics.html" target="_blank" > - <Button - leftIcon={ - ( - <Icon - as={RiQuestionLine} - h="5" - w="5" - /> - ) - } - variant="ghost" - > - {ct('integration')} + <Button variant="outline"> + <i className='i-ri-question-line'></i> {ct('integration')} </Button> </Link> ) @@ -103,11 +91,7 @@ export default function MetricsPage() { Metrics - + - + ) } diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/Ajax.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/Ajax.tsx index c1e97e7..35097c2 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/Ajax.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/Ajax.tsx @@ -1,7 +1,7 @@ 'use client' -import { Button, HStack } from '@chakra-ui/react' import Card from '~/components/card' +import { Button } from '~/components/ui/button' function Ajax() { const handleError = () => { @@ -23,10 +23,10 @@ function Ajax() { +
- +
) } title="AJAX" diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx index 2f8b03d..d42d1ba 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx @@ -1,11 +1,24 @@ 'use client' -import { Button, FormControl, FormLabel, Input, NumberDecrementStepper, NumberIncrementStepper, NumberInput, NumberInputField, NumberInputStepper } from '@chakra-ui/react' import { useCallback } from 'react' import { useForm } from 'react-hook-form' import { useTranslations } from 'next-intl' import type { OhbugConfig } from '@ohbug/types' import { useLocalStorage } from 'react-use' +import { zodResolver } from "@hookform/resolvers/zod" +import * as z from "zod" +import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '~/components/ui/form' +import { Input } from '~/components/ui/input' +import { Button } from '~/components/ui/button' + +const formSchema = z.object({ + apiKey: z.string(), + appVersion: z.string(), + appType: z.string(), + endpoint: z.string(), + releaseStage: z.string(), + maxActions: z.number().min(1), +}) interface Props { defaultConfig: OhbugConfig @@ -13,10 +26,13 @@ interface Props { function Config({ defaultConfig }: Props) { const ct = useTranslations('Common') - const { handleSubmit, register } = useForm({ defaultValues: defaultConfig }) + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: defaultConfig, + }) const [, setValue, remove] = useLocalStorage('MOCK_CONFIG', defaultConfig) - const onSubmit = useCallback((data: OhbugConfig) => { - setValue(data) + const onSubmit = useCallback((values: z.infer) => { + setValue(values) }, []) const handleReset = useCallback(() => { remove() @@ -24,73 +40,96 @@ function Config({ defaultConfig }: Props) { }, []) return ( -
- - apiKey: - + + ( + + apiKey + + + + + + )} /> - - - appVersion: - ( + + appVersion + + + + + + )} /> - - - appType: - ( + + appType + + + + + + )} /> - - - endpoint: - ( + + endpoint + + + + + + )} /> - - - releaseStage: - ( + + releaseStage + + + + + + )} /> - - - maxActions: - - - - - - - - + ( + + maxActions + + + + + + )} + /> - - - - + + ) } diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx index 2a756b8..28e746f 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx @@ -1,6 +1,6 @@ 'use client' -import { Button, HStack } from '@chakra-ui/react' +import { Button } from '~/components/ui/button' import { client } from './index' import Card from '~/components/card' @@ -25,9 +25,9 @@ function CustomReport() { +
- +
) } title="CustomReport" diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx index 0ee2d4c..e6a6073 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx @@ -1,7 +1,7 @@ 'use client' -import { Button, HStack } from '@chakra-ui/react' import Card from '~/components/card' +import { Button } from '~/components/ui/button' function randomString(length: number) { const str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' @@ -31,10 +31,10 @@ function Error() { +
- +
) } title="Error" diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx index 5d7cfcb..8b43821 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx @@ -1,6 +1,5 @@ 'use client' -import { HStack } from '@chakra-ui/react' import Link from 'next/link' import Card from '~/components/card' @@ -9,14 +8,14 @@ function HashChange() { +
hash:/#app
hash: /#dd
- +
) } title="HashChange" diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx index 9a0e03e..ee2cf7d 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx @@ -1,7 +1,7 @@ 'use client' -import { Button, HStack } from '@chakra-ui/react' import Card from '~/components/card' +import { Button } from '~/components/ui/button' function History() { const pushState = () => { @@ -15,10 +15,10 @@ function History() { +
- +
) } title="History" diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx index 65c3f7a..9d8734d 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx @@ -1,7 +1,7 @@ 'use client' -import { Button, HStack } from '@chakra-ui/react' import Card from '~/components/card' +import { Button } from '~/components/ui/button' export default function InsertRes() { const handle = () => { @@ -16,9 +16,9 @@ export default function InsertRes() { +
- +
) } title="InsertRes" diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx index 1774022..a83380b 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx @@ -1,7 +1,7 @@ 'use client' -import { Button, HStack } from '@chakra-ui/react' import Card from '~/components/card' +import { Button } from '~/components/ui/button' function PromiseError() { const handlePromise = () => { @@ -11,9 +11,9 @@ function PromiseError() { +
- +
) } title="Promise" diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/index.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/index.tsx index 50d4405..a19d322 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/index.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/index.tsx @@ -1,7 +1,6 @@ -import { Box, Wrap } from '@chakra-ui/react' +import { useMemo, useRef } from 'react' import Ohbug from '@ohbug/browser' import OhbugExtensionFeedback from '@ohbug/extension-feedback' -import { useMemo, useRef } from 'react' import type { OhbugClient, OhbugConfig } from '@ohbug/types' import { useLocalStorage, useMount } from 'react-use' import type { Project } from '@prisma/client' @@ -48,10 +47,10 @@ export default function Frame({ project }: Props) { }) return ( - +
- - +
+
@@ -59,7 +58,7 @@ export default function Frame({ project }: Props) { - - +
+
) } diff --git a/packages/web/app/[locale]/[projectId]/profile/page.tsx b/packages/web/app/[locale]/[projectId]/profile/page.tsx index f87edf3..cb71eac 100644 --- a/packages/web/app/[locale]/[projectId]/profile/page.tsx +++ b/packages/web/app/[locale]/[projectId]/profile/page.tsx @@ -26,7 +26,6 @@ export default async function ProfilePage({ params }: { params: { projectId: str { '14d': trends14d, '24h': trends24h, - } } views={ diff --git a/packages/web/app/[locale]/[projectId]/profile/profile.tsx b/packages/web/app/[locale]/[projectId]/profile/profile.tsx index 45f21c7..b84c583 100644 --- a/packages/web/app/[locale]/[projectId]/profile/profile.tsx +++ b/packages/web/app/[locale]/[projectId]/profile/profile.tsx @@ -3,7 +3,6 @@ import Link from 'next/link' import { useMemo, useState } from 'react' import { useTranslations } from 'next-intl' -import { Button, Card, CardBody, Switch, Tooltip } from '@nextui-org/react' import { type Event, type Project } from '@prisma/client' import { type ProjectTrend } from '~/services/projects' import { Box } from '~/components/ui/box' @@ -14,6 +13,11 @@ import Title from '~/components/title' import { useInfinite } from '~/hooks/use-infinite' import { serviceGetEventByProjectId } from '~/services/events' import { type PVGroupResult } from '~/services/views' +import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' +import { Button } from '~/components/ui/button' +import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' +import { Switch } from '~/components/ui/switch' +import { Label } from '~/components/ui/label' interface Props { project?: Project @@ -57,79 +61,102 @@ const View = ({ views }: Props) => { return ( <> - + - -
-
-
{t('pv')}(PV)
-
{views?.pageView}
-
- - {pageViewTrend}% -
-
- -
-
{t('uv')}(UV)
-
{views?.userView}
-
- - {userViewTrend}% -
-
- -
-
{t('activeUser')}
-
{views?.activeUser ?? 0}
-
-
-
+ + + {t('pv')}(PV) + + + + +
{views?.pageView}
+

+ + {pageViewTrend}% +

+
+
+ + + + {t('uv')}(UV) + + + + +
{views?.userView}
+

+ + {userViewTrend}% +

+
+
+ + + + {t('activeUser')} + + + + +
{views?.activeUser ?? 0}
+
-
+
{ views?.pvPathGroupResult.length > 0 && ( - - + + + + + + {t('pageViews')} + + + {t('pageViewsDesc')} + + + + + - {t('pageViews')} - - ) - } type="14d" variant="row" /> - + ) } { views?.pvReferrerGroupResult.length > 0 && ( - - + + + + + + {t('referrers')} + + + {t('referrersDesc')} + + + + + - {t('referrers')} - - ) - } type="14d" variant="row" /> - + ) } @@ -143,14 +170,13 @@ const Trend = ({ trends }: Props) => { const TrendTitle = useMemo(() => (
Event Trends
-
+
setChartType(e ? '24h' : '14d')} - > - {chartType === '24h' ? '24小时' : '14天'} - + checked={chartType === '24h'} + onCheckedChange={e => setChartType(e ? '24h' : '14d')} + /> +
), [chartType]) @@ -158,14 +184,18 @@ const Trend = ({ trends }: Props) => { return ( - + + + {TrendTitle} + + + - + ) @@ -209,12 +239,8 @@ export default function Profile({ project, trends, views }: Props) { rightNodes={ ( - ) diff --git a/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/sourceMaps.tsx b/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/sourceMaps.tsx index 62518f3..43ebbbb 100644 --- a/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/sourceMaps.tsx +++ b/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/sourceMaps.tsx @@ -1,14 +1,13 @@ 'use client' -import { Flex, IconButton, Link, Text } from '@chakra-ui/react' import { useMemo } from 'react' import { formatBytes } from 'common' -import { RiFileDownloadLine } from 'react-icons/ri' import { type Release } from '@prisma/client' -import { Box } from '~/components/ui/box' import Wrapper from '~/components/wrapper' import Title from '~/components/title' import Card from '~/components/card' +import Link from 'next/link' +import { Button } from '~/components/ui/button' interface Props { release: Release @@ -18,44 +17,37 @@ export default function SourceMaps({ release }: Props) { const sourceMaps = useMemo(() => (release.sourceMaps as Array) ?? [], [release.sourceMaps]) return ( - +
SourceMaps - - - - { - sourceMaps?.map(sourceMap => ( - - - {sourceMap.originalname} - {sourceMap.mimetype} - - - {formatBytes(sourceMap.size)} - - - - - - )) - } - - - - + + + { + sourceMaps?.map(sourceMap => ( +
+
+ {sourceMap.originalname} + {sourceMap.mimetype} +
+
+ {formatBytes(sourceMap.size)} + + + +
+
+ )) + } +
+
+
) } diff --git a/packages/web/app/[locale]/[projectId]/releases/page.tsx b/packages/web/app/[locale]/[projectId]/releases/page.tsx index 216dca7..164fd62 100644 --- a/packages/web/app/[locale]/[projectId]/releases/page.tsx +++ b/packages/web/app/[locale]/[projectId]/releases/page.tsx @@ -1,12 +1,13 @@ 'use client' -import { Button, Card } from '@nextui-org/react' import type { Release } from '@prisma/client' import { useTranslations } from 'next-intl' import Link from 'next/link' import LoadingMoreButton from '~/components/load-more-button' import ReleaseList from '~/components/release-list' import Title from '~/components/title' +import { Button } from '~/components/ui/button' +import { Card } from '~/components/ui/card' import Wrapper from '~/components/wrapper' import useCurrentProject from '~/hooks/use-current-project' import { useInfinite } from '~/hooks/use-infinite' @@ -35,15 +36,8 @@ export default function ReleasesPage() { href="https://ohbug.net/guide/releases.html" target="_blank" > - ) @@ -52,22 +46,20 @@ export default function ReleasesPage() { Releases - - - { - data && ( - - ) - } - setSize(size + 1)} - /> - + + { + data && ( + + ) + } + setSize(size + 1)} + />
) diff --git a/packages/web/app/[locale]/[projectId]/settings/page.tsx b/packages/web/app/[locale]/[projectId]/settings/page.tsx index acc2dee..d7522c4 100644 --- a/packages/web/app/[locale]/[projectId]/settings/page.tsx +++ b/packages/web/app/[locale]/[projectId]/settings/page.tsx @@ -2,17 +2,21 @@ import type { Project } from '@prisma/client' import { useTranslations } from 'next-intl' -import { useCallback, useMemo } from 'react' +import { useCallback, useMemo, useState } from 'react' import { useForm } from 'react-hook-form' import type { ProjectWithMembers } from 'common' import { useSession } from 'next-auth/react' -import { Avatar, Button, Card, CardBody, CardFooter, CardHeader, Input, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, Skeleton, Snippet, useDisclosure } from '@nextui-org/react' -import { useToast } from '@chakra-ui/react' import Title from '~/components/title' import Wrapper from '~/components/wrapper' import useCurrentProject from '~/hooks/use-current-project' import { serviceGetProjectWithUsers, serviceUpdateProject } from '~/services/projects' import { useQuery } from '~/hooks/use-query' +import { useToast } from '~/components/ui/use-toast' +import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '~/components/ui/card' +import { Input } from '~/components/ui/input' +import { Button } from '~/components/ui/button' +import { Avatar, AvatarFallback, AvatarImage } from '~/components/ui/avatar' +import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '~/components/ui/dialog' interface CommonProps { project?: ProjectWithMembers @@ -23,11 +27,10 @@ const SettingsProjectName = ({ project }: CommonProps) => { const t = useTranslations('Settings') const { register, - formState: { errors }, watch, handleSubmit, } = useForm({ defaultValues: { name: project?.name } }) - const toast = useToast() + const {toast} = useToast() const name = watch('name') const onSubmit = useCallback((value: Project) => { serviceUpdateProject(project!.id, value) @@ -35,14 +38,13 @@ const SettingsProjectName = ({ project }: CommonProps) => { toast({ title: 'Project Updated!', description: 'Your project name has been updated!', - status: 'success', }) }) .catch((error) => { toast({ title: 'Project Update Failed!', description: error.message, - status: 'error', + variant: 'destructive', }) }) }, [project]) @@ -51,18 +53,14 @@ const SettingsProjectName = ({ project }: CommonProps) => {
- {t('projectName')} + {t('projectName')} + {t('projectDescription')} - -
{t('projectDescription')}
- + @@ -77,14 +75,14 @@ const SettingsProjectName = ({ project }: CommonProps) => {
) } - +
@@ -100,12 +98,12 @@ const SettingsProjectApiKey = ({ project }: CommonProps) => { return ( - {t('projectApiKey')} + {t('projectApiKey')} + {t('apiKeyDescription')} - -
{t('apiKeyDescription')}
- {project?.apiKey ?? ''} -
+ + {project?.apiKey ?? ''} +
) } @@ -120,32 +118,32 @@ const SettingsProjectUsers = ({ project }: CommonProps) => { }, [data, project]) const t = useTranslations('Settings') - const { isOpen, onOpen, onClose } = useDisclosure() + const [open, setOpen] = useState(false) return ( <> - - {t('projectMembers')} - + + + {t('projectMembers')} + + - +
{ project?.members?.map(member => (
- + + + {member.name ?? ''} +
{member.name} {member.email} @@ -155,24 +153,27 @@ const SettingsProjectUsers = ({ project }: CommonProps) => { )) }
- + - - - {t('inviteMembers')} - + + + + {t('inviteMembers')} + + +
{t('inviteMembersDescription')}
- {inviteUrl} - - - - - - - + {inviteUrl} +
+ + + +
+ ) } @@ -180,7 +181,7 @@ const SettingsProjectUsers = ({ project }: CommonProps) => { export default function SettingsPage() { const t = useTranslations('Settings') const { projectId } = useCurrentProject() - const { data: project, isLoading } = useQuery( + const { data: project } = useQuery( () => serviceGetProjectWithUsers(projectId!), { enabled: !!projectId, @@ -193,23 +194,17 @@ export default function SettingsPage() { {t('projectSettings')} - - - + - - - + - - - +
) diff --git a/packages/web/app/[locale]/[projectId]/users/[userId]/userId.tsx b/packages/web/app/[locale]/[projectId]/users/[userId]/userId.tsx index 8685a24..30b6dbf 100644 --- a/packages/web/app/[locale]/[projectId]/users/[userId]/userId.tsx +++ b/packages/web/app/[locale]/[projectId]/users/[userId]/userId.tsx @@ -1,6 +1,5 @@ 'use client' -import { Flex, Table, TableContainer, Tbody, Td, Th, Thead, Tr } from '@chakra-ui/react' import Link from 'next/link' import dayjs from 'dayjs' import dynamic from 'next/dynamic' @@ -11,6 +10,15 @@ import Wrapper from '~/components/wrapper' import CardSection from '~/components/card-section' import useCurrentProject from '~/hooks/use-current-project' import Title from '~/components/title' +import { + Table, + TableBody, + TableCaption, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "~/components/ui/table" const DynamicReactJson = dynamic(import('react-json-view'), { ssr: false }) @@ -25,11 +33,8 @@ export default function UserId({ user }: Props) { const { projectId } = useCurrentProject() return ( - - +
+
<DynamicReactJson @@ -54,38 +59,36 @@ export default function UserId({ user }: Props) { </Wrapper> <Wrapper> <CardSection title="Related Feedbacks"> - <TableContainer> - <Table className="w-full table table-compact"> - <Thead> - <Tr> - <Th>feedback</Th> - <Th>createdAt</Th> - </Tr> - </Thead> - <Tbody> - { - user.feedbacks?.map((feedback) => { - const detail = feedback.detail as any - return ( - <Tr key={feedback.id}> - <Td> - <Link href={`/${projectId}/feedbacks/${feedback.id}`}> - {detail.feedback} - </Link> - </Td> - <Td> - {dayjs(feedback.createdAt).format('YYYY-MM-DD HH:mm:ss')} - </Td> - </Tr> - ) - }) - } - </Tbody> - </Table> - </TableContainer> + <Table className='rounded-md border'> + <TableHeader> + <TableRow> + <TableHead>feedback</TableHead> + <TableHead>createdAt</TableHead> + </TableRow> + </TableHeader> + <TableBody> + { + user.feedbacks?.map((feedback) => { + const detail = feedback.detail as any + return ( + <TableRow key={feedback.id}> + <TableCell> + <Link href={`/${projectId}/feedbacks/${feedback.id}`}> + {detail.feedback} + </Link> + </TableCell> + <TableCell> + {dayjs(feedback.createdAt).format('YYYY-MM-DD HH:mm:ss')} + </TableCell> + </TableRow> + ) + }) + } + </TableBody> + </Table> </CardSection> </Wrapper> - </Box> - </Flex> + </div> + </div> ) } diff --git a/packages/web/app/[locale]/[projectId]/users/page.tsx b/packages/web/app/[locale]/[projectId]/users/page.tsx index 7053018..37ef562 100644 --- a/packages/web/app/[locale]/[projectId]/users/page.tsx +++ b/packages/web/app/[locale]/[projectId]/users/page.tsx @@ -3,7 +3,6 @@ import { useTranslations } from 'next-intl' import { useState } from 'react' import { useDebounce } from 'react-use' -import { Button, Input } from '@nextui-org/react' import { type EventUser } from '@prisma/client' import UsersList from '~/components/users-list' import Title from '~/components/title' @@ -11,6 +10,8 @@ import Wrapper from '~/components/wrapper' import useCurrentProject from '~/hooks/use-current-project' import { useInfinite } from '~/hooks/use-infinite' import { serviceGetEventUsers } from '~/services/eventUsers' +import { Input } from '~/components/ui/input' +import { Button } from '~/components/ui/button' export default function UsersPage() { const ct = useTranslations('Common') @@ -56,7 +57,6 @@ export default function UsersPage() { <Input onChange={e => setQuery(e.target.value)} placeholder="Search for users ipAddress uuid email name and metadata" - startContent={<i className="i-ri-search-line" />} value={query} /> </div> @@ -69,6 +69,7 @@ export default function UsersPage() { className="w-full mt-6" disabled={isLoading || isReachingEnd} onClick={() => setSize(size + 1)} + variant="outline" > { isLoading diff --git a/packages/web/app/[locale]/providers.tsx b/packages/web/app/[locale]/providers.tsx index 94fef0d..5b37798 100644 --- a/packages/web/app/[locale]/providers.tsx +++ b/packages/web/app/[locale]/providers.tsx @@ -1,7 +1,6 @@ 'use client' import { useEffect } from 'react' -import { NextUIProvider } from '@nextui-org/react' import { ChakraProvider, ColorModeScript } from '@chakra-ui/react' import { SessionProvider, useSession } from 'next-auth/react' import dayjs from 'dayjs' @@ -20,6 +19,8 @@ import { serviceGetProjects } from '~/services/projects' import { useQuery } from '~/hooks/use-query' import '~/styles/nprogress.css' import { Toaster } from '~/components/ui/toaster' +import { ThemeProvider } from '~/components/ui/theme-provider' +import { TooltipProvider } from '~/components/ui/tooltip' const TopProgressBar = dynamic( () => { @@ -64,16 +65,18 @@ export function Providers({ children, session }: Props) { <SessionProvider session={session}> <Controller> <CacheProvider> - <NextUIProvider> - <ChakraProvider theme={theme}> - <Toaster /> - <ColorModeScript /> - <TopProgressBar /> - <Layout> - {children} - </Layout> - </ChakraProvider> - </NextUIProvider> + <ThemeProvider attribute="class" defaultTheme="system" enableSystem> + <TooltipProvider> + <ChakraProvider theme={theme}> + <Toaster /> + <ColorModeScript /> + <TopProgressBar /> + <Layout> + {children} + </Layout> + </ChakraProvider> + </TooltipProvider> + </ThemeProvider> </CacheProvider> </Controller> </SessionProvider> diff --git a/packages/web/components.json b/packages/web/components.json index 9d52571..d5b49a3 100644 --- a/packages/web/components.json +++ b/packages/web/components.json @@ -7,7 +7,7 @@ "config": "tailwind.config.js", "css": "app/globals.css", "baseColor": "stone", - "cssVariables": true + "cssVariables": false }, "aliases": { "components": "~/components", diff --git a/packages/web/components/alert-list.tsx b/packages/web/components/alert-list.tsx index d6d91bb..98aacdb 100644 --- a/packages/web/components/alert-list.tsx +++ b/packages/web/components/alert-list.tsx @@ -2,12 +2,15 @@ import { useCallback } from 'react' import dayjs from 'dayjs' -import { Badge, Tag, useToast } from '@chakra-ui/react' import Link from 'next/link' import type { Alert } from '@prisma/client' -import { Button, Dropdown, DropdownItem, DropdownMenu, DropdownTrigger, Tooltip } from '@nextui-org/react' import useCurrentProject from '~/hooks/use-current-project' import { serviceDeleteAlert } from '~/services/alerts' +import { useToast } from '~/components/ui/use-toast' +import { Badge } from '~/components/ui/badge' +import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' +import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from '~/components/ui/dropdown-menu' +import { Button } from '~/components/ui/button' interface Props { alerts: Alert[] @@ -16,14 +19,13 @@ interface Props { export default function AlertList({ alerts, mutate }: Props) { const { projectId } = useCurrentProject() - const toast = useToast() + const {toast} = useToast() const onDelete = useCallback((id: number) => { serviceDeleteAlert({ id }) .then(() => { toast({ title: 'Alert Deleted!', description: 'Your alert has been deleted!', - status: 'success', }) mutate() }) @@ -31,7 +33,7 @@ export default function AlertList({ alerts, mutate }: Props) { toast({ title: 'Alert Delete Error', description: error.message, - status: 'error', + variant: 'destructive', }) }) }, []) @@ -40,9 +42,9 @@ export default function AlertList({ alerts, mutate }: Props) { <div className="h-full overflow-x-hidden overflow-y-auto rounded-lg w-full"> { alerts.map((alert) => { - let colorScheme = 'gray' - if (alert.level === 'serious') colorScheme = 'red' - if (alert.level === 'warning') colorScheme = 'yellow' + let variant = 'secondary' + if (alert.level === 'serious') variant = 'destructive' + if (alert.level === 'warning') variant = 'default' return ( <div className="mb-2" @@ -55,48 +57,54 @@ export default function AlertList({ alerts, mutate }: Props) { > {alert.name} </Link> - <Badge colorScheme={colorScheme}>{alert.level}</Badge> + <Badge variant={variant as any}>{alert.level}</Badge> </div> <div className="flex items-center justify-end flex-1 gap-2"> <div className="flex gap-2"> { (alert.actions as Array<any>)?.map(action => ( - <Tag key={action.uri}>{action.type}</Tag> + <Badge key={action.uri} variant="outline">{action.type}</Badge> )) } </div> - <Tooltip content={`Updated at: ${dayjs(alert.createdAt).format('YYYY-MM-DD HH:mm:ss')}`}> - <div className="text-stone-500">{dayjs(alert.createdAt).fromNow()}</div> + <Tooltip> + + <TooltipTrigger asChild> + <div className="text-stone-500">{dayjs(alert.createdAt).fromNow()}</div> + </TooltipTrigger> + <TooltipContent> + <span>Updated at: {dayjs(alert.createdAt).format('YYYY-MM-DD HH:mm:ss')}</span> + </TooltipContent> </Tooltip> - <Dropdown> - <DropdownTrigger> + <DropdownMenu> + <DropdownMenuTrigger> <Button - isIconOnly - size="sm" - variant="light" + size="icon" + variant="outline" > <i className="i-ri-more-line" /> </Button> - </DropdownTrigger> - <DropdownMenu> - <DropdownItem> - <Link href={`/${projectId}/alerts/${alert.id}/edit`}> - Edit - </Link> - </DropdownItem> - <DropdownItem - color="danger" - onPress={ - () => { - onDelete(alert.id) + </DropdownMenuTrigger> + <DropdownMenuContent className='w-56'> + <DropdownMenuGroup> + <DropdownMenuItem> + <Link href={`/${projectId}/alerts/${alert.id}/edit`}> + Edit + </Link> + </DropdownMenuItem> + <DropdownMenuItem + onClick={ + () => { + onDelete(alert.id) + } } - } - > - Delete - </DropdownItem> - </DropdownMenu> - </Dropdown> + > + Delete + </DropdownMenuItem> + </DropdownMenuGroup> + </DropdownMenuContent> + </DropdownMenu> </div> </div> ) diff --git a/packages/web/components/breadcrumbs.tsx b/packages/web/components/breadcrumbs.tsx index cfbcf79..5916d16 100644 --- a/packages/web/components/breadcrumbs.tsx +++ b/packages/web/components/breadcrumbs.tsx @@ -1,28 +1,29 @@ 'use client' import Link from 'next/link' -import { Divider } from '@nextui-org/react' import Project from './project' import Logo from './logo' import useBreadcrumb from '~/hooks/use-breadcrumb' +import { Separator } from '~/components/ui/separator' export default function Breadcrumbs() { const [breadcrumbs] = useBreadcrumb() + console.log('breadcrumbs: ', breadcrumbs.slice(0, -1)); return ( - <div className="flex gap-4"> + <div className="flex items-center gap-2"> <Logo /> - <Divider orientation="vertical" /> + <Separator orientation="vertical" className='h-5 rotate-[26deg] mx-2' /> <Project /> - {breadcrumbs.length > 0 ? <Divider orientation="vertical" /> : null} + {breadcrumbs.slice(0, -1).length > 0 ? <Separator orientation="vertical" className='h-5 rotate-[26deg] mx-2' /> : null} <div className="flex items-center"> { breadcrumbs - .slice(0, - 1) + .slice(0, -1) .map(v => ( <div key={v.path}> <Link href={v.path}> @@ -32,7 +33,7 @@ export default function Breadcrumbs() { )) } - <Divider orientation="vertical" /> + <Separator orientation="vertical" className='h-5 rotate-[26deg] mx-2' /> <div>{breadcrumbs.at(-1)?.breadcrumb}</div> </div> diff --git a/packages/web/components/card-section.tsx b/packages/web/components/card-section.tsx index 05418ef..53dc0c4 100644 --- a/packages/web/components/card-section.tsx +++ b/packages/web/components/card-section.tsx @@ -1,10 +1,14 @@ 'use client' -import { Accordion, AccordionButton, AccordionIcon, AccordionItem, AccordionPanel, Heading, Text } from '@chakra-ui/react' -import { type FC, type ReactNode } from 'react' -import Card from './card' -import { type BoxProps } from './ui' -import { Box } from './ui' +import { type ReactNode } from 'react' +import { type BoxProps, Box } from '~/components/ui/box' +import { Card, CardHeader, CardTitle } from '~/components/ui/card' +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "~/components/ui/accordion" interface Props extends BoxProps { title?: string @@ -14,56 +18,43 @@ interface Props extends BoxProps { children?: ReactNode } -const CardSection: FC<Props> = ({ title, head, collapse, collapseTitle, children, ...props }) => { +export default function CardSection({ title, head, collapse, collapseTitle, children, ...props }: Props) { return ( - <div {...props}> + <Box {...props}> <h2 className="font-semibold"> {title} </h2> - <Card - mt="4" - variant="shadow" - > + <Card className='mt-4'> { head && ( - <Box - fontWeight="semibold" - pb="4" - > - {head} - </Box> + <CardHeader> + <CardTitle className="font-semibold"> + {head} + </CardTitle> + </CardHeader> ) } { collapse && ( <Accordion - allowToggle - mx="-6" + type="single" + collapsible > - <AccordionItem> - <h2> - <AccordionButton> - <Text - flex="1" - fontWeight="semibold" - textAlign="left" - > - {collapseTitle} - </Text> - <AccordionIcon /> - </AccordionButton> - </h2> - <AccordionPanel pb={4}> + <AccordionItem value='item-1'> + <AccordionTrigger> + <span className='flex-1 font-semibold text-left'> + {collapseTitle} + </span> + </AccordionTrigger> + <AccordionContent> {collapse} - </AccordionPanel> + </AccordionContent> </AccordionItem> </Accordion> ) } {children} </Card> - </div> + </Box> ) } - -export default CardSection diff --git a/packages/web/components/card.tsx b/packages/web/components/card.tsx index 4e050ba..a662f72 100644 --- a/packages/web/components/card.tsx +++ b/packages/web/components/card.tsx @@ -3,8 +3,8 @@ import { forwardRef, useMemo } from 'react' import { useColorModeValue } from '@chakra-ui/react' import { type ReactNode } from 'react' -import { Box } from './ui' -import { type BoxProps } from './ui' +import { Box } from '~/components/ui/box' +import { type BoxProps } from '~/components/ui/box' interface Props extends Omit<BoxProps, 'content'> { children?: ReactNode @@ -40,7 +40,6 @@ const Card = forwardRef<HTMLDivElement, Props>(({ children, title, extra, conten { footer && ( <Box - m="-4" mt="0" px="4" diff --git a/packages/web/components/edit-alert.tsx b/packages/web/components/edit-alert.tsx index ef0441c..28e88fe 100644 --- a/packages/web/components/edit-alert.tsx +++ b/packages/web/components/edit-alert.tsx @@ -1,14 +1,28 @@ 'use client' -import { Badge, Box, Button, Flex, FormControl, FormErrorMessage, FormLabel, IconButton, Input, Menu, MenuButton, MenuItemOption, MenuList, MenuOptionGroup, NumberDecrementStepper, NumberIncrementStepper, NumberInput, NumberInputField, NumberInputStepper, Select, Text, Tooltip } from '@chakra-ui/react' import { useCallback } from 'react' +import { type FC } from 'react' import { useFieldArray, useForm } from 'react-hook-form' -import { RiCustomerService2Fill, RiDeleteBinLine, RiDingdingFill, RiWechatFill } from 'react-icons/ri' import { AlertConditionTopic, AlertFilterTopic } from 'common' import { useTranslations } from 'next-intl' -import { type FC } from 'react' import { type Action, type ConditionOption, type FilterMatch, type FilterOption, type Interval, type OmitAlert } from 'common' -import { Box } from '~/components/ui/box' +import { zodResolver } from "@hookform/resolvers/zod" +import * as z from "zod" +import { Badge } from '~/components/ui/badge' +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "~/components/ui/form" +import { Input, Input } from "~/components/ui/input" +import { Select } from './ui/select' +import { Button } from './ui/button' +import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from './ui/dropdown-menu' +import { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip' export const ActionOptions = ['email', 'webhook'] export const ConditionOptions: ConditionOption[] = [ @@ -52,15 +66,21 @@ export const AlertLevel = { default: 'default', } +const formSchema = z.object({ + conditionMatch: z.enum(['all', 'every']), + +}) + interface Props { alert?: OmitAlert - onSubmit: (data: OmitAlert) => void + onSubmit: (value: z.infer<typeof formSchema>) => void } const EditAlert: FC<Props> = ({ alert, onSubmit }) => { const ct = useTranslations('Common') const t = useTranslations('Alerts') - const { handleSubmit, register, control, formState: { errors } } = useForm<OmitAlert>({ + const form = useForm<z.infer<typeof formSchema>>({ + resolver: zodResolver(formSchema), defaultValues: alert ? { name: alert.name, @@ -99,29 +119,19 @@ const EditAlert: FC<Props> = ({ alert, onSubmit }) => { }, []) return ( - <Flex - as="form" - direction="column" - gap="6" - onSubmit={handleSubmit(onSubmit)} + <form + className='flex flex-col gap-6' + onSubmit={form.handleSubmit(onSubmit)} > - <Box> + <div> <FormControl> <FormLabel>{t('alertConditions')}</FormLabel> - <Flex - align="center" - gap="2" - mb="2" - > - <Badge - textAlign="center" - variant="solid" - w="14" - > + <div className="flex items-center mb-2"> + <Badge> WHEN </Badge> - <Flex gap="2"> - <Text>an event is captured by Ohbug and</Text> + <div className='space-x-2'> + <span>an event is captured by Ohbug and</span> <FormControl isInvalid={!!errors.conditionMatch} w="auto" @@ -135,27 +145,14 @@ const EditAlert: FC<Props> = ({ alert, onSubmit }) => { <option value="every">every</option> </Select> </FormControl> - <Text>of the following happens</Text> - </Flex> - </Flex> + <span>of the following happens</span> + </div> + </div> { conditionsFields.map((item, index) => { return ( - <Box - alignItems="center" - - display="flex" - gap="2" - key={item.id} - mb="2" - px="2" - py="1" - rounded="md" - > - <Flex - flex="1" - gap="2" - > + <div className='flex items-center gap-2 mb-2 px-2 py-1 rounded-md'> + <div className='space-x-2 flex-1'> { item.topic === AlertConditionTopic.EventCapturedCondition && ( <>An event is captured</> @@ -169,32 +166,21 @@ const EditAlert: FC<Props> = ({ alert, onSubmit }) => { { item.topic === AlertConditionTopic.EventFrequencyCondition && ( <> - <Text>The issue is seen more than </Text> + <span>The issue is seen more than </span> <FormControl isInvalid={!!errors.conditions?.[index]?.value} w="auto" > - <NumberInput - min={1} - size="xs" - variant="filled" - width="24" - > - <NumberInputField - id="interval" + <Input + id="interval" {...register(`conditions.${index}.value`, { required: ct('thisIsRequired'), min: 1, valueAsNumber: true, - })} - /> - <NumberInputStepper> - <NumberIncrementStepper /> - <NumberDecrementStepper /> - </NumberInputStepper> - </NumberInput> + })}> + </Input> </FormControl> - <Text>times in</Text> + <span>times in</span> <FormControl isInvalid={!!errors.conditions?.[index]?.interval} w="auto" @@ -222,32 +208,21 @@ const EditAlert: FC<Props> = ({ alert, onSubmit }) => { { item.topic === AlertConditionTopic.UserFrequencyCondition && ( <> - <Text>The issue is seen by more than </Text> + <span>The issue is seen by more than </span> <FormControl isInvalid={!!errors.conditions?.[index]?.value} w="auto" > - <NumberInput - min={1} - size="xs" - variant="filled" - width="24" - > - <NumberInputField - id="interval" - {...register(`conditions.${index}.value`, { - required: ct('thisIsRequired'), - min: 1, - valueAsNumber: true, - })} - /> - <NumberInputStepper> - <NumberIncrementStepper /> - <NumberDecrementStepper /> - </NumberInputStepper> - </NumberInput> + <Input + id="interval" + {...register(`conditions.${index}.value`, { + required: ct('thisIsRequired'), + min: 1, + valueAsNumber: true, + })} + /> </FormControl> - <Text>users in</Text> + <span>users in</span> <FormControl isInvalid={!!errors.conditions?.[index]?.interval} w="auto" @@ -272,64 +247,55 @@ const EditAlert: FC<Props> = ({ alert, onSubmit }) => { </> ) } - </Flex> - <IconButton - aria-label="delete action" - icon={<RiDeleteBinLine />} + </div> + <Button onClick={() => conditionsRemove(index)} - size="sm" - type="button" - variant="ghost" - /> - </Box> + size="icon" + variant="outline" + > + <i className='i-ri-delete-bin-line'></i> + </Button> + </div> ) }) } </FormControl> - <Menu> - <MenuButton - as={Button} - size="sm" - variant="outline" - > - {t('addCondition')} - </MenuButton> - <MenuList> - <MenuOptionGroup - onChange={value => handleAddCondition(value as ConditionOption['topic'])} - value="" + <DropdownMenu> + <DropdownMenuTrigger> + <Button + size="sm" + variant="outline" > + {t('addCondition')} + </Button> + </DropdownMenuTrigger> + <DropdownMenuContent> + <DropdownMenuGroup> { ConditionOptions.map(item => ( - <MenuItemOption + <DropdownMenuItem key={item.topic} - value={item.topic} + onClick={()=>{ + handleAddCondition(item.topic) + }} > {item.name} - </MenuItemOption> + </DropdownMenuItem> )) } - </MenuOptionGroup> - </MenuList> - </Menu> - </Box> + </DropdownMenuGroup> + </DropdownMenuContent> + </DropdownMenu> + </div> - <Box> + <div> <FormControl> <FormLabel>{t('alertFilters')}</FormLabel> - <Flex - align="center" - gap="2" - mb="2" - > - <Badge - textAlign="center" - variant="solid" - w="14" - > + <div className='flex items-center gap-2 mb-2'> + <Badge> IF </Badge> - <Flex gap="2"> + <div className='space-x-2'> <FormControl isInvalid={!!errors.filters} w="auto" @@ -343,63 +309,40 @@ const EditAlert: FC<Props> = ({ alert, onSubmit }) => { <option value="every">every</option> </Select> </FormControl> - <Text>of these filters match</Text> - </Flex> - </Flex> + <span>of these filters match</span> + </div> + </div> { filtersFields.map((item, index) => { return ( - <Box - alignItems="center" - - display="flex" - key={item.id} - mb="2" - px="2" - py="1" - rounded="md" - > + <div className='flex items-center mb-2 px-2 py-1 rounded-md'> - <Flex - flex="1" - gap="2" - > + <div className='space-x-2 flex-1'> { item.topic === AlertFilterTopic.IssueOccurrencesFilter && ( <> - <Text>The issue has happened at least</Text> + <span>The issue has happened at least</span> <FormControl isInvalid={!!errors.filters?.[index]?.value} w="auto" > - <NumberInput - min={1} - size="xs" - variant="filled" - width="24" - > - <NumberInputField - id="interval" - {...register(`filters.${index}.value`, { - required: ct('thisIsRequired'), - min: 1, - valueAsNumber: true, - })} - /> - <NumberInputStepper> - <NumberIncrementStepper /> - <NumberDecrementStepper /> - </NumberInputStepper> - </NumberInput> + <Input + id="interval" + {...register(`filters.${index}.value`, { + required: ct('thisIsRequired'), + min: 1, + valueAsNumber: true, + })} + /> </FormControl> - <Text>times</Text> + <span>times</span> </> ) } { item.topic === AlertFilterTopic.EventAttributeFilter && ( <> - <Text>The events </Text> + <span>The events </span> <FormControl isInvalid={!!errors.filters?.[index]?.attribute} w="auto" @@ -421,7 +364,7 @@ const EditAlert: FC<Props> = ({ alert, onSubmit }) => { } </Select> </FormControl> - <Text> value </Text> + <span> value </span> <FormControl isInvalid={!!errors.filters?.[index]?.match} w="auto" @@ -462,47 +405,46 @@ const EditAlert: FC<Props> = ({ alert, onSubmit }) => { <>The event is from the latest release</> ) } - </Flex> - <IconButton - aria-label="delete action" - icon={<RiDeleteBinLine />} + </div> + <Button onClick={() => filtersRemove(index)} - size="sm" - type="button" - variant="ghost" - /> - </Box> + size="icon" + variant="outline" + > + <i className='i-ri-delete-bin-line'></i> + </Button> + </div> ) }) } </FormControl> - <Menu> - <MenuButton - as={Button} - size="sm" - variant="outline" - > - {t('addFilter')} - </MenuButton> - <MenuList> - <MenuOptionGroup - onChange={value => handleAddFilter(value as FilterOption['topic'])} - value="" + <DropdownMenu> + <DropdownMenuTrigger> + <Button + size="sm" + variant="outline" > + {t('addFilter')} + </Button> + </DropdownMenuTrigger> + <DropdownMenuContent> + <DropdownMenuGroup> { FilterOptions.map(item => ( - <MenuItemOption + <DropdownMenuItem key={item.topic} - value={item.topic} + onClick={()=>{ + handleAddFilter(item.topic) + }} > {item.name} - </MenuItemOption> + </DropdownMenuItem> )) } - </MenuOptionGroup> - </MenuList> - </Menu> - </Box> + </DropdownMenuGroup> + </DropdownMenuContent> + </DropdownMenu> + </div> <FormControl isInvalid={!!errors.interval}> <FormLabel htmlFor="interval">{t('alertInterval')}</FormLabel> @@ -550,48 +492,43 @@ const EditAlert: FC<Props> = ({ alert, onSubmit }) => { </FormErrorMessage> </FormControl> - <Box> + <div> <FormControl isInvalid={!!errors.actions}> <FormLabel>{t('alertActions')}</FormLabel> { actionsFields.map((item, index) => { return ( - <Box - alignItems="center" - display="flex" - flexDirection="column" + <div + className='flex items-center flex-col mb-2 rounded-md w-full' key={item.id} - mb="2" - rounded="md" - w="full" > - <Flex - align="center" - flex="1" - gap="2" - w="full" - > + <div className='flex items-center gap-2 flex-1 w-full'> { item.type === 'webhook' && ( <Select w="72" {...register(`actions.${index}.webhookType`, { required: ct('thisIsRequired') })} > - <option value="dingtalk"><RiDingdingFill />{t('dingtalk')}</option> - <option value="wechatWork"><RiWechatFill />{t('wechatWork')}</option> - <option value="others"><RiCustomerService2Fill />{t('others')}</option> + <option value="dingtalk"><i className='i-ri-dingding-fill'></i>{t('dingtalk')}</option> + <option value="wechatWork"><i className='i-ri-wechat-fill'>{t('wechatWork')}</option> + <option value="others"><i className='i-ri-customer-service-2-fill'>{t('others')}</option> </Select> ) } { item.type === 'webhook' && ( - <Tooltip label={t('webhookTooltip')}> - <Input - placeholder={t('webhookContact')} - variant="filled" - w="96" - {...register(`actions.${index}.at`)} - /> + <Tooltip> + <TooltipTrigger> + <Input + placeholder={t('webhookContact')} + variant="filled" + w="96" + {...register(`actions.${index}.at`)} + /> + </TooltipTrigger> + <TooltipContent> + <span>{t('webhookTooltip')}</span> + </TooltipContent> </Tooltip> ) } @@ -607,49 +544,49 @@ const EditAlert: FC<Props> = ({ alert, onSubmit }) => { })} placeholder={item.type === 'email' ? t('inputEmailAddress') : t('inputWebhookURL')} /> - <IconButton - aria-label="delete action" - icon={<RiDeleteBinLine />} + <Button onClick={() => actionsRemove(index)} - type="button" - variant="ghost" - /> - </Flex> + size="icon" + variant="outline" + > + <i className='i-ri-delete-bin-line'></i> + </Button> + </div> <FormErrorMessage w="full"> {errors.actions && errors.actions?.[index]?.uri?.message} </FormErrorMessage> - </Box> + </div> ) }) } </FormControl> - <Menu> - <MenuButton - as={Button} - size="sm" - variant="outline" - > - {t('addAction')} - </MenuButton> - <MenuList> - <MenuOptionGroup - onChange={value => handleAddAction(value as Action['type'])} - value="" + <DropdownMenu> + <DropdownMenuTrigger> + <Button + size="sm" + variant="outline" > + {t('addAction')} + </Button> + </DropdownMenuTrigger> + <DropdownMenuContent> + <DropdownMenuGroup> { ActionOptions.map(item => ( - <MenuItemOption + <DropdownMenuItem key={item} - value={item} + onClick={()=>{ + handleAddAction(item) + }} > {item} - </MenuItemOption> + </DropdownMenuItem> )) } - </MenuOptionGroup> - </MenuList> - </Menu> - </Box> + </DropdownMenuGroup> + </DropdownMenuContent> + </DropdownMenu> + </div> <FormControl isInvalid={!!errors.name}> <FormLabel htmlFor="name">{t('alertName')}</FormLabel> @@ -665,17 +602,17 @@ const EditAlert: FC<Props> = ({ alert, onSubmit }) => { </FormErrorMessage> </FormControl> - <Box mt="6"> + <div className='mt-6'> <Button type="submit" - w="full" + className='w-full' > { alert ? t('updateAlert') : t('createAlert') } </Button> - </Box> - </Flex> + </div> + </form> ) } diff --git a/packages/web/components/event-detail-action.tsx b/packages/web/components/event-detail-action.tsx index 42b99eb..e9723d3 100644 --- a/packages/web/components/event-detail-action.tsx +++ b/packages/web/components/event-detail-action.tsx @@ -1,15 +1,15 @@ 'use client' -import { Flex, Tag, TagLabel, TagLeftIcon, Tooltip, VStack } from '@chakra-ui/react' import dayjs from 'dayjs' import { useMemo } from 'react' import { type OhbugEventLike } from 'common' import { type FC } from 'react' import { type OhbugAction } from '@ohbug/types' -import { Box } from './ui' import Wrapper from './wrapper' import CardSection from './card-section' import { getMessageAndIconByActionType } from '~/libs/utils' +import { Badge } from '~/components/ui/badge' +import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' interface Props { event: OhbugEventLike @@ -25,80 +25,50 @@ const EventDetailActions: FC<Props> = ({ event }) => { }, ], [event]) return ( - <Box> - <Wrapper> - <CardSection title="Event Actions"> - <VStack - maxH="xl" - overflowY="auto" - spacing="4" - > - { - actions.map((action, index) => { - const { message, icon, color } = getMessageAndIconByActionType(action) - return ( - <Flex - align="center" - gap="2" - justify="space-between" - key={action.timestamp + action.data} - w="full" - > - <Box - position="relative" - w="36" - > - <Tag colorScheme={color}> - <TagLeftIcon as={icon} /> - <TagLabel - fontWeight="semibold" - > - {action.type} - </TagLabel> - </Tag> - { - index !== actions.length - 1 && ( - <Box - border="1px" - borderColor="current" - borderLeft="0" - borderY="0" - h="full" - left="4" - position="absolute" - w="0" - /> - ) - } - </Box> + <Wrapper> + <CardSection title="Event Actions"> + <div className='flex flex-col gap-4 max-h-56 overflow-y-auto'> + { + actions.map((action, index) => { + const { message, icon, color } = getMessageAndIconByActionType(action) + return ( + <div + className='flex items-center justify-between gap-2 w-full' + key={action.timestamp + action.data} + > + <div className='relative w-36'> + <Badge style={{backgroundColor: color}}> + {icon} + <span className='font-semibold'>{action.type}</span> + </Badge> + { + index !== actions.length - 1 && ( + <div className='border-r absolute left-4 h-full w-full' /> + ) + } + </div> - <Box flex="1"> - <Box - fontSize="sm" - textColor="gray" - > - {message} - </Box> - </Box> + <div className='flex-1'> + <span className='text-sm text-stone-500'>{message}</span> + </div> - <Tooltip - label={dayjs(action.timestamp).format('YYYY-MM-DD HH:mm:ss')} - > - <Box - fontSize="sm" - textColor="gray" - > + <Tooltip> + <TooltipTrigger> + <span className='text-sm text-stone-500'> {dayjs(action.timestamp).format('HH:mm:ss')} - </Box> - </Tooltip> - </Flex> - ) - }) - } - </VStack> - </CardSection> - </Wrapper> - </Box> + </span> + </TooltipTrigger> + <TooltipContent> + <span>{dayjs(action.timestamp).format('YYYY-MM-DD HH:mm:ss')}</span> + </TooltipContent> + </Tooltip> + </div> + ) + }) + } + </div> + </CardSection> + </Wrapper> ) } diff --git a/packages/web/components/event-detail-profile.tsx b/packages/web/components/event-detail-profile.tsx index a29b506..e7266ac 100644 --- a/packages/web/components/event-detail-profile.tsx +++ b/packages/web/components/event-detail-profile.tsx @@ -7,7 +7,7 @@ import { Icon, Link, Stat, StatGroup, StatHelpText, StatLabel, Tag, Tooltip, Wra import { useTranslations } from 'next-intl' import { type FC } from 'react' import { type OhbugEventLike } from 'common' -import { Box } from './ui' +import { Box } from '~/components/ui/box' import Wrapper from './wrapper' import CardSection from './card-section' import { getDeviceInfo } from '~/libs/utils' diff --git a/packages/web/components/event-detail-stack.tsx b/packages/web/components/event-detail-stack.tsx index 1ff41e9..819de2c 100644 --- a/packages/web/components/event-detail-stack.tsx +++ b/packages/web/components/event-detail-stack.tsx @@ -3,7 +3,7 @@ import { type FC } from 'react' import { type OhbugEventLike } from 'common' import StackInfo from './stack-info' -import { Box } from './ui' +import { Box } from '~/components/ui/box' import Wrapper from './wrapper' import CardSection from './card-section' import { renderStringOrJson } from '~/libs/utils' diff --git a/packages/web/components/event-detail-trend.tsx b/packages/web/components/event-detail-trend.tsx index d9b86d3..568c228 100644 --- a/packages/web/components/event-detail-trend.tsx +++ b/packages/web/components/event-detail-trend.tsx @@ -6,7 +6,7 @@ import { useTranslations } from 'next-intl' import { type FC } from 'react' import { type Issue } from 'common' import TrendChart from './trend-chart' -import { Box } from './ui' +import { Box } from '~/components/ui/box' import Wrapper from './wrapper' import CardSection from './card-section' import { type IssueTrend } from '~/services/issues' diff --git a/packages/web/components/event-detail-user.tsx b/packages/web/components/event-detail-user.tsx index 6d3c087..b78b8f7 100644 --- a/packages/web/components/event-detail-user.tsx +++ b/packages/web/components/event-detail-user.tsx @@ -3,7 +3,7 @@ import dynamic from 'next/dynamic' import { type FC } from 'react' import { type OhbugEventLike } from 'common' -import { Box } from './ui' +import { Box } from '~/components/ui/box' import Wrapper from './wrapper' import CardSection from './card-section' diff --git a/packages/web/components/events-list.tsx b/packages/web/components/events-list.tsx index 660cb62..a90d155 100644 --- a/packages/web/components/events-list.tsx +++ b/packages/web/components/events-list.tsx @@ -5,9 +5,9 @@ import dayjs from 'dayjs' import { type FC, useCallback } from 'react' import { type Event } from '@prisma/client' import { type OhbugEventLike } from 'common' -import { Table, TableBody, TableCell, TableColumn, TableHeader, TableRow } from '@nextui-org/react' import { renderStringOrJson } from '~/libs/utils' import useCurrentProject from '~/hooks/use-current-project' +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '~/components/ui/table' const columns = [ { name: 'TITLE', key: 'description' }, @@ -28,7 +28,7 @@ interface Props { const EventsList: FC<Props> = ({ events }) => { const { projectId } = useCurrentProject() - const renderCell = useCallback((event: Event, columnKey: Key) => { + const renderCell = useCallback((event: Event | OhbugEventLike, columnKey: string) => { switch (columnKey) { case 'description': return ( @@ -77,35 +77,39 @@ const EventsList: FC<Props> = ({ events }) => { }, []) return ( - <Table className="w-full overflow-x-auto"> - <TableHeader columns={columns}> + <Table className='rounded-lg border'> + <TableHeader> { - column => ( - <TableColumn - align="start" + columns.map(column => ( + <TableHead + className='text-left' key={column.key} > {column.name} - </TableColumn> - ) + </TableHead> + )) } </TableHeader> - <TableBody - emptyContent="No rows to display." - items={events} - > + <TableBody> { events - ? item => ( - <TableRow key={item.id}> + ? events.map(event => ( + <TableRow key={event.id}> { - columnKey => ( - <TableCell>{renderCell(item, columnKey)}</TableCell> - ) + Object.keys(event).map(columnKey => ( + <TableCell>{renderCell(event, columnKey)}</TableCell> + )) } </TableRow> - ) - : [] + )) + : (<TableRow> + <TableCell + colSpan={columns.length} + className="h-24 text-center" + > + No results. + </TableCell> + </TableRow>) } </TableBody> </Table> diff --git a/packages/web/components/feedbacks-list.tsx b/packages/web/components/feedbacks-list.tsx index b904f58..aa6e090 100644 --- a/packages/web/components/feedbacks-list.tsx +++ b/packages/web/components/feedbacks-list.tsx @@ -1,12 +1,12 @@ 'use client' -import { Table, TableContainer, Tbody, Td, Th, Thead, Tr } from '@chakra-ui/react' import Link from 'next/link' import dayjs from 'dayjs' import type { FC } from 'react' import type { EventUser, Feedback } from '@prisma/client' import { renderStringOrJson } from '~/libs/utils' import useCurrentProject from '~/hooks/use-current-project' +import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from '~/components/ui/table' interface Props { feedbacks?: (Feedback & { user: EventUser })[] @@ -16,37 +16,35 @@ const FeedbacksList: FC<Props> = ({ feedbacks }) => { const { projectId } = useCurrentProject() return ( - <TableContainer> - <Table className="w-full table table-compact"> - <Thead> - <Tr> - <Th>feedback</Th> - <Th>createdAt</Th> - <Th>user</Th> - </Tr> - </Thead> - <Tbody> - { - feedbacks?.map((feedback) => { - const detail = feedback.detail as any - return ( - <Tr key={feedback.id}> - <Td> - <Link href={`/${projectId}/feedbacks/${feedback.id}`}> - {detail.feedback} - </Link> - </Td> - <Td> - {dayjs(feedback.createdAt).format('YYYY-MM-DD HH:mm:ss')} - </Td> - <Td>{renderStringOrJson(feedback.user)}</Td> - </Tr> - ) - }) - } - </Tbody> - </Table> - </TableContainer> + <Table className="rounded-md border"> + <TableHeader> + <TableRow> + <TableHead>feedback</TableHead> + <TableHead>createdAt</TableHead> + <TableHead>user</TableHead> + </TableRow> + </TableHeader> + <TableBody> + { + feedbacks?.map((feedback) => { + const detail = feedback.detail as any + return ( + <TableRow key={feedback.id}> + <TableCell> + <Link href={`/${projectId}/feedbacks/${feedback.id}`}> + {detail.feedback} + </Link> + </TableCell> + <TableCell> + {dayjs(feedback.createdAt).format('YYYY-MM-DD HH:mm:ss')} + </TableCell> + <TableCell>{renderStringOrJson(feedback.user)}</TableCell> + </TableRow> + ) + }) + } + </TableBody> + </Table> ) } diff --git a/packages/web/components/intl.tsx b/packages/web/components/intl.tsx index cdcd2b0..0c1235e 100644 --- a/packages/web/components/intl.tsx +++ b/packages/web/components/intl.tsx @@ -1,10 +1,10 @@ 'use client' -import type { ChangeEvent } from 'react' import { useCallback, useTransition } from 'react' import { usePathname } from 'next-intl/client' -import { useRouter } from 'next/navigation' import { useLocale } from 'next-intl' +import { useRouter } from 'next/navigation' +import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '~/components/ui/select' const options = [ { label: '中文', @@ -22,31 +22,31 @@ export default function Intl() { const [isPending, startTransition] = useTransition() const locale = useLocale() - const handleChange = useCallback(async(e: ChangeEvent<HTMLSelectElement>) => { - e.preventDefault() - const value = e.target.value + const handleChange = useCallback(async(value: string) => { startTransition(() => { router.replace(`/${value}${pathname}`) }) }, [pathname]) return ( - <select - className="w-24" - disabled={isPending} - onChange={handleChange} - value={locale} - > - { - options.map(({ label, value }) => ( - <option - key={value} - value={value} - > - {label} - </option> - )) - } - </select> + <Select disabled={isPending} onValueChange={handleChange} value={locale}> + <SelectTrigger className="w-24"> + <SelectValue placeholder="Select a fruit" /> + </SelectTrigger> + <SelectContent> + <SelectGroup> + { + options.map(({ label, value }) => ( + <SelectItem + key={value} + value={value} + > + {label} + </SelectItem> + )) + } + </SelectGroup> + </SelectContent> + </Select> ) } diff --git a/packages/web/components/issue-list.tsx b/packages/web/components/issue-list.tsx index 66d2346..d95d1b3 100644 --- a/packages/web/components/issue-list.tsx +++ b/packages/web/components/issue-list.tsx @@ -7,31 +7,6 @@ import dayjs from 'dayjs' import { useTranslations } from 'next-intl' import { useDebounce, useSet } from 'react-use' import { useAtom } from 'jotai' -import { - Badge, - Button, - Checkbox, - Dropdown, - DropdownItem, - DropdownMenu, - DropdownTrigger, - Input, - Modal, - ModalBody, - ModalContent, - ModalFooter, - ModalHeader, - Switch, - Table, - TableBody, - TableCell, - TableColumn, - TableHeader, - TableRow, - Tooltip, - useDisclosure, -} from '@nextui-org/react' -import { useToast } from '@chakra-ui/react' import { type Key, type ReactNode } from 'react' import TrendChart from './trend-chart' import Pagination from './pagination' @@ -47,8 +22,21 @@ import useCurrentProject from '~/hooks/use-current-project' import { useQuery } from '~/hooks/use-query' import { useInfinite } from '~/hooks/use-infinite' import { issueSortAtom } from '~/atoms/issue' +import { useToast } from '~/components/ui/use-toast' +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '~/components/ui/dropdown-menu' +import { Button } from '~/components/ui/button' +import { Switch } from '~/components/ui/switch' +import { Label } from '~/components/ui/label' +import { Badge } from '~/components/ui/badge' +import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' +import { Input } from '~/components/ui/input' +import { Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow } from '~/components/ui/table' +import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '~/components/ui/dialog' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '~/components/ui/select' +import { Checkbox } from '~/components/ui/checkbox' const columns = [ + { name: 'SELECT', key: 'select' }, { name: 'TITLE', key: 'title' }, { name: 'TRENDS', key: 'trends' }, { name: 'EVENTSCOUNT', key: 'eventsCount' }, @@ -60,11 +48,11 @@ interface Props { } export default function IssueList({ empty }: Props) { - const toast = useToast() + const {toast} = useToast() const t = useTranslations('Issues') const ct = useTranslations('Common') const { projectId } = useCurrentProject() - const { isOpen, onClose, onOpen } = useDisclosure() + const [open, setOpen] = useState(false) const cancelRef = useRef(null) const [orderBy, setOrderBy] = useAtom(issueSortAtom) const [query, setQuery] = useState('') @@ -113,11 +101,6 @@ export default function IssueList({ empty }: Props) { && Array.from(checkedItems ?? []).every(v => (data?.findIndex(issue => issue.id === v) ?? -1) > -1), [checkedItems, data], ) - const isIndeterminate = useMemo( - () => - Array.from(checkedItems ?? []).some(v => (data?.findIndex(issue => issue.id === v) ?? -1) > -1) && !allChecked, - [checkedItems, data, allChecked], - ) const handleDeleteIssue = useCallback(() => { const issueIds = Array.from(checkedItems) serviceDeleteIssues(issueIds) @@ -125,7 +108,6 @@ export default function IssueList({ empty }: Props) { toast({ title: 'Issue Deleted!', description: 'Your issues has been deleted!', - status: 'success', }) mutate() }) @@ -133,90 +115,114 @@ export default function IssueList({ empty }: Props) { toast({ title: 'Alert Delete Error', description: error.message, - status: 'error', + variant: 'destructive', }) }) - .finally(onClose) + .finally(()=>setOpen(false)) }, [checkedItems]) - const renderTitleCell = useCallback((columnKey: Key) => { + const renderTitleCell = useCallback((columnKey: string) => { switch (columnKey) { + case 'select': + return ( + <Checkbox + checked={allChecked} + onCheckedChange={(value) => { + if (value) { + data?.forEach(issue => checkedItemsActions.add(issue.id)) + } + else { + checkedItemsActions.reset() + } + }} + className="translate-y-[2px]" + /> + ) case 'title': return ( - <div className="w-1/2"> + <div> <div className="flex gap-2"> - <select - className="w-40" - onChange={ - e => - setOrderBy(e.target.value as SearchIssuesOrderBy) + <Select + onValueChange={ + e => setOrderBy(e as SearchIssuesOrderBy) } value={orderBy} > - <option value="updatedAt">{t('orderByUpdatedAt')}</option> - <option value="createdAt">{t('orderByCreatedAt')}</option> - <option value="events">{t('orderByEvents')}</option> - <option value="users">{t('orderByUsers')}</option> - </select> + <SelectTrigger className="w-40"> + <SelectValue /> + </SelectTrigger> + <SelectContent> + <SelectItem value="updatedAt">{t('orderByUpdatedAt')}</SelectItem> + <SelectItem value="createdAt">{t('orderByCreatedAt')}</SelectItem> + <SelectItem value="events">{t('orderByEvents')}</SelectItem> + <SelectItem value="users">{t('orderByUsers')}</SelectItem> + </SelectContent> + </Select> - <Dropdown> - <DropdownTrigger> + <DropdownMenu> + <DropdownMenuTrigger asChild> <Button disabled={checkedItems.size <= 0} - isIconOnly - size="sm" - variant="light" + size="icon" + variant="outline" > <i className="i-ri-more-line" /> </Button> - </DropdownTrigger> - <DropdownMenu> - <DropdownItem - color="danger" + </DropdownMenuTrigger> + <DropdownMenuContent className='w-56'> + <DropdownMenuItem key="delete" - onClick={onOpen} + onClick={()=>setOpen(true)} > Delete - </DropdownItem> - </DropdownMenu> - </Dropdown> + </DropdownMenuItem> + </DropdownMenuContent> + </DropdownMenu> </div> </div> ) case 'trends': return ( - <div className="w-48"> + <div className="flex items-center gap-2"> <Switch id="trendsType" - isDisabled={!trends || !data?.length} - isSelected={chartType === '24h'} - onChange={e => setChartType(e ? '24h' : '14d')} + disabled={!trends || !data?.length} + checked={chartType === '24h'} + onCheckedChange={e => setChartType(e ? '24h' : '14d')} > - {chartType === '24h' ? ct('24h') : ct('14d')} </Switch> + <Label htmlFor="trendsType">{chartType === '24h' ? ct('24h') : ct('14d')}</Label> </div> ) case 'eventsCount': return ( - <div className="w-20 flex items-center justify-center">Events</div> + <div className="flex items-center justify-center">Events</div> ) case 'usersCount': return ( - <div className="w-20 flex items-center justify-center">Users</div> + <div className="flex items-center justify-center">Users</div> ) default: return null } - }, []) - const renderCell = useCallback((issue: Issue, columnKey: Key) => { + }, [data, allChecked, checkedItems, trends, data, chartType]) + const renderCell = useCallback((issue: Issue, columnKey: string) => { const metadata = JSON.parse(issue.metadata) || {} switch (columnKey) { + case 'select': + return ( + <Checkbox + checked={checkedItems.has(issue.id)} + onCheckedChange={(value) => checkedItemsActions[value ? 'add' : 'remove'](issue.id)} + className="translate-y-[2px]" + /> + ) case 'title': return ( - <div className="w-1/2"> + <div> <Link - className="cursor-pointer flex justify-between w-full line-clamp-2" + className="cursor-pointer flex items-center w-full line-clamp-2" href={`/${projectId}/issues/${issue.id}`} > {/* title */} @@ -225,9 +231,9 @@ export default function IssueList({ empty }: Props) { issue.releaseStage === 'mock' && ( <Badge className="mr-2" - color="danger" + variant="outline" > - Mock + Mock </Badge> ) } @@ -250,24 +256,24 @@ export default function IssueList({ empty }: Props) { {/* time */} <div className="flex items-center text-xs"> <i className="i-ri-time-line mr-2" /> - <Tooltip - aria-label="A tooltip" - content={ - `${ct('lastSeen')} ${dayjs(issue.updatedAt).format('YYYY-MM-DD HH:mm:ss')}` - } - > - <span>{dayjs(issue.updatedAt).fromNow()}</span> + <Tooltip> + <TooltipTrigger asChild> + <span>{dayjs(issue.updatedAt).fromNow()}</span> + </TooltipTrigger> + <TooltipContent> + <span>{ct('lastSeen')} {dayjs(issue.updatedAt).format('YYYY-MM-DD HH:mm:ss')}</span> + </TooltipContent> </Tooltip> <div className="mx-1">|</div> - <Tooltip - aria-label="A tooltip" - content={ - `${ct('firstSeen')} ${dayjs(issue.createdAt).format('YYYY-MM-DD HH:mm:ss')}` - } - > - <span>{dayjs(issue.createdAt).fromNow()}</span> + <Tooltip> + <TooltipTrigger asChild> + <span>{dayjs(issue.createdAt).fromNow()}</span> + </TooltipTrigger> + <TooltipContent> + <span>{ct('firstSeen')} {dayjs(issue.createdAt).format('YYYY-MM-DD HH:mm:ss')}</span> + </TooltipContent> </Tooltip> </div> </div> @@ -275,7 +281,7 @@ export default function IssueList({ empty }: Props) { ) case 'trends': return ( - <div className="w-48"> + <div> <TrendChart data={trends?.[issue.id]} type={chartType} @@ -284,109 +290,112 @@ export default function IssueList({ empty }: Props) { ) case 'eventsCount': return ( - <div className="flex items-center justify-center w-20"> + <div className="flex items-center justify-center"> {issue._count?.events} </div> ) case 'usersCount': return ( - <div className="flex items-center justify-center w-20"> + <div className="flex items-center justify-center"> {issue._count?.users} </div> ) default: return null } - }, []) + }, [checkedItems, projectId, trends, chartType]) return ( - <div className="h-full overflow-x-hidden overflow-y-auto w-full"> - <div className="mb-4 w-full"> - <Input - onChange={e => setQuery(e.target.value)} - placeholder="Search..." - startContent={ - isLoading ? <Spinning /> : <i className="i-ri-search-line" /> - } - value={query} - /> - </div> + <div className="h-full overflow-x-hidden overflow-y-auto space-y-4"> + <Input + onChange={e => setQuery(e.target.value)} + placeholder="Search..." + value={query} + /> - <Table aria-label="Issues Table"> - <TableHeader columns={columns}> + <Table className='rounded-md border'> + <TableCaption> { - column => ( - <TableColumn - align="start" - key={column.key} - > - {renderTitleCell(column.key)} - </TableColumn> + !!data?.length && ( + <div className="flex items-center justify-between w-full"> + <Link href={`/${projectId}/mock`}>Mock Data</Link> + <Pagination + isReachingEnd={!!isReachingEnd} + onChange={page => setSize(page - 1)} + page={size + 1} + /> + </div> ) } + </TableCaption> + <TableHeader> + <TableRow> + { + columns.map(column => ( + <TableHead + key={column.key} + className='text-left' + > + {renderTitleCell(column.key)} + </TableHead> + )) + } + </TableRow> </TableHeader> - <TableBody - emptyContent="No rows to display." - items={data} - > + <TableBody> { data - ? item => ( - <TableRow key={item.id}> + ? data.map(issue => ( + <TableRow key={issue.id}> { - columnKey => ( - <TableCell>{renderCell(item, columnKey)}</TableCell> - ) + columns.map(column => ( + <TableCell>{renderCell(issue, column.key)}</TableCell> + )) } </TableRow> - ) - : [] + )) + : ( + <TableRow> + <TableCell colSpan={columns.length}> + {isLoading ? <Spinning /> : empty} + </TableCell> + </TableRow> + ) } </TableBody> </Table> - { - !!data?.length && ( - <div className="flex items-center justify-between mt-6 w-full"> - <Link href={`/${projectId}/mock`}>Mock Data</Link> - <Pagination - isReachingEnd={!!isReachingEnd} - onChange={page => setSize(page - 1)} - page={size + 1} - /> - </div> - ) - } - <Modal - isOpen={isOpen} - onClose={onClose} + + <Dialog + open={open} + onOpenChange={setOpen} > - <> - <ModalHeader className="text-lg font-bold"> - Are you sure you want to delete this {checkedItems.size} issue? - </ModalHeader> - <ModalContent> - <ModalBody>{t('deleteIssuesConfirm')}</ModalBody> - </ModalContent> - <ModalFooter> + <DialogContent> + <DialogHeader className="text-lg font-bold"> + <DialogTitle> + Are you sure you want to delete this {checkedItems.size} issue? + </DialogTitle> + </DialogHeader> + <div>{t('deleteIssuesConfirm')}</div> + <DialogFooter> <Button - onClick={onClose} + onClick={()=>setOpen(false)} ref={cancelRef} - variant="light" + variant="outline" > Cancel </Button> <Button className="ml-3" - color="danger" + variant="destructive" onClick={handleDeleteIssue} > Delete </Button> - </ModalFooter> - </> - </Modal> + </DialogFooter> + </DialogContent> + </Dialog> </div> ) } diff --git a/packages/web/components/issue-related-metadata.tsx b/packages/web/components/issue-related-metadata.tsx index 52f433e..0215ede 100644 --- a/packages/web/components/issue-related-metadata.tsx +++ b/packages/web/components/issue-related-metadata.tsx @@ -5,7 +5,7 @@ import { useMemo } from 'react' import { type OhbugEventLike } from 'common' import { type FC } from 'react' import CardSection from './card-section' -import { Box } from './ui' +import { Box } from '~/components/ui/box' import Wrapper from './wrapper' const DynamicReactJson = dynamic(import('react-json-view'), { ssr: false }) diff --git a/packages/web/components/layout.tsx b/packages/web/components/layout.tsx index c054d7a..7171b14 100644 --- a/packages/web/components/layout.tsx +++ b/packages/web/components/layout.tsx @@ -9,7 +9,7 @@ import NavMenu from './nav-menu' import User from './user' import Logo from './logo' import Footer from './footer' -import { Box } from './ui/box' +import { Box } from '~/components/ui/box' import Wrapper from './wrapper' import { scrollWindowTo } from '~/libs/utils' diff --git a/packages/web/components/load-more-button.tsx b/packages/web/components/load-more-button.tsx index b63561f..0397c38 100644 --- a/packages/web/components/load-more-button.tsx +++ b/packages/web/components/load-more-button.tsx @@ -1,7 +1,7 @@ 'use client' -import { Button } from '~/components/ui/button' import type { MouseEventHandler } from 'react' +import { Button } from '~/components/ui/button' interface Props { isLoading?: boolean @@ -16,6 +16,7 @@ export default function LoadingMoreButton({ isLoading, isReachingEnd, onClick }: disabled={isLoading || isReachingEnd} onClick={onClick} size="sm" + variant="outline" > { isLoading diff --git a/packages/web/components/logo.tsx b/packages/web/components/logo.tsx index e94ff77..c1677e8 100644 --- a/packages/web/components/logo.tsx +++ b/packages/web/components/logo.tsx @@ -3,9 +3,9 @@ import type { CSSProperties } from 'react' import { forwardRef } from 'react' import Link from 'next/link' -import { useColorMode } from '@chakra-ui/react' import Image from 'next/image' import { twMerge } from 'tailwind-merge' +import { useTheme } from 'next-themes' interface Props { className?: string @@ -14,7 +14,8 @@ interface Props { } const Logo = forwardRef<HTMLAnchorElement, Props>((props, ref) => { - const { colorMode } = useColorMode() + const { theme } = useTheme() + return ( <Link href="/" @@ -26,7 +27,7 @@ const Logo = forwardRef<HTMLAnchorElement, Props>((props, ref) => { alt="logo" fill priority - src={colorMode === 'dark' ? '/logo-white.svg' : '/logo.svg'} + src={theme === 'dark' ? '/logo-white.svg' : '/logo.svg'} /> </Link> ) diff --git a/packages/web/components/nav-container.tsx b/packages/web/components/nav-container.tsx index e2e696d..15585f9 100644 --- a/packages/web/components/nav-container.tsx +++ b/packages/web/components/nav-container.tsx @@ -29,7 +29,7 @@ const NavContainer: FC<Props> = ({ children, navs }) => { > <Button fontWeight={nav.active ? 'bold' : 'normal'} - variant="ghost" + variant="outline" > {nav.label} </Button> diff --git a/packages/web/components/nav-menu.tsx b/packages/web/components/nav-menu.tsx index d49d332..c471eab 100644 --- a/packages/web/components/nav-menu.tsx +++ b/packages/web/components/nav-menu.tsx @@ -2,9 +2,9 @@ import { useCallback, useMemo } from 'react' import { usePathname, useRouter } from 'next-intl/client' -import { Tab, Tabs } from '@nextui-org/react' import { type FC, type Key } from 'react' import useCurrentProject from '~/hooks/use-current-project' +import { Tabs, TabsList, TabsTrigger } from '~/components/ui/tabs' interface NavMenuItem { label: string @@ -72,23 +72,22 @@ const NavMenu: FC = () => { return ( <Tabs className="flex items-center gap-4 h-full w-full" - onSelectionChange={handleSelectionChange} - selectedKey={active?.link} - size="lg" - variant="light" + onValueChange={handleSelectionChange} + value={active?.link} > - { - navMenuList.map((item) => { - return ( - <Tab - className="flex items-center h-full" - key={item.link} - title={item.label} - /> - ) - }) - } - + <TabsList> + { + navMenuList.map((item) => { + return ( + <TabsTrigger + value={item.link} + > + {item.label} + </TabsTrigger> + ) + }) + } + </TabsList> </Tabs> ) } diff --git a/packages/web/components/pagination.tsx b/packages/web/components/pagination.tsx index 22260c7..0dbbeed 100644 --- a/packages/web/components/pagination.tsx +++ b/packages/web/components/pagination.tsx @@ -1,18 +1,15 @@ 'use client' -import type { FlexProps } from '@chakra-ui/react' -import { ButtonGroup, Flex, IconButton } from '@chakra-ui/react' -import type { FC } from 'react' import { useCallback } from 'react' -import { RiArrowLeftSLine, RiArrowRightSLine } from 'react-icons/ri' +import { Button } from '~/components/ui/button' -interface Props extends Omit<FlexProps, 'onChange'> { +interface Props { page: number onChange: (page: number) => void isReachingEnd: boolean } -const Pagination: FC<Props> = ({ page = 1, onChange, isReachingEnd, ...props }) => { +export default function Pagination({ page = 1, onChange, isReachingEnd, ...props }: Props) { const handlePrev = useCallback(() => { const _page = page - 1 const value = _page > 0 ? _page : 1 @@ -25,34 +22,28 @@ const Pagination: FC<Props> = ({ page = 1, onChange, isReachingEnd, ...props }) }, [page]) return ( - <Flex - align="center" - gap="4" - justify="end" + <div + className='flex items-center justify-end gap-2' {...props} > - <ButtonGroup - isAttached - size="sm" + <Button variant="outline" + className="h-8 w-8 p-0" + onClick={handlePrev} + disabled={page <= 1} > - <IconButton - aria-label="left" - cursor="pointer" - disabled={page <= 1} - icon={<RiArrowLeftSLine />} - onClick={handlePrev} - /> - <IconButton - aria-label="right" - cursor="pointer" - disabled={isReachingEnd} - icon={<RiArrowRightSLine />} - onClick={handleNext} - /> - </ButtonGroup> - </Flex> + <span className="sr-only">Go to previous page</span> + <i className="i-ri-arrow-left-s-line" /> + </Button> + <Button + variant="outline" + className="h-8 w-8 p-0" + disabled={isReachingEnd} + onClick={handleNext} + > + <span className="sr-only">Go to next page</span> + <i className="i-ri-arrow-right-s-line" /> + </Button> + </div> ) } - -export default Pagination diff --git a/packages/web/components/project-card.tsx b/packages/web/components/project-card.tsx index 60860ee..e9a4368 100644 --- a/packages/web/components/project-card.tsx +++ b/packages/web/components/project-card.tsx @@ -1,7 +1,5 @@ 'use client' -import { Card, CardBody } from '@nextui-org/react' -import { Avatar, Text } from '@chakra-ui/react' import Link from 'next/link' import { type ProjectWithEventCount } from 'common' import Loading from './loading' @@ -9,6 +7,8 @@ import TrendChart from './trend-chart' import { type ProjectTrend } from '~/services/projects' import { serviceGetProjectTrends } from '~/services/projects' import { useQuery } from '~/hooks/use-query' +import { Card, CardContent, CardHeader } from '~/components/ui/card' +import { Avatar, AvatarFallback, AvatarImage } from '~/components/ui/avatar' interface Props { project: ProjectWithEventCount @@ -25,27 +25,22 @@ export default function ProjectCard({ project }: Props) { return ( <Link href={`/${project.id}/profile`}> - <Card isBlurred> - <CardBody> + <Card> + <CardHeader></CardHeader> + <CardContent> <div className="flex gap-6"> - <Avatar - name={project.name} - src={project.image ?? ''} - /> - <div> - <Text - cursor="pointer" - fontWeight="semibold" - > + <Avatar> + <AvatarImage src={project.image ?? ''} alt={project.name}></AvatarImage> + <AvatarFallback>{project.name}</AvatarFallback> + </Avatar> + <div className='space-x-6'> + <span className='cursor-pointer font-semibold'> {project.name} - </Text> + </span> - <Text - fontSize="xs" - textColor="gray.500" - > - Events: {project.eventCount ?? 0} - </Text> + <span className='text-xs text-stone-500'> + Events: {project.eventCount ?? 0} + </span> </div> </div> @@ -61,7 +56,7 @@ export default function ProjectCard({ project }: Props) { ) } </div> - </CardBody> + </CardContent> </Card> </Link> ) diff --git a/packages/web/components/project.tsx b/packages/web/components/project.tsx index a87ef79..a2bd18a 100644 --- a/packages/web/components/project.tsx +++ b/packages/web/components/project.tsx @@ -1,17 +1,21 @@ 'use client' import type { FC } from 'react' -import { useCallback, useEffect, useMemo } from 'react' -import { Avatar, Center, Icon, IconButton, Menu, MenuButton, MenuDivider, MenuGroup, MenuItem, MenuItemOption, MenuList, MenuOptionGroup, Text } from '@chakra-ui/react' -import { Link } from '@chakra-ui/next-js' +import { useCallback, useEffect, useMemo, useState } from 'react' +import Link from 'next/link' import type { User } from '@prisma/client' -import { RiAddLine, RiMore2Line } from 'react-icons/ri' import { usePathname, useRouter } from 'next-intl/client' import { useSession } from 'next-auth/react' import Loading from './loading' import { useStore } from '~/store' import { serviceGetProjectsWithEventCount } from '~/services/projects' import { useQuery } from '~/hooks/use-query' +import { Avatar, AvatarFallback, AvatarImage } from '~/components/ui/avatar' +import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuSeparator, DropdownMenuShortcut } from '~/components/ui/dropdown-menu' +import { Button } from '~/components/ui/button' +import { Popover, PopoverContent, PopoverTrigger } from '~/components/ui/popover' +import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator } from '~/components/ui/command' +import { cn } from '~/libs/utils' const ProjectComponent: FC = () => { const router = useRouter() @@ -24,6 +28,7 @@ const ProjectComponent: FC = () => { const currentProject = useStore(state => state.project) const setCurrentProject = useStore(state => state.setProject) const loading = useMemo(() => !projects, [projects]) + const [open, setOpen] = useState(false) useEffect(() => { const target = projects?.find(project => project.default) ?? projects?.[0] @@ -48,61 +53,65 @@ const ProjectComponent: FC = () => { } return ( - <Center gap="2"> - <Avatar - name={currentProject?.name} - size="xs" - src={currentProject?.image ?? ''} - /> - <Link href={`/${currentProject?.id}/profile`}> - {currentProject?.name} - </Link> - <Menu> - <MenuButton - aria-label="more" - as={IconButton} - icon={<RiMore2Line />} - variant="ghost" - /> - - <MenuList> - <MenuOptionGroup - onChange={handleSelectProject} - value={currentProject?.id.toString()} + <Popover open={open} onOpenChange={setOpen}> + <PopoverTrigger asChild> + <Button + variant="outline" + role="combobox" + aria-expanded={open} + aria-label="Select a team" + className="w-[200px] justify-between" > - { - projects?.map(project => ( - <MenuItemOption - key={project.id} - value={project.id.toString()} - > - <Text>{project.name}</Text> - </MenuItemOption> - )) - } - </MenuOptionGroup> - - <MenuDivider /> - - <MenuGroup> - <MenuItem - icon={ - ( - <Icon - as={RiAddLine} - h="6" - w="6" - /> - ) - } - onClick={handleCreateProject} - > - Create Project - </MenuItem> - </MenuGroup> - </MenuList> - </Menu> - </Center> + <Avatar className="mr-2 h-5 w-5"> + <AvatarImage src={currentProject?.image ?? ''} alt={currentProject?.name} /> + <AvatarFallback>{currentProject?.name}</AvatarFallback> + </Avatar> + {currentProject?.name} + <i className='i-ri-expand-up-down-line ml-auto h-4 w-4 shrink-0 opacity-50'></i> + </Button> + </PopoverTrigger> + <PopoverContent className="w-[200px] p-0"> + <Command> + <CommandList> + <CommandInput placeholder="Search team..." /> + <CommandEmpty>No team found.</CommandEmpty> + <CommandGroup> + {projects?.map((project) => ( + <CommandItem + key={project.id} + onSelect={() => { + setOpen(false) + handleSelectProject(project.id.toString()) + }} + className="text-sm" + > + <Avatar className="mr-2 h-5 w-5"> + <AvatarImage src={project.image ?? ''} alt={project.name} /> + <AvatarFallback>{project.name}</AvatarFallback> + </Avatar> + {project.name} + <i className={cn( + "'i-ri-check-line' ml-auto h-4 w-4", + project.id.toString() === currentProject?.id.toString() + ? "opacity-100" + : "opacity-0" + )}></i> + </CommandItem> + ))} + </CommandGroup> + </CommandList> + <CommandSeparator /> + <CommandList> + <CommandGroup> + <CommandItem onClick={handleCreateProject}> + <i className='i-ri-add-line mr-2'></i> + Create Project + </CommandItem> + </CommandGroup> + </CommandList> + </Command> + </PopoverContent> + </Popover> ) } diff --git a/packages/web/components/release-list.tsx b/packages/web/components/release-list.tsx index 27e046e..405f3a7 100644 --- a/packages/web/components/release-list.tsx +++ b/packages/web/components/release-list.tsx @@ -3,19 +3,22 @@ import type { FC } from 'react' import { useCallback } from 'react' import dayjs from 'dayjs' -import { Box, Flex, IconButton, Menu, MenuButton, MenuItem, MenuList, Text, Tooltip, useToast } from '@chakra-ui/react' import Link from 'next/link' import type { Release } from '@prisma/client' -import { RiMoreLine } from 'react-icons/ri' import useCurrentProject from '~/hooks/use-current-project' import { serviceDeleteRelease } from '~/services/releases' +import { useToast } from '~/components/ui/use-toast' +import { Box } from '~/components/ui/box' +import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' +import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from '~/components/ui/dropdown-menu' +import { Button } from '~/components/ui/button' interface Props { releases: Release[] mutate: () => Promise<void> } const ReleaseList: FC<Props> = ({ releases, mutate }) => { - const toast = useToast() + const {toast} = useToast() const { projectId } = useCurrentProject() const onDelete = useCallback((id: number) => { @@ -24,7 +27,6 @@ const ReleaseList: FC<Props> = ({ releases, mutate }) => { toast({ title: 'Release Deleted!', description: 'Your release has been deleted!', - status: 'success', }) mutate() }) @@ -32,87 +34,63 @@ const ReleaseList: FC<Props> = ({ releases, mutate }) => { toast({ title: 'Release Delete Error', description: error.message, - status: 'error', + variant: 'destructive', }) }) }, [mutate]) return ( - <Box - h="full" - overflowX="hidden" - overflowY="auto" - rounded="lg" - w="full" - > + <Box className='h-full w-full overflow-x-hidden overflow-y-auto rounded-lg'> { releases.map(release => ( - <Flex key={release.id}> - <Flex - direction="column" - flex="1" - > - <Text fontWeight="semibold">{release.appVersion}</Text> - <Text - as="span" - color="dimgray" - > + <div key={release.id}> + <div className='flex flex-col flex-1'> + <span className='font-semibold'>{release.appVersion}</span> + <span> {release.appType} - </Text> - </Flex> - <Flex - direction="column" - flex="1" - > - <Text - as="span" - fontWeight="semibold" - > - sourceMap files - </Text> + </span> + </div> + <div className='flex flex-col flex-1'> + <span className='font-semibold'>sourceMap files</span> <Link - fontWeight="semibold" + className='font-semibold' href={`/${projectId}/releases/${release.id}/sourceMaps`} > {(release.sourceMaps as Array<any>)?.length} </Link> - </Flex> - <Flex - align="center" - flex="1" - gap="2" - justify="end" - > - <Tooltip label={dayjs(release.createdAt).format('YYYY-MM-DD HH:mm:ss')}> - <Text - as="span" - color="gray" - > - {dayjs(release.createdAt).fromNow()} - </Text> + </div> + <div className='flex items-center justify-end gap-2 flex-1'> + <Tooltip> + <TooltipTrigger> + <span className='text-stone-500'> + {dayjs(release.createdAt).fromNow()} + </span></TooltipTrigger> + <TooltipContent> + <span>{dayjs(release.createdAt).format('YYYY-MM-DD HH:mm:ss')}</span> + </TooltipContent> </Tooltip> - <Menu> - <MenuButton - as={IconButton} - icon={<RiMoreLine />} - size="sm" - variant="ghost" - /> - <MenuList> - <MenuItem - onClick={ - () => { - onDelete(release.id) + <DropdownMenu> + <DropdownMenuTrigger asChild> + <Button size="icon" variant="outline"> + <i className="i-ri-more-line" /> + </Button> + </DropdownMenuTrigger> + <DropdownMenuContent className="w-56"> + <DropdownMenuGroup> + <DropdownMenuItem + onClick={ + () => { + onDelete(release.id) + } } - } - textColor="red" - > - Delete - </MenuItem> - </MenuList> - </Menu> - </Flex> - </Flex> + > + Delete + </DropdownMenuItem> + </DropdownMenuGroup> + </DropdownMenuContent> + </DropdownMenu> + </div> + </div> )) } </Box> diff --git a/packages/web/components/spinning.tsx b/packages/web/components/spinning.tsx index 85b5a38..d267b46 100644 --- a/packages/web/components/spinning.tsx +++ b/packages/web/components/spinning.tsx @@ -4,11 +4,7 @@ import type { FC } from 'react' const Spinning: FC = () => { return ( - <div - className="animate-spin" - > - <i className="i-ri-loader-2-line" /> - </div> + <i className="i-ri-loader-2-line w-6 h-6 animate-spin" /> ) } diff --git a/packages/web/components/theme.tsx b/packages/web/components/theme.tsx index d592320..480c77f 100644 --- a/packages/web/components/theme.tsx +++ b/packages/web/components/theme.tsx @@ -7,8 +7,8 @@ import { DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, -} from './ui/dropdown-menu' -import { Button } from './ui/button' +} from '~/components/ui/dropdown-menu' +import { Button } from '~/components/ui/button' const Theme: FC = () => { const { setTheme } = useTheme() diff --git a/packages/web/components/title.tsx b/packages/web/components/title.tsx index 42a654d..3e3c87f 100644 --- a/packages/web/components/title.tsx +++ b/packages/web/components/title.tsx @@ -2,8 +2,8 @@ import { type ReactNode } from 'react' import Wrapper from './wrapper' -import { Box } from './ui/box' -import { type BoxProps } from './ui/box' +import { Box } from '~/components/ui/box' +import { type BoxProps } from '~/components/ui/box' interface Props extends BoxProps { children: ReactNode diff --git a/packages/web/components/ui/accordion.tsx b/packages/web/components/ui/accordion.tsx new file mode 100644 index 0000000..4d89d2a --- /dev/null +++ b/packages/web/components/ui/accordion.tsx @@ -0,0 +1,60 @@ +"use client" + +import * as React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDown } from "lucide-react" + +import { cn } from "~/libs/utils" + +const Accordion = AccordionPrimitive.Root + +const AccordionItem = React.forwardRef< + React.ElementRef<typeof AccordionPrimitive.Item>, + React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item> +>(({ className, ...props }, ref) => ( + <AccordionPrimitive.Item + ref={ref} + className={cn("border-b", className)} + {...props} + /> +)) +AccordionItem.displayName = "AccordionItem" + +const AccordionTrigger = React.forwardRef< + React.ElementRef<typeof AccordionPrimitive.Trigger>, + React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger> +>(({ className, children, ...props }, ref) => ( + <AccordionPrimitive.Header className="flex"> + <AccordionPrimitive.Trigger + ref={ref} + className={cn( + "flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180", + className + )} + {...props} + > + {children} + <ChevronDown className="h-4 w-4 shrink-0 transition-transform duration-200" /> + </AccordionPrimitive.Trigger> + </AccordionPrimitive.Header> +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +const AccordionContent = React.forwardRef< + React.ElementRef<typeof AccordionPrimitive.Content>, + React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content> +>(({ className, children, ...props }, ref) => ( + <AccordionPrimitive.Content + ref={ref} + className={cn( + "overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down", + className + )} + {...props} + > + <div className="pb-4 pt-0">{children}</div> + </AccordionPrimitive.Content> +)) +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/packages/web/components/ui/badge.tsx b/packages/web/components/ui/badge.tsx new file mode 100644 index 0000000..ce9e25b --- /dev/null +++ b/packages/web/components/ui/badge.tsx @@ -0,0 +1,36 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "~/libs/utils" + +const badgeVariants = cva( + "inline-flex items-center rounded-full border border-stone-200 px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-stone-950 focus:ring-offset-2 dark:border-stone-800 dark:focus:ring-stone-300", + { + variants: { + variant: { + default: + "border-transparent bg-stone-900 text-stone-50 hover:bg-stone-900/80 dark:bg-stone-50 dark:text-stone-900 dark:hover:bg-stone-50/80", + secondary: + "border-transparent bg-stone-100 text-stone-900 hover:bg-stone-100/80 dark:bg-stone-800 dark:text-stone-50 dark:hover:bg-stone-800/80", + destructive: + "border-transparent bg-red-500 text-stone-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-stone-50 dark:hover:bg-red-900/80", + outline: "text-stone-950 dark:text-stone-50", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +export interface BadgeProps + extends React.HTMLAttributes<HTMLDivElement>, + VariantProps<typeof badgeVariants> {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( + <div className={cn(badgeVariants({ variant }), className)} {...props} /> + ) +} + +export { Badge, badgeVariants } diff --git a/packages/web/components/ui/checkbox.tsx b/packages/web/components/ui/checkbox.tsx new file mode 100644 index 0000000..1cf6c06 --- /dev/null +++ b/packages/web/components/ui/checkbox.tsx @@ -0,0 +1,30 @@ +"use client" + +import * as React from "react" +import * as CheckboxPrimitive from "@radix-ui/react-checkbox" +import { Check } from "lucide-react" + +import { cn } from "~/libs/utils" + +const Checkbox = React.forwardRef< + React.ElementRef<typeof CheckboxPrimitive.Root>, + React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root> +>(({ className, ...props }, ref) => ( + <CheckboxPrimitive.Root + ref={ref} + className={cn( + "peer h-4 w-4 shrink-0 rounded-sm border border-stone-200 border-stone-900 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stone-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-stone-900 data-[state=checked]:text-stone-50 dark:border-stone-800 dark:border-stone-50 dark:ring-offset-stone-950 dark:focus-visible:ring-stone-300 dark:data-[state=checked]:bg-stone-50 dark:data-[state=checked]:text-stone-900", + className + )} + {...props} + > + <CheckboxPrimitive.Indicator + className={cn("flex items-center justify-center text-current")} + > + <Check className="h-4 w-4" /> + </CheckboxPrimitive.Indicator> + </CheckboxPrimitive.Root> +)) +Checkbox.displayName = CheckboxPrimitive.Root.displayName + +export { Checkbox } diff --git a/packages/web/components/ui/command.tsx b/packages/web/components/ui/command.tsx new file mode 100644 index 0000000..467fbf8 --- /dev/null +++ b/packages/web/components/ui/command.tsx @@ -0,0 +1,155 @@ +"use client" + +import * as React from "react" +import { DialogProps } from "@radix-ui/react-dialog" +import { Command as CommandPrimitive } from "cmdk" +import { Search } from "lucide-react" + +import { cn } from "~/libs/utils" +import { Dialog, DialogContent } from "~/components/ui/dialog" + +const Command = React.forwardRef< + React.ElementRef<typeof CommandPrimitive>, + React.ComponentPropsWithoutRef<typeof CommandPrimitive> +>(({ className, ...props }, ref) => ( + <CommandPrimitive + ref={ref} + className={cn( + "flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground", + className + )} + {...props} + /> +)) +Command.displayName = CommandPrimitive.displayName + +interface CommandDialogProps extends DialogProps {} + +const CommandDialog = ({ children, ...props }: CommandDialogProps) => { + return ( + <Dialog {...props}> + <DialogContent className="overflow-hidden p-0 shadow-lg"> + <Command className="[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5"> + {children} + </Command> + </DialogContent> + </Dialog> + ) +} + +const CommandInput = React.forwardRef< + React.ElementRef<typeof CommandPrimitive.Input>, + React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input> +>(({ className, ...props }, ref) => ( + <div className="flex items-center border-b px-3" cmdk-input-wrapper=""> + <Search className="mr-2 h-4 w-4 shrink-0 opacity-50" /> + <CommandPrimitive.Input + ref={ref} + className={cn( + "flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50", + className + )} + {...props} + /> + </div> +)) + +CommandInput.displayName = CommandPrimitive.Input.displayName + +const CommandList = React.forwardRef< + React.ElementRef<typeof CommandPrimitive.List>, + React.ComponentPropsWithoutRef<typeof CommandPrimitive.List> +>(({ className, ...props }, ref) => ( + <CommandPrimitive.List + ref={ref} + className={cn("max-h-[300px] overflow-y-auto overflow-x-hidden", className)} + {...props} + /> +)) + +CommandList.displayName = CommandPrimitive.List.displayName + +const CommandEmpty = React.forwardRef< + React.ElementRef<typeof CommandPrimitive.Empty>, + React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty> +>((props, ref) => ( + <CommandPrimitive.Empty + ref={ref} + className="py-6 text-center text-sm" + {...props} + /> +)) + +CommandEmpty.displayName = CommandPrimitive.Empty.displayName + +const CommandGroup = React.forwardRef< + React.ElementRef<typeof CommandPrimitive.Group>, + React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group> +>(({ className, ...props }, ref) => ( + <CommandPrimitive.Group + ref={ref} + className={cn( + "overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground", + className + )} + {...props} + /> +)) + +CommandGroup.displayName = CommandPrimitive.Group.displayName + +const CommandSeparator = React.forwardRef< + React.ElementRef<typeof CommandPrimitive.Separator>, + React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator> +>(({ className, ...props }, ref) => ( + <CommandPrimitive.Separator + ref={ref} + className={cn("-mx-1 h-px bg-border", className)} + {...props} + /> +)) +CommandSeparator.displayName = CommandPrimitive.Separator.displayName + +const CommandItem = React.forwardRef< + React.ElementRef<typeof CommandPrimitive.Item>, + React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item> +>(({ className, ...props }, ref) => ( + <CommandPrimitive.Item + ref={ref} + className={cn( + "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", + className + )} + {...props} + /> +)) + +CommandItem.displayName = CommandPrimitive.Item.displayName + +const CommandShortcut = ({ + className, + ...props +}: React.HTMLAttributes<HTMLSpanElement>) => { + return ( + <span + className={cn( + "ml-auto text-xs tracking-widest text-muted-foreground", + className + )} + {...props} + /> + ) +} +CommandShortcut.displayName = "CommandShortcut" + +export { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, + CommandSeparator, +} diff --git a/packages/web/components/ui/dialog.tsx b/packages/web/components/ui/dialog.tsx new file mode 100644 index 0000000..a813e7c --- /dev/null +++ b/packages/web/components/ui/dialog.tsx @@ -0,0 +1,123 @@ +"use client" + +import * as React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { X } from "lucide-react" + +import { cn } from "~/libs/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = ({ + className, + ...props +}: DialogPrimitive.DialogPortalProps) => ( + <DialogPrimitive.Portal className={cn(className)} {...props} /> +) +DialogPortal.displayName = DialogPrimitive.Portal.displayName + +const DialogOverlay = React.forwardRef< + React.ElementRef<typeof DialogPrimitive.Overlay>, + React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay> +>(({ className, ...props }, ref) => ( + <DialogPrimitive.Overlay + ref={ref} + className={cn( + "fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", + className + )} + {...props} + /> +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef< + React.ElementRef<typeof DialogPrimitive.Content>, + React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> +>(({ className, children, ...props }, ref) => ( + <DialogPortal> + <DialogOverlay /> + <DialogPrimitive.Content + ref={ref} + className={cn( + "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full", + className + )} + {...props} + > + {children} + <DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground"> + <X className="h-4 w-4" /> + <span className="sr-only">Close</span> + </DialogPrimitive.Close> + </DialogPrimitive.Content> + </DialogPortal> +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes<HTMLDivElement>) => ( + <div + className={cn( + "flex flex-col space-y-1.5 text-center sm:text-left", + className + )} + {...props} + /> +) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes<HTMLDivElement>) => ( + <div + className={cn( + "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", + className + )} + {...props} + /> +) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef< + React.ElementRef<typeof DialogPrimitive.Title>, + React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title> +>(({ className, ...props }, ref) => ( + <DialogPrimitive.Title + ref={ref} + className={cn( + "text-lg font-semibold leading-none tracking-tight", + className + )} + {...props} + /> +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef< + React.ElementRef<typeof DialogPrimitive.Description>, + React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description> +>(({ className, ...props }, ref) => ( + <DialogPrimitive.Description + ref={ref} + className={cn("text-sm text-muted-foreground", className)} + {...props} + /> +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} diff --git a/packages/web/components/ui/popover.tsx b/packages/web/components/ui/popover.tsx new file mode 100644 index 0000000..9a06e06 --- /dev/null +++ b/packages/web/components/ui/popover.tsx @@ -0,0 +1,31 @@ +"use client" + +import * as React from "react" +import * as PopoverPrimitive from "@radix-ui/react-popover" + +import { cn } from "~/libs/utils" + +const Popover = PopoverPrimitive.Root + +const PopoverTrigger = PopoverPrimitive.Trigger + +const PopoverContent = React.forwardRef< + React.ElementRef<typeof PopoverPrimitive.Content>, + React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + <PopoverPrimitive.Portal> + <PopoverPrimitive.Content + ref={ref} + align={align} + sideOffset={sideOffset} + className={cn( + "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", + className + )} + {...props} + /> + </PopoverPrimitive.Portal> +)) +PopoverContent.displayName = PopoverPrimitive.Content.displayName + +export { Popover, PopoverTrigger, PopoverContent } diff --git a/packages/web/components/ui/skeleton.tsx b/packages/web/components/ui/skeleton.tsx new file mode 100644 index 0000000..f3daf42 --- /dev/null +++ b/packages/web/components/ui/skeleton.tsx @@ -0,0 +1,15 @@ +import { cn } from "~/libs/utils" + +function Skeleton({ + className, + ...props +}: React.HTMLAttributes<HTMLDivElement>) { + return ( + <div + className={cn("animate-pulse rounded-md bg-stone-100 dark:bg-stone-800", className)} + {...props} + /> + ) +} + +export { Skeleton } diff --git a/packages/web/components/ui/switch.tsx b/packages/web/components/ui/switch.tsx new file mode 100644 index 0000000..08fafd5 --- /dev/null +++ b/packages/web/components/ui/switch.tsx @@ -0,0 +1,29 @@ +"use client" + +import * as React from "react" +import * as SwitchPrimitives from "@radix-ui/react-switch" + +import { cn } from "~/libs/utils" + +const Switch = React.forwardRef< + React.ElementRef<typeof SwitchPrimitives.Root>, + React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root> +>(({ className, ...props }, ref) => ( + <SwitchPrimitives.Root + className={cn( + "peer inline-flex h-[24px] w-[44px] shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2 focus-visible:ring-offset-white disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-slate-900 data-[state=unchecked]:bg-slate-200 dark:focus-visible:ring-slate-300 dark:focus-visible:ring-offset-slate-950 dark:data-[state=checked]:bg-slate-50 dark:data-[state=unchecked]:bg-slate-800", + className + )} + {...props} + ref={ref} + > + <SwitchPrimitives.Thumb + className={cn( + "pointer-events-none block h-5 w-5 rounded-full bg-white shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0 dark:bg-slate-950" + )} + /> + </SwitchPrimitives.Root> +)) +Switch.displayName = SwitchPrimitives.Root.displayName + +export { Switch } diff --git a/packages/web/components/ui/tabs.tsx b/packages/web/components/ui/tabs.tsx new file mode 100644 index 0000000..18cce9e --- /dev/null +++ b/packages/web/components/ui/tabs.tsx @@ -0,0 +1,55 @@ +"use client" + +import * as React from "react" +import * as TabsPrimitive from "@radix-ui/react-tabs" + +import { cn } from "~/libs/utils" + +const Tabs = TabsPrimitive.Root + +const TabsList = React.forwardRef< + React.ElementRef<typeof TabsPrimitive.List>, + React.ComponentPropsWithoutRef<typeof TabsPrimitive.List> +>(({ className, ...props }, ref) => ( + <TabsPrimitive.List + ref={ref} + className={cn( + "inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground", + className + )} + {...props} + /> +)) +TabsList.displayName = TabsPrimitive.List.displayName + +const TabsTrigger = React.forwardRef< + React.ElementRef<typeof TabsPrimitive.Trigger>, + React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger> +>(({ className, ...props }, ref) => ( + <TabsPrimitive.Trigger + ref={ref} + className={cn( + "inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm", + className + )} + {...props} + /> +)) +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName + +const TabsContent = React.forwardRef< + React.ElementRef<typeof TabsPrimitive.Content>, + React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content> +>(({ className, ...props }, ref) => ( + <TabsPrimitive.Content + ref={ref} + className={cn( + "mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2", + className + )} + {...props} + /> +)) +TabsContent.displayName = TabsPrimitive.Content.displayName + +export { Tabs, TabsList, TabsTrigger, TabsContent } diff --git a/packages/web/components/ui/tooltip.tsx b/packages/web/components/ui/tooltip.tsx new file mode 100644 index 0000000..59f7de4 --- /dev/null +++ b/packages/web/components/ui/tooltip.tsx @@ -0,0 +1,30 @@ +"use client" + +import * as React from "react" +import * as TooltipPrimitive from "@radix-ui/react-tooltip" + +import { cn } from "~/libs/utils" + +const TooltipProvider = TooltipPrimitive.Provider + +const Tooltip = TooltipPrimitive.Root + +const TooltipTrigger = TooltipPrimitive.Trigger + +const TooltipContent = React.forwardRef< + React.ElementRef<typeof TooltipPrimitive.Content>, + React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> +>(({ className, sideOffset = 4, ...props }, ref) => ( + <TooltipPrimitive.Content + ref={ref} + sideOffset={sideOffset} + className={cn( + "z-50 overflow-hidden rounded-md border border-slate-200 bg-white px-3 py-1.5 text-sm text-slate-950 shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-slate-800 dark:bg-slate-950 dark:text-slate-50", + className + )} + {...props} + /> +)) +TooltipContent.displayName = TooltipPrimitive.Content.displayName + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } diff --git a/packages/web/components/user.tsx b/packages/web/components/user.tsx index d2f6bfd..a6fc115 100644 --- a/packages/web/components/user.tsx +++ b/packages/web/components/user.tsx @@ -1,10 +1,12 @@ 'use client' -import { Avatar, Button, Dropdown, DropdownItem, DropdownMenu, DropdownSection, DropdownTrigger, User } from '@nextui-org/react' import { signIn, signOut, useSession } from 'next-auth/react' import { useTranslations } from 'next-intl' import Theme from './theme' import Intl from './intl' +import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup, DropdownMenuItem, DropdownMenuShortcut } from '~/components/ui/dropdown-menu' +import { Avatar, AvatarFallback, AvatarImage } from '~/components/ui/avatar' +import { Button } from '~/components/ui/button' export default function UserComponent() { const t = useTranslations('Header.User') @@ -12,55 +14,44 @@ export default function UserComponent() { if (session) { return ( - <Dropdown backdrop="blur"> - <DropdownTrigger> - <Avatar - as="button" - className="transition-transform" - name={session.user?.name ?? ''} - size="sm" - src={session.user?.image ?? ''} - /> - </DropdownTrigger> + <DropdownMenu> + <DropdownMenuTrigger asChild> + <Button variant="outline" className="relative h-8 w-8 rounded-full"> + <Avatar className="h-8 w-8"> + <AvatarImage src={session.user?.image ?? ''} alt={session.user?.name ?? ''} /> + <AvatarFallback>{session.user?.name ?? ''}</AvatarFallback> + </Avatar> + </Button> + </DropdownMenuTrigger> - <DropdownMenu> - <DropdownSection - showDivider - > - <DropdownItem> - <User - avatarProps={ - { src: session.user?.image ?? '' } - } - description={session.user?.email} - name={session.user?.name ?? ''} - /> - </DropdownItem> - </DropdownSection> + <DropdownMenuContent className='w-56'> + <DropdownMenuLabel> + <div className="flex flex-col space-y-1"> + <p className="text-sm font-medium leading-none">{session.user?.name ?? ''}</p> + <p className="text-xs leading-none text-muted-foreground"> + {session.user?.email} + </p> + </div> + </DropdownMenuLabel> - <DropdownSection showDivider> - <DropdownItem - endContent={<Theme />} - isReadOnly - > - {t('theme')} - </DropdownItem> - </DropdownSection> + <DropdownMenuSeparator /> - <DropdownSection> - <DropdownItem - endContent={<Intl />} - isReadOnly - > + <DropdownMenuGroup> + <DropdownMenuItem> + {t('theme')} + <DropdownMenuShortcut><Theme /></DropdownMenuShortcut> + </DropdownMenuItem> + <DropdownMenuItem> {t('language')} - </DropdownItem> - </DropdownSection> - - <DropdownSection> - <DropdownItem onPress={() => signOut()}>{t('logout')}</DropdownItem> - </DropdownSection> - </DropdownMenu> - </Dropdown> + <DropdownMenuShortcut><Intl /></DropdownMenuShortcut> + </DropdownMenuItem> + <DropdownMenuSeparator /> + <DropdownMenuItem onClick={() => signOut()}> + {t('logout')} + </DropdownMenuItem> + </DropdownMenuGroup> + </DropdownMenuContent> + </DropdownMenu> ) } return ( diff --git a/packages/web/components/users-list.tsx b/packages/web/components/users-list.tsx index d67301f..bcdfbab 100644 --- a/packages/web/components/users-list.tsx +++ b/packages/web/components/users-list.tsx @@ -1,11 +1,11 @@ 'use client' -import { Table, TableBody, TableCell, TableColumn, TableHeader, TableRow } from '@nextui-org/react' import Link from 'next/link' import { useCallback } from 'react' import { type Key } from 'react' import { type EventUser } from '@prisma/client' import useCurrentProject from '~/hooks/use-current-project' +import { Table, TableBody, TableCell, TableHeader, TableHead, TableRow } from '~/components/ui/table' type User = EventUser & { _count: { @@ -94,21 +94,20 @@ export default function UsersList({ users }: Props) { }, [projectId]) return ( - <Table> - <TableHeader columns={columns}> - {column => <TableColumn key={column.key}>{column.label}</TableColumn>} + <Table className='rounded-md border'> + <TableHeader> + <TableRow> + {columns.map(column => <TableHead key={column.key}>{column.label}</TableHead>)} + </TableRow> </TableHeader> - <TableBody - emptyContent="No rows to display." - items={users} - > + <TableBody> { users - ? item => ( - <TableRow key={item.id}> - {columnKey => <TableCell>{renderCell(item, columnKey)}</TableCell>} + ? users.map(user => ( + <TableRow key={user.id}> + {columns.map(column => <TableCell>{renderCell(user, column.key)}</TableCell>)} </TableRow> - ) + )) :[] } </TableBody> diff --git a/packages/web/libs/utils.tsx b/packages/web/libs/utils.tsx index 4952f11..558873e 100644 --- a/packages/web/libs/utils.tsx +++ b/packages/web/libs/utils.tsx @@ -1,7 +1,4 @@ import UA from 'ua-parser-js' -import { Text } from '@chakra-ui/react' -import { RiBugFill, RiCursorFill, RiGift2Fill, RiLoader2Fill, RiRouterFill, RiTerminalBoxFill } from 'react-icons/ri' -import { type IconType } from 'react-icons' import { type OhbugAction, type OhbugEvent } from '@ohbug/types' import { type ReactNode } from 'react' import { type ClassValue, clsx } from 'clsx' @@ -58,7 +55,7 @@ export function getDeviceInfo(event?: OhbugEvent<any>) { export function getMessageAndIconByActionType(action: OhbugAction): { message: ReactNode - icon: IconType + icon: any color: string } { switch (action.type) { @@ -66,7 +63,7 @@ export function getMessageAndIconByActionType(action: OhbugAction): { if (action.data?.selector) { return { message: action.data?.selector, - icon: RiCursorFill, + icon: <i className="i-ri-cursor-fill"></i>, color: 'gray', } } @@ -74,10 +71,10 @@ export function getMessageAndIconByActionType(action: OhbugAction): { message: ( <> <span>{action.message}</span>{' '} - <Text color="gray.500">{renderStringOrJson(action.data)}</Text> + <span className='text-stone-500'>{renderStringOrJson(action.data)}</span> </> ), - icon: RiCursorFill, + icon: <i className="i-ri-cursor-fill"></i>, color: 'gray', } case 'navigation': @@ -88,7 +85,7 @@ export function getMessageAndIconByActionType(action: OhbugAction): { <strong>To:</strong> <em>{action.data?.to}</em> </> ), - icon: RiRouterFill, + icon: <i className="i-ri-router-fill"></i>, color: 'gray', } case 'ajax': @@ -99,7 +96,7 @@ export function getMessageAndIconByActionType(action: OhbugAction): { <em>{action.data?.req?.url}</em>{' '} </> ), - icon: RiLoader2Fill, + icon: <i className="i-ri-loader-2-fill"></i>, color: 'gray', } case 'fetch': @@ -110,19 +107,19 @@ export function getMessageAndIconByActionType(action: OhbugAction): { <em>{action.data?.req?.url}</em>{' '} </> ), - icon: RiLoader2Fill, + icon: <i className="i-ri-loader-2-fill"></i>, color: 'gray', } case 'console': return { message: `[${action.message}] ${JSON.stringify(action.data)}`, - icon: RiTerminalBoxFill, + icon: <i className="i-ri-terminal-box-fill"></i>, color: 'gray', } case 'exception': return { message: renderStringOrJson(action.message), - icon: RiBugFill, + icon: <i className="i-ri-bug-fill"></i>, color: 'red', } default: @@ -130,10 +127,10 @@ export function getMessageAndIconByActionType(action: OhbugAction): { message: ( <> <span>{action.message}</span>{' '} - <Text color="gray.500">{renderStringOrJson(action.data)}</Text> + <span className='text-stone-500'>{renderStringOrJson(action.data)}</span> </> ), - icon: RiGift2Fill, + icon: <i className="i-ri-gift-2-fill"></i>, color: 'gray', } } diff --git a/packages/web/package.json b/packages/web/package.json index 48cf7b8..71ae4ee 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -18,20 +18,25 @@ "@hookform/resolvers": "^3.3.0", "@iconify-json/ri": "^1.1.12", "@next-auth/prisma-adapter": "^1.0.7", - "@nextui-org/react": "^2.1.5", - "@nextui-org/theme": "^2.1.2", "@ohbug/extension-feedback": "^0.7.2", "@ohbug/extension-rrweb": "^1.10.1", "@ohbug/extension-uuid": "^2.1.1", "@ohbug/extension-view": "^0.1.1", "@ohbug/extension-web-vitals": "^0.2.1", + "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-avatar": "^1.0.3", + "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-dialog": "^1.0.4", "@radix-ui/react-dropdown-menu": "^2.0.5", "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-popover": "^1.0.6", "@radix-ui/react-select": "^1.2.2", "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", "@radix-ui/react-toast": "^1.1.4", + "@radix-ui/react-tooltip": "^1.0.6", "@tanstack/react-table": "^8.9.3", "@types/nprogress": "^0.2.0", "@types/react": "^18.2.21", @@ -40,6 +45,7 @@ "autoprefixer": "^10.4.15", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", + "cmdk": "^0.2.0", "common": "workspace:*", "config": "workspace:*", "downshift": "^8.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c8b9d1..6eb5994 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -268,12 +268,6 @@ importers: '@next-auth/prisma-adapter': specifier: ^1.0.7 version: 1.0.7(@prisma/client@5.2.0)(next-auth@4.23.1) - '@nextui-org/react': - specifier: ^2.1.5 - version: 2.1.5(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': - specifier: ^2.1.2 - version: 2.1.2(tailwindcss@3.3.3) '@ohbug/extension-feedback': specifier: ^0.7.2 version: 0.7.2 @@ -289,15 +283,27 @@ importers: '@ohbug/extension-web-vitals': specifier: ^0.2.1 version: 0.2.1(web-vitals@3.4.0) + '@radix-ui/react-accordion': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-avatar': specifier: ^1.0.3 version: 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-checkbox': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dialog': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-dropdown-menu': specifier: ^2.0.5 version: 2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-label': specifier: ^2.0.2 version: 2.0.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-popover': + specifier: ^1.0.6 + version: 1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-select': specifier: ^1.2.2 version: 1.2.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) @@ -307,9 +313,18 @@ importers: '@radix-ui/react-slot': specifier: ^1.0.2 version: 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-switch': + specifier: ^1.0.3 + version: 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-tabs': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-toast': specifier: ^1.1.4 version: 1.1.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-tooltip': + specifier: ^1.0.6 + version: 1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-table': specifier: ^8.9.3 version: 8.9.3(react-dom@18.2.0)(react@18.2.0) @@ -334,6 +349,9 @@ importers: clsx: specifier: ^2.0.0 version: 2.0.0 + cmdk: + specifier: ^0.2.0 + version: 0.2.0(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) common: specifier: workspace:* version: link:../common @@ -2588,12 +2606,6 @@ packages: tslib: 2.6.1 dev: false - /@formatjs/fast-memoize@2.2.0: - resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} - dependencies: - tslib: 2.6.1 - dev: false - /@formatjs/icu-messageformat-parser@2.1.0: resolution: {integrity: sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==} dependencies: @@ -2602,14 +2614,6 @@ packages: tslib: 2.6.1 dev: false - /@formatjs/icu-messageformat-parser@2.6.0: - resolution: {integrity: sha512-yT6at0qc0DANw9qM/TU8RZaCtfDXtj4pZM/IC2WnVU80yAcliS3KVDiuUt4jSQAeFL9JS5bc2hARnFmjPdA6qw==} - dependencies: - '@formatjs/ecma402-abstract': 1.17.0 - '@formatjs/icu-skeleton-parser': 1.6.0 - tslib: 2.6.1 - dev: false - /@formatjs/icu-skeleton-parser@1.3.6: resolution: {integrity: sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==} dependencies: @@ -2617,13 +2621,6 @@ packages: tslib: 2.6.1 dev: false - /@formatjs/icu-skeleton-parser@1.6.0: - resolution: {integrity: sha512-eMmxNpoX/J1IPUjPGSZwo0Wh+7CEvdEMddP2Jxg1gQJXfGfht/FdW2D5XDFj3VMbOTUQlDIdZJY7uC6O6gjPoA==} - dependencies: - '@formatjs/ecma402-abstract': 1.17.0 - tslib: 2.6.1 - dev: false - /@formatjs/intl-localematcher@0.2.25: resolution: {integrity: sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==} dependencies: @@ -2702,31 +2699,6 @@ packages: - supports-color dev: false - /@internationalized/date@3.4.0: - resolution: {integrity: sha512-QUDSGCsvrEVITVf+kv9VSAraAmCgjQmU5CiXtesUBBhBe374NmnEIIaOFBZ72t29dfGMBP0zF+v6toVnbcc6jg==} - dependencies: - '@swc/helpers': 0.5.1 - dev: false - - /@internationalized/message@3.1.1: - resolution: {integrity: sha512-ZgHxf5HAPIaR0th+w0RUD62yF6vxitjlprSxmLJ1tam7FOekqRSDELMg4Cr/DdszG5YLsp5BG3FgHgqquQZbqw==} - dependencies: - '@swc/helpers': 0.5.1 - intl-messageformat: 10.5.0 - dev: false - - /@internationalized/number@3.2.1: - resolution: {integrity: sha512-hK30sfBlmB1aIe3/OwAPg9Ey0DjjXvHEiGVhNaOiBJl31G0B6wMaX8BN3ibzdlpyRNE9p7X+3EBONmxtJO9Yfg==} - dependencies: - '@swc/helpers': 0.5.1 - dev: false - - /@internationalized/string@3.1.1: - resolution: {integrity: sha512-fvSr6YRoVPgONiVIUhgCmIAlifMVCeej/snPZVzbzRPxGpHl3o1GRe+d/qh92D8KhgOciruDUH8I5mjdfdjzfA==} - dependencies: - '@swc/helpers': 0.5.1 - dev: false - /@ioredis/commands@1.2.0: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} dev: false @@ -3206,3056 +3178,1466 @@ packages: dev: false optional: true - /@nextui-org/accordion@2.0.16(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-fZQwqEokL0eAF03HEiz9SuzwdoqMtGMhkNwPUJ37NuaGg2S6q0kaaHPceIRTIfXYoiIR3EoKqojr/V5lB9x+lg==} - peerDependencies: - framer-motion: '>=4.0.0' - react: '>=18' + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} dependencies: - '@nextui-org/aria-utils': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/divider': 2.0.13(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/framer-transitions': 2.0.5(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-icons': 2.0.3(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-aria-accordion-item': 2.0.3(react@18.2.0) - '@react-aria/accordion': 3.0.0-alpha.20(react@18.2.0) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/tree': 3.7.1(react@18.2.0) - '@react-types/accordion': 3.0.0-alpha.15(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 - /@nextui-org/aria-utils@2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-pbfSGjQeGQoWMVHE9iCOPq2MSLPa2AIZwazdBO1QKyzfXGRCoJ6FM1zX+EvBrax/8+6DtZb9bZ6UzICr5ZLvVw==} - peerDependencies: - react: '>=18' + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} dependencies: - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/collections': 3.10.0(react@18.2.0) - '@react-types/overlays': 3.8.1(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 - /@nextui-org/avatar@2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-7HPB3VesRDcXgR9iQVXPR0ruNvIe57cxv1iTym1PeI+eTHna7s2UhIxas6Ao85hOeHBrzC7BY8KVT8fTDxZ0Fw==} - peerDependencies: - react: '>=18' + /@npmcli/config@6.2.1: + resolution: {integrity: sha512-Cj/OrSbrLvnwWuzquFCDTwFN8QmR+SWH6qLNCBttUreDkKM5D5p36SeSMbcEUiCGdwjUrVy2yd8C0REwwwDPEw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-image': 2.0.2(react@18.2.0) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false + '@npmcli/map-workspaces': 3.0.4 + ci-info: 3.8.0 + ini: 4.1.1 + nopt: 7.2.0 + proc-log: 3.0.0 + read-package-json-fast: 3.0.2 + semver: 7.5.4 + walk-up-path: 3.0.1 + dev: true - /@nextui-org/badge@2.0.12(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-FRWIqleKT82kyiZ+q5w8RCuc2+dCXZc9U8cYumFCqGUOm4ynEkR7nw5f1TvVbQag79O2pLbK60xSvxnAzestWQ==} - peerDependencies: - react: '>=18' + /@npmcli/fs@3.1.0: + resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - react: 18.2.0 - transitivePeerDependencies: - - tailwindcss - dev: false + semver: 7.5.4 + dev: true - /@nextui-org/button@2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-5ZmuLbrKxrFasKcZaK9+9AmrRUZg9H0O0ohhyWxSOlCyKlcZuxI597MNmNwk/hTuftjFjakyEwMs6DWt9TFBRg==} - peerDependencies: - react: '>=18' + /@npmcli/git@4.1.0: + resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/ripple': 2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/spinner': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-aria-button': 2.0.3(react@18.2.0) - '@react-aria/button': 3.8.1(react@18.2.0) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/button': 3.7.4(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - react: 18.2.0 + '@npmcli/promise-spawn': 6.0.2 + lru-cache: 7.18.3 + npm-pick-manifest: 8.0.2 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.4 + which: 3.0.1 transitivePeerDependencies: - - framer-motion - - react-dom - - tailwindcss - dev: false + - bluebird + dev: true - /@nextui-org/card@2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-P4zH6DQ8rOkntUQw2AfwXzfBrz/zmFW7a9pw2+Y0onlC2B+2D6ki+2nQ6wkQw7SNIFPMbP4CApIGKsnTVsfh/g==} - peerDependencies: - react: '>=18' + /@npmcli/installed-package-contents@2.0.2: + resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/ripple': 2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-aria-button': 2.0.3(react@18.2.0) - '@react-aria/button': 3.8.1(react@18.2.0) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - framer-motion - - react-dom - - tailwindcss - dev: false + npm-bundled: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true - /@nextui-org/checkbox@2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-zCSY/X92lEm0Ox6FHLOpZqpsQRS081Mw7/u43lycK8dkIbkWsG40qQ2PLF7kM8un0+A5ZlDdoQnJl12Jrl3jCQ==} - peerDependencies: - react: '>=18' + /@npmcli/map-workspaces@3.0.4: + resolution: {integrity: sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@react-aria/checkbox': 3.10.0(react@18.2.0) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-aria/visually-hidden': 3.8.3(react@18.2.0) - '@react-stately/checkbox': 3.4.4(react@18.2.0) - '@react-stately/toggle': 3.6.1(react@18.2.0) - '@react-types/checkbox': 3.5.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false + '@npmcli/name-from-folder': 2.0.0 + glob: 10.3.3 + minimatch: 9.0.3 + read-package-json-fast: 3.0.2 + dev: true - /@nextui-org/chip@2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-W3NS/RZxKHFKstNJYv7V2zd7nUGSlGiVtCGTFkuoTkHeTJcor4u4aAylTuY3/rxjoyl9wDREpaX4NZrOZx4rRQ==} - peerDependencies: - react: '>=18' + /@npmcli/name-from-folder@2.0.0: + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@npmcli/node-gyp@3.0.0: + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@npmcli/promise-spawn@6.0.2: + resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-icons': 2.0.3(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/checkbox': 3.5.0(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false + which: 3.0.1 + dev: true - /@nextui-org/code@2.0.12(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-X5vClH6qs7l4xXzOybo6DMG93MA8paGnVdS/uWdXoUtZTtHBqjir9CkvF7b4NKvuTD20oRu4EZ42wTS8r3Lr0Q==} - peerDependencies: - react: '>=18' + /@npmcli/run-script@6.0.2: + resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - react: 18.2.0 + '@npmcli/node-gyp': 3.0.0 + '@npmcli/promise-spawn': 6.0.2 + node-gyp: 9.4.0 + read-package-json-fast: 3.0.2 + which: 3.0.1 transitivePeerDependencies: - - tailwindcss - dev: false + - supports-color + dev: true - /@nextui-org/divider@2.0.13(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-l4f/rmqBl2e9zVM20TP7vgWJ2/LrNunYt5NHZuxXHERuuznKdNVv3Q496zAU5wLJ1S3GE3+H4cw3K7bRG2MiRQ==} - peerDependencies: - react: '>=18' + /@nuxtjs/opencollective@0.3.2: + resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true dependencies: - '@nextui-org/react-rsc-utils': 2.0.7 - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@react-types/shared': 3.19.0(react@18.2.0) - react: 18.2.0 + chalk: 4.1.2 + consola: 2.15.3 + node-fetch: 2.6.12 transitivePeerDependencies: - - tailwindcss + - encoding dev: false - /@nextui-org/dropdown@2.1.3(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-ira40ZjOIWIbFE6s0cUgEIsSmVYN1X44vZN32/qTyY+YckWDRcqcVrLz7lBDkJOZ0Y4Zc2ljIqqpNR4IQSelHg==} - peerDependencies: - framer-motion: '>=4.0.0' - react: '>=18' + /@octokit/auth-token@3.0.4: + resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} + engines: {node: '>= 14'} + dev: true + + /@octokit/core@4.2.4: + resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} + engines: {node: '>= 14'} dependencies: - '@nextui-org/menu': 2.0.4(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/popover': 2.1.2(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/menu': 3.10.1(react-dom@18.2.0)(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/menu': 3.5.4(react@18.2.0) - '@react-types/menu': 3.9.3(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 + '@octokit/auth-token': 3.0.4 + '@octokit/graphql': 5.0.6 + '@octokit/request': 6.2.8 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 transitivePeerDependencies: - - '@types/react' - - react-dom - - tailwindcss - dev: false + - encoding + dev: true - /@nextui-org/framer-transitions@2.0.5(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-lf4u6cQZyCgxwX2HLYqos3czbt3174W6cyptxDSHW1VxZYlRhm4II31awR9ZGxaU0d4I2v5PJxNqj70oSNz2rg==} - peerDependencies: - framer-motion: '>=4.0.0' - react: '>=18' + /@octokit/endpoint@7.0.6: + resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} + engines: {node: '>= 14'} dependencies: - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: true - /@nextui-org/image@2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-BSauRVIzM8aavB5PG/iDEXBrLFisBlx0Z6PiePiNoWi6PI221nVsVXh7tM8kAwB0UdZu7xGqWO+3gKlk7mFbJg==} - peerDependencies: - react: '>=18' + /@octokit/graphql@5.0.6: + resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} + engines: {node: '>= 14'} dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-image': 2.0.2(react@18.2.0) - react: 18.2.0 + '@octokit/request': 6.2.8 + '@octokit/types': 9.3.2 + universal-user-agent: 6.0.0 transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false + - encoding + dev: true + + /@octokit/openapi-types@18.0.0: + resolution: {integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==} + dev: true - /@nextui-org/input@2.1.2(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-vjLTXVdGr1k2JFlBvZlsfXvt6D70aJhQnUkYJZEBP3cB+w+iYjLy91H8vCnhdiZD3b5MYNTL2wZF8WuUsA2UDA==} + /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): + resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} + engines: {node: '>= 14'} peerDependencies: - react: '>=18' + '@octokit/core': '>=4' dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-icons': 2.0.3(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/textfield': 3.11.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@react-types/textfield': 3.7.3(react@18.2.0) - react: 18.2.0 - react-textarea-autosize: 8.5.2(@types/react@18.2.21)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - react-dom - - tailwindcss - dev: false + '@octokit/core': 4.2.4 + '@octokit/tsconfig': 1.0.2 + '@octokit/types': 9.3.2 + dev: true - /@nextui-org/kbd@2.0.13(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-CwYnfiQ060Q3iGkoTWuLXkmDM329UnP8p+FkeC0qMloHI0V2ChOfoH+wfQXdLAcuhu6l48W64dCy75oxpwzhEg==} + /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} peerDependencies: - react: '>=18' + '@octokit/core': '>=3' dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@react-aria/utils': 3.19.0(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - tailwindcss - dev: false + '@octokit/core': 4.2.4 + dev: true - /@nextui-org/link@2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-lEvqOt41gBkM2nMt3DCoy1KoSa1A3evR7+K9sIAfZuuQH81I33x9di0bh7/xTwpTDEDrEt07aU730bybGxr8lQ==} + /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): + resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} + engines: {node: '>= 14'} peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-icons': 2.0.3(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-aria-link': 2.0.12(react@18.2.0) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/link': 3.5.3(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/link': 3.4.4(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false - - /@nextui-org/listbox@2.1.3(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-2ZBBPyVLMKFzfr/p3RPTXK6PA3OPcFtKzoahWxWvGJHm33TxeG47eXwQuxH6Ekx7osnO81KjZAKD8YxFbhDp3g==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/aria-utils': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/divider': 2.0.13(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-is-mobile': 2.0.3(react@18.2.0) - '@react-aria/focus': 3.13.0(react@18.2.0) - '@react-aria/interactions': 3.16.0(react@18.2.0) - '@react-aria/listbox': 3.10.1(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/list': 3.9.0(react@18.2.0) - '@react-types/menu': 3.9.2(react@18.2.0) - '@react-types/shared': 3.18.1(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false - - /@nextui-org/menu@2.0.4(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-WsQ/LGxqTUhnjkVFz6h6Iucn9GdAViGYk59NEzvQZ+ANZgj+FquAK3I5SD31zKJqlR1+B8IPMc/4dyIqfNGN4Q==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/aria-utils': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/divider': 2.0.13(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-is-mobile': 2.0.3(react@18.2.0) - '@react-aria/focus': 3.13.0(react@18.2.0) - '@react-aria/interactions': 3.16.0(react@18.2.0) - '@react-aria/menu': 3.10.1(react-dom@18.2.0)(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/menu': 3.5.3(react@18.2.0) - '@react-stately/tree': 3.7.0(react@18.2.0) - '@react-types/menu': 3.9.2(react@18.2.0) - '@react-types/shared': 3.18.1(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false - - /@nextui-org/modal@2.0.16(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-LlK8Jg0WZN8obu9DIdEHCY3QseiudL8Xh6NGWwf/J31VPtaZ5Lcase4QxsWpJQ4gNxDZW+Qgx6d44Ur3OIXcPw==} - peerDependencies: - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@nextui-org/framer-transitions': 2.0.5(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-icons': 2.0.3(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-aria-button': 2.0.3(react@18.2.0) - '@nextui-org/use-aria-modal-overlay': 2.0.3(react-dom@18.2.0)(react@18.2.0) - '@nextui-org/use-disclosure': 2.0.3(react@18.2.0) - '@react-aria/dialog': 3.5.4(react-dom@18.2.0)(react@18.2.0) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/overlays': 3.6.1(react@18.2.0) - '@react-types/overlays': 3.8.1(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-remove-scroll: 2.5.6(@types/react@18.2.21)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - react-dom - - tailwindcss - dev: false - - /@nextui-org/navbar@2.0.14(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-lpvj4yYmW8807QLViWlXKwKj7jloSrZK8nDCiI/NZ7/WRZBtm8cdqSlU5aekZFmtKUcnCajskzWVmmPpyZBwkw==} - peerDependencies: - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@nextui-org/framer-transitions': 2.0.5(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-aria-toggle-button': 2.0.3(react@18.2.0) - '@nextui-org/use-scroll-position': 2.0.2(react@18.2.0) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/toggle': 3.6.1(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-remove-scroll: 2.5.6(@types/react@18.2.21)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - react-dom - - tailwindcss - dev: false - - /@nextui-org/pagination@2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-NlT4KTDvprRwPPGuhMjK0RVhczVC/08rhyAhjzQMJlDqgm0hsuojNClHwK4Oca4pZBAiQMytoM3LZ8yrx0NLkA==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-icons': 2.0.3(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-pagination': 2.0.2(react@18.2.0) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - react: 18.2.0 - scroll-into-view-if-needed: 3.0.10 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false - - /@nextui-org/popover@2.1.2(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-E76xPGCbNqza1F73Avx4M/esofCMLflvAH/vJUI9S5iJYc5Ce/oCokBJ7XqRElEfrghb4lqSnQX2jsZB+eWcnw==} - peerDependencies: - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@nextui-org/aria-utils': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/button': 2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/framer-transitions': 2.0.5(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-aria-button': 2.0.3(react@18.2.0) - '@react-aria/dialog': 3.5.4(react-dom@18.2.0)(react@18.2.0) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/overlays': 3.6.1(react@18.2.0) - '@react-types/button': 3.7.4(react@18.2.0) - '@react-types/overlays': 3.8.1(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-remove-scroll: 2.5.6(@types/react@18.2.21)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - react-dom - - tailwindcss - dev: false - - /@nextui-org/progress@2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-qXFYlj6zkSpxUB9syHiWaf08pmcZh6ANm8oBQ2r/2dcZbJSja7l5CmLTCTfinbpYZdFcmCaPJ7hpYYpQ4/C6vA==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-is-mounted': 2.0.2(react-dom@18.2.0)(react@18.2.0) - '@react-aria/i18n': 3.8.1(react@18.2.0) - '@react-aria/progress': 3.4.4(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/progress': 3.4.1(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false - - /@nextui-org/radio@2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-CZTlFQU4Cia5Uom7um3b6cJ+WOeW6BvZiZ9VI2afR6rMR2ONb1SZg2cLSPWNTkkXUNNzyi31o6nP4epd3AJfCA==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/radio': 3.7.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-aria/visually-hidden': 3.8.3(react@18.2.0) - '@react-stately/radio': 3.8.3(react@18.2.0) - '@react-types/radio': 3.5.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false - - /@nextui-org/react-rsc-utils@2.0.7: - resolution: {integrity: sha512-BfbrN0/kh7qHoZYAh0bkV1w04Wngm+7K+soTZR4C3eSIxMMeu179CDELW+VCIBwdat4iSQaaJkHZVm8brtueNA==} - dev: false - - /@nextui-org/react-utils@2.0.7(react@18.2.0): - resolution: {integrity: sha512-dN4vSf3h4BVIN6CVqaSCn2OUyDmGVWORgOsfA1k0z/r1XBwuxlfQIEnj8GTwbltnGkFrgj7PJ2RsuVzUs8Vt3g==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/react-rsc-utils': 2.0.7 - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - react: 18.2.0 - dev: false - - /@nextui-org/react@2.1.5(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-DPBAdoEARFgJgueasOWZcIDkiRYkI1CC0V17j/jqovaezBBKt+pTS5I3djgKuuXL5iUW6FnhmZP39fZh1Rf1UQ==} - peerDependencies: - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@nextui-org/accordion': 2.0.16(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/avatar': 2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/badge': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/button': 2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/card': 2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/checkbox': 2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/chip': 2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/code': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/divider': 2.0.13(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/dropdown': 2.1.3(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/image': 2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/input': 2.1.2(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/kbd': 2.0.13(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/link': 2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/listbox': 2.1.3(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/menu': 2.0.4(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/modal': 2.0.16(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/navbar': 2.0.14(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/pagination': 2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/popover': 2.1.2(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/progress': 2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/radio': 2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/scroll-shadow': 2.1.2(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/select': 2.1.4(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/skeleton': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/snippet': 2.0.18(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/spacer': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/spinner': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/switch': 2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/table': 2.0.16(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/tabs': 2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/tooltip': 2.0.17(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/user': 2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@react-aria/visually-hidden': 3.8.3(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - '@types/react' - - react-dom - - tailwindcss - dev: false - - /@nextui-org/ripple@2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-rI2mMXjPtQANJuQE+QQCxLWcJ6ANlNHDfNxZ2jbuVACee6Y1mXEK9AqbZcpLVMpI577l20CcDqU63PRYvf7e9Q==} - peerDependencies: - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false - - /@nextui-org/scroll-shadow@2.1.2(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-kGNn8fa/IyF//PjLKoloMtEuLm8N3JnQ9kfF0ucuX7fT4TZT8EC9Msc8/+0DtS8AORYcNLGzWjJPXB+VYyY6fQ==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-data-scroll-overflow': 2.1.0(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false - - /@nextui-org/select@2.1.4(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-C5XPeJZ9bpp/uyJ2zI1Q+miQuQ8T4yiX1hqk7WuUGe8nkQ3ZOBRGb9ohSsREsaXJhLkYnnTDph3ngd6ZMqtX8Q==} - peerDependencies: - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@nextui-org/aria-utils': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/listbox': 2.1.3(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/popover': 2.1.2(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/scroll-shadow': 2.1.2(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/shared-icons': 2.0.3(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/spinner': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-aria-button': 2.0.3(react@18.2.0) - '@nextui-org/use-aria-multiselect': 2.1.0(react-dom@18.2.0)(react@18.2.0) - '@react-aria/focus': 3.13.0(react@18.2.0) - '@react-aria/interactions': 3.16.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-aria/visually-hidden': 3.8.3(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - '@types/react' - - react-dom - - tailwindcss - dev: false - - /@nextui-org/shared-icons@2.0.3(react@18.2.0): - resolution: {integrity: sha512-2ODlzPWW+iYM7Uf7XDkz7GlJ+dzsFo6cBHH9hbbZEOx2v7/wB8x3VvrZcQ4SASewSb18a/wzxP8MJFnIUCOCrQ==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@nextui-org/shared-utils@2.0.2(react@18.2.0): - resolution: {integrity: sha512-tqWVoJtxYbd/hd/laHE85GaXP+b3HeE1tXYjnObbwM+JIh4uu2/Do7Av7mzzyXwS7sZvyHxhi3zW12oank2ykA==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@nextui-org/skeleton@2.0.12(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-mVNPkW1q7C37LRyDLAnVZKU5YllcAAguDzWItadKEDCJ4ihhjnWT2wM4m3Iip9ddRU28wbt9C0e2/SZizBYdyA==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - react: 18.2.0 - transitivePeerDependencies: - - tailwindcss - dev: false - - /@nextui-org/snippet@2.0.18(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-qvUQQ/GMkb5v+t7pkjlCphiUjBkJca4Qm8cuTzYu9ytTEDFYNBO8Z1UqbgjP+z5QMYF88//LdGERw6VWrY90jg==} - peerDependencies: - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@nextui-org/button': 2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-icons': 2.0.3(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/tooltip': 2.0.17(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/use-clipboard': 2.0.2(react@18.2.0) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false - - /@nextui-org/spacer@2.0.12(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-JIfcbDwvYEZBraT3MR3+NtHLKe517daNhm2mZDDt+nMgqka8rwrsyssGB+rgCAqJ+xN/oAyLycvObMbuKZRhWA==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - react: 18.2.0 - transitivePeerDependencies: - - tailwindcss - dev: false - - /@nextui-org/spinner@2.0.12(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-AwMREvK5N7uAyUqNO7B3r2SG52b+97SpB+KU31CzrUWK9a4Vbepuk6cnu8CBCnFKWcB4coV6QSScpPJfODInLw==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - react: 18.2.0 - transitivePeerDependencies: - - tailwindcss - dev: false - - /@nextui-org/switch@2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-EE9w2M/q+C3obuDrTTAbuyknXV+KQjYBMbaZcRlFBqiLmcbi2rjIzRsxrcGLlkMvo5waYiaACcjhthmQ9CCzug==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/switch': 3.5.3(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-aria/visually-hidden': 3.8.3(react@18.2.0) - '@react-stately/toggle': 3.6.1(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false - - /@nextui-org/system-rsc@2.0.3(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-CfWl1JkHPtgSvq/Szz4oWQAg7b6L7wxxHEFzKcvNdhbX61IfE5PvnQMl5z8T9UTSIIwFv4P0ntP5kpKE895w2w==} - peerDependencies: - react: '>=18' + '@octokit/core': '>=3' dependencies: - clsx: 1.2.1 - react: 18.2.0 - tailwind-variants: 0.1.13(tailwindcss@3.3.3) - transitivePeerDependencies: - - tailwindcss - dev: false + '@octokit/core': 4.2.4 + '@octokit/types': 10.0.0 + dev: true - /@nextui-org/system@2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-ke02e60ctxnXsxe77TRN6pWVY89aCCi0AXwyQIbgT9lfiVgUGWJa+f6am46ItCzeSkvIQ7j3XJBz717zu+GSRg==} - peerDependencies: - react: '>=18' + /@octokit/request-error@3.0.3: + resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} + engines: {node: '>= 14'} dependencies: - '@nextui-org/system-rsc': 2.0.3(react@18.2.0)(tailwindcss@3.3.3) - '@react-aria/i18n': 3.8.1(react@18.2.0) - '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false + '@octokit/types': 9.3.2 + deprecation: 2.3.1 + once: 1.4.0 + dev: true - /@nextui-org/table@2.0.16(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-jrg+h7tpKEoILxwFMqh/nMMbrcF14lpQAX6tC95FFNEHARtRRQ5ZoZJOz/lIxvqwo2i8lggm+L+23Q/iw1tp7g==} - peerDependencies: - react: '>=18' + /@octokit/request@6.2.8: + resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} + engines: {node: '>= 14'} dependencies: - '@nextui-org/checkbox': 2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-icons': 2.0.3(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/spacer': 2.0.12(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/table': 3.11.0(react-dom@18.2.0)(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-aria/visually-hidden': 3.8.3(react@18.2.0) - '@react-stately/table': 3.11.0(react@18.2.0) - '@react-stately/virtualizer': 3.6.0(react@18.2.0) - '@react-types/grid': 3.2.0(react@18.2.0) - '@react-types/table': 3.8.0(react@18.2.0) - react: 18.2.0 + '@octokit/endpoint': 7.0.6 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + node-fetch: 2.6.12 + universal-user-agent: 6.0.0 transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false + - encoding + dev: true - /@nextui-org/tabs@2.0.14(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-QGsIuXxF6rwvTsk81/PBVsOy+tRyAECD5g1auKzNsxW2QokcjNWA8QmbhueefkxeO0AIhUwiK62g86KfiX1nOw==} - peerDependencies: - framer-motion: '>=4.0.0' - react: '>=18' + /@octokit/rest@19.0.13: + resolution: {integrity: sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==} + engines: {node: '>= 14'} dependencies: - '@nextui-org/aria-utils': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/framer-transitions': 2.0.5(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@nextui-org/use-is-mounted': 2.0.2(react-dom@18.2.0)(react@18.2.0) - '@nextui-org/use-update-effect': 2.0.2(react@18.2.0) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/tabs': 3.6.2(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/tabs': 3.5.1(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@react-types/tabs': 3.3.1(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - scroll-into-view-if-needed: 3.0.10 + '@octokit/core': 4.2.4 + '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) + '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false - - /@nextui-org/theme@2.1.2(tailwindcss@3.3.3): - resolution: {integrity: sha512-r71nB3kP5Y8aGQ2dke4Das8Fyq+B1IlvazL2xYPQBq1HwMOWL9eRsUjnIR8o2o+HqUYchLncuWzWDiKYeTy8YQ==} - peerDependencies: - tailwindcss: '*' - dependencies: - '@types/color': 3.0.3 - '@types/flat': 5.0.2 - '@types/lodash.foreach': 4.5.7 - '@types/lodash.get': 4.4.7 - '@types/lodash.kebabcase': 4.1.7 - '@types/lodash.mapkeys': 4.6.7 - '@types/lodash.omit': 4.5.7 - color: 4.2.3 - color2k: 2.0.2 - deepmerge: 4.3.1 - flat: 5.0.2 - lodash.foreach: 4.5.0 - lodash.get: 4.4.2 - lodash.kebabcase: 4.1.1 - lodash.mapkeys: 4.6.0 - lodash.omit: 4.5.0 - tailwind-variants: 0.1.13(tailwindcss@3.3.3) - tailwindcss: 3.3.3(ts-node@10.9.1) - dev: false + - encoding + dev: true - /@nextui-org/tooltip@2.0.17(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-RXcrs3pVLv1FhGdKw+j1SDJ/Djb7Lm/NUYGt2oPIyvW3VXT5AjB9By+biayEtSkoLKXHzbtHUQtmsw992/P9Cg==} - peerDependencies: - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@nextui-org/aria-utils': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/framer-transitions': 2.0.5(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) - '@react-aria/tooltip': 3.6.1(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/tooltip': 3.4.3(react@18.2.0) - '@react-types/overlays': 3.8.1(react@18.2.0) - '@react-types/tooltip': 3.4.3(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false + /@octokit/tsconfig@1.0.2: + resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} + dev: true - /@nextui-org/use-aria-accordion-item@2.0.3(react@18.2.0): - resolution: {integrity: sha512-nHJypFAwbeKn86KhfOXnf92D89CD5IETuq7RbWm0EC++NajPxRDjJl/zgPef7UWIvq28UC4TRVC7LAknFH7L/Q==} - peerDependencies: - react: '>=18' + /@octokit/types@10.0.0: + resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} dependencies: - '@react-aria/button': 3.8.1(react@18.2.0) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-stately/tree': 3.7.1(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - react: 18.2.0 - dev: false + '@octokit/openapi-types': 18.0.0 + dev: true - /@nextui-org/use-aria-button@2.0.3(react@18.2.0): - resolution: {integrity: sha512-JdxOk12vXO/AVLwJ0Mnr9QTugLDnjOPfDoV/AtQVGxgU/7VAuyGVt2Gt5eXQM6eOm36UBia59eXlWzF/9Judjw==} - peerDependencies: - react: '>=18' + /@octokit/types@9.3.2: + resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/button': 3.7.4(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - react: 18.2.0 - dev: false + '@octokit/openapi-types': 18.0.0 + dev: true - /@nextui-org/use-aria-link@2.0.12(react@18.2.0): - resolution: {integrity: sha512-Q+ztjV19GK9lT9XZ440pdSKhOY+Hc4cKK4CDsZGYgh2WqUAjy1qI2fiQZjQ2pQNda49Gl+QvZzTglX14wO2xAg==} - peerDependencies: - react: '>=18' - dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/link': 3.4.4(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@nextui-org/use-aria-modal-overlay@2.0.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-ajh7bEV+OaQ7s6DWC3rBwbkr8eTi2/ykf4mNc/682Y5cuR2ZPrBGg00HStVcNDZOdwUBArVhTWQaQ8e+0lwBww==} - peerDependencies: - react: '>=18' - dependencies: - '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/overlays': 3.6.1(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - dev: false - - /@nextui-org/use-aria-multiselect@2.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-dHMTbhFd+/D9h7rruDQgtQMZ95UKKfImtczu4ji0xnTu9ZXVVanM2ZEhU/GqpRdjuKS9xNq3BKZ6GnPlBcwMdA==} - peerDependencies: - react: '>=18' - dependencies: - '@react-aria/i18n': 3.8.1(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/label': 3.6.1(react@18.2.0) - '@react-aria/listbox': 3.10.1(react@18.2.0) - '@react-aria/menu': 3.10.1(react-dom@18.2.0)(react@18.2.0) - '@react-aria/selection': 3.16.1(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/list': 3.9.0(react@18.2.0) - '@react-stately/menu': 3.5.4(react@18.2.0) - '@react-types/button': 3.7.4(react@18.2.0) - '@react-types/overlays': 3.8.1(react@18.2.0) - '@react-types/select': 3.8.2(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - dev: false - - /@nextui-org/use-aria-toggle-button@2.0.3(react@18.2.0): - resolution: {integrity: sha512-puoPTmrxx7l9vh42oAnkAc57uF+TldUg3G2A/Gc7aTcIq1AXLfaTDaxWiRel6W0Ew2H/IKu9AlQScY28HOQ/iA==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/use-aria-button': 2.0.3(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/toggle': 3.6.1(react@18.2.0) - '@react-types/button': 3.7.4(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@nextui-org/use-callback-ref@2.0.2(react@18.2.0): - resolution: {integrity: sha512-avKTXdy/bOfjPKTBj1RIdkbdqTC9ICZUzb5GejR4riA3zCcHwS2JxjQTGb9xNF3Y5DyH1Mb7hf2+jBmqF2g/QA==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/use-safe-layout-effect': 2.0.2(react@18.2.0) - react: 18.2.0 - dev: false - - /@nextui-org/use-clipboard@2.0.2(react@18.2.0): - resolution: {integrity: sha512-Ass+LJR/cWC48AeIUtsukzvA7Mf5bV7ikdNUvuLyrc9pdqr1fmw4aHCkQPQKSjLIHy85KuXDKqrqhVoVLivD4g==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@nextui-org/use-data-scroll-overflow@2.1.0(react@18.2.0): - resolution: {integrity: sha512-hmr5kQ3KguDYTzqkU7F+J/aIu6tFriG5a+0JyfnIzuVmwbMlNf9tvRrfrgFT3OBqwgj2ljhGAPwQ37CFDsCZAA==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@nextui-org/use-disclosure@2.0.3(react@18.2.0): - resolution: {integrity: sha512-bPs4/wXSytiR5xxhlErkxXc2Fk3siQqLK5g/Qo+f2CQopXTaldkbIIlu/0lzd0KBIApX5z0rOr3bnr9Xu1Wn4A==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/use-callback-ref': 2.0.2(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@nextui-org/use-image@2.0.2(react@18.2.0): - resolution: {integrity: sha512-geCUHp2P/2und98/Ka12dyrw78D9F2qG1a8WN/iB0BQWwaEm8km8YH13zlV0GOFHCwlA5gsXqrUvzxPjfZytZQ==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/use-safe-layout-effect': 2.0.2(react@18.2.0) - react: 18.2.0 - dev: false - - /@nextui-org/use-is-mobile@2.0.3(react@18.2.0): - resolution: {integrity: sha512-JOxomIBoMIj7CnLVNrnv3wlUQ/3cr3l1OJw947qRzMlN19Q6X8k4bDvuPPlQbY6KL+emB0RM+lsdHv4WQ+Hpdg==} - peerDependencies: - react: '>=18' - dependencies: - '@react-aria/ssr': 3.7.1(react@18.2.0) - react: 18.2.0 - dev: false - - /@nextui-org/use-is-mounted@2.0.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-PjwpTkl5f+bTVU9l5GzgZDHd+uOwCZ3bhuYzbbamw1J5kBWruVnKUqZihS3zrLtJxKNxk/f7RT0UWK2a4wGpDw==} - peerDependencies: - react: '>=18' - react-dom: '>=16.8.0' - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@nextui-org/use-pagination@2.0.2(react@18.2.0): - resolution: {integrity: sha512-wQAmKMXzb0DhhXHx3K/LppaP2n5ZknjOYQpm+TAjOaIPJYIbyNIRa2FFAP/lf8vZCHjHB7+KUVLhkIwAzrZ0dw==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - react: 18.2.0 - dev: false - - /@nextui-org/use-safe-layout-effect@2.0.2(react@18.2.0): - resolution: {integrity: sha512-HsFP2e+o2eSiQyAXdiicPBj6qj1naHuiNqqeTPqeJBsr0aUZI8l+7vZ5OXjLc8Qou4AOyNyJBBGFNhwsraxdpw==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@nextui-org/use-scroll-position@2.0.2(react@18.2.0): - resolution: {integrity: sha512-DHmGMoLrjyuE/YQk92OGxF/v3cLaiBIvDpTxAAMtgerVkkPyuL7O9j9cyLiRz9ad92pL9TJwmjJ/00wJ2Qr/Wg==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@nextui-org/use-update-effect@2.0.2(react@18.2.0): - resolution: {integrity: sha512-yN2LWvG2QNDz6XDjRZq6jBQ7+Jaz2eihy+Q7IR+XLXi6fsyKQuYKxphw5VANa0ZbvKVuN/n5m5WRDRmWmeeOWw==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@nextui-org/user@2.0.15(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3): - resolution: {integrity: sha512-Zltwvb0+mIg/WDfFL4UHFi7kCo73vM8r5cbWczzLsjqFvYeZAK/W69armb6nH+fsFuDuFOPbFrDE51LkeSTmww==} - peerDependencies: - react: '>=18' - dependencies: - '@nextui-org/avatar': 2.0.14(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/react-utils': 2.0.7(react@18.2.0) - '@nextui-org/shared-utils': 2.0.2(react@18.2.0) - '@nextui-org/system': 2.0.5(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.3) - '@nextui-org/theme': 2.1.2(tailwindcss@3.3.3) - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - react: 18.2.0 - transitivePeerDependencies: - - react-dom - - tailwindcss - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@npmcli/config@6.2.1: - resolution: {integrity: sha512-Cj/OrSbrLvnwWuzquFCDTwFN8QmR+SWH6qLNCBttUreDkKM5D5p36SeSMbcEUiCGdwjUrVy2yd8C0REwwwDPEw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/map-workspaces': 3.0.4 - ci-info: 3.8.0 - ini: 4.1.1 - nopt: 7.2.0 - proc-log: 3.0.0 - read-package-json-fast: 3.0.2 - semver: 7.5.4 - walk-up-path: 3.0.1 - dev: true - - /@npmcli/fs@3.1.0: - resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - semver: 7.5.4 - dev: true - - /@npmcli/git@4.1.0: - resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/promise-spawn': 6.0.2 - lru-cache: 7.18.3 - npm-pick-manifest: 8.0.2 - proc-log: 3.0.0 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.5.4 - which: 3.0.1 - transitivePeerDependencies: - - bluebird - dev: true - - /@npmcli/installed-package-contents@2.0.2: - resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - npm-bundled: 3.0.0 - npm-normalize-package-bin: 3.0.1 - dev: true - - /@npmcli/map-workspaces@3.0.4: - resolution: {integrity: sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/name-from-folder': 2.0.0 - glob: 10.3.3 - minimatch: 9.0.3 - read-package-json-fast: 3.0.2 - dev: true - - /@npmcli/name-from-folder@2.0.0: - resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /@npmcli/node-gyp@3.0.0: - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - /@npmcli/promise-spawn@6.0.2: - resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - which: 3.0.1 - dev: true - - /@npmcli/run-script@6.0.2: - resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - '@npmcli/node-gyp': 3.0.0 - '@npmcli/promise-spawn': 6.0.2 - node-gyp: 9.4.0 - read-package-json-fast: 3.0.2 - which: 3.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@nuxtjs/opencollective@0.3.2: - resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true - dependencies: - chalk: 4.1.2 - consola: 2.15.3 - node-fetch: 2.6.12 - transitivePeerDependencies: - - encoding - dev: false - - /@octokit/auth-token@3.0.4: - resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} - engines: {node: '>= 14'} - dev: true - - /@octokit/core@4.2.4: - resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} - engines: {node: '>= 14'} - dependencies: - '@octokit/auth-token': 3.0.4 - '@octokit/graphql': 5.0.6 - '@octokit/request': 6.2.8 - '@octokit/request-error': 3.0.3 - '@octokit/types': 9.3.2 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/endpoint@7.0.6: - resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} - engines: {node: '>= 14'} - dependencies: - '@octokit/types': 9.3.2 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 - dev: true - - /@octokit/graphql@5.0.6: - resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} - engines: {node: '>= 14'} - dependencies: - '@octokit/request': 6.2.8 - '@octokit/types': 9.3.2 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/openapi-types@18.0.0: - resolution: {integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==} - dev: true - - /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): - resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} - engines: {node: '>= 14'} - peerDependencies: - '@octokit/core': '>=4' - dependencies: - '@octokit/core': 4.2.4 - '@octokit/tsconfig': 1.0.2 - '@octokit/types': 9.3.2 - dev: true - - /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): - resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 4.2.4 - dev: true - - /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): - resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} - engines: {node: '>= 14'} - peerDependencies: - '@octokit/core': '>=3' - dependencies: - '@octokit/core': 4.2.4 - '@octokit/types': 10.0.0 - dev: true - - /@octokit/request-error@3.0.3: - resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} - engines: {node: '>= 14'} - dependencies: - '@octokit/types': 9.3.2 - deprecation: 2.3.1 - once: 1.4.0 - dev: true - - /@octokit/request@6.2.8: - resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} - engines: {node: '>= 14'} - dependencies: - '@octokit/endpoint': 7.0.6 - '@octokit/request-error': 3.0.3 - '@octokit/types': 9.3.2 - is-plain-object: 5.0.0 - node-fetch: 2.6.12 - universal-user-agent: 6.0.0 - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/rest@19.0.13: - resolution: {integrity: sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==} - engines: {node: '>= 14'} - dependencies: - '@octokit/core': 4.2.4 - '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) - '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) - transitivePeerDependencies: - - encoding - dev: true - - /@octokit/tsconfig@1.0.2: - resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} - dev: true - - /@octokit/types@10.0.0: - resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} - dependencies: - '@octokit/openapi-types': 18.0.0 - dev: true - - /@octokit/types@9.3.2: - resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} - dependencies: - '@octokit/openapi-types': 18.0.0 - dev: true - - /@ohbug/browser@2.5.1: - resolution: {integrity: sha512-b6XBS7ZXG+7zZmy+S6CVeYYYJphTb/HVt2kfFVD9gC9MXiwTAjHMTkjDKp39jBnqJHv6qMKrUpol7pQAhmcOPA==} - dependencies: - '@ohbug/core': 2.2.1 - '@ohbug/types': 2.2.1 - '@ohbug/utils': 2.0.8 - error-stack-parser: 2.1.4 - dev: false - - /@ohbug/core@2.2.1: - resolution: {integrity: sha512-fLQ4nSJ28CLmV642zZIDCvI1XbBcWOLQ7HYG5wQYQskSAtz8nbuu3uA4lxpNfrOAe6qmhQa4MZSh8jalBDwTzQ==} - dependencies: - '@ohbug/types': 2.2.1 - '@ohbug/utils': 2.0.8 - dev: false - - /@ohbug/extension-feedback@0.7.2: - resolution: {integrity: sha512-wSXmeua/rIFON4OhvqFipCVWQAZkdQVJP7muqgGKOvo0pcU6w/ut1dQ6kib1tPyCt16i5ayVC54VJe44NvdMIA==} - dependencies: - '@ohbug/types': 2.2.1 - '@ohbug/utils': 2.0.8 - solid-js: 1.7.9 - dev: false - - /@ohbug/extension-rrweb@1.10.1(rrweb@2.0.0-alpha.4): - resolution: {integrity: sha512-KRq/RqgemR+KDlBNP4ojRYhtcfZVolzGaKSLPVJeG/EJCQg9VMvphskHI7BoQyDmOQTm4Nlj5Yg9JS7U9ooksA==} - peerDependencies: - rrweb: ^2.0.0 - dependencies: - '@ohbug/core': 2.2.1 - '@ohbug/types': 2.2.1 - '@rrweb/types': 2.0.0-alpha.9 - rrweb: 2.0.0-alpha.4 - dev: false - - /@ohbug/extension-uuid@2.1.1: - resolution: {integrity: sha512-dC7khwKnQ8cgpJI62nvF1cBUp0C33ZQp01vizCteG5BIAI2smQL5dWZhd5GZ0DiYxvv1YmZ3I5BVnuFLCWo/gA==} - dependencies: - '@ohbug/types': 2.2.1 - '@ohbug/utils': 2.0.8 - uuid: 9.0.0 - dev: false - - /@ohbug/extension-view@0.1.1: - resolution: {integrity: sha512-mtEzlD29Mld5sjYjxOfbjKwJNlGpPCImeYgLS/7QzrzS5OydX7fz+fKhHJmfFciVRqdB8Spd2bRJ1KUoHAmtnQ==} - dependencies: - '@ohbug/types': 2.2.1 - '@ohbug/utils': 2.0.8 - dayjs: 1.11.9 - dev: false - - /@ohbug/extension-web-vitals@0.2.1(web-vitals@3.4.0): - resolution: {integrity: sha512-1b7f0Q7xoTjCk2y0PxEpjvwutMeuH2GcFmTDnifTkOGQCdXFfdvMteL1wZm5MKL6xk1GH9f79megHujuFlUypQ==} - peerDependencies: - web-vitals: ^2.1.4 - dependencies: - '@ohbug/types': 2.2.1 - web-vitals: 3.4.0 - dev: false - - /@ohbug/react@2.0.9(react@16.14.0): - resolution: {integrity: sha512-UD4i7e7IGd6Qmcwvsm5kKfIojs/wqdcWANt2Wc/WFy9e7ppYyJcIvg1caskj3kmRY7fQS8blemTHQBQMPLN6AA==} - peerDependencies: - react: ^16.8.6 - dependencies: - '@ohbug/core': 2.2.1 - '@ohbug/types': 2.2.1 - react: 16.14.0 - dev: false - - /@ohbug/types@2.2.1: - resolution: {integrity: sha512-ZfY7pW2MPi3Kr+ASrYcBiQe8mAvekwmM2O5mkmiaTU1ggcxrSinqesWsea6BkO+54MSd68UC3vPJH5YkMVTf/Q==} - dev: false - - /@ohbug/utils@2.0.8: - resolution: {integrity: sha512-eAhFr8c+7Q6MtxvkwgEGAg91XZXoZzASIsUzoGQAqt/hlMIPHlsN9CO2Lxr012jBU/I/pnQteopq+sQbZQjKIA==} - dependencies: - '@ohbug/types': 2.2.1 - '@types/node': 20.5.6 - dev: false - - /@ohbug/vue@2.0.10(vue@3.3.4): - resolution: {integrity: sha512-b/f2OhcwS6mwVhQHhlyQXVVydPeyHNoPcRAYafHWRp85UOxlmUWJdHDLXZxwSfy91JllEYeMSbiSWJV9HzLh5A==} - peerDependencies: - vue: 2.x || 3.x - dependencies: - '@ohbug/core': 2.2.1 - '@ohbug/types': 2.2.1 - vue: 3.3.4 - dev: false - - /@panva/hkdf@1.1.1: - resolution: {integrity: sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==} - dev: false - - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true - optional: true - - /@pnpm/config.env-replace@1.1.0: - resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} - engines: {node: '>=12.22.0'} - dev: true - - /@pnpm/network.ca-file@1.0.2: - resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} - engines: {node: '>=12.22.0'} - dependencies: - graceful-fs: 4.2.10 - dev: true - - /@pnpm/npm-conf@2.2.2: - resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} - engines: {node: '>=12'} - dependencies: - '@pnpm/config.env-replace': 1.1.0 - '@pnpm/network.ca-file': 1.0.2 - config-chain: 1.1.13 - dev: true - - /@popperjs/core@2.11.8: - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - dev: false - - /@prisma/client@5.2.0(prisma@5.2.0): - resolution: {integrity: sha512-AiTjJwR4J5Rh6Z/9ZKrBBLel3/5DzUNntMohOy7yObVnVoTNVFi2kvpLZlFuKO50d7yDspOtW6XBpiAd0BVXbQ==} - engines: {node: '>=16.13'} - requiresBuild: true - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true - dependencies: - '@prisma/engines-version': 5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f - prisma: 5.2.0 - dev: false - - /@prisma/engines-version@5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f: - resolution: {integrity: sha512-jsnKT5JIDIE01lAeCj2ghY9IwxkedhKNvxQeoyLs6dr4ZXynetD0vTy7u6wMJt8vVPv8I5DPy/I4CFaoXAgbtg==} - dev: false - - /@prisma/engines@5.2.0: - resolution: {integrity: sha512-dT7FOLUCdZmq+AunLqB1Iz+ZH/IIS1Fz2THmKZQ6aFONrQD/BQ5ecJ7g2wGS2OgyUFf4OaLam6/bxmgdOBDqig==} - requiresBuild: true - - /@radix-ui/number@1.0.1: - resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} - dependencies: - '@babel/runtime': 7.22.6 - dev: false - - /@radix-ui/primitive@1.0.1: - resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} - dependencies: - '@babel/runtime': 7.22.6 - dev: false - - /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-avatar@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-9ToF7YNex3Ste45LrAeTlKtONI9yVRt/zOS158iilIkW5K/Apeyb/TUQlcEFTEFvWr8Kzdi2ZYrm1/suiXPajQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@types/react': 18.2.21 - react: 18.2.0 - dev: false - - /@radix-ui/react-context@1.0.1(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@types/react': 18.2.21 - react: 18.2.0 - dev: false - - /@radix-ui/react-direction@1.0.1(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@types/react': 18.2.21 - react: 18.2.0 - dev: false - - /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-dropdown-menu@2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xdOrZzOTocqqkCkYo8yRPCib5OkTkqN7lqNCdxwPOdE466DOaNl4N8PkUIlsXthQvW5Wwkd+aEmWpfWlBoDPEw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-menu': 2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@types/react': 18.2.21 - react: 18.2.0 - dev: false - - /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-id@1.0.1(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 - react: 18.2.0 - dev: false - - /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-menu@2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Gw4f9pwdH+w5w+49k0gLjN0PfRDHvxmAgG16AbyJZ7zhwZ6PBHKtWohvnSwfusfnK3L68dpBREHpVkj8wEM7ZA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - aria-hidden: 1.2.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) - dev: false - - /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@floating-ui/react-dom': 2.0.1(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-select@1.2.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/number': 1.0.1 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - aria-hidden: 1.2.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) - dev: false - - /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-slot@1.0.2(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 - react: 18.2.0 - dev: false - - /@radix-ui/react-toast@1.1.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-wf+fc8DOywrpRK3jlPlWVe+ELYGHdKDaaARJZNuUTWyWYq7+ANCFLp4rTjZ/mcGkJJQ/vZ949Zis9xxEpfq9OA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@types/react': 18.2.21 - react: 18.2.0 - dev: false - - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 - react: 18.2.0 - dev: false - - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 - react: 18.2.0 - dev: false - - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@types/react': 18.2.21 - react: 18.2.0 - dev: false - - /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@types/react': 18.2.21 - react: 18.2.0 - dev: false - - /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.21 - react: 18.2.0 - dev: false - - /@radix-ui/react-use-size@1.0.1(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 - react: 18.2.0 - dev: false - - /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 - '@types/react-dom': 18.2.7 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/rect@1.0.1: - resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} - dependencies: - '@babel/runtime': 7.22.6 - dev: false - - /@react-aria/accordion@3.0.0-alpha.20(react@18.2.0): - resolution: {integrity: sha512-dQIrZrUwfVIezny/7SknsxIeZ5R4VXMizuCC6XCTDgeu7Mx8O3/+quJwE58KAHT9mhvWx7Wk+QGNBOTNbwSXQQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + /@ohbug/browser@2.5.1: + resolution: {integrity: sha512-b6XBS7ZXG+7zZmy+S6CVeYYYJphTb/HVt2kfFVD9gC9MXiwTAjHMTkjDKp39jBnqJHv6qMKrUpol7pQAhmcOPA==} dependencies: - '@react-aria/button': 3.8.1(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/selection': 3.16.1(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/tree': 3.7.1(react@18.2.0) - '@react-types/accordion': 3.0.0-alpha.15(react@18.2.0) - '@react-types/button': 3.7.4(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 + '@ohbug/core': 2.2.1 + '@ohbug/types': 2.2.1 + '@ohbug/utils': 2.0.8 + error-stack-parser: 2.1.4 dev: false - /@react-aria/button@3.8.1(react@18.2.0): - resolution: {integrity: sha512-igxZ871An3Clpmpw+beN8F792NfEnEaLRAZ4jITtC/FdzwQwRM7eCu/ZEaqpNtbUtruAmYhafnG/2uCkKhTpTw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + /@ohbug/core@2.2.1: + resolution: {integrity: sha512-fLQ4nSJ28CLmV642zZIDCvI1XbBcWOLQ7HYG5wQYQskSAtz8nbuu3uA4lxpNfrOAe6qmhQa4MZSh8jalBDwTzQ==} dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/toggle': 3.6.1(react@18.2.0) - '@react-types/button': 3.7.4(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 + '@ohbug/types': 2.2.1 + '@ohbug/utils': 2.0.8 dev: false - /@react-aria/checkbox@3.10.0(react@18.2.0): - resolution: {integrity: sha512-1s5jkmag+41Fa2BwoOoM5cRRadDh3N8khgsziuGzD0NqvZLRCtHgDetNlileezFHwOeOWK6zCqDOrYLJhcMi8g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + /@ohbug/extension-feedback@0.7.2: + resolution: {integrity: sha512-wSXmeua/rIFON4OhvqFipCVWQAZkdQVJP7muqgGKOvo0pcU6w/ut1dQ6kib1tPyCt16i5ayVC54VJe44NvdMIA==} dependencies: - '@react-aria/label': 3.6.1(react@18.2.0) - '@react-aria/toggle': 3.7.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/checkbox': 3.4.4(react@18.2.0) - '@react-stately/toggle': 3.6.1(react@18.2.0) - '@react-types/checkbox': 3.5.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 + '@ohbug/types': 2.2.1 + '@ohbug/utils': 2.0.8 + solid-js: 1.7.9 dev: false - /@react-aria/dialog@3.5.4(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-+YGjX5ygYvFvnRGDy7LVTL2uRCH5VYosMNKn0vyel99SiwHH9d8fdnnJjVvSJ3u8kvoXk22+OnRE2/vEX+G1EA==} + /@ohbug/extension-rrweb@1.10.1(rrweb@2.0.0-alpha.4): + resolution: {integrity: sha512-KRq/RqgemR+KDlBNP4ojRYhtcfZVolzGaKSLPVJeG/EJCQg9VMvphskHI7BoQyDmOQTm4Nlj5Yg9JS7U9ooksA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + rrweb: ^2.0.0 dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/overlays': 3.6.1(react@18.2.0) - '@react-types/dialog': 3.5.4(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 - transitivePeerDependencies: - - react-dom + '@ohbug/core': 2.2.1 + '@ohbug/types': 2.2.1 + '@rrweb/types': 2.0.0-alpha.9 + rrweb: 2.0.0-alpha.4 dev: false - /@react-aria/focus@3.13.0(react@18.2.0): - resolution: {integrity: sha512-9DW7RqgbFWiImZmkmTIJGe9LrQBqEeLYwlKY+F1FTVXerIPiCCQ3JO3ESEa4lFMmkaHoueFLUrq2jkYjRNqoTw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + /@ohbug/extension-uuid@2.1.1: + resolution: {integrity: sha512-dC7khwKnQ8cgpJI62nvF1cBUp0C33ZQp01vizCteG5BIAI2smQL5dWZhd5GZ0DiYxvv1YmZ3I5BVnuFLCWo/gA==} dependencies: - '@react-aria/interactions': 3.16.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - clsx: 1.2.1 - react: 18.2.0 + '@ohbug/types': 2.2.1 + '@ohbug/utils': 2.0.8 + uuid: 9.0.0 dev: false - /@react-aria/focus@3.14.0(react@18.2.0): - resolution: {integrity: sha512-Xw7PxLT0Cqcz22OVtTZ8+HvurDogn9/xntzoIbVjpRFWzhlYe5WHnZL+2+gIiKf7EZ18Ma9/QsCnrVnvrky/Kw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + /@ohbug/extension-view@0.1.1: + resolution: {integrity: sha512-mtEzlD29Mld5sjYjxOfbjKwJNlGpPCImeYgLS/7QzrzS5OydX7fz+fKhHJmfFciVRqdB8Spd2bRJ1KUoHAmtnQ==} dependencies: - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - clsx: 1.2.1 - react: 18.2.0 + '@ohbug/types': 2.2.1 + '@ohbug/utils': 2.0.8 + dayjs: 1.11.9 dev: false - /@react-aria/grid@3.8.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-J/k7i2ZnMgTv3csMIQrIanbb0mWzlokT86QfKDgQpKxIvrPGbdrVJTx99tzJxEzYeXN9w11Jjwjal65rZCs4rQ==} + /@ohbug/extension-web-vitals@0.2.1(web-vitals@3.4.0): + resolution: {integrity: sha512-1b7f0Q7xoTjCk2y0PxEpjvwutMeuH2GcFmTDnifTkOGQCdXFfdvMteL1wZm5MKL6xk1GH9f79megHujuFlUypQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + web-vitals: ^2.1.4 dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/i18n': 3.8.1(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/live-announcer': 3.3.1 - '@react-aria/selection': 3.16.1(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/collections': 3.10.0(react@18.2.0) - '@react-stately/grid': 3.8.0(react@18.2.0) - '@react-stately/selection': 3.13.3(react@18.2.0) - '@react-stately/virtualizer': 3.6.1(react@18.2.0) - '@react-types/checkbox': 3.5.0(react@18.2.0) - '@react-types/grid': 3.2.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@ohbug/types': 2.2.1 + web-vitals: 3.4.0 dev: false - /@react-aria/i18n@3.8.1(react@18.2.0): - resolution: {integrity: sha512-ftH3saJlhWaHoHEDb/YjYqP8I4/9t4Ksf0D0kvPDRfRcL98DKUSHZD77+EmbjsmzJInzm76qDeEV0FYl4oj7gg==} + /@ohbug/react@2.0.9(react@16.14.0): + resolution: {integrity: sha512-UD4i7e7IGd6Qmcwvsm5kKfIojs/wqdcWANt2Wc/WFy9e7ppYyJcIvg1caskj3kmRY7fQS8blemTHQBQMPLN6AA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8.6 dependencies: - '@internationalized/date': 3.4.0 - '@internationalized/message': 3.1.1 - '@internationalized/number': 3.2.1 - '@internationalized/string': 3.1.1 - '@react-aria/ssr': 3.7.1(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 + '@ohbug/core': 2.2.1 + '@ohbug/types': 2.2.1 + react: 16.14.0 dev: false - /@react-aria/interactions@3.16.0(react@18.2.0): - resolution: {integrity: sha512-vXANFKVd6ONqNw8U+ZWbSA8lrduCOXw7cWsYosTa5dZ24ZJfRfbhlvRe8CaAKMhB/rOOmvTLaAwdIPia6JtLDg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - dependencies: - '@react-aria/ssr': 3.7.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 + /@ohbug/types@2.2.1: + resolution: {integrity: sha512-ZfY7pW2MPi3Kr+ASrYcBiQe8mAvekwmM2O5mkmiaTU1ggcxrSinqesWsea6BkO+54MSd68UC3vPJH5YkMVTf/Q==} dev: false - /@react-aria/interactions@3.17.0(react@18.2.0): - resolution: {integrity: sha512-v4BI5Nd8gi8s297fHpgjDDXOyufX+FPHJ31rkMwY6X1nR5gtI0+2jNOL4lh7s+cWzszpA0wpwIrKUPGhhLyUjQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + /@ohbug/utils@2.0.8: + resolution: {integrity: sha512-eAhFr8c+7Q6MtxvkwgEGAg91XZXoZzASIsUzoGQAqt/hlMIPHlsN9CO2Lxr012jBU/I/pnQteopq+sQbZQjKIA==} dependencies: - '@react-aria/ssr': 3.7.1(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 + '@ohbug/types': 2.2.1 + '@types/node': 20.5.6 dev: false - /@react-aria/label@3.6.1(react@18.2.0): - resolution: {integrity: sha512-hR7Qx6q0BjOJi/YG5pI13QTQA/2oaXMYdzDCx4Faz8qaY9CCsLjFpo5pUUwRhNieGmf/nHJq6jiYbJqfaONuTQ==} + /@ohbug/vue@2.0.10(vue@3.3.4): + resolution: {integrity: sha512-b/f2OhcwS6mwVhQHhlyQXVVydPeyHNoPcRAYafHWRp85UOxlmUWJdHDLXZxwSfy91JllEYeMSbiSWJV9HzLh5A==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + vue: 2.x || 3.x dependencies: - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/label': 3.7.5(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 + '@ohbug/core': 2.2.1 + '@ohbug/types': 2.2.1 + vue: 3.3.4 dev: false - /@react-aria/link@3.5.3(react@18.2.0): - resolution: {integrity: sha512-WGz/s/czlb/+wJUnBfnfaRuvOSiNTaQDTk9QsEEwrTkkYbWo7fMlH5Tc7c0Uxem4UuUblYXKth5SskiKQNWc0w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/link': 3.4.4(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 + /@panva/hkdf@1.1.1: + resolution: {integrity: sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==} dev: false - /@react-aria/listbox@3.10.1(react@18.2.0): - resolution: {integrity: sha512-hG+f7URcVk7saRG6bemCRaZSNMCg5U51ol/EuoKyHyvd0Vfq/AcsLYrg8vOyRWTsPwjxFtMLItNOZo36KIDs5w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@pnpm/config.env-replace@1.1.0: + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + dev: true + + /@pnpm/network.ca-file@1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/label': 3.6.1(react@18.2.0) - '@react-aria/selection': 3.16.1(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/collections': 3.10.0(react@18.2.0) - '@react-stately/list': 3.9.1(react@18.2.0) - '@react-types/listbox': 3.4.3(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 - dev: false + graceful-fs: 4.2.10 + dev: true - /@react-aria/live-announcer@3.3.1: - resolution: {integrity: sha512-hsc77U7S16trM86d+peqJCOCQ7/smO1cybgdpOuzXyiwcHQw8RQ4GrXrS37P4Ux/44E9nMZkOwATQRT2aK8+Ew==} + /@pnpm/npm-conf@2.2.2: + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + engines: {node: '>=12'} dependencies: - '@swc/helpers': 0.5.1 - dev: false + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + dev: true - /@react-aria/menu@3.10.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-FOb16XVejZgl4sFpclLvGd2RCvUBwl2bzFdAnss8Nd6Mx+h4m0bPeDT102k9v1Vjo7OGeqzvMyNU/KM4FwUGGA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/i18n': 3.8.1(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/overlays': 3.16.0(react-dom@18.2.0)(react@18.2.0) - '@react-aria/selection': 3.16.1(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/collections': 3.10.0(react@18.2.0) - '@react-stately/menu': 3.5.4(react@18.2.0) - '@react-stately/tree': 3.7.1(react@18.2.0) - '@react-types/button': 3.7.4(react@18.2.0) - '@react-types/menu': 3.9.3(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false - /@react-aria/overlays@3.16.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-jclyCqs1U4XqDA1DAdZaiijKtHLVZ78FV0+IzL4QQfrvzCPC+ba+MC8pe/tw8dMQzXBSnTx/IEqOHu07IwrESQ==} + /@prisma/client@5.2.0(prisma@5.2.0): + resolution: {integrity: sha512-AiTjJwR4J5Rh6Z/9ZKrBBLel3/5DzUNntMohOy7yObVnVoTNVFi2kvpLZlFuKO50d7yDspOtW6XBpiAd0BVXbQ==} + engines: {node: '>=16.13'} + requiresBuild: true peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/i18n': 3.8.1(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/ssr': 3.7.1(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-aria/visually-hidden': 3.8.3(react@18.2.0) - '@react-stately/overlays': 3.6.1(react@18.2.0) - '@react-types/button': 3.7.4(react@18.2.0) - '@react-types/overlays': 3.8.1(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@prisma/engines-version': 5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f + prisma: 5.2.0 dev: false - /@react-aria/progress@3.4.4(react@18.2.0): - resolution: {integrity: sha512-k4EBtYcmqw3j/JYJtn+xKPM8/P1uPcFGSBqvwmVdwDknuT/hR1os3wIKm712N/Ubde8hTeeLcaa38HYezSF8BA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - dependencies: - '@react-aria/i18n': 3.8.1(react@18.2.0) - '@react-aria/label': 3.6.1(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/progress': 3.4.2(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 + /@prisma/engines-version@5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f: + resolution: {integrity: sha512-jsnKT5JIDIE01lAeCj2ghY9IwxkedhKNvxQeoyLs6dr4ZXynetD0vTy7u6wMJt8vVPv8I5DPy/I4CFaoXAgbtg==} dev: false - /@react-aria/radio@3.7.0(react@18.2.0): - resolution: {integrity: sha512-ygSr3ow9avO5BNNwm4aL70EwvLHrBbhSVfG1lmP2k5u/2dxn+Pnm3BGMaEriOFiAyAV4nLGUZAjER6GWXfu5cA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + /@prisma/engines@5.2.0: + resolution: {integrity: sha512-dT7FOLUCdZmq+AunLqB1Iz+ZH/IIS1Fz2THmKZQ6aFONrQD/BQ5ecJ7g2wGS2OgyUFf4OaLam6/bxmgdOBDqig==} + requiresBuild: true + + /@radix-ui/number@1.0.1: + resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/i18n': 3.8.1(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/label': 3.6.1(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/radio': 3.8.3(react@18.2.0) - '@react-types/radio': 3.5.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 + '@babel/runtime': 7.22.6 dev: false - /@react-aria/selection@3.16.1(react@18.2.0): - resolution: {integrity: sha512-mOoAeNjq23H5p6IaeoyLHavYHRXOuNUlv8xO4OzYxIEnxmAvk4PCgidGLFYrr4sloftUMgTTL3LpCj21ylBS9A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + /@radix-ui/primitive@1.0.0: + resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/i18n': 3.8.1(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/collections': 3.10.0(react@18.2.0) - '@react-stately/selection': 3.13.3(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - react: 18.2.0 + '@babel/runtime': 7.22.6 dev: false - /@react-aria/ssr@3.7.0(react@18.2.0): - resolution: {integrity: sha512-bfufjg4ESE5giN+Fxj1XIzS5f/YIhqcGc+Ve+vUUKU8xZ8t/Xtjlv8F3kjqDBQdk//n3mluFY7xG1wQVB9rMLQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + /@radix-ui/primitive@1.0.1: + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: - '@swc/helpers': 0.5.1 - react: 18.2.0 + '@babel/runtime': 7.22.6 dev: false - /@react-aria/ssr@3.7.1(react@18.2.0): - resolution: {integrity: sha512-ovVPSD1WlRpZHt7GI9DqJrWG3OIYS+NXQ9y5HIewMJpSe+jPQmMQfyRmgX4EnvmxSlp0u04Wg/7oItcoSIb/RA==} - engines: {node: '>= 12'} + /@radix-ui/react-accordion@1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-aria/switch@3.5.3(react@18.2.0): - resolution: {integrity: sha512-3sV78Oa12/aU+M9P7BqUDdp/zm2zZA2QvtLLdxykrH04AJp0hLNBnmaTDXJVaGPPiU0umOB0LWDquA3apkBiBA==} + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-aria/toggle': 3.7.0(react@18.2.0) - '@react-stately/toggle': 3.6.1(react@18.2.0) - '@react-types/switch': 3.4.0(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-aria/table@3.11.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-kPIQWh1dIHFAzl+rzfUGgbpAZGerMwwW0zNvRwcLpBOl/nrOwV5Zg/wuCC5cSdkwgo3SghYbcUaM19teve0UcQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/grid': 3.8.1(react-dom@18.2.0)(react@18.2.0) - '@react-aria/i18n': 3.8.1(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/live-announcer': 3.3.1 - '@react-aria/selection': 3.16.1(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-aria/visually-hidden': 3.8.3(react@18.2.0) - '@react-stately/collections': 3.10.0(react@18.2.0) - '@react-stately/flags': 3.0.0 - '@react-stately/table': 3.11.0(react@18.2.0) - '@react-stately/virtualizer': 3.6.1(react@18.2.0) - '@react-types/checkbox': 3.5.0(react@18.2.0) - '@react-types/grid': 3.2.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@react-types/table': 3.8.0(react@18.2.0) - '@swc/helpers': 0.5.1 + /@radix-ui/react-avatar@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9ToF7YNex3Ste45LrAeTlKtONI9yVRt/zOS158iilIkW5K/Apeyb/TUQlcEFTEFvWr8Kzdi2ZYrm1/suiXPajQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@react-aria/tabs@3.6.2(react@18.2.0): - resolution: {integrity: sha512-FjI0h1Z4TsLOvIODhdDrVLz0O8RAqxDi58DO88CwkdUrWwZspNEpSpHhDarzUT7MlX3X72lsAUwvQLqY1OmaBQ==} + /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/i18n': 3.8.1(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/selection': 3.16.1(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/list': 3.9.1(react@18.2.0) - '@react-stately/tabs': 3.5.1(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@react-types/tabs': 3.3.1(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-aria/textfield@3.11.0(react@18.2.0): - resolution: {integrity: sha512-07pHRuWeLmsmciWL8y9azUwcBYi1IBmOT9KxBgLdLK5NLejd7q2uqd0WEEgZkOc48i2KEtMDgBslc4hA+cmHow==} + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/label': 3.6.1(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@react-types/textfield': 3.7.3(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-aria/toggle@3.7.0(react@18.2.0): - resolution: {integrity: sha512-8Rpqolm8dxesyHi03RSmX2MjfHO/YwdhyEpAMMO0nsajjdtZneGzIOXzyjdWCPWwwzahcpwRHOA4qfMiRz+axA==} + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/toggle': 3.6.1(react@18.2.0) - '@react-types/checkbox': 3.5.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@react-types/switch': 3.4.0(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-aria/tooltip@3.6.1(react@18.2.0): - resolution: {integrity: sha512-CVSmndGXhC5EkkGrKcC8EVdAKCbSLTyJibpojC/8uOCbGIQglq3xCAr68PElNNO8+sFDJ4fp9ZzEeDi0Qyxf0w==} + /@radix-ui/react-compose-refs@1.0.0(react@18.2.0): + resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@react-aria/focus': 3.14.0(react@18.2.0) - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-stately/tooltip': 3.4.3(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@react-types/tooltip': 3.4.3(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 react: 18.2.0 dev: false - /@react-aria/utils@3.19.0(react@18.2.0): - resolution: {integrity: sha512-5GXqTCrUQtr78aiLVHZoeeGPuAxO4lCM+udWbKpSCh5xLfCZ7zFlZV9Q9FS0ea+IQypUcY8ngXCLsf22nSu/yg==} + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@react-aria/ssr': 3.7.1(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - clsx: 1.2.1 + '@babel/runtime': 7.22.6 + '@types/react': 18.2.21 react: 18.2.0 dev: false - /@react-aria/visually-hidden@3.8.3(react@18.2.0): - resolution: {integrity: sha512-Ln3rqUnPF/UiiPjj8Xjc5FIagwNvG16qtAR2Diwnsju+X9o2xeDEZhN/5fg98PxH2JBS3IvtsmMZRzPT9mhpmg==} + /@radix-ui/react-context@1.0.0(react@18.2.0): + resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 - clsx: 1.2.1 + '@babel/runtime': 7.22.6 react: 18.2.0 dev: false - /@react-stately/checkbox@3.4.4(react@18.2.0): - resolution: {integrity: sha512-TYNod4+4TmS73F+sbKXAMoBH810ZEBdpMfXlNttUCXfVkDXc38W7ucvpQxXPwF+d+ZhGk4DJZsUYqfVPyXXSGg==} + /@radix-ui/react-context@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@react-stately/toggle': 3.6.1(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/checkbox': 3.5.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@types/react': 18.2.21 react: 18.2.0 dev: false - /@react-stately/collections@3.10.0(react@18.2.0): - resolution: {integrity: sha512-PyJEFmt9X0kDMF7D4StGnTdXX1hgyUcTXvvXU2fEw6OyXLtmfWFHmFARRtYbuelGKk6clmJojYmIEds0k8jdww==} + /@radix-ui/react-dialog@1.0.0(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-context': 1.0.0(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.0(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.0(react@18.2.0) + '@radix-ui/react-portal': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.0(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0) + aria-hidden: 1.2.3 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.4(@types/react@18.2.21)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' dev: false - /@react-stately/collections@3.9.0(react@18.2.0): - resolution: {integrity: sha512-CBpXSKmCpbIFpIToVFlzo2R1/Cj+dcU8gWw2KfPyyJX+2wHKkDIvtK01EAytDLX/vkE8O+fD5a7qMZ3pf8gpeA==} + /@radix-ui/react-dialog@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-hJtRy/jPULGQZceSAP2Re6/4NpKo8im6V8P2hUqZsdFiSL8l35kYsw3qbRI6Ay5mQd2+wlLqje770eq+RJ3yZg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-types/shared': 3.18.1(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + aria-hidden: 1.2.3 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) dev: false - /@react-stately/flags@3.0.0: - resolution: {integrity: sha512-e3i2ItHbIa0eEwmSXAnPdD7K8syW76JjGe8ENxwFJPW/H1Pu9RJfjkCb/Mq0WSPN/TpxBb54+I9TgrGhbCoZ9w==} - dependencies: - '@swc/helpers': 0.4.36 - dev: false - - /@react-stately/grid@3.8.0(react@18.2.0): - resolution: {integrity: sha512-+3Q6D3W5FTc9/t1Gz35sH0NRiJ2u95aDls9ogBNulC/kQvYaF31NT34QdvpstcfrcCFtF+D49+TkesklZRHJlw==} + /@radix-ui/react-direction@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@react-stately/collections': 3.10.0(react@18.2.0) - '@react-stately/selection': 3.13.3(react@18.2.0) - '@react-types/grid': 3.2.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@types/react': 18.2.21 react: 18.2.0 dev: false - /@react-stately/list@3.9.0(react@18.2.0): - resolution: {integrity: sha512-9DNV02zFEkJG38AtHyhvGMfpJQGwV0KMyMObs+KEujzCh+rmHdTu1rWdjzLw1ve+ecESK8UMsF4Kt6wwO0Qi6g==} + /@radix-ui/react-dismissable-layer@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@react-stately/collections': 3.9.0(react@18.2.0) - '@react-stately/selection': 3.13.2(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/shared': 3.18.1(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.0(react@18.2.0) react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-stately/list@3.9.1(react@18.2.0): - resolution: {integrity: sha512-GiKrxGakzMTZKe3mp410l4xKiHbZplJCGrtqlxq/+YRD0uCQwWGYpRG+z9A7tTCusruRD3m91/OjWsbfbGdiEw==} + /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-stately/collections': 3.10.0(react@18.2.0) - '@react-stately/selection': 3.13.3(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-stately/menu@3.5.3(react@18.2.0): - resolution: {integrity: sha512-RFgwVD/4BgTtJkexi1WaHpAEkQWZPvpyri0LQUgXWVqBf9PpjB8wigF3XBLMDNkL+YXE0QtzQZBNS1nJECf7rg==} + /@radix-ui/react-dropdown-menu@2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xdOrZzOTocqqkCkYo8yRPCib5OkTkqN7lqNCdxwPOdE466DOaNl4N8PkUIlsXthQvW5Wwkd+aEmWpfWlBoDPEw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-stately/overlays': 3.6.0(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/menu': 3.9.2(react@18.2.0) - '@react-types/shared': 3.18.1(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-menu': 2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-stately/menu@3.5.4(react@18.2.0): - resolution: {integrity: sha512-+Q71fMDhMM1iARPFtwqpXY/8qkb0dN4PBJbcjwjGCumGs+ja2YbZxLBHCP0DYBElS9l6m3ssF47RKNMtF/Oi5w==} + /@radix-ui/react-focus-guards@1.0.0(react@18.2.0): + resolution: {integrity: sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@react-stately/overlays': 3.6.1(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/menu': 3.9.3(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 react: 18.2.0 dev: false - /@react-stately/overlays@3.6.0(react@18.2.0): - resolution: {integrity: sha512-0Bgy4xwCXKM+jkHAGJMN19ZFXNgKstf6qJozfH79j3E5erY30ZStwT7gbAnwv112zFUQLHBKo+3wJTGWuHgs8Q==} + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/overlays': 3.8.0(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@types/react': 18.2.21 react: 18.2.0 dev: false - /@react-stately/overlays@3.6.1(react@18.2.0): - resolution: {integrity: sha512-c/Mda4ZZmFO4e3XZFd7kqt5wuh6Q/7wYJ+0oG59MfDoQstFwGcJTUnx7S8EUMujbocIOCeOmVPA1eE3DNPC2/A==} + /@radix-ui/react-focus-scope@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/overlays': 3.8.1(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-stately/radio@3.8.3(react@18.2.0): - resolution: {integrity: sha512-3ovJ6tDWzl/Qap8065GZS9mQM7LbQwLc7EhhmQ3dn5+pH4pUCHo8Gb0TIcYFsvFMyHrNMg/r8+N3ICq/WDj5NQ==} + /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/radio': 3.5.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-stately/selection@3.13.2(react@18.2.0): - resolution: {integrity: sha512-rVnseneG9XWuS0+JEsa0EhRfTZsupm9JiEuZHZ19YeLewjVdFpjgBMDZb8ZYoyilNXVjyUwaoq94FsOXotsg9w==} + /@radix-ui/react-id@1.0.0(react@18.2.0): + resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@react-stately/collections': 3.9.0(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/shared': 3.18.1(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) react: 18.2.0 dev: false - /@react-stately/selection@3.13.3(react@18.2.0): - resolution: {integrity: sha512-+CmpZpyIXfbxEwd9eBvo5Jatc2MNX7HinBcW3X8GfvqNzkbgOXETsmXaW6jlKJekvLLE13Is78Ob8NNzZVxQYg==} + /@radix-ui/react-id@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@react-stately/collections': 3.10.0(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 react: 18.2.0 dev: false - /@react-stately/table@3.11.0(react@18.2.0): - resolution: {integrity: sha512-mHv8KgNHm6scO0gntQc1ZVbQaAqLiNzYi4hxksz2lY+HN2CJbJkYGl/aRt4jmnfpi1xWpwYP5najXdncMAKpGA==} + /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-stately/collections': 3.10.0(react@18.2.0) - '@react-stately/flags': 3.0.0 - '@react-stately/grid': 3.8.0(react@18.2.0) - '@react-stately/selection': 3.13.3(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/grid': 3.2.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@react-types/table': 3.8.0(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-stately/tabs@3.5.1(react@18.2.0): - resolution: {integrity: sha512-p1vZOuIS98GMF9jfEHQA6Pir1wYY6j+Gni6DcluNnWj90rLEubuwARNw7uscoOaXKlK/DiZIhkLKSDsA5tbadQ==} + /@radix-ui/react-menu@2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Gw4f9pwdH+w5w+49k0gLjN0PfRDHvxmAgG16AbyJZ7zhwZ6PBHKtWohvnSwfusfnK3L68dpBREHpVkj8wEM7ZA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-stately/list': 3.9.1(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@react-types/tabs': 3.3.1(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + aria-hidden: 1.2.3 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) dev: false - /@react-stately/toggle@3.6.1(react@18.2.0): - resolution: {integrity: sha512-UUWtuI6gZlX6wpF9/bxBikjyAW1yQojRPCJ4MPkjMMBQL0iveAm3WEQkXRLNycEiOCeoaVFBwAd1L9h9+fuCFg==} + /@radix-ui/react-popover@1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/checkbox': 3.5.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + aria-hidden: 1.2.3 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) dev: false - /@react-stately/tooltip@3.4.3(react@18.2.0): - resolution: {integrity: sha512-IX/XlLdwSQWy75TAOARm6hxajRWV0x/C7vGA54O+JNvvfZ212+nxVyTSduM+zjULzhOPICSSUFKmX4ZCV/aHSg==} + /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-stately/overlays': 3.6.1(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/tooltip': 3.4.3(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@floating-ui/react-dom': 2.0.1(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-stately/tree@3.7.0(react@18.2.0): - resolution: {integrity: sha512-oXOjJwy/o3XSJyBkudiEvnjWzto2jy48kmGjHCJ+B7Hv+WcbN9o7iAaHv11lOqMXRSpuF9gqox4ZZCASG+smIQ==} + /@radix-ui/react-portal@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@react-stately/collections': 3.9.0(react@18.2.0) - '@react-stately/selection': 3.13.2(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/shared': 3.18.1(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-stately/tree@3.7.1(react@18.2.0): - resolution: {integrity: sha512-D0BWcLTRx7EOTdAJCgYV6zm18xpNDxmv4meKJ/WmYSFq1bkHPN75NLv7VPf5Uvsm66xshbO/B3A4HB2/ag1yPA==} + /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-stately/collections': 3.10.0(react@18.2.0) - '@react-stately/selection': 3.13.3(react@18.2.0) - '@react-stately/utils': 3.7.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-stately/utils@3.7.0(react@18.2.0): - resolution: {integrity: sha512-VbApRiUV2rhozOfk0Qj9xt0qjVbQfLTgAzXLdrfeZSBnyIgo1bFRnjDpnDZKZUUCeGQcJJI03I9niaUtY+kwJQ==} + /@radix-ui/react-presence@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-stately/virtualizer@3.6.0(react@18.2.0): - resolution: {integrity: sha512-f78BQT9ZSD5Hpqf6axRoNQJFqV+JjMSV2VixMfhIAcqi/fn8rEN2j3g4SPdFzTtFf2FR3+AKdBFu5tsgtk1Tgw==} + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/shared': 3.18.1(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-stately/virtualizer@3.6.1(react@18.2.0): - resolution: {integrity: sha512-Gq5gQ1YPgTakPCkWnmp9P6p5uGoVS+phm6Ie34lmZQ+E62lrkHK0XG0bkOuvMSdWwzql0oLg03E/SMOahI9vNA==} + /@radix-ui/react-primitive@1.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@react-aria/utils': 3.19.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - '@swc/helpers': 0.5.1 + '@babel/runtime': 7.22.6 + '@radix-ui/react-slot': 1.0.0(react@18.2.0) react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-types/accordion@3.0.0-alpha.15(react@18.2.0): - resolution: {integrity: sha512-BzR/9zVS1plc7s22szg5q2l15q+2pyyiM7S87Jfs9ROduM9GJjS3MwFvUyXAaYbh9t0Wkw+3ZZITUENimwFVPA==} + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-types/button@3.7.4(react@18.2.0): - resolution: {integrity: sha512-y1JOnJ3pqg2ezZz/fdwMMToPj+8fgj/He7z1NRWtIy1/I7HP+ilSK6S/MLO2jRsM2QfCq8KSw5MQEZBPiPWsjw==} + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-types/checkbox@3.5.0(react@18.2.0): - resolution: {integrity: sha512-fCisTdqFKkz7FvxNoexXIiVsTBt0ZwIyeIZz/S41M6hzIZM38nKbh6yS/lveQ+/877Dn7+ngvbpJ8QYnXYVrIQ==} + /@radix-ui/react-select@1.2.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + aria-hidden: 1.2.3 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) dev: false - /@react-types/dialog@3.5.4(react@18.2.0): - resolution: {integrity: sha512-WCEkUf93XauGaPaF1efTJ8u04Z5iUgmmzRbFnGLrske7rQJYfryP3+26zCxtKKlOTgeFORq5AHeH6vqaMKOhhg==} + /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-types/overlays': 3.8.1(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-types/grid@3.2.0(react@18.2.0): - resolution: {integrity: sha512-ZIzFDbuBgqaPNvZ18/fOdm9Ol0m5rFPlhSxQfyAgUOXFaQhl/1+BsG8FsHla/Y6tTmxDt5cVrF5PX2CWzZmtOw==} + /@radix-ui/react-slot@1.0.0(react@18.2.0): + resolution: {integrity: sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) react: 18.2.0 dev: false - /@react-types/label@3.7.5(react@18.2.0): - resolution: {integrity: sha512-iNO5T1UYK7FPF23cwRLQJ4zth2rqoJWbz27Wikwt8Cw8VbVVzfLBPUBZoUyeBVZ0/zzTvEgZUW75OrmKb4gqhw==} + /@radix-ui/react-slot@1.0.2(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 react: 18.2.0 dev: false - /@react-types/link@3.4.4(react@18.2.0): - resolution: {integrity: sha512-/FnKf7W6nCNZ2E96Yo1gaX63eSxERmtovQbkRRdsgPLfgRcqzQIVzQtNJThIbVNncOnAw3qvIyhrS0weUTFacQ==} + /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-aria/interactions': 3.17.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-types/listbox@3.4.3(react@18.2.0): - resolution: {integrity: sha512-AHOnx5z+q/uIsBnGqrNJ25OSTbOe2/kWXWUcPDdfZ29OBqoDZu86psAOA97glYod97w/KzU5xq8EaxDrWupKuQ==} + /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-types/menu@3.9.2(react@18.2.0): - resolution: {integrity: sha512-OIuEOGqo8gHaP4k3Ua+RvuPN2/3Sgcl30dNFIGaK7hra4eWxOUu8TTC+/Quy6xozR/SvFhqCLCoMKixy6MblWQ==} + /@radix-ui/react-toast@1.1.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wf+fc8DOywrpRK3jlPlWVe+ELYGHdKDaaARJZNuUTWyWYq7+ANCFLp4rTjZ/mcGkJJQ/vZ949Zis9xxEpfq9OA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-types/overlays': 3.8.0(react@18.2.0) - '@react-types/shared': 3.18.1(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-types/menu@3.9.3(react@18.2.0): - resolution: {integrity: sha512-0dgIIM9z3hzjFltT+1/L8Hj3oDEcdYkexQhaA+jv6xBHUI5Bqs4SaJAeSGrGz5u6tsrHBPEgf/TLk9Dg9c7XMA==} + /@radix-ui/react-tooltip@1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-types/overlays': 3.8.1(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-types/overlays@3.8.0(react@18.2.0): - resolution: {integrity: sha512-0JxwUW3xwXjsT+nVI5dVE1KUm8QKxnQj9vjqgsazX213+klRd/QdeuFJgcbxzCVFOS/mLkP4o/ATjxt4+1eQsA==} + /@radix-ui/react-use-callback-ref@1.0.0(react@18.2.0): + resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@react-types/shared': 3.18.1(react@18.2.0) + '@babel/runtime': 7.22.6 react: 18.2.0 dev: false - /@react-types/overlays@3.8.1(react@18.2.0): - resolution: {integrity: sha512-aDI/K3E2XACkey8SCBmAerLhYSUFa8g8tML4SoQbfEJPRj+jJztbHbg9F7b3HKDUk4ZOjcUdQRfz1nFHORdbtQ==} + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@types/react': 18.2.21 react: 18.2.0 dev: false - /@react-types/progress@3.4.1(react@18.2.0): - resolution: {integrity: sha512-Y6cTvvJjbfFBeB7Zb3PizhhO3+YLWXpIP8opto15RWu11ktgZVMUgsnlsJgE3dFeoZ7UHwXdCYf8JOzBw5VPHA==} + /@radix-ui/react-use-controllable-state@1.0.0(react@18.2.0): + resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@react-types/shared': 3.18.1(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) react: 18.2.0 dev: false - /@react-types/progress@3.4.2(react@18.2.0): - resolution: {integrity: sha512-UvnBt1OtjgQgOM3556KpuAXSdvSIVGSeD4+otTfkl05ieTcy6Lx7ef3TFI2KfQP45a9JeRBstTNpThBmuRe03A==} + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 react: 18.2.0 dev: false - /@react-types/radio@3.5.0(react@18.2.0): - resolution: {integrity: sha512-jpAG03eYxLvD1+zLoHXVUR7BCXfzbaQnOv5vu2R4EXhBA7t1/HBOAY/WHbUEgrnyDYa2na7dr/RbY81H9JqR0g==} + /@radix-ui/react-use-escape-keydown@1.0.0(react@18.2.0): + resolution: {integrity: sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) react: 18.2.0 dev: false - /@react-types/select@3.8.2(react@18.2.0): - resolution: {integrity: sha512-m11J/xBR8yFwPLuueoFHzr4DiLyY7nKLCbZCz1W2lwIyd8Tl2iJwcLcuJiyUTJwdSTcCDgvbkY4vdTfLOIktYQ==} + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 react: 18.2.0 dev: false - /@react-types/shared@3.18.1(react@18.2.0): - resolution: {integrity: sha512-OpTYRFS607Ctfd6Tmhyk6t6cbFyDhO5K+etU35X50pMzpypo1b7vF0mkngEeTc0Xwl0e749ONZNPZskMyu5k8w==} + /@radix-ui/react-use-layout-effect@1.0.0(react@18.2.0): + resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^16.8 || ^17.0 || ^18.0 dependencies: + '@babel/runtime': 7.22.6 react: 18.2.0 dev: false - /@react-types/shared@3.19.0(react@18.2.0): - resolution: {integrity: sha512-h852l8bWhqUxbXIG8vH3ab7gE19nnP3U1kuWf6SNSMvgmqjiRN9jXKPIFxF/PbfdvnXXm0yZSgSMWfUCARF0Cg==} + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: + '@babel/runtime': 7.22.6 + '@types/react': 18.2.21 react: 18.2.0 dev: false - /@react-types/switch@3.4.0(react@18.2.0): - resolution: {integrity: sha512-vUA4Etm7ZiThYN3IotPXl99gHYZNJlc/f9o/SgAUSxtk5pBv5unOSmXLdrvk01Kd6TJ/MjL42IxRShygyr8mTQ==} + /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@react-types/checkbox': 3.5.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@types/react': 18.2.21 react: 18.2.0 dev: false - /@react-types/table@3.8.0(react@18.2.0): - resolution: {integrity: sha512-/7IBG4ZlJHvEPQwND/q6ZFzfXq0Bc1ohaocDFzEOeNtVUrgQ2rFS64EY2p8G7BL9XDJFTY2R5dLYqjyGFojUvQ==} + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@react-types/grid': 3.2.0(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.21 react: 18.2.0 dev: false - /@react-types/tabs@3.3.1(react@18.2.0): - resolution: {integrity: sha512-vPxSbLCU7RT+Rupvu/1uOAesxlR/53GD5ZbgLuQRr/oEZRbsjY8Cs3CE3LGv49VdvBWivXUvHiF5wSE7CdWs1w==} + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 react: 18.2.0 dev: false - /@react-types/textfield@3.7.3(react@18.2.0): - resolution: {integrity: sha512-M2u9NK3iqQEmTp4G1Dk36pCleyH/w1n+N52u5n0fRlxvucY/Od8W1zvk3w9uqJLFHSlzleHsfSvkaETDJn7FYw==} + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true dependencies: - '@react-types/shared': 3.19.0(react@18.2.0) + '@babel/runtime': 7.22.6 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@react-types/tooltip@3.4.3(react@18.2.0): - resolution: {integrity: sha512-ne1SVhgofHRZNhoQM4iMCSjCstpdPBpM81B4KDJ7XmWax0+dP4qmdxMc7qvEm7GjuZLfYx5f44fWytKm1BkZmg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + /@radix-ui/rect@1.0.1: + resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} dependencies: - '@react-types/overlays': 3.8.1(react@18.2.0) - '@react-types/shared': 3.19.0(react@18.2.0) - react: 18.2.0 + '@babel/runtime': 7.22.6 dev: false /@release-it/conventional-changelog@7.0.0(release-it@16.1.5): @@ -6436,19 +4818,6 @@ packages: '@swc/core-win32-ia32-msvc': 1.3.80 '@swc/core-win32-x64-msvc': 1.3.80 - /@swc/helpers@0.4.14: - resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} - dependencies: - tslib: 2.6.1 - dev: false - - /@swc/helpers@0.4.36: - resolution: {integrity: sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==} - dependencies: - legacy-swc-helpers: /@swc/helpers@0.4.14 - tslib: 2.6.1 - dev: false - /@swc/helpers@0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} dependencies: @@ -6553,22 +4922,6 @@ packages: '@types/node': 20.5.6 '@types/responselike': 1.0.0 - /@types/color-convert@2.0.0: - resolution: {integrity: sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==} - dependencies: - '@types/color-name': 1.1.1 - dev: false - - /@types/color-name@1.1.1: - resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==} - dev: false - - /@types/color@3.0.3: - resolution: {integrity: sha512-X//qzJ3d3Zj82J9sC/C18ZY5f43utPbAJ6PhYt/M7uG6etcF6MRpKdN880KBy43B0BMzSfeT96MzrsNjFI3GbA==} - dependencies: - '@types/color-convert': 2.0.0 - dev: false - /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: @@ -6623,10 +4976,6 @@ packages: '@types/serve-static': 1.15.2 dev: false - /@types/flat@5.0.2: - resolution: {integrity: sha512-3zsplnP2djeps5P9OyarTxwRpMLoe5Ash8aL9iprw0JxB+FAHjY+ifn4yZUuW4/9hqtnmor6uvjSRzJhiVbrEQ==} - dev: false - /@types/http-cache-semantics@4.0.1: resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} @@ -6658,30 +5007,6 @@ packages: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} dev: false - /@types/lodash.foreach@4.5.7: - resolution: {integrity: sha512-YjBEB6/Bl19V+R70IpyB/MhMb2IvrSgD26maRNyqbGRNDTH9AnPrQoT+ECvhFJ/hwhQ+RgYWaZKvF+knCguMJw==} - dependencies: - '@types/lodash': 4.14.196 - dev: false - - /@types/lodash.get@4.4.7: - resolution: {integrity: sha512-af34Mj+KdDeuzsJBxc/XeTtOx0SZHZNLd+hdrn+PcKGQs0EG2TJTzQAOTCZTgDJCArahlCzLWSy8c2w59JRz7Q==} - dependencies: - '@types/lodash': 4.14.196 - dev: false - - /@types/lodash.kebabcase@4.1.7: - resolution: {integrity: sha512-qzrcpK5uiADZ9OyZaegalM0b9Y3WetoBQ04RAtP3xZFGC5ul1UxmbjZ3j6suCh0BDkvgQmoMh8t5e9cVrdJYMw==} - dependencies: - '@types/lodash': 4.14.196 - dev: false - - /@types/lodash.mapkeys@4.6.7: - resolution: {integrity: sha512-mfK0jlh4Itdhmy69/7r/vYftWaltahoS9kCF62UyvbDtXzMkUjuypaf2IASeoeoUPqBo/heoJSZ/vntbXC6LAA==} - dependencies: - '@types/lodash': 4.14.196 - dev: false - /@types/lodash.mergewith@4.6.6: resolution: {integrity: sha512-RY/8IaVENjG19rxTZu9Nukqh0W2UrYgmBj5sdns4hWRZaV8PqR7wIKHFKzvOTjo4zVRV7sVI+yFhAJql12Kfqg==} dependencies: @@ -6694,12 +5019,6 @@ packages: '@types/lodash': 4.14.196 dev: false - /@types/lodash.omit@4.5.7: - resolution: {integrity: sha512-6q6cNg0tQ6oTWjSM+BcYMBhan54P/gLqBldG4AuXd3nKr0oeVekWNS4VrNEu3BhCSDXtGapi7zjhnna0s03KpA==} - dependencies: - '@types/lodash': 4.14.196 - dev: false - /@types/lodash@4.14.196: resolution: {integrity: sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==} dev: false @@ -8052,11 +6371,6 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - /clsx@1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} - dev: false - /clsx@2.0.0: resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} engines: {node: '>=6'} @@ -8067,6 +6381,20 @@ packages: engines: {node: '>=0.10.0'} dev: false + /cmdk@0.2.0(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-JQpKvEOb86SnvMZbYaFKYhvzFntWBeSZdyii0rZPhKJj9uwJBxu4DaVYDrRN7r3mPop56oPhRw+JYWTKs66TYw==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@radix-ui/react-dialog': 1.0.0(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + command-score: 0.1.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -8084,13 +6412,6 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - dev: false - /color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true @@ -8100,14 +6421,6 @@ packages: resolution: {integrity: sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w==} dev: false - /color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - dev: false - /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -8118,6 +6431,10 @@ packages: delayed-stream: 1.0.0 dev: false + /command-score@0.1.2: + resolution: {integrity: sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==} + dev: false + /commander@11.0.0: resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} engines: {node: '>=16'} @@ -8184,10 +6501,6 @@ packages: resolution: {integrity: sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g==} dev: false - /compute-scroll-into-view@3.0.3: - resolution: {integrity: sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==} - dev: false - /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -9772,11 +8085,6 @@ packages: rimraf: 3.0.2 dev: true - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - dev: false - /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true @@ -10728,15 +9036,6 @@ packages: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} - /intl-messageformat@10.5.0: - resolution: {integrity: sha512-AvojYuOaRb6r2veOKfTVpxH9TrmjSdc5iR9R5RgBwrDZYSmAAFVT+QLbW3C4V7Qsg0OguMp67Q/EoUkxZzXRGw==} - dependencies: - '@formatjs/ecma402-abstract': 1.17.0 - '@formatjs/fast-memoize': 2.2.0 - '@formatjs/icu-messageformat-parser': 2.6.0 - tslib: 2.6.1 - dev: false - /intl-messageformat@9.13.0: resolution: {integrity: sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==} dependencies: @@ -10812,10 +9111,6 @@ packages: /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: false - /is-async-function@2.0.0: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} @@ -11479,14 +9774,6 @@ packages: resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} dev: false - /lodash.foreach@4.5.0: - resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==} - dev: false - - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: false - /lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} dev: false @@ -11509,15 +9796,12 @@ packages: /lodash.kebabcase@4.1.1: resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true /lodash.map@4.6.0: resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} dev: true - /lodash.mapkeys@4.6.0: - resolution: {integrity: sha512-0Al+hxpYvONWtg+ZqHpa/GaVzxuN3V7Xeo2p+bY06EaK/n+Y9R7nBePPN2o1LxmL0TWQSwP8LYZ008/hc9JzhA==} - dev: false - /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -11525,10 +9809,6 @@ packages: /lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - /lodash.omit@4.5.0: - resolution: {integrity: sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==} - dev: false - /lodash.snakecase@4.1.1: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} dev: true @@ -13326,6 +11606,25 @@ packages: tslib: 2.6.1 dev: false + /react-remove-scroll@2.5.4(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.21 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.21)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) + tslib: 2.6.1 + use-callback-ref: 1.3.0(@types/react@18.2.21)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.21)(react@18.2.0) + dev: false + /react-remove-scroll@2.5.5(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} @@ -13940,12 +12239,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /scroll-into-view-if-needed@3.0.10: - resolution: {integrity: sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg==} - dependencies: - compute-scroll-into-view: 3.0.3 - dev: false - /secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} dev: false @@ -14077,12 +12370,6 @@ packages: - supports-color dev: true - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - dependencies: - is-arrayish: 0.3.2 - dev: false - /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true @@ -14521,16 +12808,6 @@ packages: resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} dev: false - /tailwind-variants@0.1.13(tailwindcss@3.3.3): - resolution: {integrity: sha512-G2M7M74hjq0nAo6QdEfUJgF+0t9DecFUw91GC1P9YTnwMcfB3uChT5U5e2DuNU42xoOz15lzo7r0mPdMzZkylg==} - engines: {node: '>=16.x', pnpm: '>=7.x'} - peerDependencies: - tailwindcss: '*' - dependencies: - tailwind-merge: 1.14.0 - tailwindcss: 3.3.3(ts-node@10.9.1) - dev: false - /tailwindcss-animate@1.0.6(tailwindcss@3.3.3): resolution: {integrity: sha512-4WigSGMvbl3gCCact62ZvOngA+PRqhAn7si3TQ3/ZuPuQZcIEtVap+ENSXbzWhpojKB8CpvnIsrwBu8/RnHtuw==} peerDependencies: From 50506cb3037eb9f7aec9660aca1d591a5a900f9f Mon Sep 17 00:00:00 2001 From: chenyueban <jasonchan0527@gmail.com> Date: Sat, 2 Sep 2023 19:00:46 +0800 Subject: [PATCH 07/23] chore: update --- .../[projectId]/alerts/[alertId]/alertId.tsx | 19 +- .../app/[locale]/[projectId]/alerts/page.tsx | 6 +- .../feedbacks/[feedbackId]/feedback-id.tsx | 18 +- .../[locale]/[projectId]/feedbacks/page.tsx | 6 +- .../app/[locale]/[projectId]/issues/page.tsx | 6 +- .../web/app/[locale]/[projectId]/layout.tsx | 5 +- .../[locale]/[projectId]/mock/frame/Ajax.tsx | 26 +- .../[projectId]/mock/frame/Config.tsx | 2 +- .../[projectId]/mock/frame/CustomReport.tsx | 26 +- .../[locale]/[projectId]/mock/frame/Error.tsx | 26 +- .../[projectId]/mock/frame/HashChange.tsx | 32 +- .../[projectId]/mock/frame/History.tsx | 26 +- .../[projectId]/mock/frame/InsertRes.tsx | 24 +- .../[projectId]/mock/frame/PromiseError.tsx | 24 +- .../app/[locale]/[projectId]/mock/mock.tsx | 6 +- .../[locale]/[projectId]/profile/profile.tsx | 6 +- .../[releaseId]/sourceMaps/sourceMaps.tsx | 55 +- .../[projectId]/users/[userId]/userId.tsx | 12 +- .../web/app/[locale]/auth/signin/signin.tsx | 4 +- .../create-project/action.ts} | 15 +- .../create-project/create-project.tsx | 25 +- .../web/app/[locale]/create-project/schema.ts | 8 + packages/web/app/[locale]/page.tsx | 3 +- packages/web/app/[locale]/providers.tsx | 23 +- ...card-section.tsx => accordion-section.tsx} | 10 +- packages/web/components/breadcrumbs.tsx | 1 - packages/web/components/card.tsx | 84 -- packages/web/components/edit-alert.tsx | 544 ++++--- packages/web/components/empty-issues.tsx | 29 +- .../web/components/event-detail-action.tsx | 6 +- .../web/components/event-detail-profile.tsx | 117 +- .../web/components/event-detail-stack.tsx | 32 +- .../web/components/event-detail-trend.tsx | 127 +- packages/web/components/event-detail-user.tsx | 12 +- packages/web/components/introduce-chart.tsx | 41 +- packages/web/components/issue-detail-tabs.tsx | 32 +- .../web/components/issue-detail-title.tsx | 70 +- .../web/components/issue-related-events.tsx | 53 +- .../web/components/issue-related-metadata.tsx | 12 +- .../web/components/issue-related-rrweb.tsx | 8 +- packages/web/components/layout.tsx | 14 +- packages/web/components/nav-container.tsx | 24 +- packages/web/components/release-list.tsx | 6 +- packages/web/components/stack-info.tsx | 91 +- packages/web/components/title.tsx | 8 +- packages/web/components/trend-chart.tsx | 22 +- packages/web/components/ui/box.tsx | 25 - packages/web/hooks/use-color.ts | 16 - packages/web/hooks/use-query.ts | 4 +- packages/web/messages/en.json | 1 + packages/web/messages/zh.json | 1 + packages/web/next.config.js | 3 + packages/web/package.json | 4 - packages/web/services/projects.ts | 7 +- packages/web/styles/theme.ts | 107 -- pnpm-lock.yaml | 1244 +---------------- .../migrations/20230902043321_/migration.sql | 15 + prisma/schema.prisma | 8 +- 58 files changed, 869 insertions(+), 2312 deletions(-) rename packages/web/app/{api/project/route.ts => [locale]/create-project/action.ts} (60%) create mode 100644 packages/web/app/[locale]/create-project/schema.ts rename packages/web/components/{card-section.tsx => accordion-section.tsx} (84%) delete mode 100644 packages/web/components/card.tsx delete mode 100644 packages/web/components/ui/box.tsx delete mode 100644 packages/web/hooks/use-color.ts delete mode 100644 packages/web/styles/theme.ts create mode 100644 prisma/migrations/20230902043321_/migration.sql diff --git a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alertId.tsx b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alertId.tsx index 4edec3d..87018ae 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alertId.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alertId.tsx @@ -6,9 +6,8 @@ import { type Action, type ConditionOption, type FilterOption } from 'common' import dayjs from 'dayjs' import { type Alert, type AlertEvent, type Event, type Issue } from '@prisma/client' import { type AlertEventTrend } from '~/services/alerts' -import { Box } from '~/components/ui/box' import Wrapper from '~/components/wrapper' -import CardSection from '~/components/card-section' +import AccordionSection from '~/components/accordion-section' import Title from '~/components/title' import useCurrentProject from '~/hooks/use-current-project' import EventsList from '~/components/events-list' @@ -45,9 +44,9 @@ export default function AlertId({ alert, alertEvents, alertEventTrends }: Props) {alert.name} - +
- + { alert.recentlyAt && ( @@ -121,22 +120,22 @@ export default function AlertId({ alert, alertEvents, alertEventTrends }: Props) {alert.level} interval: {alert.interval}
- + - + - + - + - + -
+
) } diff --git a/packages/web/app/[locale]/[projectId]/alerts/page.tsx b/packages/web/app/[locale]/[projectId]/alerts/page.tsx index 581b7c4..554a6ab 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/page.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/page.tsx @@ -10,7 +10,7 @@ import useCurrentProject from '~/hooks/use-current-project' import { useInfinite } from '~/hooks/use-infinite' import LoadingMoreButton from '~/components/load-more-button' import { serviceGetAlerts } from '~/services/alerts' -import { Box } from '~/components/ui/box' + import { Button } from '~/components/ui/button' const Alerts = () => { @@ -28,7 +28,7 @@ const Alerts = () => { ) return ( - +
{ onClick={() => setSize(size + 1)} /> </Wrapper> - </Box> + </div> ) } diff --git a/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedback-id.tsx b/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedback-id.tsx index 16846c5..276e4c5 100644 --- a/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedback-id.tsx +++ b/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedback-id.tsx @@ -4,8 +4,8 @@ import { useMemo } from 'react' import EventDetailActions from '~/components/event-detail-action' import EventDetailProfile from '~/components/event-detail-profile' import EventDetailUser from '~/components/event-detail-user' -import CardSection from '~/components/card-section' -import { Box } from '~/components/ui/box' +import AccordionSection from '~/components/ui/accordion-section' + import Wrapper from '~/components/wrapper' interface Props { @@ -19,19 +19,19 @@ export default function FeedbackId({ feedback }: Props) { <div className='flex flex-col gap-6'> <EventDetailProfile event={feedback} /> - <Box> + <div> <Wrapper> - <CardSection + <AccordionSection title="Event Detail" > <div className='flex flex-col'> - {detail.feedback && <div className='w-full'><Box className='w-24'>Feedback:</Box><code>{detail.feedback}</code></div>} - {detail.selector && <div className='w-full'><Box className='w-24'>Selector:</Box><code>{detail.selector}</code></div>} - {detail.outerHTML && <div className='w-full'><Box className='w-24'>outerHTML:</Box><code>{detail.outerHTML}</code></div>} + {detail.feedback && <div className='w-full'><div className='w-24'>Feedback:</div><code>{detail.feedback}</code></div>} + {detail.selector && <div className='w-full'><div className='w-24'>Selector:</div><code>{detail.selector}</code></div>} + {detail.outerHTML && <div className='w-full'><div className='w-24'>outerHTML:</div><code>{detail.outerHTML}</code></div>} </div> - </CardSection> + </AccordionSection> </Wrapper> - </Box> + </div> <EventDetailActions event={feedback} /> diff --git a/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx b/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx index 664eec6..3ff7fc2 100644 --- a/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx +++ b/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx @@ -3,7 +3,7 @@ import { useTranslations } from 'next-intl' import { type EventUser, type Feedback } from '@prisma/client' import FeedbacksList from '~/components/feedbacks-list' -import { Box } from '~/components/ui/box' + import Title from '~/components/title' import Wrapper from '~/components/wrapper' import useCurrentProject from '~/hooks/use-current-project' @@ -27,7 +27,7 @@ export default function FeedbacksPage() { ) return ( - <Box> + <div> <Title rightNodes={ ( @@ -65,6 +65,6 @@ export default function FeedbacksPage() { } </Button> </Wrapper> - </Box> + </div> ) } diff --git a/packages/web/app/[locale]/[projectId]/issues/page.tsx b/packages/web/app/[locale]/[projectId]/issues/page.tsx index 11e9f04..703c6bf 100644 --- a/packages/web/app/[locale]/[projectId]/issues/page.tsx +++ b/packages/web/app/[locale]/[projectId]/issues/page.tsx @@ -2,17 +2,17 @@ import EmptyIssues from '~/components/empty-issues' import IssueList from '~/components/issue-list' -import { Box } from '~/components/ui/box' + import Wrapper from '~/components/wrapper' export default function IssuesPage() { return ( - <Box> + <div> <Wrapper> <IssueList empty={<EmptyIssues />} /> </Wrapper> - </Box> + </div> ) } diff --git a/packages/web/app/[locale]/[projectId]/layout.tsx b/packages/web/app/[locale]/[projectId]/layout.tsx index da93c64..bf7138d 100644 --- a/packages/web/app/[locale]/[projectId]/layout.tsx +++ b/packages/web/app/[locale]/[projectId]/layout.tsx @@ -1,9 +1,10 @@ import { type ReactNode } from 'react' +import Layout from '~/components/layout' interface Props { children: ReactNode } -export default function RootLayout({ children }: Props) { - return children +export default function ProjectLayout({ children }: Props) { + return <Layout>{children}</Layout> } diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/Ajax.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/Ajax.tsx index 35097c2..af608b2 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/Ajax.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/Ajax.tsx @@ -1,6 +1,6 @@ 'use client' -import Card from '~/components/card' +import {Card, CardContent, CardHeader, CardTitle} from '~/components/ui/card' import { Button } from '~/components/ui/button' function Ajax() { @@ -20,17 +20,19 @@ function Ajax() { } return ( - <Card - content={ - ( - <div className='flex'> - <Button onClick={() => handleError()}>500 error</Button> - <Button onClick={() => handleTimeOut()}>timeout error</Button> - </div> - ) - } - title="AJAX" - /> + <Card> + <CardHeader> + <CardTitle> + AJAX + </CardTitle> + </CardHeader> + <CardContent> + <div className='flex'> + <Button onClick={() => handleError()}>500 error</Button> + <Button onClick={() => handleTimeOut()}>timeout error</Button> + </div> + </CardContent> + </Card> ) } diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx index d42d1ba..d40808b 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx @@ -6,7 +6,7 @@ import { useTranslations } from 'next-intl' import type { OhbugConfig } from '@ohbug/types' import { useLocalStorage } from 'react-use' import { zodResolver } from "@hookform/resolvers/zod" -import * as z from "zod" +import { z } from "zod" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '~/components/ui/form' import { Input } from '~/components/ui/input' import { Button } from '~/components/ui/button' diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx index 28e746f..347a047 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx @@ -1,8 +1,8 @@ 'use client' -import { Button } from '~/components/ui/button' import { client } from './index' -import Card from '~/components/card' +import {Card, CardContent, CardHeader, CardTitle} from '~/components/ui/card' +import { Button } from '~/components/ui/button' function CustomReport() { const handleError = () => { @@ -22,16 +22,18 @@ function CustomReport() { } } return ( - <Card - content={ - ( - <div> - <Button onClick={() => handleError()}>custom report</Button> - </div> - ) - } - title="CustomReport" - /> + <Card> + <CardHeader> + <CardTitle> + CustomReport + </CardTitle> + </CardHeader> + <CardContent> + <div className='flex'> + <Button onClick={() => handleError()}>custom report</Button> + </div> + </CardContent> + </Card> ) } diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx index e6a6073..5442c89 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx @@ -1,6 +1,6 @@ 'use client' -import Card from '~/components/card' +import {Card, CardContent, CardHeader, CardTitle} from '~/components/ui/card' import { Button } from '~/components/ui/button' function randomString(length: number) { @@ -28,17 +28,19 @@ function Error() { } return ( - <Card - content={ - ( - <div className='flex'> - <Button onClick={() => handleError()}>undefined error</Button> - <Button onClick={() => handleError1()}>random error</Button> - </div> - ) - } - title="Error" - /> + <Card> + <CardHeader> + <CardTitle> + Error + </CardTitle> + </CardHeader> + <CardContent> + <div className='flex'> + <Button onClick={() => handleError()}>undefined error</Button> + <Button onClick={() => handleError1()}>random error</Button> + </div> + </CardContent> + </Card> ) } diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx index 8b43821..54fabad 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx @@ -1,25 +1,27 @@ 'use client' import Link from 'next/link' -import Card from '~/components/card' +import {Card, CardContent, CardHeader, CardTitle} from '~/components/ui/card' function HashChange() { return ( - <Card - content={ - ( - <div className='flex'> - <div> - <Link href="#app">hash:/#app</Link> - </div> - <div> - <Link href="#dd">hash: /#dd</Link> - </div> + <Card> + <CardHeader> + <CardTitle> + ErrorHashChange + </CardTitle> + </CardHeader> + <CardContent> + <div className='flex'> + <div> + <Link href="#app">hash:/#app</Link> </div> - ) - } - title="HashChange" - /> + <div> + <Link href="#dd">hash: /#dd</Link> + </div> + </div> + </CardContent> + </Card> ) } diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx index ee2cf7d..92ac472 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx @@ -1,6 +1,6 @@ 'use client' -import Card from '~/components/card' +import {Card, CardContent, CardHeader, CardTitle} from '~/components/ui/card' import { Button } from '~/components/ui/button' function History() { @@ -12,17 +12,19 @@ function History() { } return ( - <Card - content={ - ( - <div className='flex'> - <Button onClick={() => pushState()}>pushState</Button> - <Button onClick={() => replaceState()}>replaceState</Button> - </div> - ) - } - title="History" - /> + <Card> + <CardHeader> + <CardTitle> + History + </CardTitle> + </CardHeader> + <CardContent> + <div className='flex'> + <Button onClick={() => pushState()}>pushState</Button> + <Button onClick={() => replaceState()}>replaceState</Button> + </div> + </CardContent> + </Card> ) } diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx index 9d8734d..5d1d7fe 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx @@ -1,6 +1,6 @@ 'use client' -import Card from '~/components/card' +import {Card, CardContent, CardHeader, CardTitle} from '~/components/ui/card' import { Button } from '~/components/ui/button' export default function InsertRes() { @@ -13,15 +13,17 @@ export default function InsertRes() { } return ( - <Card - content={ - ( - <div> - <Button onClick={() => handle()}>insert script</Button> - </div> - ) - } - title="InsertRes" - /> + <Card> + <CardHeader> + <CardTitle> + InsertRes + </CardTitle> + </CardHeader> + <CardContent> + <div className='flex'> + <Button onClick={() => handle()}>insert script</Button> + </div> + </CardContent> + </Card> ) } diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx index a83380b..160c02f 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx @@ -1,6 +1,6 @@ 'use client' -import Card from '~/components/card' +import {Card, CardContent, CardHeader, CardTitle} from '~/components/ui/card' import { Button } from '~/components/ui/button' function PromiseError() { @@ -8,16 +8,18 @@ function PromiseError() { Promise?.reject(new Error('fail')) } return ( - <Card - content={ - ( - <div> - <Button onClick={() => handlePromise()}>unhandledrejection error</Button> - </div> - ) - } - title="Promise" - /> + <Card> + <CardHeader> + <CardTitle> + Promise + </CardTitle> + </CardHeader> + <CardContent> + <div className='flex'> + <Button onClick={() => handlePromise()}>unhandledrejection error</Button> + </div> + </CardContent> + </Card> ) } diff --git a/packages/web/app/[locale]/[projectId]/mock/mock.tsx b/packages/web/app/[locale]/[projectId]/mock/mock.tsx index 17c78a0..7f15de1 100644 --- a/packages/web/app/[locale]/[projectId]/mock/mock.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/mock.tsx @@ -3,7 +3,7 @@ import { type Project } from '@prisma/client' import Frame from './frame' import Wrapper from '~/components/wrapper' -import { Box } from '~/components/ui/box' + interface Props { project: Project @@ -11,10 +11,10 @@ interface Props { export default function Mock({ project }: Props) { return ( - <Box > + <div > <Wrapper> <Frame project={project} /> </Wrapper> - </Box> + </div> ) } diff --git a/packages/web/app/[locale]/[projectId]/profile/profile.tsx b/packages/web/app/[locale]/[projectId]/profile/profile.tsx index b84c583..17f6f5f 100644 --- a/packages/web/app/[locale]/[projectId]/profile/profile.tsx +++ b/packages/web/app/[locale]/[projectId]/profile/profile.tsx @@ -5,7 +5,7 @@ import { useMemo, useState } from 'react' import { useTranslations } from 'next-intl' import { type Event, type Project } from '@prisma/client' import { type ProjectTrend } from '~/services/projects' -import { Box } from '~/components/ui/box' + import TrendChart from '~/components/trend-chart' import Wrapper from '~/components/wrapper' import EventsList from '~/components/events-list' @@ -210,7 +210,7 @@ const Events = ({ project }: Props) => { ) return ( - <Box> + <div> <Wrapper> <EventsList events={data} /> <Button @@ -228,7 +228,7 @@ const Events = ({ project }: Props) => { } </Button> </Wrapper> - </Box> + </div> ) } diff --git a/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/sourceMaps.tsx b/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/sourceMaps.tsx index 43ebbbb..9723370 100644 --- a/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/sourceMaps.tsx +++ b/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/sourceMaps.tsx @@ -5,7 +5,7 @@ import { formatBytes } from 'common' import { type Release } from '@prisma/client' import Wrapper from '~/components/wrapper' import Title from '~/components/title' -import Card from '~/components/card' +import {Card, CardContent, CardHeader, CardTitle} from '~/components/ui/card' import Link from 'next/link' import { Button } from '~/components/ui/button' @@ -22,30 +22,37 @@ export default function SourceMaps({ release }: Props) { <Wrapper> <Card> - { - sourceMaps?.map(sourceMap => ( - <div - className='flex items-center justify-between w-full' - key={sourceMap.filename} - > - <div className='flex flex-col'> - <span className='font-semibold'>{sourceMap.originalname}</span> - <span className='text-stone-500'>{sourceMap.mimetype}</span> + <CardHeader> + <CardTitle> + SourceMaps + </CardTitle> + </CardHeader> + <CardContent> + { + sourceMaps?.map(sourceMap => ( + <div + className='flex items-center justify-between w-full' + key={sourceMap.filename} + > + <div className='flex flex-col'> + <span className='font-semibold'>{sourceMap.originalname}</span> + <span className='text-stone-500'>{sourceMap.mimetype}</span> + </div> + <div className='flex items-center gap-2'> + <span className='text-stone-500'>{formatBytes(sourceMap.size)}</span> + <Link href={`/api/releases/${release.id}/sourceMaps/${sourceMap.id}`}> + <Button + size="icon" + variant="outline" + > + <i className='i-ri-file-download-line'></i> + </Button> + </Link> + </div> </div> - <div className='flex items-center gap-2'> - <span className='text-stone-500'>{formatBytes(sourceMap.size)}</span> - <Link href={`/api/releases/${release.id}/sourceMaps/${sourceMap.id}`}> - <Button - size="icon" - variant="outline" - > - <i className='i-ri-file-download-line'></i> - </Button> - </Link> - </div> - </div> - )) - } + )) + } + </CardContent> </Card> </Wrapper> </div> diff --git a/packages/web/app/[locale]/[projectId]/users/[userId]/userId.tsx b/packages/web/app/[locale]/[projectId]/users/[userId]/userId.tsx index 30b6dbf..c670a13 100644 --- a/packages/web/app/[locale]/[projectId]/users/[userId]/userId.tsx +++ b/packages/web/app/[locale]/[projectId]/users/[userId]/userId.tsx @@ -5,9 +5,9 @@ import dayjs from 'dayjs' import dynamic from 'next/dynamic' import { type Event, type EventUser, type Feedback } from '@prisma/client' import EventsList from '~/components/events-list' -import { Box } from '~/components/ui/box' + import Wrapper from '~/components/wrapper' -import CardSection from '~/components/card-section' +import AccordionSection from '~/components/ui/accordion-section' import useCurrentProject from '~/hooks/use-current-project' import Title from '~/components/title' import { @@ -53,12 +53,12 @@ export default function UserId({ user }: Props) { - + - + - + @@ -86,7 +86,7 @@ export default function UserId({ user }: Props) { }
-
+
diff --git a/packages/web/app/[locale]/auth/signin/signin.tsx b/packages/web/app/[locale]/auth/signin/signin.tsx index ea40010..f0c0c74 100644 --- a/packages/web/app/[locale]/auth/signin/signin.tsx +++ b/packages/web/app/[locale]/auth/signin/signin.tsx @@ -11,7 +11,7 @@ import type { Project, User } from '@prisma/client' import { useAtom } from 'jotai' import { useMount } from 'react-use' import { zodResolver } from "@hookform/resolvers/zod" -import * as z from "zod" +import { z } from "zod" import { inviteAtom } from '~/atoms/invite' import { Button } from '~/components/ui/button' import { Input } from '~/components/ui/input' @@ -220,7 +220,7 @@ export default function SignIn({ providers, inviter }: Props) { {title} - Choose a way to log in to your account + Choose a way to log in to your account diff --git a/packages/web/app/api/project/route.ts b/packages/web/app/[locale]/create-project/action.ts similarity index 60% rename from packages/web/app/api/project/route.ts rename to packages/web/app/[locale]/create-project/action.ts index 4afbad4..65cd47c 100644 --- a/packages/web/app/api/project/route.ts +++ b/packages/web/app/[locale]/create-project/action.ts @@ -1,21 +1,28 @@ +'use server' + +import { redirect } from 'next/navigation' import crypto from 'node:crypto' import { NextResponse } from 'next/server' +import { z } from 'zod' import { getConfig } from 'config' import { getAuth } from '~/libs/middleware' import { serviceCreateProject } from '~/services/projects' +import schema from './schema' -export async function POST(request: Request) { +export default async function submit(formData: z.infer) { + console.log('formData: ', formData); const secret = getConfig().secret?.apikey ?? 'ohbug-apikey-s3cret' const auth = await getAuth() if (!auth) { return NextResponse.redirect('/auth/signin', { status: 302 }) } - const project = await request.json() + const project = schema.parse(formData) + const apiKey = crypto .createHmac('sha256', secret) - .update(JSON.stringify(project) + new Date().getTime()) + .update(JSON.stringify(formData) + new Date().getTime()) .digest('hex') await serviceCreateProject({ ...project, apiKey }, auth.user) - return NextResponse.redirect('/') + return redirect('/') } diff --git a/packages/web/app/[locale]/create-project/create-project.tsx b/packages/web/app/[locale]/create-project/create-project.tsx index bdbfee3..6324c90 100644 --- a/packages/web/app/[locale]/create-project/create-project.tsx +++ b/packages/web/app/[locale]/create-project/create-project.tsx @@ -1,6 +1,5 @@ 'use client' -import type { Project } from '@prisma/client' import { useTranslations } from 'next-intl' import { useForm } from 'react-hook-form' import { zodResolver } from "@hookform/resolvers/zod" @@ -17,8 +16,8 @@ import { Input } from '~/components/ui/input' import { Button } from '~/components/ui/button' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '~/components/ui/select' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '~/components/ui/card' - -type OmitProject = Omit +import schema from './schema' +import submit from './action' const projectTypes = [ { @@ -27,34 +26,26 @@ const projectTypes = [ }, ] as const -const formSchema = z.object({ - name: z.string().min(2).max(50), - type: z.enum(['javascript'] as const) -}) - export default function CreateProject() { - const ct = useTranslations('Common') const t = useTranslations('CreateProject') - const form = useForm>({ - resolver: zodResolver(formSchema), + const form = useForm>({ + resolver: zodResolver(schema), defaultValues: { name: "", type: "javascript" }, }) - function onSubmit(values: z.infer) { - // Do something with the form values. - // ✅ This will be type-safe and validated. - console.log(values) + async function onSubmit(values: z.infer) { + await submit(values) } return (
- Create project - Deploy your new project in one-click. + {t('createProject')} + {t('createProjectDescription')} diff --git a/packages/web/app/[locale]/create-project/schema.ts b/packages/web/app/[locale]/create-project/schema.ts new file mode 100644 index 0000000..92582b7 --- /dev/null +++ b/packages/web/app/[locale]/create-project/schema.ts @@ -0,0 +1,8 @@ +import { z } from "zod"; + +const schema = z.object({ + name: z.string().min(2).max(50), + type: z.enum(['javascript'] as const) +}) + +export default schema diff --git a/packages/web/app/[locale]/page.tsx b/packages/web/app/[locale]/page.tsx index facd518..02e9e41 100644 --- a/packages/web/app/[locale]/page.tsx +++ b/packages/web/app/[locale]/page.tsx @@ -1,5 +1,6 @@ +import Layout from '~/components/layout' import Home from './home' export default async function HomePage() { - return + return } diff --git a/packages/web/app/[locale]/providers.tsx b/packages/web/app/[locale]/providers.tsx index 5b37798..3df22b1 100644 --- a/packages/web/app/[locale]/providers.tsx +++ b/packages/web/app/[locale]/providers.tsx @@ -1,7 +1,6 @@ 'use client' import { useEffect } from 'react' -import { ChakraProvider, ColorModeScript } from '@chakra-ui/react' import { SessionProvider, useSession } from 'next-auth/react' import dayjs from 'dayjs' import relativeTime from 'dayjs/plugin/relativeTime' @@ -9,7 +8,6 @@ import timezone from 'dayjs/plugin/timezone' import utc from 'dayjs/plugin/utc' import { usePathname, useRouter } from 'next-intl/client' import dynamic from 'next/dynamic' -import { CacheProvider } from '@chakra-ui/next-js' import { type ReactElement, type ReactNode } from 'react' import { type Session } from 'next-auth' import { type User } from '@prisma/client' @@ -64,20 +62,13 @@ export function Providers({ children, session }: Props) { return ( - - - - - - - - - {children} - - - - - + + + + + {children} + + ) diff --git a/packages/web/components/card-section.tsx b/packages/web/components/accordion-section.tsx similarity index 84% rename from packages/web/components/card-section.tsx rename to packages/web/components/accordion-section.tsx index 53dc0c4..b14bde9 100644 --- a/packages/web/components/card-section.tsx +++ b/packages/web/components/accordion-section.tsx @@ -1,7 +1,6 @@ 'use client' import { type ReactNode } from 'react' -import { type BoxProps, Box } from '~/components/ui/box' import { Card, CardHeader, CardTitle } from '~/components/ui/card' import { Accordion, @@ -10,7 +9,8 @@ import { AccordionTrigger, } from "~/components/ui/accordion" -interface Props extends BoxProps { +interface Props { + className?: string title?: string head?: ReactNode collapse?: ReactNode @@ -18,9 +18,9 @@ interface Props extends BoxProps { children?: ReactNode } -export default function CardSection({ title, head, collapse, collapseTitle, children, ...props }: Props) { +export default function AccordionSection({ title, head, collapse, collapseTitle, children, ...props }: Props) { return ( - +

{title}

@@ -55,6 +55,6 @@ export default function CardSection({ title, head, collapse, collapseTitle, chil } {children} - +
) } diff --git a/packages/web/components/breadcrumbs.tsx b/packages/web/components/breadcrumbs.tsx index 5916d16..110bb25 100644 --- a/packages/web/components/breadcrumbs.tsx +++ b/packages/web/components/breadcrumbs.tsx @@ -8,7 +8,6 @@ import { Separator } from '~/components/ui/separator' export default function Breadcrumbs() { const [breadcrumbs] = useBreadcrumb() - console.log('breadcrumbs: ', breadcrumbs.slice(0, -1)); return (
diff --git a/packages/web/components/card.tsx b/packages/web/components/card.tsx deleted file mode 100644 index a662f72..0000000 --- a/packages/web/components/card.tsx +++ /dev/null @@ -1,84 +0,0 @@ -'use client' - -import { forwardRef, useMemo } from 'react' -import { useColorModeValue } from '@chakra-ui/react' -import { type ReactNode } from 'react' -import { Box } from '~/components/ui/box' -import { type BoxProps } from '~/components/ui/box' - -interface Props extends Omit { - children?: ReactNode - title?: string - extra?: ReactNode - content?: ReactNode - footer?: ReactNode - hover?: boolean - variant?: 'default' | 'shadow' -} -const Card = forwardRef(({ children, title, extra, content, footer, hover = false, variant = 'default', ...props }, ref) => { - const node = useMemo(() => { - if (children) return children - return ( - <> - { - title && ( -

- {title} - {extra} -

- ) - } - { - content && ( -
- {content} -
- ) - } - { - footer && ( - - {footer} - - ) - } - - ) - }, [children, title, content, footer]) - const hoverBorderColor = useColorModeValue('dark.50', 'gray.200') - - return ( - - {node} - - ) -}) -Card.displayName = 'Card' -export default Card diff --git a/packages/web/components/edit-alert.tsx b/packages/web/components/edit-alert.tsx index 28e88fe..8094430 100644 --- a/packages/web/components/edit-alert.tsx +++ b/packages/web/components/edit-alert.tsx @@ -1,13 +1,12 @@ 'use client' import { useCallback } from 'react' -import { type FC } from 'react' import { useFieldArray, useForm } from 'react-hook-form' import { AlertConditionTopic, AlertFilterTopic } from 'common' -import { useTranslations } from 'next-intl' import { type Action, type ConditionOption, type FilterMatch, type FilterOption, type Interval, type OmitAlert } from 'common' +import { useTranslations } from 'next-intl' import { zodResolver } from "@hookform/resolvers/zod" -import * as z from "zod" +import {z} from "zod" import { Badge } from '~/components/ui/badge' import { Form, @@ -18,11 +17,11 @@ import { FormLabel, FormMessage, } from "~/components/ui/form" -import { Input, Input } from "~/components/ui/input" -import { Select } from './ui/select' -import { Button } from './ui/button' -import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from './ui/dropdown-menu' -import { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip' +import { Input } from "~/components/ui/input" +import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '~/components/ui/select' +import { Button } from '~/components/ui/button' +import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from '~/components/ui/dropdown-menu' +import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' export const ActionOptions = ['email', 'webhook'] export const ConditionOptions: ConditionOption[] = [ @@ -67,8 +66,30 @@ export const AlertLevel = { } const formSchema = z.object({ + level: z.enum(['serious', 'warning', 'default']), + interval: z.string(), + enabled:z.boolean(), + filterMatch: z.string(), conditionMatch: z.enum(['all', 'every']), - + actions: z.array(z.object({ + type: z.enum(['email', 'webhook']), + uri: z.string(), + at: z.string().optional(), + webhookType: z.enum(['dingtalk', 'wechatWork', 'others']).optional(), + })), + conditions: z.array(z.object({ + topic: z.string(), + name: z.string(), + value: z.union([z.string(), z.number()]).optional(), + interval: z.string().optional(), + })), + filters: z.array(z.object({ + topic: z.string(), + name: z.string(), + value: z.union([z.string(), z.number()]).optional(), + attribute: z.string().optional(), + match: z.enum(['contains', 'starts with', 'ends with', 'equals', 'does not contain', 'does not start with', 'does not end with', 'does not equal']).optional(), + })) }) interface Props { @@ -76,15 +97,15 @@ interface Props { onSubmit: (value: z.infer) => void } -const EditAlert: FC = ({ alert, onSubmit }) => { +export default function EditAlert({ alert, onSubmit }: Props) { const ct = useTranslations('Common') const t = useTranslations('Alerts') const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: alert ? { - name: alert.name, - releaseStage: alert.releaseStage, + // name: alert.name, + // releaseStage: alert.releaseStage, level: alert.level, interval: alert.interval, enabled: alert.enabled, @@ -99,9 +120,9 @@ const EditAlert: FC = ({ alert, onSubmit }) => { conditionMatch: 'all', }, }) - const { fields: actionsFields, append: actionsAppend, remove: actionsRemove } = useFieldArray({ control, name: 'actions' }) - const { fields: conditionsFields, append: conditionsAppend, remove: conditionsRemove } = useFieldArray({ control, name: 'conditions' }) - const { fields: filtersFields, append: filtersAppend, remove: filtersRemove } = useFieldArray({ control, name: 'filters' }) + const { fields: actionsFields, append: actionsAppend, remove: actionsRemove } = useFieldArray({ control: form.control, name: 'actions' }) + const { fields: conditionsFields, append: conditionsAppend, remove: conditionsRemove } = useFieldArray({ control: form.control, name: 'conditions' }) + const { fields: filtersFields, append: filtersAppend, remove: filtersRemove } = useFieldArray({ control: form.control, name: 'filters' }) const handleAddAction = useCallback((type: Action['type']) => { if (type) { actionsAppend({ type, uri: '' }) @@ -132,19 +153,28 @@ const EditAlert: FC = ({ alert, onSubmit }) => {
an event is captured by Ohbug and - - - + ( + + + + + + + )} + /> of the following happens
@@ -167,41 +197,52 @@ const EditAlert: FC = ({ alert, onSubmit }) => { item.topic === AlertConditionTopic.EventFrequencyCondition && ( <> The issue is seen more than - - - - + ( + + + + + + + )} + /> times in - - - + ( + + + + + + + )} + /> ) } @@ -209,41 +250,52 @@ const EditAlert: FC = ({ alert, onSubmit }) => { item.topic === AlertConditionTopic.UserFrequencyCondition && ( <> The issue is seen by more than - - - + ( + + + + + + + )} + /> users in - - - + ( + + + + + + + )} + /> ) } @@ -296,19 +348,28 @@ const EditAlert: FC = ({ alert, onSubmit }) => { IF
- - - + ( + + + + + + + )} + /> of these filters match
@@ -322,19 +383,21 @@ const EditAlert: FC = ({ alert, onSubmit }) => { item.topic === AlertFilterTopic.IssueOccurrencesFilter && ( <> The issue has happened at least - - - + ( + + + + + + + )} + /> times ) @@ -343,60 +406,51 @@ const EditAlert: FC = ({ alert, onSubmit }) => { item.topic === AlertFilterTopic.EventAttributeFilter && ( <> The events - - - + ( + + + + + + + )} + /> value - - - - - - + ( + + + + + + + )} + /> ) } @@ -446,51 +500,101 @@ const EditAlert: FC = ({ alert, onSubmit }) => {
- - {t('alertInterval')} - - - {errors.interval && errors.interval.message} - - + ( + + {t('alertInterval')} + + + + + + )} + /> - - {t('alertLevel')} - - - {errors.level && errors.level.message} - - + ( + + {t('alertLevel')} + + + + + + )} + /> + + ( + + {t('alertLevel')} + + + + + + )} + />
@@ -615,5 +719,3 @@ const EditAlert: FC = ({ alert, onSubmit }) => { ) } - -export default EditAlert diff --git a/packages/web/components/empty-issues.tsx b/packages/web/components/empty-issues.tsx index f7a4a19..5276ffd 100644 --- a/packages/web/components/empty-issues.tsx +++ b/packages/web/components/empty-issues.tsx @@ -1,49 +1,40 @@ 'use client' import type { FC } from 'react' -import { Box, Button, Center } from '@chakra-ui/react' import Link from 'next/link' import { useTranslations } from 'next-intl' -import { RiExternalLinkLine } from 'react-icons/ri' import useCurrentProject from '~/hooks/use-current-project' +import { Button } from '~/components/ui/button' const EmptyIssues: FC = () => { const { projectId } = useCurrentProject() const t = useTranslations('Issues.Empty') return ( -
- {t('gettingStarted')} - +
+
{t('gettingStarted')}
+
- - - {t('getApiKey')} +
+
{t('getApiKey')}
Get apiKey - {t('needMockData')} +
{t('needMockData')}
Mock -
+
) } diff --git a/packages/web/components/event-detail-action.tsx b/packages/web/components/event-detail-action.tsx index e9723d3..c10482f 100644 --- a/packages/web/components/event-detail-action.tsx +++ b/packages/web/components/event-detail-action.tsx @@ -6,7 +6,7 @@ import { type OhbugEventLike } from 'common' import { type FC } from 'react' import { type OhbugAction } from '@ohbug/types' import Wrapper from './wrapper' -import CardSection from './card-section' +import AccordionSection from './card-section' import { getMessageAndIconByActionType } from '~/libs/utils' import { Badge } from '~/components/ui/badge' import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' @@ -26,7 +26,7 @@ const EventDetailActions: FC = ({ event }) => { ], [event]) return ( - +
{ actions.map((action, index) => { @@ -67,7 +67,7 @@ const EventDetailActions: FC = ({ event }) => { }) }
-
+
) } diff --git a/packages/web/components/event-detail-profile.tsx b/packages/web/components/event-detail-profile.tsx index e7266ac..4602488 100644 --- a/packages/web/components/event-detail-profile.tsx +++ b/packages/web/components/event-detail-profile.tsx @@ -2,15 +2,15 @@ import dayjs from 'dayjs' import { useMemo } from 'react' -import { RiCake2Line, RiCake3Line, RiCakeLine, RiComputerLine, RiEarthLine, RiFingerprintLine, RiHeading, RiLinkedinLine, RiLinksLine, RiTimeLine } from 'react-icons/ri' -import { Icon, Link, Stat, StatGroup, StatHelpText, StatLabel, Tag, Tooltip, Wrap, WrapItem } from '@chakra-ui/react' import { useTranslations } from 'next-intl' import { type FC } from 'react' import { type OhbugEventLike } from 'common' -import { Box } from '~/components/ui/box' import Wrapper from './wrapper' -import CardSection from './card-section' +import AccordionSection from './card-section' import { getDeviceInfo } from '~/libs/utils' +import Link from 'next/link' +import { Badge } from '~/components/ui/badge' +import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' interface Props { event: OhbugEventLike | any @@ -26,7 +26,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'time', title: `${t('profileTimestamp')}: ${dayjs(event.createdAt).format('YYYY-MM-DD HH:mm:ss')}`, value: dayjs(event.createdAt).fromNow(), - icon: RiTimeLine, + icon: , }) } if (event?.user?.uuid) { @@ -34,7 +34,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'uuid', title: `UUID: ${event?.user?.uuid}`, value: event?.user?.uuid, - icon: RiFingerprintLine, + icon: , }) } if (event?.user?.ipAddress) { @@ -42,7 +42,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'ip', title: `IP: ${event?.user?.ipAddress}`, value: event?.user?.ipAddress, - icon: RiLinksLine, + icon: , }) } if (event?.device?.title) { @@ -50,7 +50,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'title', title: `${t('profileTitle')}: ${event.device.title}`, value: event.device.title, - icon: RiHeading, + icon: , }) } if (event?.device?.url) { @@ -58,7 +58,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'url', title: `URL: ${event.device.url}`, value: event.device.url, - icon: RiLinkedinLine, + icon: , }) } if (event?.device?.language) { @@ -66,7 +66,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'language', title: `${t('profileLanguage')}: ${event.device.language}`, value: event.device.language, - icon: RiEarthLine, + icon: , }) } if (event?.appVersion) { @@ -74,7 +74,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'appVersion', title: `AppVersion: ${event.appVersion}`, value: event.appVersion, - icon: RiCakeLine, + icon: , }) } if (event?.appType) { @@ -82,7 +82,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'appType', title: `AppType: ${event.appType}`, value: event.appType, - icon: RiCake2Line, + icon: , }) } if (event?.releaseStage) { @@ -90,7 +90,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'releaseStage', title: `ReleaseStage: ${event.releaseStage}`, value: event.releaseStage, - icon: RiCake3Line, + icon: , }) } if ( @@ -102,7 +102,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'dpi', title: `${t('profileDPI')}: ${event?.device?.device?.screenWidth} × ${event?.device?.device?.screenHeight} @ ${event?.device?.device?.pixelRatio}x`, value: `${event?.device?.device?.screenWidth} × ${event?.device?.device?.screenHeight} @ ${event?.device?.device?.pixelRatio}x`, - icon: RiComputerLine, + icon: , }) } @@ -112,104 +112,95 @@ const EventDetailProfile: FC = ({ event }) => { return (
- - JSON Raw {event.id} + JSON Raw {event.id} ) : null } title="Event Environment" > - +
{/* 浏览器 */} { deviceInfo?.browser && ( - - {deviceInfo?.browser?.name ?? ''} - {deviceInfo?.browser?.version ?? ''} - +
+
{deviceInfo?.browser?.name ?? ''}
+
{deviceInfo?.browser?.version ?? ''}
+
) } {/* 系统 */} { deviceInfo?.os && ( - - {deviceInfo?.os?.name ?? ''} - {deviceInfo?.os?.version ?? ''} - +
+
{deviceInfo?.os?.name ?? ''}
+
{deviceInfo?.os?.version ?? ''}
+
) } {/* App */} { deviceInfo?.app && ( - - {deviceInfo?.app ?? ''} - {`${deviceInfo?.version} / ${deviceInfo?.SDKVersion}`} - +
+
{deviceInfo?.app ?? ''}
+
{`${deviceInfo?.version} / ${deviceInfo?.SDKVersion}`}
+
) } {/* 品牌 */} { (deviceInfo?.device && deviceInfo?.device?.brand) && ( - - {deviceInfo?.device?.brand ?? ''} - {deviceInfo?.device?.model ?? ''} - +
+
{deviceInfo?.device?.brand ?? ''}
+
{deviceInfo?.device?.model ?? ''}
+
) } {/* 平台 */} { deviceInfo?.platform && ( - - {deviceInfo?.platform ?? ''} - {deviceInfo?.system ?? ''} - +
+
{deviceInfo?.platform ?? ''}
+
{deviceInfo?.system ?? ''}
+
) } {/* SDK */} { deviceInfo?.sdk && ( - - {deviceInfo?.sdk.platform ?? ''} - {deviceInfo?.sdk.version ?? ''} - +
+
{deviceInfo?.sdk.platform ?? ''}
+
{deviceInfo?.sdk.version ?? ''}
+
) } - +
- +
{ tagList.map(tag => ( - - - - + + + + {tag.icon} {tag.value} - - + + + + {tag.title} + )) } - - +
+
) diff --git a/packages/web/components/event-detail-stack.tsx b/packages/web/components/event-detail-stack.tsx index 819de2c..ca78e84 100644 --- a/packages/web/components/event-detail-stack.tsx +++ b/packages/web/components/event-detail-stack.tsx @@ -3,9 +3,9 @@ import { type FC } from 'react' import { type OhbugEventLike } from 'common' import StackInfo from './stack-info' -import { Box } from '~/components/ui/box' + import Wrapper from './wrapper' -import CardSection from './card-section' +import AccordionSection from './card-section' import { renderStringOrJson } from '~/libs/utils' interface Props { @@ -14,16 +14,16 @@ interface Props { const EventDetailStack: FC = ({ event }) => { return ( - +
- +
- +
) } collapseTitle="Code" @@ -34,41 +34,41 @@ const EventDetailStack: FC = ({ event }) => { > {/* unhandledrejectionError */} {/* uncaughtError */} - {typeof event.detail.stack === 'string' ? event.detail.stack : JSON.stringify(event.detail.stack)} - +
{/* resourceError */} { event?.detail.selector && ( - +
{renderStringOrJson(event.detail)} - +
) } {/* ajaxError */} {/* fetchError */} { event?.type === 'ajaxError' && ( - +
{renderStringOrJson(event.detail)} - +
) } {/* websocketError */} { event?.type === 'websocketError' && ( - +
{renderStringOrJson(event.detail)} - +
) } - + -
+
) } diff --git a/packages/web/components/event-detail-trend.tsx b/packages/web/components/event-detail-trend.tsx index 568c228..24ec507 100644 --- a/packages/web/components/event-detail-trend.tsx +++ b/packages/web/components/event-detail-trend.tsx @@ -1,15 +1,13 @@ 'use client' import dayjs from 'dayjs' -import { Stat, StatGroup, StatLabel, StatNumber, Tooltip } from '@chakra-ui/react' import { useTranslations } from 'next-intl' -import { type FC } from 'react' import { type Issue } from 'common' import TrendChart from './trend-chart' -import { Box } from '~/components/ui/box' import Wrapper from './wrapper' -import CardSection from './card-section' +import AccordionSection from './card-section' import { type IssueTrend } from '~/services/issues' +import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' interface Props { issue: Issue @@ -19,73 +17,70 @@ interface Props { } } -const EventDetailTrend: FC = ({ issue, trends }) => { +export default function EventDetailTrend({ issue, trends }: Props) { const ct = useTranslations('Common') return ( - - - - - {ct('firstSeen')} - - + + +
+
{ct('firstSeen')}
+ + +
{dayjs(issue?.createdAt).fromNow()} - - - - - {ct('lastSeen')} - - +
+
+ + {dayjs(issue?.createdAt).format('YYYY-MM-DD HH:mm:ss A')} + +
+
+
+
{ct('lastSeen')}
+ + +
{dayjs(issue?.updatedAt).fromNow()} - - - - +
+
+ + {dayjs(issue?.updatedAt).format('YYYY-MM-DD HH:mm:ss A')} + +
+
+
+ ) + } + title="Event Trends" + > +
+ { + trends['14d'] && ( + ) } - title="Event Trends" - > - - { - trends['14d'] && ( - - ) - } - - - { - trends['24h'] && ( - - ) - } - - - - - +
+
+ { + trends['24h'] && ( + + ) + } +
+ +
) } - -export default EventDetailTrend diff --git a/packages/web/components/event-detail-user.tsx b/packages/web/components/event-detail-user.tsx index b78b8f7..95dbd7c 100644 --- a/packages/web/components/event-detail-user.tsx +++ b/packages/web/components/event-detail-user.tsx @@ -3,9 +3,9 @@ import dynamic from 'next/dynamic' import { type FC } from 'react' import { type OhbugEventLike } from 'common' -import { Box } from '~/components/ui/box' + import Wrapper from './wrapper' -import CardSection from './card-section' +import AccordionSection from './card-section' const DynamicReactJson = dynamic(import('react-json-view'), { ssr: false }) @@ -15,13 +15,13 @@ interface Props { const EventDetailUser: FC = ({ event }) => { return ( - +
- + - + - +
) } diff --git a/packages/web/components/introduce-chart.tsx b/packages/web/components/introduce-chart.tsx index a1c8e7a..35aef37 100644 --- a/packages/web/components/introduce-chart.tsx +++ b/packages/web/components/introduce-chart.tsx @@ -1,7 +1,6 @@ 'use client' -import { Box, Flex } from '@chakra-ui/react' -import type { FC, ReactNode } from 'react' +import type { ReactNode } from 'react' interface Props { title: string @@ -12,35 +11,21 @@ interface Props { children: ReactNode } -const IntroduceChart: FC = ({ title, value, unit, description, actions, children }) => { +export default function IntroduceChart({ title, value, unit, description, actions, children }: Props) { return ( - - - +
+
+
{title} - - +
+
{value} {unit} - - {description} - {actions} - - {children} - +
+
{description}
+
{actions}
+
+
{children}
+
) } - -export default IntroduceChart diff --git a/packages/web/components/issue-detail-tabs.tsx b/packages/web/components/issue-detail-tabs.tsx index 10e3cfa..e7e53c8 100644 --- a/packages/web/components/issue-detail-tabs.tsx +++ b/packages/web/components/issue-detail-tabs.tsx @@ -1,19 +1,19 @@ 'use client' -import type { FC } from 'react' import { useCallback, useMemo } from 'react' import { usePathname, useRouter } from 'next-intl/client' import { useSearchParams } from 'next/navigation' -import { Link, Tab, TabList, Tabs } from '@chakra-ui/react' import type { OhbugEventLike } from 'common' import { useTranslations } from 'next-intl' import useCurrentProject from '~/hooks/use-current-project' +import { Tabs, TabsList, TabsTrigger } from '~/components/ui/tabs' +import Link from 'next/link' interface Props { event: OhbugEventLike } -const IssueDetailTabs: FC = ({ event }) => { +export default function IssueDetailTabs({ event }: Props) { const t = useTranslations('Event') const router = useRouter() const pathname = usePathname() @@ -50,11 +50,11 @@ const IssueDetailTabs: FC = ({ event }) => { return base }, [event, router, projectId]) const active = useMemo(() => { - const index = list.findIndex(item => item.tab === tab) - return index > 0 ? index : 0 + const value = list.find(item => item.tab === tab)?.value + return value }, [list, tab]) - const handleTabChange = useCallback((index: number) => { - const item = list[index] + const handleTabChange = useCallback((value: string) => { + const item = list.find(v=>v.value===value) if (item) { router.push(`${pathname}?tab=${item.tab}`) } @@ -62,23 +62,21 @@ const IssueDetailTabs: FC = ({ event }) => { return ( - + { list.map(v => ( - - {v.label} - + {v.label} + )) } - + ) } - -export default IssueDetailTabs diff --git a/packages/web/components/issue-detail-title.tsx b/packages/web/components/issue-detail-title.tsx index 51e5786..abf08c2 100644 --- a/packages/web/components/issue-detail-title.tsx +++ b/packages/web/components/issue-detail-title.tsx @@ -1,79 +1,59 @@ 'use client' -import { Badge, Box, Stat, StatGroup, StatLabel, StatNumber } from '@chakra-ui/react' import { useMemo } from 'react' import { useTranslations } from 'next-intl' -import { type FC } from 'react' import { type Issue, type OhbugEventLike } from 'common' import Title from './title' import IssueDetailTabs from './issue-detail-tabs' import { renderStringOrJson } from '~/libs/utils' +import { Badge } from '~/components/ui/badge' interface Props { issue: Issue event: OhbugEventLike } -const IssueDetailTitle: FC = ({ issue, event }) => { +export default function IssueDetailTitle({ issue, event }: Props) { const t = useTranslations('Event') const metadata = useMemo(() => JSON.parse(issue.metadata) || {}, [issue]) return ( } - position="sticky" rightNodes={ ( - <StatGroup w="xs"> - <Stat> - <StatLabel>{t('titleEvents')}</StatLabel> - <StatNumber>{issue._count?.events}</StatNumber> - </Stat> - <Stat> - <StatLabel>{t('titleUsers')}</StatLabel> - <StatNumber>{issue._count?.users}</StatNumber> - </Stat> - </StatGroup> + <div className='flex'> + <div className='flex flex-col'> + <div>{t('titleEvents')}</div> + <div>{issue._count?.events}</div> + </div> + <div className='flex flex-col'> + <div>{t('titleUsers')}</div> + <div>{issue._count?.users}</div> + </div> + </div> ) } - top="48px" - zIndex="docked" > - <Box> - <Box - as="a" - noOfLines={2} - > - <Box - as="span" - fontWeight="semibold" - mr="2" - > + <div> + <a className='line-clamp-2'> + <span className='font-semibold mr-2'> {issue.type} - </Box> + </span> { issue.releaseStage === 'mock' && ( - <Badge - colorScheme="red" - mr="2" - > + <Badge variant="destructive" className='mr-2'> Mock </Badge> ) } - <Box - as="code" - textColor="gray.400" - > + <code className='text-stone-500'> {renderStringOrJson(metadata.filename ?? metadata.others)} - </Box> - </Box> - <Box - noOfLines={[1, 2]} - textColor="gray.400" - > + </code> + </a> + <div className='line-clamp-2 text-stone-500'> { metadata.message && ( <code> @@ -81,10 +61,8 @@ const IssueDetailTitle: FC<Props> = ({ issue, event }) => { </code> ) } - </Box> - </Box> + </div> + </div> ) } - -export default IssueDetailTitle diff --git a/packages/web/components/issue-related-events.tsx b/packages/web/components/issue-related-events.tsx index 18e1c52..5c8e837 100644 --- a/packages/web/components/issue-related-events.tsx +++ b/packages/web/components/issue-related-events.tsx @@ -1,22 +1,20 @@ 'use client' -import { Button } from '@chakra-ui/react' import { type Event } from '@prisma/client' -import { type FC } from 'react' import { useTranslations } from 'next-intl' import { type Issue } from 'common' import EventsList from '~/components/events-list' -import { Box } from '~/components/ui/box' import Wrapper from '~/components/wrapper' -import CardSection from '~/components/card-section' +import AccordionSection from '~/components/ui/accordion-section' import { useInfinite } from '~/hooks/use-infinite' import { serviceGetEventsByIssueId } from '~/services/events' +import { Button } from '~/components/ui/button' interface Props { issue: Issue } -const IssueRelatedEvents: FC = ({ issue }) => { +export default function IssueRelatedEvents({ issue }:Props) { const ct = useTranslations('Common') const { data: events, isLoading, size, setSize, isReachingEnd } = useInfinite( index => serviceGetEventsByIssueId({ issueId: issue.id, page: index + 1 }), @@ -27,30 +25,25 @@ const IssueRelatedEvents: FC = ({ issue }) => { ) return ( - - - - - - - - + + + + + + ) } - -export default IssueRelatedEvents diff --git a/packages/web/components/issue-related-metadata.tsx b/packages/web/components/issue-related-metadata.tsx index 0215ede..cd54edb 100644 --- a/packages/web/components/issue-related-metadata.tsx +++ b/packages/web/components/issue-related-metadata.tsx @@ -4,8 +4,8 @@ import dynamic from 'next/dynamic' import { useMemo } from 'react' import { type OhbugEventLike } from 'common' import { type FC } from 'react' -import CardSection from './card-section' -import { Box } from '~/components/ui/box' +import AccordionSection from './card-section' + import Wrapper from './wrapper' const DynamicReactJson = dynamic(import('react-json-view'), { ssr: false }) @@ -24,13 +24,13 @@ const IssueRelatedMetadata: FC = ({ event, tab }) => { }, [event]) return ( - +
- + - + - +
) } diff --git a/packages/web/components/issue-related-rrweb.tsx b/packages/web/components/issue-related-rrweb.tsx index 3e0fafa..9ffad4a 100644 --- a/packages/web/components/issue-related-rrweb.tsx +++ b/packages/web/components/issue-related-rrweb.tsx @@ -6,7 +6,7 @@ import { unpack } from 'rrweb' import { useMount } from 'react-use' import { type OhbugEventLike } from 'common' import { type FC } from 'react' -import { Box } from '~/components/ui/box' + import Wrapper from '~/components/wrapper' import 'rrweb-player/dist/style.css' @@ -29,11 +29,11 @@ const IssueRelatedRrweb: FC = ({ event }) => { } }) return ( - +
- +
- +
) } diff --git a/packages/web/components/layout.tsx b/packages/web/components/layout.tsx index 7171b14..61ede3d 100644 --- a/packages/web/components/layout.tsx +++ b/packages/web/components/layout.tsx @@ -9,7 +9,7 @@ import NavMenu from './nav-menu' import User from './user' import Logo from './logo' import Footer from './footer' -import { Box } from '~/components/ui/box' + import Wrapper from './wrapper' import { scrollWindowTo } from '~/libs/utils' @@ -32,14 +32,14 @@ const Layout: FC = ({ children }) => { <>
{/* nav */} -
{/* navMenu */} - = ({ children }) => {
-
+
{/* main */}
= ({ children }) => {
{children}
{/* footer */} - +
- +
) diff --git a/packages/web/components/nav-container.tsx b/packages/web/components/nav-container.tsx index 15585f9..f115268 100644 --- a/packages/web/components/nav-container.tsx +++ b/packages/web/components/nav-container.tsx @@ -1,8 +1,9 @@ 'use client' -import { Box, Button, Flex } from '@chakra-ui/react' +import type { ReactNode } from 'react' import Link from 'next/link' -import type { FC, ReactNode } from 'react' +import { Button } from '~/components/ui/button' +import { cn } from '~/libs/utils' export interface Nav { label: string @@ -14,13 +15,10 @@ interface Props { navs: Nav[] } -const NavContainer: FC = ({ children, navs }) => { +export default function NavContainer({ children, navs }:Props) { return ( - - +
+
{ navs.map(nav => ( = ({ children, navs }) => { key={nav.href} >
+
{children}
+
) } - -export default NavContainer diff --git a/packages/web/components/release-list.tsx b/packages/web/components/release-list.tsx index 405f3a7..28c89e6 100644 --- a/packages/web/components/release-list.tsx +++ b/packages/web/components/release-list.tsx @@ -8,7 +8,7 @@ import type { Release } from '@prisma/client' import useCurrentProject from '~/hooks/use-current-project' import { serviceDeleteRelease } from '~/services/releases' import { useToast } from '~/components/ui/use-toast' -import { Box } from '~/components/ui/box' + import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from '~/components/ui/dropdown-menu' import { Button } from '~/components/ui/button' @@ -40,7 +40,7 @@ const ReleaseList: FC = ({ releases, mutate }) => { }, [mutate]) return ( - +
{ releases.map(release => (
@@ -93,7 +93,7 @@ const ReleaseList: FC = ({ releases, mutate }) => {
)) } - +
) } diff --git a/packages/web/components/stack-info.tsx b/packages/web/components/stack-info.tsx index 3f8596b..3e64931 100644 --- a/packages/web/components/stack-info.tsx +++ b/packages/web/components/stack-info.tsx @@ -1,100 +1,61 @@ 'use client' -import type { FC, ReactElement } from 'react' +import type { ReactElement } from 'react' import { useMemo } from 'react' import type { Result } from 'source-map-trace' -import { Box, Text } from '@chakra-ui/react' +import { cn } from '~/libs/utils' interface Props { source?: Result } -const StackInfo: FC = ({ source }) => { +export default function StackInfo({ source }: Props) { const title = useMemo( () => ( - - +
+ {source?.parsed?.source} - - + + in - - + + {source?.parsed?.name} - - + + at line - - + + {source?.parsed?.line}: - - + + {source?.parsed?.column} - - + +
), [source], ) return ( - - {title} - +
{title}
+
    { source?.code?.map(({ code, number, highlight }): ReactElement => { return ( - {code} - + ) }) } - - +
+ ) } - -export default StackInfo diff --git a/packages/web/components/title.tsx b/packages/web/components/title.tsx index 3e3c87f..72892d3 100644 --- a/packages/web/components/title.tsx +++ b/packages/web/components/title.tsx @@ -2,10 +2,8 @@ import { type ReactNode } from 'react' import Wrapper from './wrapper' -import { Box } from '~/components/ui/box' -import { type BoxProps } from '~/components/ui/box' -interface Props extends BoxProps { +interface Props { children: ReactNode rightNodes?: ReactNode bottomNodes?: ReactNode @@ -15,7 +13,7 @@ const PADDING = '12' export default function Title({ children, rightNodes, bottomNodes, ...props }: Props) { return ( -
{bottomNodes}
-
+ ) } diff --git a/packages/web/components/trend-chart.tsx b/packages/web/components/trend-chart.tsx index c2618a5..cacde54 100644 --- a/packages/web/components/trend-chart.tsx +++ b/packages/web/components/trend-chart.tsx @@ -1,16 +1,16 @@ 'use client' -import type { FC, ReactNode } from 'react' +import type { ReactNode } from 'react' import { memo, useEffect, useMemo, useRef } from 'react' import type { Options } from 'highcharts' import Highcharts from 'highcharts' import HighchartsExporting from 'highcharts/modules/exporting' import HighchartsReact from 'highcharts-react-official' import dayjs from 'dayjs' -import { useColorMode } from '@chakra-ui/react' import Loading from './loading' -import { theme } from '~/styles/chart.theme' +import { theme as chartTheme } from '~/styles/chart.theme' import { colors } from '~/styles/colors' +import { useTheme } from 'next-themes' if (typeof Highcharts === 'object') { HighchartsExporting(Highcharts) } @@ -26,14 +26,14 @@ interface MiniChartProps { plotValue?: number[] } -const TrendChart: FC = memo(({ type, data, title, variant = 'mini', name = 'Events', timeField = 'time', valueField = 'count', unit = 'events', plotValue }) => { +const TrendChart = memo(({ type, data, title, variant = 'mini', name = 'Events', timeField = 'time', valueField = 'count', unit = 'events', plotValue }) => { if (!data) return const ref = useRef(null) - const { colorMode } = useColorMode() + const { theme } = useTheme() useEffect(() => { - if (typeof Highcharts === 'object') { Highcharts.setOptions(theme) } + if (typeof Highcharts === 'object') { Highcharts.setOptions(chartTheme) } }, []) useEffect(() => { ref.current.chart.showLoading() @@ -45,7 +45,7 @@ const TrendChart: FC = memo(({ type, data, title, variant = 'min if (variant === 'detail') { return { accessibility: { enabled: false }, - colors: [colorMode === 'dark' ? 'white' : 'black'], + colors: [theme === 'dark' ? 'white' : 'black'], chart: { type: 'column' }, xAxis: { categories: data?.map(v => v[timeField]), crosshair: true }, yAxis: { @@ -66,7 +66,7 @@ const TrendChart: FC = memo(({ type, data, title, variant = 'min if (variant === 'row') { return { accessibility: { enabled: false }, - colors: [colorMode === 'dark' ? 'white' : 'black'], + colors: [theme === 'dark' ? 'white' : 'black'], chart: { type: 'bar' }, xAxis: { categories: data?.map(v => v[timeField]), crosshair: true }, yAxis: { @@ -88,7 +88,7 @@ const TrendChart: FC = memo(({ type, data, title, variant = 'min return { chart: { spacingTop: 15 }, accessibility: { enabled: false }, - colors: [colorMode === 'dark' ? 'white' : 'black'], + colors: [theme === 'dark' ? 'white' : 'black'], xAxis: { categories: data?.map(v => v[timeField]) }, yAxis: { labels: { enabled: true }, @@ -147,7 +147,7 @@ const TrendChart: FC = memo(({ type, data, title, variant = 'min } return { accessibility: { enabled: false }, - colors: [colorMode === 'dark' ? 'white' : 'black'], + colors: [theme === 'dark' ? 'white' : 'black'], chart: { height: 60, spacingTop: 5, @@ -179,7 +179,7 @@ const TrendChart: FC = memo(({ type, data, title, variant = 'min exporting: { enabled: false }, } }, - [data, type, variant, colorMode, name, timeField, valueField, unit], + [data, type, variant, theme, name, timeField, valueField, unit], ) return ( diff --git a/packages/web/components/ui/box.tsx b/packages/web/components/ui/box.tsx deleted file mode 100644 index 0b8941a..0000000 --- a/packages/web/components/ui/box.tsx +++ /dev/null @@ -1,25 +0,0 @@ -'use client' - -import { type CSSProperties, type ReactNode, forwardRef } from 'react' -import { twMerge } from 'tailwind-merge' - -export interface BoxProps { - acrylic?: boolean - children?: ReactNode - className?: string - style?: CSSProperties -} - -export const Box = forwardRef(({ acrylic, className, children, ...props }, ref) => { - - return ( -
- {children} -
- ) -}) -Box.displayName = 'Box' diff --git a/packages/web/hooks/use-color.ts b/packages/web/hooks/use-color.ts deleted file mode 100644 index 2c7324b..0000000 --- a/packages/web/hooks/use-color.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { useColorModeValue } from '@chakra-ui/react' - -export function useBgColor({ gray = false, acrylic = false }) { - if (acrylic) { - if (gray) return useColorModeValue('gray.50', 'dark.800') - return useColorModeValue('whiteAlpha.600', 'blackAlpha.600') - } - else { - if (gray) return useColorModeValue('gray.50', 'dark.800') - return useColorModeValue('white', 'dark.900') - } -} - -export function useBorderColor() { - return useColorModeValue('gray.200', 'dark.50') -} diff --git a/packages/web/hooks/use-query.ts b/packages/web/hooks/use-query.ts index 625dce2..6171a27 100644 --- a/packages/web/hooks/use-query.ts +++ b/packages/web/hooks/use-query.ts @@ -1,5 +1,5 @@ -import { useToast } from '@chakra-ui/react' import { useCallback, useEffect, useRef, useState } from 'react' +import {useToast} from '~/components/ui/use-toast' interface State { isLoading: boolean @@ -15,7 +15,7 @@ export function useQuery( fn: () => (Promise), options?: Options, ) { - const toast = useToast() + const {toast} = useToast() const { enabled = true, deps = [] } = options ?? {} const lastCallId = useRef(0) const [state, set] = useState>({ isLoading: false }) diff --git a/packages/web/messages/en.json b/packages/web/messages/en.json index 882d059..8d1c960 100644 --- a/packages/web/messages/en.json +++ b/packages/web/messages/en.json @@ -28,6 +28,7 @@ "projectName": "Project Name", "projectType": "Project Type", "createProject": "Create Project", + "createProjectDescription": "One-click project creation.", "projectNamePlaceholder": "Input Project Name" }, "Bootstrap": { diff --git a/packages/web/messages/zh.json b/packages/web/messages/zh.json index 84a05a4..ee793c6 100644 --- a/packages/web/messages/zh.json +++ b/packages/web/messages/zh.json @@ -28,6 +28,7 @@ "projectName": "项目名称", "projectType": "项目类型", "createProject": "创建项目", + "createProjectDescription": "一键创建项目", "projectNamePlaceholder": "请输入项目名称" }, "Bootstrap": { diff --git a/packages/web/next.config.js b/packages/web/next.config.js index 7b0dc4d..d7ea109 100644 --- a/packages/web/next.config.js +++ b/packages/web/next.config.js @@ -1,6 +1,9 @@ /** @type {import('next').NextConfig} */ const nextConfig = { output: 'standalone', + experimental: { + serverActions: true, + }, webpack: (config) => { config.resolve.fallback = { 'node:fs': false, diff --git a/packages/web/package.json b/packages/web/package.json index 71ae4ee..9af6c1d 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -8,10 +8,6 @@ "lint": "tsc && eslint . --fix" }, "dependencies": { - "@chakra-ui/next-js": "^2.1.5", - "@chakra-ui/react": "^2.8.0", - "@chakra-ui/theme-tools": "^2.1.0", - "@chakra-ui/utils": "^2.0.14", "@egoist/tailwindcss-icons": "^1.1.0", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", diff --git a/packages/web/services/projects.ts b/packages/web/services/projects.ts index 4af5eae..07b79af 100644 --- a/packages/web/services/projects.ts +++ b/packages/web/services/projects.ts @@ -47,7 +47,12 @@ export async function serviceGetProjectsWithEventCount(user: User): Promise ({ - bg: mode('dark.500', 'gray.50')(props), - _hover: { - textColor: mode('black', 'white')(props), - bg: mode('gray.100', 'dark.500')(props), - }, - }), - ghost: (props: GlobalStyleProps) => ({ - textColor: mode('black', 'white')(props), - _hover: { bg: mode('gray.100', 'dark.200')(props) }, - _active: { textColor: 'white' }, - }), - outline: (props: GlobalStyleProps) => ({ - textColor: mode('gray.400', 'dark.50')(props), - borderColor: mode('gray.400', 'dark.50')(props), - _hover: { - textColor: mode('dark.50', 'gray.50')(props), - borderColor: mode('dark.50', 'gray.50')(props), - bg: 'inherit', - }, - _active: { bg: mode('gray.200', 'dark.50')(props) }, - }), - }, - }, - Input: { - variants: { - outline: (props: GlobalStyleProps) => ({ - borderColor: mode('gray.200', 'dark.50')(props), - _hover: { borderColor: mode('black', 'white')(props) }, - }), - }, - }, - Switch: { defaultProps: { colorScheme: 'gray' } }, - Tabs: { - variants: { - 'enclosed-colored': (props: GlobalStyleProps) => ({ - tab: { - borderColor: mode('gray.200', 'dark.50')(props), - _selected: { - borderColor: mode('gray.200', 'dark.50')(props), - borderTopColor: mode('gray.200', 'dark.50')(props), - borderBottomWidth: '2px', - borderBottomColor: mode('black', 'white')(props), - textColor: mode('black', 'white')(props), - }, - }, - tablist: { borderColor: mode('gray.200', 'dark.50')(props) }, - }), - }, - }, - Menu: { - baseStyle: (props: GlobalStyleProps) => ({ - divider: { borderColor: mode('gray.200', 'dark.50')(props) }, - list: { zIndex: '1300' }, - }), - }, - Link: { - baseStyle: { - opacity: 0.6, - _hover: { - textDecoration: 'none', - opacity: 1, - }, - }, - }, - Breadcrumb: { - baseStyle: { - link: { - opacity: 0.6, - _hover: { - textDecoration: 'none', - opacity: 1, - }, - }, - }, - }, - Accordion: { - baseStyle: (props: GlobalStyleProps) => ({ - container: { borderColor: mode('gray.200', 'dark.50')(props) }, - button: { - py: '4', - _hover: { bg: mode('gray.200', 'inherit')(props) }, - _expanded: { bg: mode('gray.200', 'inherit')(props) }, - }, - panel: { bg: mode('gray.200', 'inherit')(props) }, - }), - }, - Tooltip: { baseStyle: { color: 'white' } }, - Checkbox: { baseStyle: (props: GlobalStyleProps) => ({ control: { borderColor: mode('gray.200', 'dark.50')(props) } }) }, - Table: { baseStyle: { table: { mx: '-4' } } }, - }, - config: { useSystemColorMode: true }, -}) - -export default theme diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6eb5994..8a4b34a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -238,18 +238,6 @@ importers: packages/web: dependencies: - '@chakra-ui/next-js': - specifier: ^2.1.5 - version: 2.1.5(@chakra-ui/react@2.8.0)(@emotion/react@11.11.1)(next@13.4.19)(react@18.2.0) - '@chakra-ui/react': - specifier: ^2.8.0 - version: 2.8.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/theme-tools': - specifier: ^2.1.0 - version: 2.1.0(@chakra-ui/styled-system@2.9.1) - '@chakra-ui/utils': - specifier: ^2.0.14 - version: 2.0.14 '@egoist/tailwindcss-icons': specifier: ^1.1.0 version: 1.1.0(tailwindcss@3.3.3) @@ -597,1117 +585,6 @@ packages: '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 - /@chakra-ui/accordion@2.3.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0): - resolution: {integrity: sha512-A4TkRw3Jnt+Fam6dSSJ62rskdrvjF3JGctYcfXlojfFIpHPuIw4pDwfZgNAxlaxWkcj0e7JJKlQ88dnZW+QfFg==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@chakra-ui/descendant': 3.1.0(react@18.2.0) - '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/transition': 2.1.0(framer-motion@10.16.1)(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/alert@2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-De+BT88iYOu3Con7MxQeICb1SwgAdVdgpHIYjTh3qvGlNXAQjs81rhG0fONXvwW1FIYletvr9DY2Tlg8xJe7tQ==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/anatomy@2.2.0: - resolution: {integrity: sha512-cD8Ms5C8+dFda0LrORMdxiFhAZwOIY1BSlCadz6/mHUIgNdQy13AHPrXiq6qWdMslqVHq10k5zH7xMPLt6kjFg==} - dev: false - - /@chakra-ui/avatar@2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-8gKSyLfygnaotbJbDMHDiJoF38OHXUYVme4gGxZ1fLnQEdPVEaIWfH+NndIjOM0z8S+YEFnT9KyGMUtvPrBk3g==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/image': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/breadcrumb@2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-4cWCG24flYBxjruRi4RJREWTGF74L/KzI2CognAW/d/zWR0CjiScuJhf37Am3LFbCySP6WSoyBOtTIoTA4yLEA==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/breakpoint-utils@2.0.8: - resolution: {integrity: sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA==} - dependencies: - '@chakra-ui/shared-utils': 2.0.5 - dev: false - - /@chakra-ui/button@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-95CplwlRKmmUXkdEp/21VkEWgnwcx2TOBG6NfYlsuLBDHSLlo5FKIiE2oSi4zXc4TLcopGcWPNcm/NDaSC5pvA==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/card@2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-xUB/k5MURj4CtPAhdSoXZidUbm8j3hci9vnc+eZJVDqhDOShNlD6QeniQNRPRys4lWAQLCbFcrwL29C8naDi6g==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/checkbox@2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-fX7M5sQK27aFWoj7vqnPkf1Q3AHmML/5dIRYfm7HEIsZXYH2C1CkM6+dijeSWIk6a0mp0r3el6SNDUti2ehH8g==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/form-control': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/visually-hidden': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@zag-js/focus-visible': 0.10.5 - react: 18.2.0 - dev: false - - /@chakra-ui/clickable@2.1.0(react@18.2.0): - resolution: {integrity: sha512-flRA/ClPUGPYabu+/GLREZVZr9j2uyyazCAUHAdrTUEdDYCr31SVGhgh7dgKdtq23bOvAQJpIJjw/0Bs0WvbXw==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - react: 18.2.0 - dev: false - - /@chakra-ui/close-button@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-KfJcz6UAaR2dDWSIv6UrCGkZQS54Fjl+DEEVOUTJ7gf4KOP4FQZCkv8hqsAB9FeCtnwU43adq2oaw3aZH/Uzew==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/color-mode@2.2.0(react@18.2.0): - resolution: {integrity: sha512-niTEA8PALtMWRI9wJ4LL0CSBDo8NBfLNp4GD6/0hstcm3IlbBHTVKxN6HwSaoNYfphDQLxCjT4yG+0BJA5tFpg==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/control-box@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-gVrRDyXFdMd8E7rulL0SKeoljkLQiPITFnsyMO8EFHNZ+AHt5wK4LIguYVEq88APqAGZGfHFWXr79RYrNiE3Mg==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/counter@2.1.0(react@18.2.0): - resolution: {integrity: sha512-s6hZAEcWT5zzjNz2JIWUBzRubo9la/oof1W7EKZVVfPYHERnl5e16FmBC79Yfq8p09LQ+aqFKm/etYoJMMgghw==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/number-utils': 2.0.7 - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - react: 18.2.0 - dev: false - - /@chakra-ui/css-reset@2.2.0(@emotion/react@11.11.1)(react@18.2.0): - resolution: {integrity: sha512-nn7hjquIrPwCzwI4d/Y4wzM5A5xAeswREOfT8gT0Yd+U+Qnw3pPT8NPLbNJ3DvuOfJaCV6/N5ld/6RRTgYF/sQ==} - peerDependencies: - '@emotion/react': '>=10.0.35' - react: '>=18' - dependencies: - '@emotion/react': 11.11.1(@types/react@18.2.21)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/descendant@3.1.0(react@18.2.0): - resolution: {integrity: sha512-VxCIAir08g5w27klLyi7PVo8BxhW4tgU/lxQyujkmi4zx7hT9ZdrcQLAted/dAa+aSIZ14S1oV0Q9lGjsAdxUQ==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/dom-utils@2.1.0: - resolution: {integrity: sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ==} - dev: false - - /@chakra-ui/editable@3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-j2JLrUL9wgg4YA6jLlbU88370eCRyor7DZQD9lzpY95tSOXpTljeg3uF9eOmDnCs6fxp3zDWIfkgMm/ExhcGTg==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-focus-on-pointer-down': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/event-utils@2.0.8: - resolution: {integrity: sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw==} - dev: false - - /@chakra-ui/focus-lock@2.1.0(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-EmGx4PhWGjm4dpjRqM4Aa+rCWBxP+Rq8Uc/nAVnD4YVqkEhBkrPTpui2lnjsuxqNaZ24fIAZ10cF1hlpemte/w==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/dom-utils': 2.1.0 - react: 18.2.0 - react-focus-lock: 2.9.5(@types/react@18.2.21)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - dev: false - - /@chakra-ui/form-control@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-3QmWG9v6Rx+JOwJP3Wt89+AWZxK0F1NkVAgXP3WVfE9VDXOKFRV/faLT0GEe2V+l7WZHF5PLdEBvKG8Cgw2mkA==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/hooks@2.2.0(react@18.2.0): - resolution: {integrity: sha512-GZE64mcr20w+3KbCUPqQJHHmiFnX5Rcp8jS3YntGA4D5X2qU85jka7QkjfBwv/iduZ5Ei0YpCMYGCpi91dhD1Q==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/react-utils': 2.0.12(react@18.2.0) - '@chakra-ui/utils': 2.0.15 - compute-scroll-into-view: 1.0.20 - copy-to-clipboard: 3.3.3 - react: 18.2.0 - dev: false - - /@chakra-ui/icon@3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-t6v0lGCXRbwUJycN8A/nDTuLktMP+LRjKbYJnd2oL6Pm2vOl99XwEQ5cAEyEa4XoseYNEgXiLR+2TfvgfNFvcw==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/image@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-bskumBYKLiLMySIWDGcz0+D9Th0jPvmX6xnRMs4o92tT3Od/bW26lahmV2a2Op2ItXeCmRMY+XxJH5Gy1i46VA==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/input@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-HItI2vq6vupCuixdzof4sIanGdLlszhDtlR5be5z8Nrda1RkXVqI+9CTJPbNsx2nIKEfwPt01pnT9mozoOSMMw==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/form-control': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/object-utils': 2.1.0 - '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/layout@2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-tp1/Bn+cHn0Q4HWKY62HtOwzhpH1GUA3i5fvs23HEhOEryTps05hyuQVeJ71fLqSs6f1QEIdm+9It+5WCj64vQ==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/breakpoint-utils': 2.0.8 - '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/object-utils': 2.1.0 - '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/lazy-utils@2.0.5: - resolution: {integrity: sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg==} - dev: false - - /@chakra-ui/live-region@2.1.0(react@18.2.0): - resolution: {integrity: sha512-ZOxFXwtaLIsXjqnszYYrVuswBhnIHHP+XIgK1vC6DePKtyK590Wg+0J0slDwThUAd4MSSIUa/nNX84x1GMphWw==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@chakra-ui/media-query@3.3.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-IsTGgFLoICVoPRp9ykOgqmdMotJG0CnPsKvGQeSFOB/dZfIujdVb14TYxDU4+MURXry1MhJ7LzZhv+Ml7cr8/g==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/breakpoint-utils': 2.0.8 - '@chakra-ui/react-env': 3.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/menu@2.2.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0): - resolution: {integrity: sha512-l7HQjriW4JGeCyxDdguAzekwwB+kHGDLxACi0DJNp37sil51SRaN1S1OrneISbOHVpHuQB+KVNgU0rqhoglVew==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@chakra-ui/clickable': 2.1.0(react@18.2.0) - '@chakra-ui/descendant': 3.1.0(react@18.2.0) - '@chakra-ui/lazy-utils': 2.0.5 - '@chakra-ui/popper': 3.1.0(react@18.2.0) - '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-animation-state': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-disclosure': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-focus-effect': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-outside-click': 2.2.0(react@18.2.0) - '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/transition': 2.1.0(framer-motion@10.16.1)(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/modal@2.3.0(@chakra-ui/system@2.6.0)(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-S1sITrIeLSf21LJ0Vz8xZhj5fWEud5z5Dl2dmvOEv1ezypgOrCCBdOEnnqCkoEKZDbKvzZWZXWR5791ikLP6+g==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - framer-motion: '>=4.0.0' - react: '>=18' - react-dom: '>=18' - dependencies: - '@chakra-ui/close-button': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/focus-lock': 2.1.0(@types/react@18.2.21)(react@18.2.0) - '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/transition': 2.1.0(framer-motion@10.16.1)(react@18.2.0) - aria-hidden: 1.2.3 - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.6(@types/react@18.2.21)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - dev: false - - /@chakra-ui/next-js@2.1.5(@chakra-ui/react@2.8.0)(@emotion/react@11.11.1)(next@13.4.19)(react@18.2.0): - resolution: {integrity: sha512-bBd8zeXlAuVwDsjGN0/5ZZJknSbFeiZgJiGdbJo91v2lxKkOwo26b4ggc1ck1t+JR+daU6SrGBjlbQqSuWzyaA==} - peerDependencies: - '@chakra-ui/react': '>=2.4.0' - '@emotion/react': '>=11' - next: '>=13' - react: '>=18' - dependencies: - '@chakra-ui/react': 2.8.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0) - '@emotion/cache': 11.11.0 - '@emotion/react': 11.11.1(@types/react@18.2.21)(react@18.2.0) - next: 13.4.19(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/number-input@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-/gEAzQHhrMA+1rzyCMaN8OkKtUPuER6iA+nloYEYBoT7dH/EoNlRtBkiIQhDp+E4VpgZJ0SK3OVrm9/eBbtHHg==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/counter': 2.1.0(react@18.2.0) - '@chakra-ui/form-control': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-interval': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/number-utils@2.0.7: - resolution: {integrity: sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg==} - dev: false - - /@chakra-ui/object-utils@2.1.0: - resolution: {integrity: sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ==} - dev: false - - /@chakra-ui/pin-input@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-x4vBqLStDxJFMt+jdAHHS8jbh294O53CPQJoL4g228P513rHylV/uPscYUHrVJXRxsHfRztQO9k45jjTYaPRMw==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/descendant': 3.1.0(react@18.2.0) - '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/popover@2.2.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0): - resolution: {integrity: sha512-cTqXdgkU0vgK82AR1nWcC2MJYhEL/y6uTeprvO2+j4o2D0yPrzVMuIZZRl0abrQwiravQyVGEMgA5y0ZLYwbiQ==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@chakra-ui/close-button': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/lazy-utils': 2.0.5 - '@chakra-ui/popper': 3.1.0(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-animation-state': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-disclosure': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-focus-effect': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-focus-on-pointer-down': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/popper@3.1.0(react@18.2.0): - resolution: {integrity: sha512-ciDdpdYbeFG7og6/6J8lkTFxsSvwTdMLFkpVylAF6VNC22jssiWfquj2eyD4rJnzkRFPvIWJq8hvbfhsm+AjSg==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@popperjs/core': 2.11.8 - react: 18.2.0 - dev: false - - /@chakra-ui/portal@2.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-9q9KWf6SArEcIq1gGofNcFPSWEyl+MfJjEUg/un1SMlQjaROOh3zYr+6JAwvcORiX7tyHosnmWC3d3wI2aPSQg==} - peerDependencies: - react: '>=18' - react-dom: '>=18' - dependencies: - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@chakra-ui/progress@2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-qUXuKbuhN60EzDD9mHR7B67D7p/ZqNS2Aze4Pbl1qGGZfulPW0PY8Rof32qDtttDQBkzQIzFGE8d9QpAemToIQ==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/provider@2.4.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-KJ/TNczpY+EStQXa2Y5PZ+senlBHrY7P+RpBgJLBZLGkQUCS3APw5KvCwgpA0COb2M4AZXCjw+rm+Ko7ontlgA==} - peerDependencies: - '@emotion/react': ^11.0.0 - '@emotion/styled': ^11.0.0 - react: '>=18' - react-dom: '>=18' - dependencies: - '@chakra-ui/css-reset': 2.2.0(@emotion/react@11.11.1)(react@18.2.0) - '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/react-env': 3.1.0(react@18.2.0) - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/utils': 2.0.15 - '@emotion/react': 11.11.1(@types/react@18.2.21)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.21)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@chakra-ui/radio@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-WiRlSCqKWgy4m9106w4g77kcLYqBxqGhFRO1pTTJp99rxpM6jNadOeK+moEjqj64N9mSz3njEecMJftKKcOYdg==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/form-control': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@zag-js/focus-visible': 0.10.5 - react: 18.2.0 - dev: false - - /@chakra-ui/react-children-utils@2.0.6(react@18.2.0): - resolution: {integrity: sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@chakra-ui/react-context@2.1.0(react@18.2.0): - resolution: {integrity: sha512-iahyStvzQ4AOwKwdPReLGfDesGG+vWJfEsn0X/NoGph/SkN+HXtv2sCfYFFR9k7bb+Kvc6YfpLlSuLvKMHi2+w==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@chakra-ui/react-env@3.1.0(react@18.2.0): - resolution: {integrity: sha512-Vr96GV2LNBth3+IKzr/rq1IcnkXv+MLmwjQH6C8BRtn3sNskgDFD5vLkVXcEhagzZMCh8FR3V/bzZPojBOyNhw==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/react-types@2.0.7(react@18.2.0): - resolution: {integrity: sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-animation-state@2.1.0(react@18.2.0): - resolution: {integrity: sha512-CFZkQU3gmDBwhqy0vC1ryf90BVHxVN8cTLpSyCpdmExUEtSEInSCGMydj2fvn7QXsz/za8JNdO2xxgJwxpLMtg==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/dom-utils': 2.1.0 - '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-callback-ref@2.1.0(react@18.2.0): - resolution: {integrity: sha512-efnJrBtGDa4YaxDzDE90EnKD3Vkh5a1t3w7PhnRQmsphLy3g2UieasoKTlT2Hn118TwDjIv5ZjHJW6HbzXA9wQ==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-controllable-state@2.1.0(react@18.2.0): - resolution: {integrity: sha512-QR/8fKNokxZUs4PfxjXuwl0fj/d71WPrmLJvEpCTkHjnzu7LnYvzoe2wB867IdooQJL0G1zBxl0Dq+6W1P3jpg==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-disclosure@2.1.0(react@18.2.0): - resolution: {integrity: sha512-Ax4pmxA9LBGMyEZJhhUZobg9C0t3qFE4jVF1tGBsrLDcdBeLR9fwOogIPY9Hf0/wqSlAryAimICbr5hkpa5GSw==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-event-listener@2.1.0(react@18.2.0): - resolution: {integrity: sha512-U5greryDLS8ISP69DKDsYcsXRtAdnTQT+jjIlRYZ49K/XhUR/AqVZCK5BkR1spTDmO9H8SPhgeNKI70ODuDU/Q==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-focus-effect@2.1.0(react@18.2.0): - resolution: {integrity: sha512-xzVboNy7J64xveLcxTIJ3jv+lUJKDwRM7Szwn9tNzUIPD94O3qwjV7DDCUzN2490nSYDF4OBMt/wuDBtaR3kUQ==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/dom-utils': 2.1.0 - '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-focus-on-pointer-down@2.1.0(react@18.2.0): - resolution: {integrity: sha512-2jzrUZ+aiCG/cfanrolsnSMDykCAbv9EK/4iUyZno6BYb3vziucmvgKuoXbMPAzWNtwUwtuMhkby8rc61Ue+Lg==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-interval@2.1.0(react@18.2.0): - resolution: {integrity: sha512-8iWj+I/+A0J08pgEXP1J1flcvhLBHkk0ln7ZvGIyXiEyM6XagOTJpwNhiu+Bmk59t3HoV/VyvyJTa+44sEApuw==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-latest-ref@2.1.0(react@18.2.0): - resolution: {integrity: sha512-m0kxuIYqoYB0va9Z2aW4xP/5b7BzlDeWwyXCH6QpT2PpW3/281L3hLCm1G0eOUcdVlayqrQqOeD6Mglq+5/xoQ==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-merge-refs@2.1.0(react@18.2.0): - resolution: {integrity: sha512-lERa6AWF1cjEtWSGjxWTaSMvneccnAVH4V4ozh8SYiN9fSPZLlSG3kNxfNzdFvMEhM7dnP60vynF7WjGdTgQbQ==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-outside-click@2.2.0(react@18.2.0): - resolution: {integrity: sha512-PNX+s/JEaMneijbgAM4iFL+f3m1ga9+6QK0E5Yh4s8KZJQ/bLwZzdhMz8J/+mL+XEXQ5J0N8ivZN28B82N1kNw==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-pan-event@2.1.0(react@18.2.0): - resolution: {integrity: sha512-xmL2qOHiXqfcj0q7ZK5s9UjTh4Gz0/gL9jcWPA6GVf+A0Od5imEDa/Vz+533yQKWiNSm1QGrIj0eJAokc7O4fg==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/event-utils': 2.0.8 - '@chakra-ui/react-use-latest-ref': 2.1.0(react@18.2.0) - framesync: 6.1.2 - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-previous@2.1.0(react@18.2.0): - resolution: {integrity: sha512-pjxGwue1hX8AFcmjZ2XfrQtIJgqbTF3Qs1Dy3d1krC77dEsiCUbQ9GzOBfDc8pfd60DrB5N2tg5JyHbypqh0Sg==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-safe-layout-effect@2.1.0(react@18.2.0): - resolution: {integrity: sha512-Knbrrx/bcPwVS1TorFdzrK/zWA8yuU/eaXDkNj24IrKoRlQrSBFarcgAEzlCHtzuhufP3OULPkELTzz91b0tCw==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-size@2.1.0(react@18.2.0): - resolution: {integrity: sha512-tbLqrQhbnqOjzTaMlYytp7wY8BW1JpL78iG7Ru1DlV4EWGiAmXFGvtnEt9HftU0NJ0aJyjgymkxfVGI55/1Z4A==} - peerDependencies: - react: '>=18' - dependencies: - '@zag-js/element-size': 0.10.5 - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-timeout@2.1.0(react@18.2.0): - resolution: {integrity: sha512-cFN0sobKMM9hXUhyCofx3/Mjlzah6ADaEl/AXl5Y+GawB5rgedgAcu2ErAgarEkwvsKdP6c68CKjQ9dmTQlJxQ==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/react-use-update-effect@2.1.0(react@18.2.0): - resolution: {integrity: sha512-ND4Q23tETaR2Qd3zwCKYOOS1dfssojPLJMLvUtUbW5M9uW1ejYWgGUobeAiOVfSplownG8QYMmHTP86p/v0lbA==} - peerDependencies: - react: '>=18' - dependencies: - react: 18.2.0 - dev: false - - /@chakra-ui/react-utils@2.0.12(react@18.2.0): - resolution: {integrity: sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw==} - peerDependencies: - react: '>=18' - dependencies: - '@chakra-ui/utils': 2.0.15 - react: 18.2.0 - dev: false - - /@chakra-ui/react@2.8.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-tV82DaqE4fMbLIWq58BYh4Ol3gAlNEn+qYOzx8bPrZudboEDnboq8aVfSBwWOY++MLWz2Nn7CkT69YRm91e5sg==} - peerDependencies: - '@emotion/react': ^11.0.0 - '@emotion/styled': ^11.0.0 - framer-motion: '>=4.0.0' - react: '>=18' - react-dom: '>=18' - dependencies: - '@chakra-ui/accordion': 2.3.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0) - '@chakra-ui/alert': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/avatar': 2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/breadcrumb': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/button': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/card': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/checkbox': 2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/close-button': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/control-box': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/counter': 2.1.0(react@18.2.0) - '@chakra-ui/css-reset': 2.2.0(@emotion/react@11.11.1)(react@18.2.0) - '@chakra-ui/editable': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/focus-lock': 2.1.0(@types/react@18.2.21)(react@18.2.0) - '@chakra-ui/form-control': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/hooks': 2.2.0(react@18.2.0) - '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/image': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/input': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/layout': 2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/live-region': 2.1.0(react@18.2.0) - '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/menu': 2.2.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0) - '@chakra-ui/modal': 2.3.0(@chakra-ui/system@2.6.0)(@types/react@18.2.21)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/number-input': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/pin-input': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/popover': 2.2.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0) - '@chakra-ui/popper': 3.1.0(react@18.2.0) - '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/progress': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/provider': 2.4.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/radio': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/react-env': 3.1.0(react@18.2.0) - '@chakra-ui/select': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/skeleton': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/skip-nav': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/slider': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/stat': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/stepper': 2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/switch': 2.1.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0) - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/table': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/tabs': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/tag': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/textarea': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/theme': 3.2.0(@chakra-ui/styled-system@2.9.1) - '@chakra-ui/theme-utils': 2.0.19 - '@chakra-ui/toast': 7.0.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/tooltip': 2.3.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/transition': 2.1.0(framer-motion@10.16.1)(react@18.2.0) - '@chakra-ui/utils': 2.0.15 - '@chakra-ui/visually-hidden': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@emotion/react': 11.11.1(@types/react@18.2.21)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.21)(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - dev: false - - /@chakra-ui/select@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-6GEjCJNOm1pS9E7XRvodoVOuSFl82Jio3MGWgmcQrLznjJAhIZVMq85vCQqzGpjjfbHys/UctfdJY75Ctas/Jg==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/form-control': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/shared-utils@2.0.5: - resolution: {integrity: sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q==} - dev: false - - /@chakra-ui/skeleton@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-JNRuMPpdZGd6zFVKjVQ0iusu3tXAdI29n4ZENYwAJEMf/fN0l12sVeirOxkJ7oEL0yOx2AgEYFSKdbcAgfUsAQ==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/react-use-previous': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/skip-nav@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-Hk+FG+vadBSH0/7hwp9LJnLjkO0RPGnx7gBJWI4/SpoJf3e4tZlWYtwGj0toYY4aGKl93jVghuwGbDBEMoHDug==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/slider@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-lUOBcLMCnFZiA/s2NONXhELJh6sY5WtbRykPtclGfynqqOo47lwWJx+VP7xaeuhDOPcWSSecWc9Y1BfPOCz9cQ==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/number-utils': 2.0.7 - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-latest-ref': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-pan-event': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-size': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/spinner@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-hczbnoXt+MMv/d3gE+hjQhmkzLiKuoTo42YhUG7Bs9OSv2lg1fZHW1fGNRFP3wTi6OIbD044U1P9HK+AOgFH3g==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/stat@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-sqx0/AdFFZ80dsiM5owmhtQyYl+zON1r+IY0m70I/ABRVy+I3br06xdUhoaxh3tcP7c0O/BQgb+VCfXa9Y34CA==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/stepper@2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-q80QX/NLrjJQIlBP1N+Q8GVJb7/HiOpMoK1PlP4denB/KxkU2K8GEjss8U2vklR1XsWJy1fwfj03+66Q78Uk/Q==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/styled-system@2.9.1: - resolution: {integrity: sha512-jhYKBLxwOPi9/bQt9kqV3ELa/4CjmNNruTyXlPp5M0v0+pDMUngPp48mVLoskm9RKZGE0h1qpvj/jZ3K7c7t8w==} - dependencies: - '@chakra-ui/shared-utils': 2.0.5 - csstype: 3.1.2 - lodash.mergewith: 4.6.2 - dev: false - - /@chakra-ui/switch@2.1.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react@18.2.0): - resolution: {integrity: sha512-uWHOaIDQdGh+mszxeppj5aYVepbkSK445KZlJJkfr9Bnr6sythTwM63HSufnVDiTEE4uRqegv9jEjZK2JKA+9A==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@chakra-ui/checkbox': 2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/system@2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): - resolution: {integrity: sha512-MgAFRz9V1pW0dplwWsB99hx49LCC+LsrkMala7KXcP0OvWdrkjw+iu+voBksO3626+glzgIwlZW113Eja+7JEQ==} - peerDependencies: - '@emotion/react': ^11.0.0 - '@emotion/styled': ^11.0.0 - react: '>=18' - dependencies: - '@chakra-ui/color-mode': 2.2.0(react@18.2.0) - '@chakra-ui/object-utils': 2.1.0 - '@chakra-ui/react-utils': 2.0.12(react@18.2.0) - '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/theme-utils': 2.0.19 - '@chakra-ui/utils': 2.0.15 - '@emotion/react': 11.11.1(@types/react@18.2.21)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.21)(react@18.2.0) - react: 18.2.0 - react-fast-compare: 3.2.1 - dev: false - - /@chakra-ui/table@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-o5OrjoHCh5uCLdiUb0Oc0vq9rIAeHSIRScc2ExTC9Qg/uVZl2ygLrjToCaKfaaKl1oQexIeAcZDKvPG8tVkHyQ==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/tabs@2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-ulN7McHZ322qlbJXg8S+IwdN8Axh8q0HzYBOHzSdcnVphEytfv9TsfJhN0Hx5yjkpekAzG5fewn33ZdIpIpKyQ==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/clickable': 2.1.0(react@18.2.0) - '@chakra-ui/descendant': 3.1.0(react@18.2.0) - '@chakra-ui/lazy-utils': 2.0.5 - '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/tag@3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-Mn2u828z5HvqEBEG+tUJWe3al5tzN87bK2U0QfThx3+zqWbBCWBSCVfnWRtkNh80m+5a1TekexDAPZqu5G8zdw==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/textarea@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-4F7X/lPRsY+sPxYrWGrhh1pBtdnFvVllIOapzAwnjYwsflm+vf6c+9ZgoDWobXsNezJ9fcqN0FTPwaBnDvDQRQ==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/form-control': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/theme-tools@2.1.0(@chakra-ui/styled-system@2.9.1): - resolution: {integrity: sha512-TKv4trAY8q8+DWdZrpSabTd3SZtZrnzFDwUdzhbWBhFEDEVR3fAkRTPpnPDtf1X9w1YErWn3QAcMACVFz4+vkw==} - peerDependencies: - '@chakra-ui/styled-system': '>=2.0.0' - dependencies: - '@chakra-ui/anatomy': 2.2.0 - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/styled-system': 2.9.1 - color2k: 2.0.2 - dev: false - - /@chakra-ui/theme-utils@2.0.19: - resolution: {integrity: sha512-UQ+KvozTN86+0oA80rdQd1a++4rm4ulo+DEabkgwNpkK3yaWsucOxkDQpi2sMIMvw5X0oaWvNBZJuVyK7HdOXg==} - dependencies: - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/theme': 3.2.0(@chakra-ui/styled-system@2.9.1) - lodash.mergewith: 4.6.2 - dev: false - - /@chakra-ui/theme@3.2.0(@chakra-ui/styled-system@2.9.1): - resolution: {integrity: sha512-q9mppdkhmaBnvOT8REr/lVNNBX/prwm50EzObJ+r+ErVhNQDc55gCFmtr+It3xlcCqmOteG6XUdwRCJz8qzOqg==} - peerDependencies: - '@chakra-ui/styled-system': '>=2.8.0' - dependencies: - '@chakra-ui/anatomy': 2.2.0 - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/theme-tools': 2.1.0(@chakra-ui/styled-system@2.9.1) - dev: false - - /@chakra-ui/toast@7.0.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-XQgSnn4DYRgfOBzBvh8GI/AZ7SfrO8wlVSmChfp92Nfmqm7tRDUT9x8ws/iNKAvMRHkhl7fmRjJ39ipeXYrMvA==} - peerDependencies: - '@chakra-ui/system': 2.6.0 - framer-motion: '>=4.0.0' - react: '>=18' - react-dom: '>=18' - dependencies: - '@chakra-ui/alert': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/close-button': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) - '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-timeout': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/theme': 3.2.0(@chakra-ui/styled-system@2.9.1) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@chakra-ui/tooltip@2.3.0(@chakra-ui/system@2.6.0)(framer-motion@10.16.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-2s23f93YIij1qEDwIK//KtEu4LLYOslhR1cUhDBk/WUzyFR3Ez0Ee+HlqlGEGfGe9x77E6/UXPnSAKKdF/cpsg==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - framer-motion: '>=4.0.0' - react: '>=18' - react-dom: '>=18' - dependencies: - '@chakra-ui/dom-utils': 2.1.0 - '@chakra-ui/popper': 3.1.0(react@18.2.0) - '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-disclosure': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@chakra-ui/transition@2.1.0(framer-motion@10.16.1)(react@18.2.0): - resolution: {integrity: sha512-orkT6T/Dt+/+kVwJNy7zwJ+U2xAZ3EU7M3XCs45RBvUnZDr/u9vdmaM/3D/rOpmQJWgQBwKPJleUXrYWUagEDQ==} - peerDependencies: - framer-motion: '>=4.0.0' - react: '>=18' - dependencies: - '@chakra-ui/shared-utils': 2.0.5 - framer-motion: 10.16.1(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - dev: false - - /@chakra-ui/utils@2.0.14: - resolution: {integrity: sha512-vYxtAUPY09Ex2Ae2ZvQKA1d2+lMKq/wUaRiqpwmeLfutEQuPQZc3qzQcAIMRQx3wLgXr9BUFDtHgBoOz0XKtZw==} - dependencies: - '@types/lodash.mergewith': 4.6.6 - css-box-model: 1.2.1 - framesync: 6.1.2 - lodash.mergewith: 4.6.2 - dev: false - - /@chakra-ui/utils@2.0.15: - resolution: {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 - dev: false - - /@chakra-ui/visually-hidden@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): - resolution: {integrity: sha512-3OHKqTz78PX7V4qto+a5Y6VvH6TbU3Pg6Z0Z2KnDkOBP3Po8fiz0kk+/OSPzIwdcSsQKiocLi0c1pnnUPdMZPg==} - peerDependencies: - '@chakra-ui/system': '>=2.0.0' - react: '>=18' - dependencies: - '@chakra-ui/system': 2.6.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - react: 18.2.0 - dev: false - /@chenyueban/eslint-config@3.0.5(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-whFg8PUas0gBw6wF+bO2l7YhWuGMoaA19MKPGxlgWRTJ5GlmIeo1Qa58swy6tewCBKScpUyatwgXl04PWVn/Cw==} engines: {node: '>=16', npm: '>=7'} @@ -3541,10 +2418,6 @@ packages: config-chain: 1.1.13 dev: true - /@popperjs/core@2.11.8: - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - dev: false - /@prisma/client@5.2.0(prisma@5.2.0): resolution: {integrity: sha512-AiTjJwR4J5Rh6Z/9ZKrBBLel3/5DzUNntMohOy7yObVnVoTNVFi2kvpLZlFuKO50d7yDspOtW6XBpiAd0BVXbQ==} engines: {node: '>=16.13'} @@ -5007,22 +3880,6 @@ packages: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} dev: false - /@types/lodash.mergewith@4.6.6: - resolution: {integrity: sha512-RY/8IaVENjG19rxTZu9Nukqh0W2UrYgmBj5sdns4hWRZaV8PqR7wIKHFKzvOTjo4zVRV7sVI+yFhAJql12Kfqg==} - dependencies: - '@types/lodash': 4.14.196 - dev: false - - /@types/lodash.mergewith@4.6.7: - resolution: {integrity: sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==} - dependencies: - '@types/lodash': 4.14.196 - dev: false - - /@types/lodash@4.14.196: - resolution: {integrity: sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==} - dev: false - /@types/markdown-it@13.0.0: resolution: {integrity: sha512-mPTaUl5glYfzdJFeCsvhXQwZKdyszNAZcMm5ZTP5SfpTu+vIbog7J3z8Fa4x/Fzv5TB4R6OA/pHBYIYmkYOWGQ==} dependencies: @@ -5487,20 +4344,6 @@ packages: /@xtuc/long@4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - /@zag-js/dom-query@0.10.5: - resolution: {integrity: sha512-zm6wA5+kqU48it6afNjaUhjVSixKZruTKB23z0V1xBqKbuiLOMMOZ5oK26cTPSXtZ5CPhDNZ2Qk4pliS5n9SVw==} - dev: false - - /@zag-js/element-size@0.10.5: - resolution: {integrity: sha512-uQre5IidULANvVkNOBQ1tfgwTQcGl4hliPSe69Fct1VfYb2Fd0jdAcGzqQgPhfrXFpR62MxLPB7erxJ/ngtL8w==} - dev: false - - /@zag-js/focus-visible@0.10.5: - resolution: {integrity: sha512-EhDHKLutMtvLFCjBjyIY6h1JoJJNXG3KJz7Dj1sh4tj4LWAqo/TqLvgHyUTB29XMHwoslFHDJHKVWmLGMi+ULQ==} - dependencies: - '@zag-js/dom-query': 0.10.5 - dev: false - /JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -6417,10 +5260,6 @@ packages: hasBin: true dev: true - /color2k@2.0.2: - resolution: {integrity: sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w==} - dev: false - /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -6493,10 +5332,6 @@ packages: dot-prop: 5.3.0 dev: true - /compute-scroll-into-view@1.0.20: - resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} - dev: false - /compute-scroll-into-view@2.0.4: resolution: {integrity: sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g==} dev: false @@ -6799,12 +5634,6 @@ packages: type-fest: 1.4.0 dev: true - /css-box-model@1.2.1: - resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==} - dependencies: - tiny-invariant: 1.3.1 - dev: false - /css-in-js-utils@3.1.0: resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} dependencies: @@ -8101,13 +6930,6 @@ packages: - encoding dev: false - /focus-lock@0.11.6: - resolution: {integrity: sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==} - engines: {node: '>=10'} - dependencies: - tslib: 2.6.1 - dev: false - /follow-redirects@1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} @@ -8203,12 +7025,6 @@ packages: '@emotion/is-prop-valid': 0.8.8 dev: false - /framesync@6.1.2: - resolution: {integrity: sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==} - dependencies: - tslib: 2.4.0 - dev: false - /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -9808,6 +8624,7 @@ packages: /lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true /lodash.snakecase@4.1.1: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} @@ -11503,15 +10320,6 @@ packages: pure-color: 1.3.0 dev: false - /react-clientside-effect@1.2.6(react@18.2.0): - resolution: {integrity: sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==} - peerDependencies: - react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@babel/runtime': 7.22.6 - react: 18.2.0 - dev: false - /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -11522,29 +10330,6 @@ packages: scheduler: 0.23.0 dev: false - /react-fast-compare@3.2.1: - resolution: {integrity: sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg==} - dev: false - - /react-focus-lock@2.9.5(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-h6vrdgUbsH2HeD5I7I3Cx1PPrmwGuKYICS+kB9m+32X/9xHRrAbxgvaBpG7BFBN9h3tO+C3qX1QAVESmi4CiIA==} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.6 - '@types/react': 18.2.21 - focus-lock: 0.11.6 - prop-types: 15.8.1 - react: 18.2.0 - react-clientside-effect: 1.2.6(react@18.2.0) - use-callback-ref: 1.3.0(@types/react@18.2.21)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.21)(react@18.2.0) - dev: false - /react-hook-form@7.45.4(react@18.2.0): resolution: {integrity: sha512-HGDV1JOOBPZj10LB3+OZgfDBTn+IeEsNOKiq/cxbQAIbKaiJUe/KV8DBUzsx0Gx/7IG/orWqRRm736JwOfUSWQ==} engines: {node: '>=12.22.0'} @@ -11644,25 +10429,6 @@ packages: use-sidecar: 1.1.2(@types/react@18.2.21)(react@18.2.0) dev: false - /react-remove-scroll@2.5.6(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-bO856ad1uDYLefgArk559IzUNeQ6SWH4QnrevIUjH+GczV56giDfl3h0Idptf2oIKxQmd1p9BN25jleKodTALg==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.21 - react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.21)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) - tslib: 2.6.1 - use-callback-ref: 1.3.0(@types/react@18.2.21)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.21)(react@18.2.0) - dev: false - /react-style-singleton@2.2.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} @@ -12966,10 +11732,6 @@ packages: /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - /tiny-invariant@1.3.1: - resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} - dev: false - /tiny-lru@11.0.1: resolution: {integrity: sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==} engines: {node: '>=12'} @@ -13123,10 +11885,6 @@ packages: strip-bom: 3.0.0 dev: false - /tslib@2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - dev: false - /tslib@2.6.0: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} dev: false diff --git a/prisma/migrations/20230902043321_/migration.sql b/prisma/migrations/20230902043321_/migration.sql new file mode 100644 index 0000000..be1f357 --- /dev/null +++ b/prisma/migrations/20230902043321_/migration.sql @@ -0,0 +1,15 @@ +/* + Warnings: + + - Changed the type of `conditionMatch` on the `Alert` table. No cast exists, the column would be dropped and recreated, which cannot be done if there is data, since the column is required. + - Changed the type of `filterMatch` on the `Alert` table. No cast exists, the column would be dropped and recreated, which cannot be done if there is data, since the column is required. + +*/ +-- CreateEnum +CREATE TYPE "Match" AS ENUM ('every', 'all'); + +-- AlterTable +ALTER TABLE "Alert" DROP COLUMN "conditionMatch", +ADD COLUMN "conditionMatch" "Match" NOT NULL, +DROP COLUMN "filterMatch", +ADD COLUMN "filterMatch" "Match" NOT NULL; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index a9a7382..6fe5770 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -207,6 +207,10 @@ enum AlertLevel { warning default } +enum Match { + every + all +} model Alert { id Int @id @default(autoincrement()) @@ -218,8 +222,8 @@ model Alert { actions Json conditions Json filters Json - conditionMatch String - filterMatch String + conditionMatch Match + filterMatch Match createdAt DateTime @default(now()) updatedAt DateTime @updatedAt recentlyAt DateTime? From d9d59a90a03d2d05664c4d69cc251460756cdba3 Mon Sep 17 00:00:00 2001 From: chenyueban Date: Sun, 3 Sep 2023 00:05:36 +0800 Subject: [PATCH 08/23] chore: lint --- eslint.config.js | 7 +- package.json | 26 +- packages/common/package.json | 6 +- packages/common/src/interfaces/alert.ts | 4 +- packages/common/src/interfaces/event.ts | 4 +- packages/common/src/interfaces/index.ts | 2 +- packages/common/src/interfaces/issue.ts | 4 +- packages/common/src/interfaces/project.ts | 2 +- .../{sourceMap.ts => source-map.ts} | 0 packages/common/src/lib.ts | 2 +- packages/config/package.json | 6 +- packages/config/src/index.ts | 6 +- packages/server/package.json | 14 +- packages/server/src/api/alert/alert.core.ts | 21 +- .../server/src/api/alert/alert.processor.ts | 13 +- packages/server/src/api/alert/email.ts | 2 +- packages/server/src/api/alert/webhook.ts | 4 +- packages/server/src/api/api.module.ts | 2 +- .../src/api/report/report.controller.ts | 4 +- packages/server/src/api/report/report.core.ts | 6 +- .../server/src/api/report/report.interface.ts | 24 +- .../server/src/api/report/report.module.ts | 1 + .../server/src/api/report/report.processor.ts | 11 +- .../server/src/api/report/report.service.ts | 48 +- .../source-map.constant.ts} | 0 .../source-map.controller.ts} | 8 +- .../source-map.dto.ts} | 0 .../source-map.module.ts} | 8 +- .../source-map.processor.ts} | 15 +- .../source-map.service.ts} | 6 +- .../server/src/common/constants/status.ts | 20 +- .../src/common/database/prisma.service.ts | 5 +- .../common/exceptions/forbidden.exception.ts | 2 +- .../common/filters/all-exceptions.filter.ts | 4 +- .../filters/forbidden-exception.filter.ts | 6 +- .../interceptors/transform.interceptor.ts | 4 +- packages/server/src/main.ts | 3 +- packages/server/src/tasks/tasks.service.ts | 2 +- .../[alertId]/{alertId.tsx => alert-id.tsx} | 58 +- .../alerts/[alertId]/edit/edit.tsx | 12 +- .../alerts/[alertId]/edit/page.tsx | 4 +- .../[projectId]/alerts/[alertId]/page.tsx | 4 +- .../[projectId]/alerts/create/page.tsx | 9 +- .../[projectId]/alerts/edit-alert.tsx | 721 +++++++++++++++ .../app/[locale]/[projectId]/alerts/page.tsx | 16 +- .../feedbacks/[feedbackId]/feedback-id.tsx | 13 +- .../[locale]/[projectId]/feedbacks/page.tsx | 10 +- .../[issueId]/{issueId.tsx => issue-id.tsx} | 0 .../[projectId]/issues/[issueId]/page.tsx | 14 +- .../app/[locale]/[projectId]/issues/page.tsx | 12 +- .../app/[locale]/[projectId]/metrics/page.tsx | 8 +- .../[locale]/[projectId]/mock/frame/Ajax.tsx | 8 +- .../[projectId]/mock/frame/Config.tsx | 27 +- .../[projectId]/mock/frame/CustomReport.tsx | 10 +- .../[locale]/[projectId]/mock/frame/Error.tsx | 4 +- .../[projectId]/mock/frame/HashChange.tsx | 4 +- .../[projectId]/mock/frame/History.tsx | 4 +- .../[projectId]/mock/frame/InsertRes.tsx | 8 +- .../[projectId]/mock/frame/PromiseError.tsx | 4 +- .../[locale]/[projectId]/mock/frame/index.tsx | 6 +- .../app/[locale]/[projectId]/mock/mock.tsx | 1 - .../app/[locale]/[projectId]/mock/page.tsx | 4 +- .../app/[locale]/[projectId]/profile/page.tsx | 32 +- .../[locale]/[projectId]/profile/profile.tsx | 36 +- .../releases/[releaseId]/sourceMaps/page.tsx | 4 +- .../{sourceMaps.tsx => source-maps.tsx} | 20 +- .../[locale]/[projectId]/releases/page.tsx | 19 +- .../[locale]/[projectId]/settings/page.tsx | 21 +- .../[projectId]/users/[userId]/page.tsx | 4 +- .../[userId]/{userId.tsx => user-id.tsx} | 29 +- .../app/[locale]/[projectId]/users/page.tsx | 24 +- .../web/app/[locale]/auth/signin/page.tsx | 4 +- .../web/app/[locale]/auth/signin/signin.tsx | 259 +++--- .../web/app/[locale]/create-project/action.ts | 9 +- .../create-project/create-project.tsx | 35 +- .../web/app/[locale]/create-project/page.tsx | 2 +- .../web/app/[locale]/create-project/schema.ts | 8 +- packages/web/app/[locale]/layout.tsx | 2 +- packages/web/app/[locale]/page.tsx | 2 +- packages/web/app/[locale]/providers.tsx | 8 +- .../[id]/sourceMaps/[sourceMapId]/route.ts | 2 +- packages/web/atoms/issue.ts | 2 +- packages/web/auth.ts | 4 +- packages/web/components/accordion-section.tsx | 56 +- packages/web/components/alert-list.tsx | 22 +- packages/web/components/breadcrumbs.tsx | 21 +- packages/web/components/edit-alert.tsx | 721 --------------- packages/web/components/empty-issues.tsx | 6 +- .../web/components/event-detail-action.tsx | 22 +- .../web/components/event-detail-profile.tsx | 162 ++-- .../web/components/event-detail-stack.tsx | 84 +- .../web/components/event-detail-trend.tsx | 50 +- packages/web/components/event-detail-user.tsx | 14 +- packages/web/components/events-list.tsx | 22 +- packages/web/components/feedbacks-list.tsx | 6 +- packages/web/components/footer.tsx | 2 +- packages/web/components/intl.tsx | 9 +- packages/web/components/introduce-chart.tsx | 14 +- packages/web/components/issue-detail-tabs.tsx | 7 +- .../web/components/issue-detail-title.tsx | 35 +- packages/web/components/issue-list.tsx | 59 +- .../web/components/issue-related-events.tsx | 8 +- .../web/components/issue-related-metadata.tsx | 14 +- .../web/components/issue-related-rrweb.tsx | 8 +- packages/web/components/layout.tsx | 46 +- packages/web/components/load-more-button.tsx | 4 +- packages/web/components/loading.tsx | 2 +- packages/web/components/login-button.tsx | 2 +- packages/web/components/logo.tsx | 6 +- packages/web/components/nav-container.tsx | 8 +- packages/web/components/nav-menu.tsx | 51 +- packages/web/components/pagination.tsx | 10 +- packages/web/components/project-card.tsx | 15 +- packages/web/components/project.tsx | 132 +-- packages/web/components/release-list.tsx | 39 +- packages/web/components/spinning.tsx | 2 +- packages/web/components/stack-info.tsx | 24 +- packages/web/components/title.tsx | 35 +- packages/web/components/trend-chart.tsx | 28 +- packages/web/components/ui/accordion.tsx | 22 +- packages/web/components/ui/avatar.tsx | 18 +- packages/web/components/ui/badge.tsx | 29 +- packages/web/components/ui/button.tsx | 4 +- packages/web/components/ui/card.tsx | 28 +- packages/web/components/ui/checkbox.tsx | 16 +- packages/web/components/ui/command.tsx | 45 +- packages/web/components/ui/dialog.tsx | 41 +- packages/web/components/ui/dropdown-menu.tsx | 80 +- packages/web/components/ui/form.tsx | 76 +- packages/web/components/ui/input.tsx | 34 +- packages/web/components/ui/label.tsx | 16 +- .../web/components/ui/navigation-menu.tsx | 126 +++ packages/web/components/ui/popover.tsx | 14 +- packages/web/components/ui/select.tsx | 40 +- packages/web/components/ui/separator.tsx | 42 +- packages/web/components/ui/skeleton.tsx | 4 +- packages/web/components/ui/switch.tsx | 16 +- packages/web/components/ui/table.tsx | 32 +- packages/web/components/ui/tabs.tsx | 20 +- packages/web/components/ui/toast.tsx | 42 +- packages/web/components/ui/toaster.tsx | 19 +- packages/web/components/ui/tooltip.tsx | 12 +- packages/web/components/ui/use-toast.ts | 81 +- packages/web/components/user.tsx | 14 +- packages/web/components/users-list.tsx | 6 +- packages/web/components/wrapper.tsx | 4 +- packages/web/db.ts | 16 +- packages/web/environment.d.ts | 3 +- packages/web/fs.ts | 11 +- packages/web/hooks/use-infinite.ts | 10 +- packages/web/hooks/use-invite-member.ts | 2 +- packages/web/hooks/use-query.ts | 14 +- packages/web/libs/middleware.ts | 4 +- packages/web/libs/utils.tsx | 20 +- packages/web/middleware.ts | 2 +- packages/web/next.config.js | 4 +- packages/web/package.json | 15 +- packages/web/services/alerts.ts | 6 +- .../{eventUsers.ts => event-users.ts} | 2 +- packages/web/services/events.ts | 8 +- packages/web/services/feedbacks.ts | 2 +- packages/web/services/issues.ts | 6 +- packages/web/services/metrics.ts | 4 +- packages/web/services/projects.ts | 10 +- packages/web/services/releases.ts | 6 +- packages/web/services/users.ts | 4 +- packages/web/services/views.ts | 2 +- packages/web/store/index.ts | 2 +- packages/web/store/project.ts | 4 +- pnpm-lock.yaml | 822 +++++++++--------- 170 files changed, 2824 insertions(+), 2571 deletions(-) rename packages/common/src/interfaces/{sourceMap.ts => source-map.ts} (100%) rename packages/server/src/api/{sourceMap/sourceMap.constant.ts => source-map/source-map.constant.ts} (100%) rename packages/server/src/api/{sourceMap/sourceMap.controller.ts => source-map/source-map.controller.ts} (78%) rename packages/server/src/api/{sourceMap/sourceMap.dto.ts => source-map/source-map.dto.ts} (100%) rename packages/server/src/api/{sourceMap/sourceMap.module.ts => source-map/source-map.module.ts} (53%) rename packages/server/src/api/{sourceMap/sourceMap.processor.ts => source-map/source-map.processor.ts} (81%) rename packages/server/src/api/{sourceMap/sourceMap.service.ts => source-map/source-map.service.ts} (78%) rename packages/web/app/[locale]/[projectId]/alerts/[alertId]/{alertId.tsx => alert-id.tsx} (73%) create mode 100644 packages/web/app/[locale]/[projectId]/alerts/edit-alert.tsx rename packages/web/app/[locale]/[projectId]/issues/[issueId]/{issueId.tsx => issue-id.tsx} (100%) rename packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/{sourceMaps.tsx => source-maps.tsx} (71%) rename packages/web/app/[locale]/[projectId]/users/[userId]/{userId.tsx => user-id.tsx} (79%) delete mode 100644 packages/web/components/edit-alert.tsx create mode 100644 packages/web/components/ui/navigation-menu.tsx rename packages/web/services/{eventUsers.ts => event-users.ts} (97%) diff --git a/eslint.config.js b/eslint.config.js index ab613db..53374f7 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -2,5 +2,10 @@ import { all } from '@chenyueban/eslint-config' export default [ ...all, - { rules: { 'import/no-default-export': 'off' } }, + { + rules: { + 'import/no-default-export': 'off', + '@typescript-eslint/no-extraneous-class': 'off', + }, + }, ] diff --git a/package.json b/package.json index 951505a..6ff39c3 100644 --- a/package.json +++ b/package.json @@ -1,21 +1,21 @@ { "name": "ohbug-dashboard", - "type": "module", "version": "0.11.0", - "packageManager": "pnpm@8.6.12", + "packageManager": "pnpm@8.7.1", + "type": "module", + "license": "Apache-2.0", "homepage": "https://github.com/ohbug-org/ohbug-dashboard#readme", "bugs": { "url": "https://github.com/ohbug-org/ohbug-dashboard/issues" }, - "license": "Apache-2.0", - "author": { - "name": "chenyueban", - "email": "jasonchan0527@gmail.com" - }, "repository": { "type": "git", "url": "git+https://github.com/ohbug-org/ohbug-dashboard.git" }, + "author": { + "name": "chenyueban", + "email": "jasonchan0527@gmail.com" + }, "funding": "https://github.com/sponsors/chenyueban", "sideEffects": false, "scripts": { @@ -51,16 +51,16 @@ "source-map-trace": "^0.2.6" }, "devDependencies": { - "@antfu/ni": "^0.21.6", + "@antfu/ni": "^0.21.8", "@babel/types": "^7.22.11", - "@chenyueban/eslint-config": "^3.0.5", - "@chenyueban/tsconfig": "^3.0.5", + "@chenyueban/eslint-config": "^3.0.8", + "@chenyueban/tsconfig": "^3.0.8", "@commitlint/cli": "^17.7.1", "@release-it/conventional-changelog": "^7.0.0", "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.80", + "@swc/core": "^1.3.82", "@types/js-yaml": "^4.0.5", - "@types/node": "^20.5.6", + "@types/node": "^20.5.8", "@types/ramda": "^0.29.3", "commitizen": "^4.3.0", "cross-env": "^7.0.3", @@ -73,7 +73,7 @@ "rimraf": "^5.0.1", "taze": "^0.11.2", "tsup": "^7.2.0", - "tsx": "^3.12.7", + "tsx": "^3.12.8", "typescript": "^5.2.2" }, "prisma": { diff --git a/packages/common/package.json b/packages/common/package.json index 4b751a8..ac94e29 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,9 @@ { "name": "common", "private": true, + "files": [ + "dist" + ], "main": "./dist/index.js", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", @@ -10,9 +13,6 @@ "import": "./dist/index.mjs" } }, - "files": [ - "dist" - ], "sideEffects": false, "scripts": { "prebuild": "rimraf dist", diff --git a/packages/common/src/interfaces/alert.ts b/packages/common/src/interfaces/alert.ts index c90c4d0..6528b1e 100644 --- a/packages/common/src/interfaces/alert.ts +++ b/packages/common/src/interfaces/alert.ts @@ -1,5 +1,5 @@ -import type { Alert } from '@prisma/client' -import type { AlertConditionTopic, AlertFilterTopic, FilterMatch } from '../topic' +import { type Alert } from '@prisma/client' +import { type AlertConditionTopic, type AlertFilterTopic, type FilterMatch } from '../topic' export interface Action { type: 'email' | 'webhook' diff --git a/packages/common/src/interfaces/event.ts b/packages/common/src/interfaces/event.ts index 443b445..74f1f68 100644 --- a/packages/common/src/interfaces/event.ts +++ b/packages/common/src/interfaces/event.ts @@ -1,5 +1,5 @@ -import type { OhbugEvent, OhbugUser } from '@ohbug/types' -import type { Result } from 'source-map-trace' +import { type OhbugEvent, type OhbugUser } from '@ohbug/types' +import { type Result } from 'source-map-trace' export interface OhbugEventLike extends Omit, 'user'> { id?: string diff --git a/packages/common/src/interfaces/index.ts b/packages/common/src/interfaces/index.ts index 09a5f09..3dfb37d 100644 --- a/packages/common/src/interfaces/index.ts +++ b/packages/common/src/interfaces/index.ts @@ -1,6 +1,6 @@ export * from './event' export * from './issue' export * from './project' -export * from './sourceMap' +export * from './source-map' export * from './alert' export * from './metric' diff --git a/packages/common/src/interfaces/issue.ts b/packages/common/src/interfaces/issue.ts index e336eea..a03a42c 100644 --- a/packages/common/src/interfaces/issue.ts +++ b/packages/common/src/interfaces/issue.ts @@ -1,5 +1,5 @@ -import type { OhbugReleaseStage } from '@ohbug/types' -import type { OhbugEventLike } from './event' +import { type OhbugReleaseStage } from '@ohbug/types' +import { type OhbugEventLike } from './event' export interface MetaData { type: string diff --git a/packages/common/src/interfaces/project.ts b/packages/common/src/interfaces/project.ts index a46ec2c..658779a 100644 --- a/packages/common/src/interfaces/project.ts +++ b/packages/common/src/interfaces/project.ts @@ -1,4 +1,4 @@ -import type { Project, User } from '@prisma/client' +import { type Project, type User } from '@prisma/client' export interface ProjectWithEventCount extends Project { eventCount: number diff --git a/packages/common/src/interfaces/sourceMap.ts b/packages/common/src/interfaces/source-map.ts similarity index 100% rename from packages/common/src/interfaces/sourceMap.ts rename to packages/common/src/interfaces/source-map.ts diff --git a/packages/common/src/lib.ts b/packages/common/src/lib.ts index 2b2c3c9..7f4bf26 100644 --- a/packages/common/src/lib.ts +++ b/packages/common/src/lib.ts @@ -31,7 +31,7 @@ export function formatBytes(bytes: number, decimals = 2) { const i = Math.floor(Math.log(bytes) / Math.log(k)) - return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}` + return `${Number.parseFloat((bytes / k ** i).toFixed(dm))} ${sizes[i]}` } export function md5(data: string) { diff --git a/packages/config/package.json b/packages/config/package.json index 698429b..c2125e2 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,9 @@ { "name": "config", "private": true, + "files": [ + "dist" + ], "main": "./dist/index.js", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", @@ -10,9 +13,6 @@ "import": "./dist/index.mjs" } }, - "files": [ - "dist" - ], "sideEffects": false, "scripts": { "prebuild": "rimraf dist", diff --git a/packages/config/src/index.ts b/packages/config/src/index.ts index 5198777..62f0d89 100644 --- a/packages/config/src/index.ts +++ b/packages/config/src/index.ts @@ -55,12 +55,12 @@ const YAML_CONFIG_FILENAME = 'ohbug.config.yml' const DEVELOP_YAML_CONFIG_FILENAME = 'ohbug.config.development.yml' export function getConfig(rootPath?: string): Config { - if (!global.__config__) { + if (!globalThis.__config__) { const configPath = join(rootPath ?? join(cwd(), '../../'), process.env.NODE_ENV === 'development' ? DEVELOP_YAML_CONFIG_FILENAME : YAML_CONFIG_FILENAME) const config = yaml.load(readFileSync(configPath, 'utf8')) as Config const postgresUrl = `postgresql://${config.db.postgres.user}:${config.db.postgres.password}@${config.db.postgres.host}:${config.db.postgres.port}/${config.db.postgres.database}` config.db.postgres.url = postgresUrl - global.__config__ = config + globalThis.__config__ = config } - return global.__config__ + return globalThis.__config__ } diff --git a/packages/server/package.json b/packages/server/package.json index 69f5d7b..827ec0f 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -14,18 +14,18 @@ "dependencies": { "@nestjs/axios": "^3.0.0", "@nestjs/bull": "^10.0.1", - "@nestjs/cli": "^10.1.16", - "@nestjs/common": "^10.2.1", - "@nestjs/core": "^10.2.1", + "@nestjs/cli": "^10.1.17", + "@nestjs/common": "^10.2.4", + "@nestjs/core": "^10.2.4", "@nestjs/mapped-types": "^2.0.2", - "@nestjs/platform-fastify": "^10.2.1", + "@nestjs/platform-fastify": "^10.2.4", "@nestjs/schedule": "^3.0.3", "@nestjs/schematics": "^10.0.2", - "@nestjs/swagger": "^7.1.8", + "@nestjs/swagger": "^7.1.10", "@types/bull": "^4.10.0", "@types/cron": "^2.4.0", "@types/express": "^4.17.17", - "@types/markdown-it": "^13.0.0", + "@types/markdown-it": "^13.0.1", "@types/nodemailer": "^6.4.9", "@webundsoehne/nest-fastify-file-upload": "^2.1.0", "bull": "^4.11.3", @@ -33,7 +33,7 @@ "class-validator": "^0.14.0", "common": "workspace:*", "config": "workspace:*", - "cron": "^2.4.1", + "cron": "^2.4.3", "dotenv": "^16.3.1", "fastify-multer": "^2.0.3", "markdown-it": "^13.0.1", diff --git a/packages/server/src/api/alert/alert.core.ts b/packages/server/src/api/alert/alert.core.ts index 9047d9b..c712d21 100644 --- a/packages/server/src/api/alert/alert.core.ts +++ b/packages/server/src/api/alert/alert.core.ts @@ -1,9 +1,10 @@ -import { Alert, AlertLevel, Event, Issue } from '@prisma/client' -import { AlertConditionTopic, AlertFilterTopic, ConditionOption, FilterOption, Interval } from 'common' +import { AlertConditionTopic, AlertFilterTopic } from 'common' import dayjs from 'dayjs' import markdownIt from 'markdown-it' -import { GetAlertStatusParams } from '../report/report.interface' -import { PrismaService } from '~/common' +import { type ConditionOption, type FilterOption, type Interval } from 'common' +import { type Alert, type AlertLevel, type Event, type Issue } from '@prisma/client' +import { type GetAlertStatusParams } from '../report/report.interface' +import { type PrismaService } from '~/common' function getIntervalMs(interval: Interval) { switch ((interval)) { @@ -150,7 +151,7 @@ async function judgingCondition(event: Event, issue: Issue, alert: Alert, prisma const eventIntervalCount = await getEventIntervalCount( event, interval as Interval, - parseInt(value as string), + Number.parseInt(value as string), alert, prisma, ) @@ -162,7 +163,7 @@ async function judgingCondition(event: Event, issue: Issue, alert: Alert, prisma const userIntervalCount = await getUserIntervalCount( issue, interval as Interval, - parseInt(value as string), + Number.parseInt(value as string), alert, prisma, ) @@ -188,7 +189,7 @@ async function judgingFilter( switch (filter.topic) { case AlertFilterTopic.IssueOccurrencesFilter: { const { value } = filter - if (issueEventsCount >= parseInt(value as string)) { + if (issueEventsCount >= Number.parseInt(value as string)) { result.push({ topic: filter.topic, filter: true, @@ -327,10 +328,8 @@ export async function getAlertStatus( if (alert.conditionMatch === 'every') { result = result.concat(items.filter(v => v.condition)) } - else if (alert.conditionMatch === 'all') { - if (items.every(item => item.condition === true)) { - result = result.concat(items) - } + else if (alert.conditionMatch === 'all' && items.every(item => item.condition === true)) { + result = result.concat(items) } } return result diff --git a/packages/server/src/api/alert/alert.processor.ts b/packages/server/src/api/alert/alert.processor.ts index 5f9ce04..a4596c9 100644 --- a/packages/server/src/api/alert/alert.processor.ts +++ b/packages/server/src/api/alert/alert.processor.ts @@ -1,13 +1,14 @@ import { OnQueueError, Process, Processor } from '@nestjs/bull' -import type { Job } from 'bull' -import { Action } from 'common' -import { HttpService } from '@nestjs/axios' import { getConfig } from 'config' -import { GetAlertStatusParams } from '../report/report.interface' +import { type Job } from 'bull' +import { type Action } from 'common' +import { type HttpService } from '@nestjs/axios' +import { type GetAlertStatusParams } from '../report/report.interface' import { getAlertContent, getAlertStatus } from './alert.core' import email from './email' import webhook from './webhook' -import { ForbiddenException, PrismaService } from '~/common' +import { type PrismaService } from '~/common' +import { ForbiddenException } from '~/common' @Processor('alert') export class AlertProcessor { @@ -29,7 +30,7 @@ export class AlertProcessor { })).users.length const status = await getAlertStatus(data.event, data.issue, issueEventsCount, data.alerts, this.prisma) - if (status.length) { + if (status.length > 0) { for (const item of status) { if (item.alert) { const alertContent = getAlertContent( diff --git a/packages/server/src/api/alert/email.ts b/packages/server/src/api/alert/email.ts index 60978c0..73d9b98 100644 --- a/packages/server/src/api/alert/email.ts +++ b/packages/server/src/api/alert/email.ts @@ -1,5 +1,5 @@ import nodemailer from 'nodemailer' -import SMTPTransport from 'nodemailer/lib/smtp-transport' +import type SMTPTransport from 'nodemailer/lib/smtp-transport' interface SendMail { server: SMTPTransport.Options | string diff --git a/packages/server/src/api/alert/webhook.ts b/packages/server/src/api/alert/webhook.ts index 82d58f3..7b1e1a2 100644 --- a/packages/server/src/api/alert/webhook.ts +++ b/packages/server/src/api/alert/webhook.ts @@ -1,6 +1,6 @@ -import { HttpService } from '@nestjs/axios' -import { Action } from 'common' import { lastValueFrom } from 'rxjs' +import { type HttpService } from '@nestjs/axios' +import { type Action } from 'common' interface Content { title: string diff --git a/packages/server/src/api/api.module.ts b/packages/server/src/api/api.module.ts index 2cb3663..0522b2c 100644 --- a/packages/server/src/api/api.module.ts +++ b/packages/server/src/api/api.module.ts @@ -1,7 +1,7 @@ import { Module } from '@nestjs/common' import { AlertModule } from './alert/alert.module' import { ReportModule } from './report/report.module' -import { SourceMapModule } from './sourceMap/sourceMap.module' +import { SourceMapModule } from './source-map/source-map.module' @Module({ imports: [AlertModule, ReportModule, SourceMapModule] }) export class ApiModule {} diff --git a/packages/server/src/api/report/report.controller.ts b/packages/server/src/api/report/report.controller.ts index b7a8bc9..0c22f55 100644 --- a/packages/server/src/api/report/report.controller.ts +++ b/packages/server/src/api/report/report.controller.ts @@ -1,6 +1,6 @@ import { Body, Controller, HttpCode, Ip, Post, Req } from '@nestjs/common' -import type { OhbugEvent } from '@ohbug/types' -import { ReportService } from './report.service' +import { type OhbugEvent } from '@ohbug/types' +import { type ReportService } from './report.service' /** * 用于接收上报数据 diff --git a/packages/server/src/api/report/report.core.ts b/packages/server/src/api/report/report.core.ts index fe78b13..5e9d87a 100644 --- a/packages/server/src/api/report/report.core.ts +++ b/packages/server/src/api/report/report.core.ts @@ -1,8 +1,8 @@ import { EventTypes } from '@ohbug/core' import { md5 } from 'common' -import type { - AggregationDataAndMetaData, - OhbugEventDetail, +import { + type AggregationDataAndMetaData, + type OhbugEventDetail, } from './report.interface' /** diff --git a/packages/server/src/api/report/report.interface.ts b/packages/server/src/api/report/report.interface.ts index 29f1e0e..efee001 100644 --- a/packages/server/src/api/report/report.interface.ts +++ b/packages/server/src/api/report/report.interface.ts @@ -1,16 +1,16 @@ -import type { - AjaxErrorDetail, - FetchErrorDetail, - ResourceErrorDetail, - UncaughtErrorDetail, - UnhandledrejectionErrorDetail, - UnknownErrorDetail, - WebsocketErrorDetail, +import { + type AjaxErrorDetail, + type FetchErrorDetail, + type ResourceErrorDetail, + type UncaughtErrorDetail, + type UnhandledrejectionErrorDetail, + type UnknownErrorDetail, + type WebsocketErrorDetail, } from '@ohbug/browser' -import type { ReactErrorDetail } from '@ohbug/react' -import type { VueErrorDetail } from '@ohbug/vue' -import { Alert, Event, Issue, Prisma } from '@prisma/client' -import { OhbugEventLike } from 'common' +import { type ReactErrorDetail } from '@ohbug/react' +import { type VueErrorDetail } from '@ohbug/vue' +import { type OhbugEventLike } from 'common' +import { type Alert, type Event, type Issue, type Prisma } from '@prisma/client' export type OhbugEventDetail = UncaughtErrorDetail & UnhandledrejectionErrorDetail & diff --git a/packages/server/src/api/report/report.module.ts b/packages/server/src/api/report/report.module.ts index 07b688b..cb4190d 100644 --- a/packages/server/src/api/report/report.module.ts +++ b/packages/server/src/api/report/report.module.ts @@ -4,6 +4,7 @@ import { ReportController } from './report.controller' import { ReportService } from './report.service' import { ReportProcessor } from './report.processor' import { PrismaService } from '~/common' + @Module({ imports: [ BullModule.registerQueue({ name: 'document' }), diff --git a/packages/server/src/api/report/report.processor.ts b/packages/server/src/api/report/report.processor.ts index 86aeed0..6daddc6 100644 --- a/packages/server/src/api/report/report.processor.ts +++ b/packages/server/src/api/report/report.processor.ts @@ -1,8 +1,9 @@ import { InjectQueue, OnQueueError, Process, Processor } from '@nestjs/bull' -import type { Job, Queue } from 'bull' -import type { Prisma } from '@prisma/client' -import type { CreateEventParams, CreateFeedbackParams, CreateMetricParams, CreateViewParams, GetAlertStatusParams } from './report.interface' -import { ForbiddenException, PrismaService } from '~/common' +import { type Job, type Queue } from 'bull' +import { type Prisma } from '@prisma/client' +import { type CreateEventParams, type CreateFeedbackParams, type CreateMetricParams, type CreateViewParams, type GetAlertStatusParams } from './report.interface' +import { type PrismaService } from '~/common' +import { ForbiddenException } from '~/common' @Processor('document') export class ReportProcessor { @@ -323,7 +324,7 @@ export class ReportProcessor { // 3. 拿到对应的 alert 配置 const alerts = project.alerts - if (event && event.issue && alerts.length) { + if (event && event.issue && alerts.length > 0) { const getAlertStatusParams: GetAlertStatusParams = { event, issue: event.issue, diff --git a/packages/server/src/api/report/report.service.ts b/packages/server/src/api/report/report.service.ts index 566f87b..1105418 100644 --- a/packages/server/src/api/report/report.service.ts +++ b/packages/server/src/api/report/report.service.ts @@ -1,13 +1,13 @@ import { Injectable } from '@nestjs/common' -import type { OhbugEvent } from '@ohbug/types' -import type { Queue } from 'bull' import { InjectQueue } from '@nestjs/bull' -import type { OhbugEventLike } from 'common' +import { type OhbugEventLike } from 'common' +import { type OhbugEvent } from '@ohbug/types' +import { type Queue } from 'bull' import { getMd5FromAggregationData, switchErrorDetailAndGetAggregationDataAndMetaData, } from './report.core' -import type { CreateEventParams, CreateFeedbackParams, CreateMetricParams, CreateViewParams } from './report.interface' +import { type CreateEventParams, type CreateFeedbackParams, type CreateMetricParams, type CreateViewParams } from './report.interface' import { ForbiddenException } from '~/common' @Injectable() @@ -15,25 +15,45 @@ export class ReportService { constructor(@InjectQueue('document') private documentQueue: Queue) {} filterEvent(event: OhbugEvent): OhbugEvent { - if (!('apiKey' in event && typeof event.apiKey === 'string')) { throw new Error(`不合法的 Event 数据 收到 event.apiKey 为 ${event.apiKey}`) } + if (!('apiKey' in event && typeof event.apiKey === 'string')) { + throw new Error(`不合法的 Event 数据 收到 event.apiKey 为 ${event.apiKey}`) + } - if ('appVersion' in event && typeof event.appVersion !== 'string') { throw new Error(`不合法的 Event 数据 收到 event.appVersion 为 ${event.appVersion}`) } + if ('appVersion' in event && typeof event.appVersion !== 'string') { + throw new Error(`不合法的 Event 数据 收到 event.appVersion 为 ${event.appVersion}`) + } - if ('appType' in event && typeof event.appType !== 'string') { throw new Error(`不合法的 Event 数据 收到 event.appType 为 ${event.appType}`) } + if ('appType' in event && typeof event.appType !== 'string') { + throw new Error(`不合法的 Event 数据 收到 event.appType 为 ${event.appType}`) + } - if ('releaseStage' in event && typeof event.releaseStage !== 'string') { throw new Error(`不合法的 Event 数据 收到 event.releaseStage 为 ${event.releaseStage}`) } + if ('releaseStage' in event && typeof event.releaseStage !== 'string') { + throw new Error(`不合法的 Event 数据 收到 event.releaseStage 为 ${event.releaseStage}`) + } - if (!('timestamp' in event && typeof event.timestamp === 'string')) { throw new Error(`不合法的 Event 数据 收到 event.timestamp 为 ${event.timestamp}`) } + if (!('timestamp' in event && typeof event.timestamp === 'string')) { + throw new Error(`不合法的 Event 数据 收到 event.timestamp 为 ${event.timestamp}`) + } - if ('category' in event && typeof event.category !== 'string') { throw new Error(`不合法的 Event 数据 收到 event.category 为 ${event.category}`) } + if ('category' in event && typeof event.category !== 'string') { + throw new Error(`不合法的 Event 数据 收到 event.category 为 ${event.category}`) + } - if (!('type' in event && typeof event.type === 'string')) { throw new Error(`不合法的 Event 数据 收到 event.type 为 ${event.type}`) } + if (!('type' in event && typeof event.type === 'string')) { + throw new Error(`不合法的 Event 数据 收到 event.type 为 ${event.type}`) + } - if (!('sdk' in event && event.sdk instanceof Object)) { throw new Error(`不合法的 Event 数据 收到 event.sdk 为 ${event.sdk}`) } + if (!('sdk' in event && event.sdk instanceof Object)) { + throw new Error(`不合法的 Event 数据 收到 event.sdk 为 ${event.sdk}`) + } - if (!('detail' in event)) { throw new Error('不合法的 Event 数据 缺少 event.detail') } + if (!('detail' in event)) { + throw new Error('不合法的 Event 数据 缺少 event.detail') + } - if (!('device' in event)) { throw new Error('不合法的 Event 数据 缺少 event.device') } + if (!('device' in event)) { + throw new Error('不合法的 Event 数据 缺少 event.device') + } return event } diff --git a/packages/server/src/api/sourceMap/sourceMap.constant.ts b/packages/server/src/api/source-map/source-map.constant.ts similarity index 100% rename from packages/server/src/api/sourceMap/sourceMap.constant.ts rename to packages/server/src/api/source-map/source-map.constant.ts diff --git a/packages/server/src/api/sourceMap/sourceMap.controller.ts b/packages/server/src/api/source-map/source-map.controller.ts similarity index 78% rename from packages/server/src/api/sourceMap/sourceMap.controller.ts rename to packages/server/src/api/source-map/source-map.controller.ts index be2479f..1ddafc7 100644 --- a/packages/server/src/api/sourceMap/sourceMap.controller.ts +++ b/packages/server/src/api/source-map/source-map.controller.ts @@ -6,10 +6,10 @@ import { UseInterceptors, } from '@nestjs/common' import { FileInterceptor } from '@webundsoehne/nest-fastify-file-upload' -import { ReceiveSourceMapFile } from 'common' -import { SourceMapService } from './sourceMap.service' -import { ReceiveSourceMapDto } from './sourceMap.dto' -import { UPLOAD_DEST } from './sourceMap.constant' +import { type ReceiveSourceMapFile } from 'common' +import { UPLOAD_DEST } from './source-map.constant' +import { type SourceMapService } from './source-map.service' +import { type ReceiveSourceMapDto } from './source-map.dto' /** * 用于接受上报 SourceMap,经过处理后入库 diff --git a/packages/server/src/api/sourceMap/sourceMap.dto.ts b/packages/server/src/api/source-map/source-map.dto.ts similarity index 100% rename from packages/server/src/api/sourceMap/sourceMap.dto.ts rename to packages/server/src/api/source-map/source-map.dto.ts diff --git a/packages/server/src/api/sourceMap/sourceMap.module.ts b/packages/server/src/api/source-map/source-map.module.ts similarity index 53% rename from packages/server/src/api/sourceMap/sourceMap.module.ts rename to packages/server/src/api/source-map/source-map.module.ts index fae47ce..58bd670 100644 --- a/packages/server/src/api/sourceMap/sourceMap.module.ts +++ b/packages/server/src/api/source-map/source-map.module.ts @@ -1,12 +1,12 @@ import { Module } from '@nestjs/common' import { BullModule } from '@nestjs/bull' -import { SourceMapController } from './sourceMap.controller' -import { SourceMapService } from './sourceMap.service' -import { SourceMapProcessor } from './sourceMap.processor' +import { SourceMapController } from './source-map.controller' +import { SourceMapService } from './source-map.service' +import { SourceMapProcessor } from './source-map.processor' import { PrismaService } from '~/common' @Module({ - imports: [BullModule.registerQueue({ name: 'sourceMap' })], + imports: [BullModule.registerQueue({ name: 'source-map' })], controllers: [SourceMapController], providers: [SourceMapService, PrismaService, SourceMapProcessor], }) diff --git a/packages/server/src/api/sourceMap/sourceMap.processor.ts b/packages/server/src/api/source-map/source-map.processor.ts similarity index 81% rename from packages/server/src/api/sourceMap/sourceMap.processor.ts rename to packages/server/src/api/source-map/source-map.processor.ts index f6a8444..84c3b3f 100644 --- a/packages/server/src/api/sourceMap/sourceMap.processor.ts +++ b/packages/server/src/api/source-map/source-map.processor.ts @@ -1,12 +1,13 @@ import { unlink } from 'node:fs/promises' import { Process, Processor } from '@nestjs/bull' -import type { Job } from 'bull' -import type { Prisma, Project, Release } from '@prisma/client' -import { ReceiveSourceMapFile, SourceMapData } from 'common' import { nanoid } from 'nanoid' -import { maxSourceMap } from '../sourceMap/sourceMap.constant' -import { ReceiveSourceMapDto } from '../sourceMap/sourceMap.dto' -import { ForbiddenException, PrismaService } from '~/common' +import { type Job } from 'bull' +import { type Prisma, type Project, type Release } from '@prisma/client' +import { type ReceiveSourceMapFile, type SourceMapData } from 'common' +import { maxSourceMap } from '../source-map/source-map.constant' +import { type ReceiveSourceMapDto } from '../source-map/source-map.dto' +import { type PrismaService } from '~/common' +import { ForbiddenException } from '~/common' @Processor('sourceMap') export class SourceMapProcessor { @@ -50,7 +51,7 @@ export class SourceMapProcessor { id: nanoid(), } // 没有 release - if (!project.releases.length) return this.createRelease([sourceMap], data.body, project) + if (project.releases.length === 0) return this.createRelease([sourceMap], data.body, project) const { appVersion } = data.body || {} // 看是否达到上限 diff --git a/packages/server/src/api/sourceMap/sourceMap.service.ts b/packages/server/src/api/source-map/source-map.service.ts similarity index 78% rename from packages/server/src/api/sourceMap/sourceMap.service.ts rename to packages/server/src/api/source-map/source-map.service.ts index 8e97c11..6637232 100644 --- a/packages/server/src/api/sourceMap/sourceMap.service.ts +++ b/packages/server/src/api/source-map/source-map.service.ts @@ -1,8 +1,8 @@ import { Injectable } from '@nestjs/common' -import { ReceiveSourceMapFile } from 'common' import { InjectQueue } from '@nestjs/bull' -import { Queue } from 'bull' -import { ReceiveSourceMapDto } from './sourceMap.dto' +import { type Queue } from 'bull' +import { type ReceiveSourceMapFile } from 'common' +import { type ReceiveSourceMapDto } from './source-map.dto' @Injectable() export class SourceMapService { diff --git a/packages/server/src/common/constants/status.ts b/packages/server/src/common/constants/status.ts index f3a31e2..e13b135 100644 --- a/packages/server/src/common/constants/status.ts +++ b/packages/server/src/common/constants/status.ts @@ -1,14 +1,14 @@ export default { - "4001000": "preprocessing event failed", - "4001001": "event an error occurred during aggregation", - "4001002": "event an error occurred during task scheduling", - "4001003": "failed to create event", - "4001004": "failed to create metrics", - "4001005": "failed to create feedback", - "4001006": "failed to create pageView", - "4001007": "failed to create userView", + 4001000: 'preprocessing event failed', + 4001001: 'event an error occurred during aggregation', + 4001002: 'event an error occurred during task scheduling', + 4001003: 'failed to create event', + 4001004: 'failed to create metrics', + 4001005: 'failed to create feedback', + 4001006: 'failed to create pageView', + 4001007: 'failed to create userView', - "4001100": "alert task execution failed", + 4001100: 'alert task execution failed', - "4001200": "sourceMap file upload failed" + 4001200: 'sourceMap file upload failed', } diff --git a/packages/server/src/common/database/prisma.service.ts b/packages/server/src/common/database/prisma.service.ts index 73c19f5..fb3412b 100644 --- a/packages/server/src/common/database/prisma.service.ts +++ b/packages/server/src/common/database/prisma.service.ts @@ -1,5 +1,6 @@ -import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common' +import { Injectable } from '@nestjs/common' import { PrismaClient } from '@prisma/client' +import { type INestApplication, type OnModuleInit } from '@nestjs/common' @Injectable() export class PrismaService extends PrismaClient implements OnModuleInit { @@ -8,7 +9,7 @@ export class PrismaService extends PrismaClient implements OnModuleInit { } async enableShutdownHooks(app: INestApplication) { - process.on('beforeExit', async() => { + process.on('beforeExit', async () => { await app.close() }) } diff --git a/packages/server/src/common/exceptions/forbidden.exception.ts b/packages/server/src/common/exceptions/forbidden.exception.ts index 176e048..7d12606 100644 --- a/packages/server/src/common/exceptions/forbidden.exception.ts +++ b/packages/server/src/common/exceptions/forbidden.exception.ts @@ -1,5 +1,5 @@ import { HttpException, Logger } from '@nestjs/common' -import { ErrorShowType } from 'common' +import { type ErrorShowType } from 'common' import { status } from '../constants' export class ForbiddenException extends HttpException { diff --git a/packages/server/src/common/filters/all-exceptions.filter.ts b/packages/server/src/common/filters/all-exceptions.filter.ts index 6d7b1c9..c539302 100644 --- a/packages/server/src/common/filters/all-exceptions.filter.ts +++ b/packages/server/src/common/filters/all-exceptions.filter.ts @@ -1,7 +1,7 @@ import { Catch, HttpException, HttpStatus, Logger } from '@nestjs/common' -import type { ArgumentsHost } from '@nestjs/common' import { BaseExceptionFilter } from '@nestjs/core' -import type { ResponseStructure } from 'common' +import { type ResponseStructure } from 'common' +import { type ArgumentsHost } from '@nestjs/common' @Catch() export class AllExceptionsFilter extends BaseExceptionFilter { diff --git a/packages/server/src/common/filters/forbidden-exception.filter.ts b/packages/server/src/common/filters/forbidden-exception.filter.ts index 10e6dd6..7bce8de 100644 --- a/packages/server/src/common/filters/forbidden-exception.filter.ts +++ b/packages/server/src/common/filters/forbidden-exception.filter.ts @@ -1,7 +1,7 @@ import { Catch, HttpException, HttpStatus, Logger } from '@nestjs/common' -import type { ArgumentsHost, ExceptionFilter } from '@nestjs/common' -import type { ResponseStructure } from 'common' -import { ForbiddenException } from '../exceptions' +import { type ArgumentsHost, type ExceptionFilter } from '@nestjs/common' +import { type ResponseStructure } from 'common' +import { type ForbiddenException } from '../exceptions' @Catch(HttpException) export class ForbiddenExceptionFilter implements ExceptionFilter { diff --git a/packages/server/src/common/interceptors/transform.interceptor.ts b/packages/server/src/common/interceptors/transform.interceptor.ts index 352fdb1..4729a04 100644 --- a/packages/server/src/common/interceptors/transform.interceptor.ts +++ b/packages/server/src/common/interceptors/transform.interceptor.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common' -import type { CallHandler, NestInterceptor } from '@nestjs/common' import { map } from 'rxjs/operators' -import type { Observable } from 'rxjs' +import { type Observable } from 'rxjs' +import { type CallHandler, type NestInterceptor } from '@nestjs/common' interface Response { data: T diff --git a/packages/server/src/main.ts b/packages/server/src/main.ts index 6efea8d..664d4a5 100644 --- a/packages/server/src/main.ts +++ b/packages/server/src/main.ts @@ -3,10 +3,10 @@ import { cwd } from 'node:process' import { Logger, LoggerErrorInterceptor } from 'nestjs-pino' import { ValidationPipe } from '@nestjs/common' import { NestFactory } from '@nestjs/core' -import type { NestFastifyApplication } from '@nestjs/platform-fastify' import { FastifyAdapter } from '@nestjs/platform-fastify' import { contentParser } from 'fastify-multer' import dotenv from 'dotenv' +import { type NestFastifyApplication } from '@nestjs/platform-fastify' import { AppModule } from './app.module' import { AllExceptionsFilter, @@ -41,6 +41,7 @@ async function bootstrap() { } bootstrap() + // eslint-disable-next-line unicorn/prefer-top-level-await .catch((error) => { console.error(error) process.exit(1) diff --git a/packages/server/src/tasks/tasks.service.ts b/packages/server/src/tasks/tasks.service.ts index 8019b3f..56db3dd 100644 --- a/packages/server/src/tasks/tasks.service.ts +++ b/packages/server/src/tasks/tasks.service.ts @@ -2,7 +2,7 @@ import { Injectable, Logger } from '@nestjs/common' import { Cron, CronExpression } from '@nestjs/schedule' import { getConfig } from 'config' import dayjs from 'dayjs' -import { PrismaService } from '~/common' +import { type PrismaService } from '~/common' @Injectable() export class TasksService { diff --git a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alertId.tsx b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alert-id.tsx similarity index 73% rename from packages/web/app/[locale]/[projectId]/alerts/[alertId]/alertId.tsx rename to packages/web/app/[locale]/[projectId]/alerts/[alertId]/alert-id.tsx index 87018ae..10fd8af 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alertId.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alert-id.tsx @@ -5,13 +5,13 @@ import { useMemo } from 'react' import { type Action, type ConditionOption, type FilterOption } from 'common' import dayjs from 'dayjs' import { type Alert, type AlertEvent, type Event, type Issue } from '@prisma/client' +import { ConditionOptions, FilterOptions } from '../edit-alert' import { type AlertEventTrend } from '~/services/alerts' import Wrapper from '~/components/wrapper' import AccordionSection from '~/components/accordion-section' import Title from '~/components/title' import useCurrentProject from '~/hooks/use-current-project' import EventsList from '~/components/events-list' -import { ConditionOptions, FilterOptions } from '~/components/edit-alert' import TrendChart from '~/components/trend-chart' import { Button } from '~/components/ui/button' import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' @@ -31,37 +31,45 @@ export default function AlertId({ alert, alertEvents, alertEventTrends }: Props) const events = useMemo(() => alertEvents.map(item => item.event), [alertEvents]) return ( -
+
<Button variant="outline">Edit Alert</Button> </Link> - ) + ) } > {alert.name}
- - + + { - alert.recentlyAt && ( - - - {dayjs(alert.recentlyAt).fromNow()} - - - {dayjs(alert.recentlyAt).format('YYYY-MM-DD HH:mm:ss')} - - - ) + alert.recentlyAt + ? ( + + + {dayjs(alert.recentlyAt).fromNow()} + + + {dayjs(alert.recentlyAt).format('YYYY-MM-DD HH:mm:ss')} + + + ) + : null }
-
- +
+ WHEN an event is captured by Ohbug and {alert.conditionMatch} of the following happens @@ -79,8 +87,11 @@ export default function AlertId({ alert, alertEvents, alertEventTrends }: Props) }
-
- +
+ IF {alert.filterMatch} of these filters match @@ -98,8 +109,11 @@ export default function AlertId({ alert, alertEvents, alertEventTrends }: Props) }
-
- +
+ THEN {alert.filterMatch} of these filters match @@ -116,7 +130,7 @@ export default function AlertId({ alert, alertEvents, alertEventTrends }: Props) }) }
-
+
{alert.level} interval: {alert.interval}
diff --git a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/edit.tsx b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/edit.tsx index 689d315..4334a4b 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/edit.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/edit.tsx @@ -1,12 +1,14 @@ 'use client' import { useCallback } from 'react' -import type { OmitAlert } from 'common' import { useRouter } from 'next-intl/client' import { useSearchParams } from 'next/navigation' +import { type OmitAlert } from 'common' +import { type z } from 'zod' +import EditAlert from '../../edit-alert' +import { type formSchema } from '../../edit-alert' import Title from '~/components/title' import Wrapper from '~/components/wrapper' -import EditAlert from '~/components/edit-alert' import { serviceUpdateAlert } from '~/services/alerts' import { useToast } from '~/components/ui/use-toast' @@ -18,9 +20,9 @@ export default function Edit({ alert }: Props) { const router = useRouter() const searchParams = useSearchParams() const alertId = searchParams.get('alertId') - const {toast} = useToast() - const onSubmit = useCallback((value: OmitAlert) => { - serviceUpdateAlert(parseInt(alertId as string), value) + const { toast } = useToast() + const onSubmit = useCallback((value: z.infer) => { + serviceUpdateAlert(Number.parseInt(alertId as string), value) .then(() => { toast({ title: 'Alert Edited!', diff --git a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/page.tsx b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/page.tsx index 0aa7291..ed06ae3 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/page.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/page.tsx @@ -1,9 +1,9 @@ -import type { OmitAlert } from 'common' +import { type OmitAlert } from 'common' import Edit from './edit' import { serviceGetAlert } from '~/services/alerts' export default async function EditPage({ params }: { params: { alertId: string } }) { - const alertId = parseInt(params.alertId) + const alertId = Number.parseInt(params.alertId) const alert = (await serviceGetAlert({ id: alertId })) as unknown as OmitAlert return ( diff --git a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/page.tsx b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/page.tsx index 0c5729f..85f2dc6 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/page.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/page.tsx @@ -1,8 +1,8 @@ -import AlertId from './alertId' +import AlertId from './alert-id' import { serviceGetAlert, serviceGetAlertEventTrends, serviceGetAlertEvents } from '~/services/alerts' export default async function AlertIdPage({ params }: { params: { alertId: string } }) { - const alertId = parseInt(params.alertId, 10) + const alertId = Number.parseInt(params.alertId, 10) const alert = await serviceGetAlert({ id: alertId }) const alertEvents = await serviceGetAlertEvents(alertId) const alertEventTrends = await serviceGetAlertEventTrends({ id: alertId, type: '14d' }) diff --git a/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx b/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx index 5c71374..aea5f3d 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx @@ -1,13 +1,14 @@ 'use client' import { useCallback } from 'react' -import type { OmitAlert } from 'common' import { useRouter } from 'next-intl/client' import { useTranslations } from 'next-intl' +import { type z } from 'zod' +import EditAlert from '../edit-alert' +import { type formSchema } from '../edit-alert' import Title from '~/components/title' import Wrapper from '~/components/wrapper' import useCurrentProject from '~/hooks/use-current-project' -import EditAlert from '~/components/edit-alert' import { serviceCreateAlert } from '~/services/alerts' import { useToast } from '~/components/ui/use-toast' @@ -15,8 +16,8 @@ export default function CreatePage() { const t = useTranslations('Alerts') const router = useRouter() const { projectId } = useCurrentProject() - const {toast} = useToast() - const onSubmit = useCallback((value: OmitAlert) => { + const { toast } = useToast() + const onSubmit = useCallback((value: z.infer) => { serviceCreateAlert({ ...value, projectId: projectId! }) .then(() => { toast({ diff --git a/packages/web/app/[locale]/[projectId]/alerts/edit-alert.tsx b/packages/web/app/[locale]/[projectId]/alerts/edit-alert.tsx new file mode 100644 index 0000000..eeaa8d3 --- /dev/null +++ b/packages/web/app/[locale]/[projectId]/alerts/edit-alert.tsx @@ -0,0 +1,721 @@ +'use client' + +import { useCallback } from 'react' +import { useFieldArray, useForm } from 'react-hook-form' +import { AlertConditionTopic, AlertFilterTopic } from 'common' +import { type Action, type ConditionOption, type FilterMatch, type FilterOption, type Interval, type OmitAlert } from 'common' +import { useTranslations } from 'next-intl' +import { zodResolver } from '@hookform/resolvers/zod' +import { z } from 'zod' +import { Badge } from '~/components/ui/badge' +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '~/components/ui/form' +import { Input } from '~/components/ui/input' +import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '~/components/ui/select' +import { Button } from '~/components/ui/button' +import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from '~/components/ui/dropdown-menu' +import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' + +export const ActionOptions = ['email', 'webhook'] as const +export const ConditionOptions: ConditionOption[] = [ + { + topic: AlertConditionTopic.EventCapturedCondition, + name: 'An event is captured', + }, + { + topic: AlertConditionTopic.FirstSeenEventCondition, + name: 'A new issue is created', + }, + { + topic: AlertConditionTopic.EventFrequencyCondition, + name: 'The issue is seen more than {value} times in {interval}', + }, + { + topic: AlertConditionTopic.UserFrequencyCondition, + name: 'The issue is seen by more than {value} users in {interval}', + }, +] +export const IntervalOptions: Interval[] = ['1m', '5m', '15m', '1h', '1d', '7d', '30d'] +export const FilterOptions: FilterOption[] = [ + { + topic: AlertFilterTopic.IssueOccurrencesFilter, + name: 'The issue has happened at least {value} times', + }, + { + topic: AlertFilterTopic.EventAttributeFilter, + name: 'The event\'s {attribute} value {match} {value}', + }, + { + topic: AlertFilterTopic.LatestReleaseFilter, + name: 'The event is from the latest release', + }, +] +export const FilterAttributeOptions = ['message', 'type'] as const +export const FilterMatchOptions: FilterMatch[] = ['contains', 'starts with', 'ends with', 'equals', 'does not contain', 'does not start with', 'does not end with', 'does not equal'] +export const AlertLevel = { + serious: 'serious', + warning: 'warning', + default: 'default', +} + +export const formSchema = z.object({ + projectId: z.number(), + name: z.string(), + releaseStage: z.string(), + recentlyAt: z.date().nullable(), + level: z.enum(['serious', 'warning', 'default']), + interval: z.string(), + enabled: z.boolean(), + filterMatch: z.enum(['all', 'every']), + conditionMatch: z.enum(['all', 'every']), + actions: z.array(z.object({ + type: z.enum(['email', 'webhook']), + uri: z.string(), + at: z.string().optional(), + webhookType: z.enum(['dingtalk', 'wechatWork', 'others']).optional(), + })), + conditions: z.array(z.object({ + topic: z.nativeEnum(AlertConditionTopic), + name: z.string(), + value: z.union([z.string(), z.number()]).optional(), + interval: z.string().optional(), + })), + filters: z.array(z.object({ + topic: z.nativeEnum(AlertFilterTopic), + name: z.string(), + value: z.union([z.string(), z.number()]).optional(), + attribute: z.string().optional(), + match: z.enum(['contains', 'starts with', 'ends with', 'equals', 'does not contain', 'does not start with', 'does not end with', 'does not equal']).optional(), + })), +}) + +interface Props { + alert?: OmitAlert + onSubmit: (value: z.infer) => void +} + +export default function EditAlert({ alert, onSubmit }: Props) { + const t = useTranslations('Alerts') + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: alert + ? { + name: alert.name, + // releaseStage: alert.releaseStage, + level: alert.level, + interval: alert.interval, + enabled: alert.enabled, + actions: alert.actions, + conditions: alert.conditions, + filters: alert.filters, + conditionMatch: alert.conditionMatch, + filterMatch: alert.filterMatch, + } + : { + filterMatch: 'all', + conditionMatch: 'all', + }, + }) + const { fields: actionsFields, append: actionsAppend, remove: actionsRemove } = useFieldArray({ control: form.control, name: 'actions' }) + const { fields: conditionsFields, append: conditionsAppend, remove: conditionsRemove } = useFieldArray({ control: form.control, name: 'conditions' }) + const { fields: filtersFields, append: filtersAppend, remove: filtersRemove } = useFieldArray({ control: form.control, name: 'filters' }) + const handleAddAction = useCallback((type: Action['type']) => { + if (type) { + actionsAppend({ type, uri: '' }) + } + }, []) + const handleAddCondition = useCallback((topic: ConditionOption['topic']) => { + if (topic) { + conditionsAppend({ topic, name: ConditionOptions.find(v => v.topic === topic)!.name }) + } + }, []) + const handleAddFilter = useCallback((topic: FilterOption['topic']) => { + if (topic) { + filtersAppend({ topic, name: FilterOptions.find(v => v.topic === topic)!.name }) + } + }, []) + + return ( +
+ +
+ + {t('alertConditions')} +
+ + WHEN + +
+ an event is captured by Ohbug and + ( + + + + + + + )} + /> + of the following happens +
+
+ { + conditionsFields.map((item, index) => { + return ( +
+
+ { + item.topic === AlertConditionTopic.EventCapturedCondition && ( + <>An event is captured + ) + } + { + item.topic === AlertConditionTopic.FirstSeenEventCondition && ( + <>A new issue is created + ) + } + { + item.topic === AlertConditionTopic.EventFrequencyCondition && ( + <> + The issue is seen more than + ( + + + + + + + )} + /> + times in + ( + + + + + + + )} + /> + + ) + } + { + item.topic === AlertConditionTopic.UserFrequencyCondition && ( + <> + The issue is seen by more than + ( + + + + + + + )} + /> + users in + ( + + + + + + + )} + /> + + ) + } +
+ +
+ ) + }) + } +
+ + + + + + + { + ConditionOptions.map(item => ( + { + handleAddCondition(item.topic) + }} + > + {item.name} + + )) + } + + + +
+ +
+ + {t('alertFilters')} +
+ + IF + +
+ ( + + + + + + + )} + /> + of these filters match +
+
+ { + filtersFields.map((item, index) => { + return ( +
+ +
+ { + item.topic === AlertFilterTopic.IssueOccurrencesFilter && ( + <> + The issue has happened at least + ( + + + + + + + )} + /> + times + + ) + } + { + item.topic === AlertFilterTopic.EventAttributeFilter && ( + <> + The events + ( + + + + + + + )} + /> + value + ( + + + + + + + )} + /> + + ) + } + { + item.topic === AlertFilterTopic.LatestReleaseFilter && ( + <>The event is from the latest release + ) + } +
+ +
+ ) + }) + } +
+ + + + + + + { + FilterOptions.map(item => ( + { + handleAddFilter(item.topic) + }} + > + {item.name} + + )) + } + + + +
+ + ( + + {t('alertInterval')} + + + + + + )} + /> + + ( + + {t('alertLevel')} + + + + + + )} + /> + +
+ + {t('alertActions')} + { + actionsFields.map((item, index) => { + return ( +
+
+ { + item.type === 'webhook' && ( + ( + + + + + + + )} + /> + ) + } + { + item.type === 'webhook' && ( + + + ( + + + + + + + )} + /> + + + {t('webhookTooltip')} + + + ) + } + ( + + + + + + + )} + /> + +
+
+ ) + }) + } +
+ + + + + + + { + ActionOptions.map(item => ( + { + handleAddAction(item) + }} + > + {item} + + )) + } + + + +
+ + ( + + {t('alertName')} + + + + + + )} + /> + +
+ +
+ + + ) +} diff --git a/packages/web/app/[locale]/[projectId]/alerts/page.tsx b/packages/web/app/[locale]/[projectId]/alerts/page.tsx index 554a6ab..b98df02 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/page.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/page.tsx @@ -35,7 +35,7 @@ const Alerts = () => { - ) + ) } > Alerts @@ -43,12 +43,14 @@ const Alerts = () => { { - data && ( - - ) + data + ? ( + + ) + : null } feedback.detail as any ?? {}, [feedback]) return ( -
+
@@ -24,10 +23,10 @@ export default function FeedbackId({ feedback }: Props) { -
- {detail.feedback &&
Feedback:
{detail.feedback}
} - {detail.selector &&
Selector:
{detail.selector}
} - {detail.outerHTML &&
outerHTML:
{detail.outerHTML}
} +
+ {detail.feedback ?
Feedback:
{detail.feedback}
: null} + {detail.selector ?
Selector:
{detail.selector}
: null} + {detail.outerHTML ?
outerHTML:
{detail.outerHTML}
: null}
diff --git a/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx b/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx index 3ff7fc2..2905052 100644 --- a/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx +++ b/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx @@ -2,6 +2,7 @@ import { useTranslations } from 'next-intl' import { type EventUser, type Feedback } from '@prisma/client' +import Link from 'next/link' import FeedbacksList from '~/components/feedbacks-list' import Title from '~/components/title' @@ -9,7 +10,6 @@ import Wrapper from '~/components/wrapper' import useCurrentProject from '~/hooks/use-current-project' import { useInfinite } from '~/hooks/use-infinite' import { serviceGetFeedbacks } from '~/services/feedbacks' -import Link from 'next/link' import { Button } from '~/components/ui/button' export default function FeedbacksPage() { @@ -38,10 +38,10 @@ export default function FeedbacksPage() { - ) + ) } > Feedbacks @@ -50,11 +50,11 @@ export default function FeedbacksPage() { - ) + ) } > Metrics - + { const xmlhttp = new XMLHttpRequest() - xmlhttp.onreadystatechange = function() {} + xmlhttp.addEventListener('readystatechange', () => {}) xmlhttp.open('GET', 'https://api.nancode.cn/http/error?status=511', true) xmlhttp.send(JSON.stringify({ a: 123 })) } const handleTimeOut = () => { const xmlhttp = new XMLHttpRequest() - xmlhttp.onreadystatechange = function() {} + xmlhttp.addEventListener('readystatechange', () => {}) xmlhttp.timeout = 3000 xmlhttp.open('GET', 'https://api.nancode.cn/http/delay?delay=5', true) xmlhttp.send(JSON.stringify({ a: 1, b: 'i am data' })) @@ -27,7 +27,7 @@ function Ajax() { -
+
diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx index d40808b..d3ed82c 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx @@ -2,11 +2,10 @@ import { useCallback } from 'react' import { useForm } from 'react-hook-form' -import { useTranslations } from 'next-intl' -import type { OhbugConfig } from '@ohbug/types' import { useLocalStorage } from 'react-use' -import { zodResolver } from "@hookform/resolvers/zod" -import { z } from "zod" +import { zodResolver } from '@hookform/resolvers/zod' +import { z } from 'zod' +import { type OhbugConfig } from '@ohbug/types' import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '~/components/ui/form' import { Input } from '~/components/ui/input' import { Button } from '~/components/ui/button' @@ -25,7 +24,6 @@ interface Props { } function Config({ defaultConfig }: Props) { - const ct = useTranslations('Common') const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: defaultConfig, @@ -51,7 +49,10 @@ function Config({ defaultConfig }: Props) { apiKey - + @@ -107,7 +108,10 @@ function Config({ defaultConfig }: Props) { releaseStage - + @@ -121,7 +125,10 @@ function Config({ defaultConfig }: Props) { maxActions - + @@ -129,16 +136,16 @@ function Config({ defaultConfig }: Props) { /> diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx index 347a047..d9e5464 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx @@ -1,7 +1,7 @@ 'use client' import { client } from './index' -import {Card, CardContent, CardHeader, CardTitle} from '~/components/ui/card' +import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' import { Button } from '~/components/ui/button' function CustomReport() { @@ -9,13 +9,13 @@ function CustomReport() { try { throw new Error('test custom report') } - catch (e: any) { + catch (error: any) { const event = client.createEvent({ category: 'error', type: 'message', detail: { - message: e.message, - stack: e.stack, + message: error.message, + stack: error.stack, }, }) client?.notify(event) @@ -29,7 +29,7 @@ function CustomReport() { -
+
diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx index 5442c89..0684d23 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx @@ -1,6 +1,6 @@ 'use client' -import {Card, CardContent, CardHeader, CardTitle} from '~/components/ui/card' +import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' import { Button } from '~/components/ui/button' function randomString(length: number) { @@ -35,7 +35,7 @@ function Error() { -
+
diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx index 54fabad..a2fc697 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx @@ -1,7 +1,7 @@ 'use client' import Link from 'next/link' -import {Card, CardContent, CardHeader, CardTitle} from '~/components/ui/card' +import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' function HashChange() { return ( @@ -12,7 +12,7 @@ function HashChange() { -
+
hash:/#app
diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx index 92ac472..3fd6e12 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx @@ -1,6 +1,6 @@ 'use client' -import {Card, CardContent, CardHeader, CardTitle} from '~/components/ui/card' +import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' import { Button } from '~/components/ui/button' function History() { @@ -19,7 +19,7 @@ function History() { -
+
diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx index 5d1d7fe..0d92f16 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx @@ -1,15 +1,15 @@ 'use client' -import {Card, CardContent, CardHeader, CardTitle} from '~/components/ui/card' +import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' import { Button } from '~/components/ui/button' export default function InsertRes() { const handle = () => { - const head = document.getElementsByTagName('head')[0] + const head = document.querySelectorAll('head')[0] const script = document.createElement('script') script.type = 'text/javascript' script.src = 'https://unpkg.com/lodash@4.17.21/lodash.js' - head.appendChild(script) + head.append(script) } return ( @@ -20,7 +20,7 @@ export default function InsertRes() { -
+
diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx index 160c02f..2239c6c 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx @@ -1,6 +1,6 @@ 'use client' -import {Card, CardContent, CardHeader, CardTitle} from '~/components/ui/card' +import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' import { Button } from '~/components/ui/button' function PromiseError() { @@ -15,7 +15,7 @@ function PromiseError() { -
+
diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/index.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/index.tsx index a19d322..f2d207a 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/index.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/index.tsx @@ -1,9 +1,9 @@ import { useMemo, useRef } from 'react' import Ohbug from '@ohbug/browser' import OhbugExtensionFeedback from '@ohbug/extension-feedback' -import type { OhbugClient, OhbugConfig } from '@ohbug/types' import { useLocalStorage, useMount } from 'react-use' -import type { Project } from '@prisma/client' +import { type OhbugClient, type OhbugConfig } from '@ohbug/types' +import { type Project } from '@prisma/client' import Config from './Config' import Ajax from './Ajax' import Error from './Error' @@ -49,7 +49,7 @@ export default function Frame({ project }: Props) { return (
-
+
diff --git a/packages/web/app/[locale]/[projectId]/mock/mock.tsx b/packages/web/app/[locale]/[projectId]/mock/mock.tsx index 7f15de1..d838df9 100644 --- a/packages/web/app/[locale]/[projectId]/mock/mock.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/mock.tsx @@ -4,7 +4,6 @@ import { type Project } from '@prisma/client' import Frame from './frame' import Wrapper from '~/components/wrapper' - interface Props { project: Project } diff --git a/packages/web/app/[locale]/[projectId]/mock/page.tsx b/packages/web/app/[locale]/[projectId]/mock/page.tsx index 6bf2a2e..c2d8b52 100644 --- a/packages/web/app/[locale]/[projectId]/mock/page.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/page.tsx @@ -1,11 +1,11 @@ -import type { Metadata } from 'next' +import { type Metadata } from 'next' import Mock from './mock' import { serviceGetProject } from '~/services/projects' export const metadata: Metadata = { title: 'Mock | Ohbug' } export default async function MockPage({ params }: { params: { projectId: string } }) { - const project = await serviceGetProject(parseInt(params.projectId)) + const project = await serviceGetProject(Number.parseInt(params.projectId)) return ( ) diff --git a/packages/web/app/[locale]/[projectId]/profile/page.tsx b/packages/web/app/[locale]/[projectId]/profile/page.tsx index cb71eac..caf1e21 100644 --- a/packages/web/app/[locale]/[projectId]/profile/page.tsx +++ b/packages/web/app/[locale]/[projectId]/profile/page.tsx @@ -5,7 +5,7 @@ import { serviceGetPVPathGroupResult, serviceGetPVReferrerGroupResult, serviceGe import { getPrisma } from '~/db' export default async function ProfilePage({ params }: { params: { projectId: string } }) { - const projectId = parseInt(params.projectId) || (await getPrisma().project.findFirst())?.id + const projectId = Number.parseInt(params.projectId) || (await getPrisma().project.findFirst())?.id if (!projectId) return null const project = await serviceGetProject(projectId) @@ -22,23 +22,19 @@ export default async function ProfilePage({ params }: { params: { projectId: str return ( ) } diff --git a/packages/web/app/[locale]/[projectId]/profile/profile.tsx b/packages/web/app/[locale]/[projectId]/profile/profile.tsx index 17f6f5f..65371f0 100644 --- a/packages/web/app/[locale]/[projectId]/profile/profile.tsx +++ b/packages/web/app/[locale]/[projectId]/profile/profile.tsx @@ -61,13 +61,13 @@ const View = ({ views }: Props) => { return ( <> - + {t('pv')}(PV) - +
{views?.pageView}
@@ -82,7 +82,7 @@ const View = ({ views }: Props) => { {t('uv')}(UV) - +
{views?.userView}
@@ -97,7 +97,7 @@ const View = ({ views }: Props) => { {t('activeUser')} - +
{views?.activeUser ?? 0}
@@ -172,8 +172,8 @@ const Trend = ({ trends }: Props) => {
Event Trends
setChartType(e ? '24h' : '14d')} /> @@ -210,25 +210,23 @@ const Events = ({ project }: Props) => { ) return ( -
- - - - -
+ + ) } @@ -243,7 +241,7 @@ export default function Profile({ project, trends, views }: Props) { Setting - ) + ) } > {project?.name} diff --git a/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/page.tsx b/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/page.tsx index 5b133e9..1d3dbd9 100644 --- a/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/page.tsx +++ b/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/page.tsx @@ -1,9 +1,9 @@ -import SourceMaps from './sourceMaps' +import SourceMaps from './source-maps' import { serviceGetRelease } from '~/services/releases' export default async function SourceMapsPage({ params }: { params: { releaseId: string } }) { const releaseId = params.releaseId - const release = await serviceGetRelease({ id: parseInt(releaseId) }) + const release = await serviceGetRelease({ id: Number.parseInt(releaseId) }) return ( diff --git a/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/sourceMaps.tsx b/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/source-maps.tsx similarity index 71% rename from packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/sourceMaps.tsx rename to packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/source-maps.tsx index 9723370..a796469 100644 --- a/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/sourceMaps.tsx +++ b/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/source-maps.tsx @@ -3,10 +3,10 @@ import { useMemo } from 'react' import { formatBytes } from 'common' import { type Release } from '@prisma/client' +import Link from 'next/link' import Wrapper from '~/components/wrapper' import Title from '~/components/title' -import {Card, CardContent, CardHeader, CardTitle} from '~/components/ui/card' -import Link from 'next/link' +import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' import { Button } from '~/components/ui/button' interface Props { @@ -17,7 +17,7 @@ export default function SourceMaps({ release }: Props) { const sourceMaps = useMemo(() => (release.sourceMaps as Array) ?? [], [release.sourceMaps]) return ( -
+
SourceMaps @@ -31,21 +31,21 @@ export default function SourceMaps({ release }: Props) { { sourceMaps?.map(sourceMap => (
-
- {sourceMap.originalname} - {sourceMap.mimetype} +
+ {sourceMap.originalname} + {sourceMap.mimetype}
-
- {formatBytes(sourceMap.size)} +
+ {formatBytes(sourceMap.size)}
diff --git a/packages/web/app/[locale]/[projectId]/releases/page.tsx b/packages/web/app/[locale]/[projectId]/releases/page.tsx index 164fd62..284b358 100644 --- a/packages/web/app/[locale]/[projectId]/releases/page.tsx +++ b/packages/web/app/[locale]/[projectId]/releases/page.tsx @@ -1,13 +1,12 @@ 'use client' -import type { Release } from '@prisma/client' import { useTranslations } from 'next-intl' import Link from 'next/link' +import { type Release } from '@prisma/client' import LoadingMoreButton from '~/components/load-more-button' import ReleaseList from '~/components/release-list' import Title from '~/components/title' import { Button } from '~/components/ui/button' -import { Card } from '~/components/ui/card' import Wrapper from '~/components/wrapper' import useCurrentProject from '~/hooks/use-current-project' import { useInfinite } from '~/hooks/use-infinite' @@ -40,7 +39,7 @@ export default function ReleasesPage() { {ct('integration')} - ) + ) } > Releases @@ -48,12 +47,14 @@ export default function ReleasesPage() { { - data && ( - - ) + data + ? ( + + ) + : null } { watch, handleSubmit, } = useForm({ defaultValues: { name: project?.name } }) - const {toast} = useToast() + const { toast } = useToast() const name = watch('name') const onSubmit = useCallback((value: Project) => { serviceUpdateProject(project!.id, value) @@ -58,9 +58,9 @@ const SettingsProjectName = ({ project }: CommonProps) => { @@ -71,7 +71,7 @@ const SettingsProjectName = ({ project }: CommonProps) => { {name} - `. + `.
) } @@ -124,11 +124,11 @@ const SettingsProjectUsers = ({ project }: CommonProps) => { <> - + {t('projectMembers')} @@ -141,7 +141,10 @@ const SettingsProjectUsers = ({ project }: CommonProps) => {
- + {member.name ?? ''}
@@ -170,7 +173,7 @@ const SettingsProjectUsers = ({ project }: CommonProps) => { {inviteUrl}
- + diff --git a/packages/web/app/[locale]/[projectId]/users/[userId]/page.tsx b/packages/web/app/[locale]/[projectId]/users/[userId]/page.tsx index 75f86d8..006f34d 100644 --- a/packages/web/app/[locale]/[projectId]/users/[userId]/page.tsx +++ b/packages/web/app/[locale]/[projectId]/users/[userId]/page.tsx @@ -1,5 +1,5 @@ -import UserId from './userId' -import { serviceGetEventUser } from '~/services/eventUsers' +import UserId from './user-id' +import { serviceGetEventUser } from '~/services/event-users' export default async function UserIdPage({ params }: { params: { userId: string } }) { const userId = params.userId diff --git a/packages/web/app/[locale]/[projectId]/users/[userId]/userId.tsx b/packages/web/app/[locale]/[projectId]/users/[userId]/user-id.tsx similarity index 79% rename from packages/web/app/[locale]/[projectId]/users/[userId]/userId.tsx rename to packages/web/app/[locale]/[projectId]/users/[userId]/user-id.tsx index c670a13..b9ddb7c 100644 --- a/packages/web/app/[locale]/[projectId]/users/[userId]/userId.tsx +++ b/packages/web/app/[locale]/[projectId]/users/[userId]/user-id.tsx @@ -7,18 +7,17 @@ import { type Event, type EventUser, type Feedback } from '@prisma/client' import EventsList from '~/components/events-list' import Wrapper from '~/components/wrapper' -import AccordionSection from '~/components/ui/accordion-section' +import AccordionSection from '~/components/accordion-section' import useCurrentProject from '~/hooks/use-current-project' import Title from '~/components/title' import { Table, TableBody, - TableCaption, TableCell, TableHead, TableHeader, TableRow, -} from "~/components/ui/table" +} from '~/components/ui/table' const DynamicReactJson = dynamic(import('react-json-view'), { ssr: false }) @@ -33,22 +32,20 @@ export default function UserId({ user }: Props) { const { projectId } = useCurrentProject() return ( -
+
<DynamicReactJson - src={ - { - ipAddress: user.ipAddress, - uuid: user.uuid, - email: user.email, - name: user.name, - metadata: user.metadata, - createdAt: user.createdAt, - updatedAt: user.updatedAt, - } - } + src={{ + ipAddress: user.ipAddress, + uuid: user.uuid, + email: user.email, + name: user.name, + metadata: user.metadata, + createdAt: user.createdAt, + updatedAt: user.updatedAt, + }} /> @@ -59,7 +56,7 @@ export default function UserId({ user }: Props) { - +
feedback diff --git a/packages/web/app/[locale]/[projectId]/users/page.tsx b/packages/web/app/[locale]/[projectId]/users/page.tsx index 37ef562..a9340b8 100644 --- a/packages/web/app/[locale]/[projectId]/users/page.tsx +++ b/packages/web/app/[locale]/[projectId]/users/page.tsx @@ -9,7 +9,7 @@ import Title from '~/components/title' import Wrapper from '~/components/wrapper' import useCurrentProject from '~/hooks/use-current-project' import { useInfinite } from '~/hooks/use-infinite' -import { serviceGetEventUsers } from '~/services/eventUsers' +import { serviceGetEventUsers } from '~/services/event-users' import { Input } from '~/components/ui/input' import { Button } from '~/components/ui/button' @@ -26,15 +26,15 @@ export default function UsersPage() { [query], ) const { data: eventUsers, isLoading, size, setSize, isReachingEnd } = useInfinite<( - EventUser & { - _count: { - issues: number - metrics: number - feedbacks: number - pageViews: number - userViews: number - } - })>( + EventUser & { + _count: { + issues: number + metrics: number + feedbacks: number + pageViews: number + userViews: number + } + })>( index => serviceGetEventUsers({ page: index + 1, projectId: projectId!, @@ -55,9 +55,9 @@ export default function UsersPage() {
setQuery(e.target.value)} placeholder="Search for users ipAddress uuid email name and metadata" value={query} + onChange={e => setQuery(e.target.value)} />
@@ -68,8 +68,8 @@ export default function UsersPage() { - - - +
+ + ( + + Email + + + + + + )} + /> + + + + ) } @@ -101,10 +101,10 @@ const GithubSignIn: FC - {providers.github.name} + {providers.github.name} ) } @@ -119,14 +119,12 @@ const AccountSignIn: FC<{ const ct = useTranslations('Common') const router = useRouter() const formSchema = z.object({ - email: z.string().email().min(2, { - message: ct('mustBeTheCorrectEmailAddress'), - }), - password: z.string().max(24).min(8) + email: z.string().email().min(2, { message: ct('mustBeTheCorrectEmailAddress') }), + password: z.string().max(24).min(8), }) - const form = useForm>({resolver: zodResolver(formSchema)}) - const {toast} = useToast() - const onSubmit = useCallback(async(data: AccountSignInData) => { + const form = useForm>({ resolver: zodResolver(formSchema) }) + const { toast } = useToast() + const onSubmit = useCallback(async (data: AccountSignInData) => { const res = await onSignIn('credentials', { redirect: false, ...data }) if (res?.ok) { router.push('/') @@ -141,48 +139,58 @@ const AccountSignIn: FC<{ }, []) return ( -
- - ( - - Email - - - - - - )} - /> - ( - - Password - - - - - - )} - /> - - - +
+ + ( + + Email + + + + + + )} + /> + ( + + Password + + + + + + )} + /> + + + ) } export default function SignIn({ providers, inviter }: Props) { const router = useRouter() - useMount(async() => { + useMount(async () => { const user = (await getSession())?.user if (user) { router.push('/') @@ -193,16 +201,19 @@ export default function SignIn({ providers, inviter }: Props) { if (inviter && inviter.project && inviter.user) { const name = inviter.user.name || inviter.user.email || '' return ( -

+

- + {name} {`${inviter.user.name || inviter.user.email || ''} invited you to join the ${inviter.project.name}`}

) } - return

Sign in to Ohbug

+ return

Sign in to Ohbug

}, [inviter]) const [, setInviteValue] = useAtom(inviteAtom) useEffect(() => { @@ -215,8 +226,8 @@ export default function SignIn({ providers, inviter }: Props) { }, [router]) return ( -
- +
+ {title} @@ -229,22 +240,26 @@ export default function SignIn({ providers, inviter }: Props) { <>
{ - (providers.github) && ( - - ) + (providers.github) + ? ( + + ) + : null } { - (providers.email) && ( - - ) + (providers.email) + ? ( + + ) + : null }
@@ -260,32 +275,36 @@ export default function SignIn({ providers, inviter }: Props) { ) } - { + { step === 1 && ( <> { - (providers.credentials) && ( - - ) + (providers.credentials) + ? ( + + ) + : null } ) } - { - providers.email && ( - <> - { + { + providers.email + ? ( + <> + { (step === 2) && ( ) } - - ) + + ) + : null } diff --git a/packages/web/app/[locale]/create-project/action.ts b/packages/web/app/[locale]/create-project/action.ts index 65cd47c..61a6d23 100644 --- a/packages/web/app/[locale]/create-project/action.ts +++ b/packages/web/app/[locale]/create-project/action.ts @@ -1,16 +1,15 @@ 'use server' -import { redirect } from 'next/navigation' import crypto from 'node:crypto' +import { redirect } from 'next/navigation' import { NextResponse } from 'next/server' -import { z } from 'zod' import { getConfig } from 'config' +import { type z } from 'zod' +import schema from './schema' import { getAuth } from '~/libs/middleware' import { serviceCreateProject } from '~/services/projects' -import schema from './schema' export default async function submit(formData: z.infer) { - console.log('formData: ', formData); const secret = getConfig().secret?.apikey ?? 'ohbug-apikey-s3cret' const auth = await getAuth() if (!auth) { @@ -20,7 +19,7 @@ export default async function submit(formData: z.infer) { const apiKey = crypto .createHmac('sha256', secret) - .update(JSON.stringify(formData) + new Date().getTime()) + .update(JSON.stringify(formData) + Date.now()) .digest('hex') await serviceCreateProject({ ...project, apiKey }, auth.user) diff --git a/packages/web/app/[locale]/create-project/create-project.tsx b/packages/web/app/[locale]/create-project/create-project.tsx index 6324c90..477362b 100644 --- a/packages/web/app/[locale]/create-project/create-project.tsx +++ b/packages/web/app/[locale]/create-project/create-project.tsx @@ -2,8 +2,10 @@ import { useTranslations } from 'next-intl' import { useForm } from 'react-hook-form' -import { zodResolver } from "@hookform/resolvers/zod" -import * as z from "zod" +import { zodResolver } from '@hookform/resolvers/zod' +import schema from './schema' +import submit from './action' +import type * as z from 'zod' import { Form, FormControl, @@ -11,13 +13,11 @@ import { FormItem, FormLabel, FormMessage, -} from "~/components/ui/form" +} from '~/components/ui/form' import { Input } from '~/components/ui/input' import { Button } from '~/components/ui/button' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '~/components/ui/select' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '~/components/ui/card' -import schema from './schema' -import submit from './action' const projectTypes = [ { @@ -32,8 +32,8 @@ export default function CreateProject() { const form = useForm>({ resolver: zodResolver(schema), defaultValues: { - name: "", - type: "javascript" + name: '', + type: 'javascript', }, }) async function onSubmit(values: z.infer) { @@ -41,15 +41,18 @@ export default function CreateProject() { } return ( -
- +
+ {t('createProject')} {t('createProjectDescription')}
- + {t('projectName')} - + @@ -69,7 +75,10 @@ export default function CreateProject() { render={({ field }) => ( {t('projectType')} - @@ -93,7 +102,7 @@ export default function CreateProject() { )} /> - + @@ -94,11 +98,9 @@ export default function AlertList({ alerts, mutate }: Props) { { - onDelete(alert.id) - } - } + onClick={() => { + onDelete(alert.id) + }} > Delete diff --git a/packages/web/components/breadcrumbs.tsx b/packages/web/components/breadcrumbs.tsx index 110bb25..97a61d1 100644 --- a/packages/web/components/breadcrumbs.tsx +++ b/packages/web/components/breadcrumbs.tsx @@ -13,11 +13,21 @@ export default function Breadcrumbs() {
- + - {breadcrumbs.slice(0, -1).length > 0 ? : null} + {breadcrumbs.slice(0, -1).length > 0 + ? ( + + ) + : null}
{ @@ -32,9 +42,12 @@ export default function Breadcrumbs() { )) } - + -
{breadcrumbs.at(-1)?.breadcrumb}
+
{breadcrumbs.at(-1)?.breadcrumb}
) diff --git a/packages/web/components/edit-alert.tsx b/packages/web/components/edit-alert.tsx deleted file mode 100644 index 8094430..0000000 --- a/packages/web/components/edit-alert.tsx +++ /dev/null @@ -1,721 +0,0 @@ -'use client' - -import { useCallback } from 'react' -import { useFieldArray, useForm } from 'react-hook-form' -import { AlertConditionTopic, AlertFilterTopic } from 'common' -import { type Action, type ConditionOption, type FilterMatch, type FilterOption, type Interval, type OmitAlert } from 'common' -import { useTranslations } from 'next-intl' -import { zodResolver } from "@hookform/resolvers/zod" -import {z} from "zod" -import { Badge } from '~/components/ui/badge' -import { - Form, - FormControl, - FormDescription, - FormField, - FormItem, - FormLabel, - FormMessage, -} from "~/components/ui/form" -import { Input } from "~/components/ui/input" -import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '~/components/ui/select' -import { Button } from '~/components/ui/button' -import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from '~/components/ui/dropdown-menu' -import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' - -export const ActionOptions = ['email', 'webhook'] -export const ConditionOptions: ConditionOption[] = [ - { - topic: AlertConditionTopic.EventCapturedCondition, - name: 'An event is captured', - }, - { - topic: AlertConditionTopic.FirstSeenEventCondition, - name: 'A new issue is created', - }, - { - topic: AlertConditionTopic.EventFrequencyCondition, - name: 'The issue is seen more than {value} times in {interval}', - }, - { - topic: AlertConditionTopic.UserFrequencyCondition, - name: 'The issue is seen by more than {value} users in {interval}', - }, -] -export const IntervalOptions: Interval[] = ['1m', '5m', '15m', '1h', '1d', '7d', '30d'] -export const FilterOptions: FilterOption[] = [ - { - topic: AlertFilterTopic.IssueOccurrencesFilter, - name: 'The issue has happened at least {value} times', - }, - { - topic: AlertFilterTopic.EventAttributeFilter, - name: 'The event\'s {attribute} value {match} {value}', - }, - { - topic: AlertFilterTopic.LatestReleaseFilter, - name: 'The event is from the latest release', - }, -] -export const FilterAttributeOptions: string[] = ['message', 'type'] -export const FilterMatchOptions: FilterMatch[] = ['contains', 'starts with', 'ends with', 'equals', 'does not contain', 'does not start with', 'does not end with', 'does not equal'] -export const AlertLevel = { - serious: 'serious', - warning: 'warning', - default: 'default', -} - -const formSchema = z.object({ - level: z.enum(['serious', 'warning', 'default']), - interval: z.string(), - enabled:z.boolean(), - filterMatch: z.string(), - conditionMatch: z.enum(['all', 'every']), - actions: z.array(z.object({ - type: z.enum(['email', 'webhook']), - uri: z.string(), - at: z.string().optional(), - webhookType: z.enum(['dingtalk', 'wechatWork', 'others']).optional(), - })), - conditions: z.array(z.object({ - topic: z.string(), - name: z.string(), - value: z.union([z.string(), z.number()]).optional(), - interval: z.string().optional(), - })), - filters: z.array(z.object({ - topic: z.string(), - name: z.string(), - value: z.union([z.string(), z.number()]).optional(), - attribute: z.string().optional(), - match: z.enum(['contains', 'starts with', 'ends with', 'equals', 'does not contain', 'does not start with', 'does not end with', 'does not equal']).optional(), - })) -}) - -interface Props { - alert?: OmitAlert - onSubmit: (value: z.infer) => void -} - -export default function EditAlert({ alert, onSubmit }: Props) { - const ct = useTranslations('Common') - const t = useTranslations('Alerts') - const form = useForm>({ - resolver: zodResolver(formSchema), - defaultValues: alert - ? { - // name: alert.name, - // releaseStage: alert.releaseStage, - level: alert.level, - interval: alert.interval, - enabled: alert.enabled, - actions: alert.actions, - conditions: alert.conditions, - filters: alert.filters, - conditionMatch: alert.conditionMatch, - filterMatch: alert.filterMatch, - } - : { - filterMatch: 'all', - conditionMatch: 'all', - }, - }) - const { fields: actionsFields, append: actionsAppend, remove: actionsRemove } = useFieldArray({ control: form.control, name: 'actions' }) - const { fields: conditionsFields, append: conditionsAppend, remove: conditionsRemove } = useFieldArray({ control: form.control, name: 'conditions' }) - const { fields: filtersFields, append: filtersAppend, remove: filtersRemove } = useFieldArray({ control: form.control, name: 'filters' }) - const handleAddAction = useCallback((type: Action['type']) => { - if (type) { - actionsAppend({ type, uri: '' }) - } - }, []) - const handleAddCondition = useCallback((topic: ConditionOption['topic']) => { - if (topic) { - conditionsAppend({ topic, name: ConditionOptions.find(v => v.topic === topic)!.name }) - } - }, []) - const handleAddFilter = useCallback((topic: FilterOption['topic']) => { - if (topic) { - filtersAppend({ topic, name: FilterOptions.find(v => v.topic === topic)!.name }) - } - }, []) - - return ( - -
- - {t('alertConditions')} -
- - WHEN - -
- an event is captured by Ohbug and - ( - - - - - - - )} - /> - of the following happens -
-
- { - conditionsFields.map((item, index) => { - return ( -
-
- { - item.topic === AlertConditionTopic.EventCapturedCondition && ( - <>An event is captured - ) - } - { - item.topic === AlertConditionTopic.FirstSeenEventCondition && ( - <>A new issue is created - ) - } - { - item.topic === AlertConditionTopic.EventFrequencyCondition && ( - <> - The issue is seen more than - ( - - - - - - - )} - /> - times in - ( - - - - - - - )} - /> - - ) - } - { - item.topic === AlertConditionTopic.UserFrequencyCondition && ( - <> - The issue is seen by more than - ( - - - - - - - )} - /> - users in - ( - - - - - - - )} - /> - - ) - } -
- -
- ) - }) - } -
- - - - - - - { - ConditionOptions.map(item => ( - { - handleAddCondition(item.topic) - }} - > - {item.name} - - )) - } - - - -
- -
- - {t('alertFilters')} -
- - IF - -
- ( - - - - - - - )} - /> - of these filters match -
-
- { - filtersFields.map((item, index) => { - return ( -
- -
- { - item.topic === AlertFilterTopic.IssueOccurrencesFilter && ( - <> - The issue has happened at least - ( - - - - - - - )} - /> - times - - ) - } - { - item.topic === AlertFilterTopic.EventAttributeFilter && ( - <> - The events - ( - - - - - - - )} - /> - value - ( - - - - - - - )} - /> - - ) - } - { - item.topic === AlertFilterTopic.LatestReleaseFilter && ( - <>The event is from the latest release - ) - } -
- -
- ) - }) - } -
- - - - - - - { - FilterOptions.map(item => ( - { - handleAddFilter(item.topic) - }} - > - {item.name} - - )) - } - - - -
- - ( - - {t('alertInterval')} - - - - - - )} - /> - - ( - - {t('alertLevel')} - - - - - - )} - /> - - ( - - {t('alertLevel')} - - - - - - )} - /> - -
- - {t('alertActions')} - { - actionsFields.map((item, index) => { - return ( -
-
- { - item.type === 'webhook' && ( - - ) - } - { - item.type === 'webhook' && ( - - - - - - {t('webhookTooltip')} - - - ) - } - - -
- - {errors.actions && errors.actions?.[index]?.uri?.message} - -
- ) - }) - } -
- - - - - - - { - ActionOptions.map(item => ( - { - handleAddAction(item) - }} - > - {item} - - )) - } - - - -
- - - {t('alertName')} - - - {errors.name && errors.name.message} - - - -
- -
- - ) -} diff --git a/packages/web/components/empty-issues.tsx b/packages/web/components/empty-issues.tsx index 5276ffd..d99cfb9 100644 --- a/packages/web/components/empty-issues.tsx +++ b/packages/web/components/empty-issues.tsx @@ -1,8 +1,8 @@ 'use client' -import type { FC } from 'react' import Link from 'next/link' import { useTranslations } from 'next-intl' +import { type FC } from 'react' import useCurrentProject from '~/hooks/use-current-project' import { Button } from '~/components/ui/button' @@ -10,7 +10,7 @@ const EmptyIssues: FC = () => { const { projectId } = useCurrentProject() const t = useTranslations('Issues.Empty') return ( -
+
{t('gettingStarted')}
{ target="_blank" >
diff --git a/packages/web/components/event-detail-action.tsx b/packages/web/components/event-detail-action.tsx index c10482f..de25064 100644 --- a/packages/web/components/event-detail-action.tsx +++ b/packages/web/components/event-detail-action.tsx @@ -6,7 +6,7 @@ import { type OhbugEventLike } from 'common' import { type FC } from 'react' import { type OhbugAction } from '@ohbug/types' import Wrapper from './wrapper' -import AccordionSection from './card-section' +import AccordionSection from './accordion-section' import { getMessageAndIconByActionType } from '~/libs/utils' import { Badge } from '~/components/ui/badge' import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' @@ -27,39 +27,39 @@ const EventDetailActions: FC = ({ event }) => { return ( -
+
{ actions.map((action, index) => { const { message, icon, color } = getMessageAndIconByActionType(action) return (
-
- +
+ {icon} - {action.type} + {action.type} { index !== actions.length - 1 && ( -
+
) }
-
- {message} +
+ {message}
- + {dayjs(action.timestamp).format('HH:mm:ss')} - {dayjs(action.timestamp).format('YYYY-MM-DD HH:mm:ss')} + {dayjs(action.timestamp).format('YYYY-MM-DD HH:mm:ss')}
diff --git a/packages/web/components/event-detail-profile.tsx b/packages/web/components/event-detail-profile.tsx index 4602488..9f2bdbb 100644 --- a/packages/web/components/event-detail-profile.tsx +++ b/packages/web/components/event-detail-profile.tsx @@ -5,10 +5,10 @@ import { useMemo } from 'react' import { useTranslations } from 'next-intl' import { type FC } from 'react' import { type OhbugEventLike } from 'common' +import Link from 'next/link' import Wrapper from './wrapper' -import AccordionSection from './card-section' +import AccordionSection from './accordion-section' import { getDeviceInfo } from '~/libs/utils' -import Link from 'next/link' import { Badge } from '~/components/ui/badge' import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' @@ -26,7 +26,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'time', title: `${t('profileTimestamp')}: ${dayjs(event.createdAt).format('YYYY-MM-DD HH:mm:ss')}`, value: dayjs(event.createdAt).fromNow(), - icon: , + icon: , }) } if (event?.user?.uuid) { @@ -34,7 +34,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'uuid', title: `UUID: ${event?.user?.uuid}`, value: event?.user?.uuid, - icon: , + icon: , }) } if (event?.user?.ipAddress) { @@ -42,7 +42,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'ip', title: `IP: ${event?.user?.ipAddress}`, value: event?.user?.ipAddress, - icon: , + icon: , }) } if (event?.device?.title) { @@ -50,7 +50,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'title', title: `${t('profileTitle')}: ${event.device.title}`, value: event.device.title, - icon: , + icon: , }) } if (event?.device?.url) { @@ -58,7 +58,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'url', title: `URL: ${event.device.url}`, value: event.device.url, - icon: , + icon: , }) } if (event?.device?.language) { @@ -66,7 +66,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'language', title: `${t('profileLanguage')}: ${event.device.language}`, value: event.device.language, - icon: , + icon: , }) } if (event?.appVersion) { @@ -74,7 +74,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'appVersion', title: `AppVersion: ${event.appVersion}`, value: event.appVersion, - icon: , + icon: , }) } if (event?.appType) { @@ -82,7 +82,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'appType', title: `AppType: ${event.appType}`, value: event.appType, - icon: , + icon: , }) } if (event?.releaseStage) { @@ -90,7 +90,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'releaseStage', title: `ReleaseStage: ${event.releaseStage}`, value: event.releaseStage, - icon: , + icon: , }) } if ( @@ -102,7 +102,7 @@ const EventDetailProfile: FC = ({ event }) => { key: 'dpi', title: `${t('profileDPI')}: ${event?.device?.device?.screenWidth} × ${event?.device?.device?.screenHeight} @ ${event?.device?.device?.pixelRatio}x`, value: `${event?.device?.device?.screenWidth} × ${event?.device?.device?.screenHeight} @ ${event?.device?.device?.pixelRatio}x`, - icon: , + icon: , }) } @@ -110,10 +110,10 @@ const EventDetailProfile: FC = ({ event }) => { }, [event]) return ( -
- - + = ({ event }) => { > JSON Raw {event.id} - ) + ) : null } - title="Event Environment" - > -
- {/* 浏览器 */} - { - deviceInfo?.browser && ( -
-
{deviceInfo?.browser?.name ?? ''}
-
{deviceInfo?.browser?.version ?? ''}
-
- ) + > +
+ {/* 浏览器 */} + { + deviceInfo?.browser + ? ( +
+
{deviceInfo?.browser?.name ?? ''}
+
{deviceInfo?.browser?.version ?? ''}
+
+ ) + : null } - {/* 系统 */} - { - deviceInfo?.os && ( -
-
{deviceInfo?.os?.name ?? ''}
-
{deviceInfo?.os?.version ?? ''}
-
- ) + {/* 系统 */} + { + deviceInfo?.os + ? ( +
+
{deviceInfo?.os?.name ?? ''}
+
{deviceInfo?.os?.version ?? ''}
+
+ ) + : null } - {/* App */} - { - deviceInfo?.app && ( -
-
{deviceInfo?.app ?? ''}
-
{`${deviceInfo?.version} / ${deviceInfo?.SDKVersion}`}
-
- ) + {/* App */} + { + deviceInfo?.app + ? ( +
+
{deviceInfo?.app ?? ''}
+
{`${deviceInfo?.version} / ${deviceInfo?.SDKVersion}`}
+
+ ) + : null } - {/* 品牌 */} - { - (deviceInfo?.device && deviceInfo?.device?.brand) && ( -
-
{deviceInfo?.device?.brand ?? ''}
-
{deviceInfo?.device?.model ?? ''}
-
- ) + {/* 品牌 */} + { + (deviceInfo?.device && deviceInfo?.device?.brand) + ? ( +
+
{deviceInfo?.device?.brand ?? ''}
+
{deviceInfo?.device?.model ?? ''}
+
+ ) + : null } - {/* 平台 */} - { - deviceInfo?.platform && ( -
-
{deviceInfo?.platform ?? ''}
-
{deviceInfo?.system ?? ''}
-
- ) + {/* 平台 */} + { + deviceInfo?.platform + ? ( +
+
{deviceInfo?.platform ?? ''}
+
{deviceInfo?.system ?? ''}
+
+ ) + : null } - {/* SDK */} - { - deviceInfo?.sdk && ( -
-
{deviceInfo?.sdk.platform ?? ''}
-
{deviceInfo?.sdk.version ?? ''}
-
- ) + {/* SDK */} + { + deviceInfo?.sdk + ? ( +
+
{deviceInfo?.sdk.platform ?? ''}
+
{deviceInfo?.sdk.version ?? ''}
+
+ ) + : null } -
+
-
- { +
+ { tagList.map(tag => ( - + {tag.icon} {tag.value} @@ -199,10 +210,9 @@ const EventDetailProfile: FC = ({ event }) => { )) } -
- - -
+
+ + ) } diff --git a/packages/web/components/event-detail-stack.tsx b/packages/web/components/event-detail-stack.tsx index ca78e84..db584a9 100644 --- a/packages/web/components/event-detail-stack.tsx +++ b/packages/web/components/event-detail-stack.tsx @@ -5,7 +5,7 @@ import { type OhbugEventLike } from 'common' import StackInfo from './stack-info' import Wrapper from './wrapper' -import AccordionSection from './card-section' +import AccordionSection from './accordion-section' import { renderStringOrJson } from '~/libs/utils' interface Props { @@ -14,61 +14,59 @@ interface Props { const EventDetailStack: FC = ({ event }) => { return ( -
- - - -
- ) + + + +
+ ) + : null } - collapseTitle="Code" - head={ - event.detail.message && renderStringOrJson(event.detail.message) + head={ + event.detail.message ? renderStringOrJson(event.detail.message) : null } - title="Error Stack" - > - {/* unhandledrejectionError */} - {/* uncaughtError */} -
- {typeof event.detail.stack === 'string' ? event.detail.stack : JSON.stringify(event.detail.stack)} -
- {/* resourceError */} - { - event?.detail.selector && ( -
- {renderStringOrJson(event.detail)} -
- ) + > + {/* unhandledrejectionError */} + {/* uncaughtError */} +
+          {typeof event.detail.stack === 'string' ? event.detail.stack : JSON.stringify(event.detail.stack)}
+        
+ {/* resourceError */} + { + event?.detail.selector + ? ( +
+ {renderStringOrJson(event.detail)} +
+ ) + : null } - {/* ajaxError */} - {/* fetchError */} - { + {/* ajaxError */} + {/* fetchError */} + { event?.type === 'ajaxError' && ( -
+
{renderStringOrJson(event.detail)}
) } - {/* websocketError */} - { + {/* websocketError */} + { event?.type === 'websocketError' && ( -
+
{renderStringOrJson(event.detail)}
) } - - -
+ + ) } diff --git a/packages/web/components/event-detail-trend.tsx b/packages/web/components/event-detail-trend.tsx index 24ec507..1bc6214 100644 --- a/packages/web/components/event-detail-trend.tsx +++ b/packages/web/components/event-detail-trend.tsx @@ -5,7 +5,7 @@ import { useTranslations } from 'next-intl' import { type Issue } from 'common' import TrendChart from './trend-chart' import Wrapper from './wrapper' -import AccordionSection from './card-section' +import AccordionSection from './accordion-section' import { type IssueTrend } from '~/services/issues' import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' @@ -22,10 +22,11 @@ export default function EventDetailTrend({ issue, trends }: Props) { return ( -
+
+
{ct('firstSeen')}
@@ -38,7 +39,7 @@ export default function EventDetailTrend({ issue, trends }: Props) {
-
+
{ct('lastSeen')}
@@ -52,32 +53,35 @@ export default function EventDetailTrend({ issue, trends }: Props) {
- ) + ) } - title="Event Trends" > -
+
{ - trends['14d'] && ( - - ) + trends['14d'] + ? ( + + ) + : null }
{ - trends['24h'] && ( - - ) + trends['24h'] + ? ( + + ) + : null }
diff --git a/packages/web/components/event-detail-user.tsx b/packages/web/components/event-detail-user.tsx index 95dbd7c..8ea47a1 100644 --- a/packages/web/components/event-detail-user.tsx +++ b/packages/web/components/event-detail-user.tsx @@ -5,7 +5,7 @@ import { type FC } from 'react' import { type OhbugEventLike } from 'common' import Wrapper from './wrapper' -import AccordionSection from './card-section' +import AccordionSection from './accordion-section' const DynamicReactJson = dynamic(import('react-json-view'), { ssr: false }) @@ -15,13 +15,11 @@ interface Props { const EventDetailUser: FC = ({ event }) => { return ( -
- - - - - -
+ + + + + ) } diff --git a/packages/web/components/events-list.tsx b/packages/web/components/events-list.tsx index a90d155..9bf4573 100644 --- a/packages/web/components/events-list.tsx +++ b/packages/web/components/events-list.tsx @@ -77,13 +77,13 @@ const EventsList: FC = ({ events }) => { }, []) return ( -
+
{ columns.map(column => ( {column.name} @@ -102,14 +102,16 @@ const EventsList: FC = ({ events }) => { } )) - : ( - - No results. - - ) + : ( + + + No results. + + + ) }
diff --git a/packages/web/components/feedbacks-list.tsx b/packages/web/components/feedbacks-list.tsx index aa6e090..721193e 100644 --- a/packages/web/components/feedbacks-list.tsx +++ b/packages/web/components/feedbacks-list.tsx @@ -2,11 +2,11 @@ import Link from 'next/link' import dayjs from 'dayjs' -import type { FC } from 'react' -import type { EventUser, Feedback } from '@prisma/client' +import { type FC } from 'react' +import { type EventUser, type Feedback } from '@prisma/client' import { renderStringOrJson } from '~/libs/utils' import useCurrentProject from '~/hooks/use-current-project' -import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from '~/components/ui/table' +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '~/components/ui/table' interface Props { feedbacks?: (Feedback & { user: EventUser })[] diff --git a/packages/web/components/footer.tsx b/packages/web/components/footer.tsx index 1fba31f..2ff53c5 100644 --- a/packages/web/components/footer.tsx +++ b/packages/web/components/footer.tsx @@ -1,7 +1,7 @@ 'use client' import Link from 'next/link' -import type { FC } from 'react' +import { type FC } from 'react' import Logo from './logo' import Intl from './intl' import Theme from './theme' diff --git a/packages/web/components/intl.tsx b/packages/web/components/intl.tsx index 0c1235e..744b769 100644 --- a/packages/web/components/intl.tsx +++ b/packages/web/components/intl.tsx @@ -5,6 +5,7 @@ import { usePathname } from 'next-intl/client' import { useLocale } from 'next-intl' import { useRouter } from 'next/navigation' import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '~/components/ui/select' + const options = [ { label: '中文', @@ -22,14 +23,18 @@ export default function Intl() { const [isPending, startTransition] = useTransition() const locale = useLocale() - const handleChange = useCallback(async(value: string) => { + const handleChange = useCallback(async (value: string) => { startTransition(() => { router.replace(`/${value}${pathname}`) }) }, [pathname]) return ( - diff --git a/packages/web/components/introduce-chart.tsx b/packages/web/components/introduce-chart.tsx index 35aef37..8dd57ad 100644 --- a/packages/web/components/introduce-chart.tsx +++ b/packages/web/components/introduce-chart.tsx @@ -1,6 +1,6 @@ 'use client' -import type { ReactNode } from 'react' +import { type ReactNode } from 'react' interface Props { title: string @@ -13,19 +13,19 @@ interface Props { export default function IntroduceChart({ title, value, unit, description, actions, children }: Props) { return ( -
-
-
+
+
+
{title}
-
+
{value} {unit}
-
{description}
+
{description}
{actions}
-
{children}
+
{children}
) } diff --git a/packages/web/components/issue-detail-tabs.tsx b/packages/web/components/issue-detail-tabs.tsx index e7e53c8..e2fa56a 100644 --- a/packages/web/components/issue-detail-tabs.tsx +++ b/packages/web/components/issue-detail-tabs.tsx @@ -3,11 +3,10 @@ import { useCallback, useMemo } from 'react' import { usePathname, useRouter } from 'next-intl/client' import { useSearchParams } from 'next/navigation' -import type { OhbugEventLike } from 'common' import { useTranslations } from 'next-intl' +import { type OhbugEventLike } from 'common' import useCurrentProject from '~/hooks/use-current-project' import { Tabs, TabsList, TabsTrigger } from '~/components/ui/tabs' -import Link from 'next/link' interface Props { event: OhbugEventLike @@ -37,7 +36,7 @@ export default function IssueDetailTabs({ event }: Props) { try { metadata = JSON.parse(event.metadata as unknown as string) } - catch (_) {} + catch {} if (metadata) { Object.keys(metadata).forEach((key) => { base.push({ @@ -54,7 +53,7 @@ export default function IssueDetailTabs({ event }: Props) { return value }, [list, tab]) const handleTabChange = useCallback((value: string) => { - const item = list.find(v=>v.value===value) + const item = list.find(v => v.value === value) if (item) { router.push(`${pathname}?tab=${item.tab}`) } diff --git a/packages/web/components/issue-detail-title.tsx b/packages/web/components/issue-detail-title.tsx index abf08c2..cc51e83 100644 --- a/packages/web/components/issue-detail-title.tsx +++ b/packages/web/components/issue-detail-title.tsx @@ -18,48 +18,53 @@ export default function IssueDetailTitle({ issue, event }: Props) { const metadata = useMemo(() => JSON.parse(issue.metadata) || {}, [issue]) return ( } rightNodes={ ( - <div className='flex'> - <div className='flex flex-col'> + <div className="flex"> + <div className="flex flex-col"> <div>{t('titleEvents')}</div> <div>{issue._count?.events}</div> </div> - <div className='flex flex-col'> + <div className="flex flex-col"> <div>{t('titleUsers')}</div> <div>{issue._count?.users}</div> </div> </div> - ) + ) } > <div> - <a className='line-clamp-2'> - <span className='font-semibold mr-2'> + <a className="line-clamp-2"> + <span className="font-semibold mr-2"> {issue.type} </span> { issue.releaseStage === 'mock' && ( - <Badge variant="destructive" className='mr-2'> + <Badge + className="mr-2" + variant="destructive" + > Mock </Badge> ) } - <code className='text-stone-500'> + <code className="text-stone-500"> {renderStringOrJson(metadata.filename ?? metadata.others)} </code> </a> - <div className='line-clamp-2 text-stone-500'> + <div className="line-clamp-2 text-stone-500"> { - metadata.message && ( - <code> - {renderStringOrJson(metadata.message)} - </code> - ) + metadata.message + ? ( + <code> + {renderStringOrJson(metadata.message)} + </code> + ) + : null } </div> </div> diff --git a/packages/web/components/issue-list.tsx b/packages/web/components/issue-list.tsx index d95d1b3..d721e71 100644 --- a/packages/web/components/issue-list.tsx +++ b/packages/web/components/issue-list.tsx @@ -7,7 +7,7 @@ import dayjs from 'dayjs' import { useTranslations } from 'next-intl' import { useDebounce, useSet } from 'react-use' import { useAtom } from 'jotai' -import { type Key, type ReactNode } from 'react' +import { type ReactNode } from 'react' import TrendChart from './trend-chart' import Pagination from './pagination' import Spinning from './spinning' @@ -44,11 +44,11 @@ const columns = [ ] interface Props { - empty: ReactNode; + empty: ReactNode } export default function IssueList({ empty }: Props) { - const {toast} = useToast() + const { toast } = useToast() const t = useTranslations('Issues') const ct = useTranslations('Common') const { projectId } = useCurrentProject() @@ -118,7 +118,7 @@ export default function IssueList({ empty }: Props) { variant: 'destructive', }) }) - .finally(()=>setOpen(false)) + .finally(() => setOpen(false)) }, [checkedItems]) const renderTitleCell = useCallback((columnKey: string) => { @@ -127,6 +127,7 @@ export default function IssueList({ empty }: Props) { return ( <Checkbox checked={allChecked} + className="translate-y-[2px]" onCheckedChange={(value) => { if (value) { data?.forEach(issue => checkedItemsActions.add(issue.id)) @@ -135,7 +136,6 @@ export default function IssueList({ empty }: Props) { checkedItemsActions.reset() } }} - className="translate-y-[2px]" /> ) case 'title': @@ -143,10 +143,10 @@ export default function IssueList({ empty }: Props) { <div> <div className="flex gap-2"> <Select + value={orderBy} onValueChange={ e => setOrderBy(e as SearchIssuesOrderBy) } - value={orderBy} > <SelectTrigger className="w-40"> <SelectValue /> @@ -169,10 +169,10 @@ export default function IssueList({ empty }: Props) { <i className="i-ri-more-line" /> </Button> </DropdownMenuTrigger> - <DropdownMenuContent className='w-56'> + <DropdownMenuContent className="w-56"> <DropdownMenuItem key="delete" - onClick={()=>setOpen(true)} + onClick={() => setOpen(true)} > Delete </DropdownMenuItem> @@ -185,12 +185,11 @@ export default function IssueList({ empty }: Props) { return ( <div className="flex items-center gap-2"> <Switch - id="trendsType" - disabled={!trends || !data?.length} checked={chartType === '24h'} + disabled={!trends || !data?.length} + id="trendsType" onCheckedChange={e => setChartType(e ? '24h' : '14d')} - > - </Switch> + /> <Label htmlFor="trendsType">{chartType === '24h' ? ct('24h') : ct('14d')}</Label> </div> ) @@ -214,8 +213,8 @@ export default function IssueList({ empty }: Props) { return ( <Checkbox checked={checkedItems.has(issue.id)} - onCheckedChange={(value) => checkedItemsActions[value ? 'add' : 'remove'](issue.id)} className="translate-y-[2px]" + onCheckedChange={value => checkedItemsActions[value ? 'add' : 'remove'](issue.id)} /> ) case 'title': @@ -245,9 +244,7 @@ export default function IssueList({ empty }: Props) { {/* message */} <div className="text-stone-500 line-clamp-2"> { - metadata.message && ( - <code>{renderStringOrJson(metadata.message)}</code> - ) + metadata.message ? <code>{renderStringOrJson(metadata.message)}</code> : null } </div> {/* other message (time/appType/...) */} @@ -308,12 +305,12 @@ export default function IssueList({ empty }: Props) { return ( <div className="h-full overflow-x-hidden overflow-y-auto space-y-4"> <Input - onChange={e => setQuery(e.target.value)} placeholder="Search..." value={query} + onChange={e => setQuery(e.target.value)} /> - <Table className='rounded-md border'> + <Table className="rounded-md border"> <TableCaption> { !!data?.length && ( @@ -321,8 +318,8 @@ export default function IssueList({ empty }: Props) { <Link href={`/${projectId}/mock`}>Mock Data</Link> <Pagination isReachingEnd={!!isReachingEnd} - onChange={page => setSize(page - 1)} page={size + 1} + onChange={page => setSize(page - 1)} /> </div> ) @@ -334,7 +331,7 @@ export default function IssueList({ empty }: Props) { columns.map(column => ( <TableHead key={column.key} - className='text-left' + className="text-left" > {renderTitleCell(column.key)} </TableHead> @@ -345,7 +342,7 @@ export default function IssueList({ empty }: Props) { <TableBody> { data - ? data.map(issue => ( + ? data.map(issue => ( <TableRow key={issue.id}> { columns.map(column => ( @@ -353,20 +350,18 @@ export default function IssueList({ empty }: Props) { )) } </TableRow> - )) - : ( - <TableRow> - <TableCell colSpan={columns.length}> - {isLoading ? <Spinning /> : empty} - </TableCell> - </TableRow> - ) + )) + : ( + <TableRow> + <TableCell colSpan={columns.length}> + {isLoading ? <Spinning /> : empty} + </TableCell> + </TableRow> + ) } </TableBody> </Table> - - <Dialog open={open} onOpenChange={setOpen} @@ -380,9 +375,9 @@ export default function IssueList({ empty }: Props) { <div>{t('deleteIssuesConfirm')}</div> <DialogFooter> <Button - onClick={()=>setOpen(false)} ref={cancelRef} variant="outline" + onClick={() => setOpen(false)} > Cancel </Button> diff --git a/packages/web/components/issue-related-events.tsx b/packages/web/components/issue-related-events.tsx index 5c8e837..9e9fa75 100644 --- a/packages/web/components/issue-related-events.tsx +++ b/packages/web/components/issue-related-events.tsx @@ -5,7 +5,7 @@ import { useTranslations } from 'next-intl' import { type Issue } from 'common' import EventsList from '~/components/events-list' import Wrapper from '~/components/wrapper' -import AccordionSection from '~/components/ui/accordion-section' +import AccordionSection from '~/components/accordion-section' import { useInfinite } from '~/hooks/use-infinite' import { serviceGetEventsByIssueId } from '~/services/events' import { Button } from '~/components/ui/button' @@ -14,7 +14,7 @@ interface Props { issue: Issue } -export default function IssueRelatedEvents({ issue }:Props) { +export default function IssueRelatedEvents({ issue }: Props) { const ct = useTranslations('Common') const { data: events, isLoading, size, setSize, isReachingEnd } = useInfinite<Event>( index => serviceGetEventsByIssueId({ issueId: issue.id, page: index + 1 }), @@ -29,11 +29,11 @@ export default function IssueRelatedEvents({ issue }:Props) { <AccordionSection title="Events"> <EventsList events={events} /> <Button - className='mt-6 w-full' + className="mt-6 w-full" disabled={isLoading || isReachingEnd} - onClick={() => setSize(size + 1)} size="sm" variant="outline" + onClick={() => setSize(size + 1)} > { isLoading diff --git a/packages/web/components/issue-related-metadata.tsx b/packages/web/components/issue-related-metadata.tsx index cd54edb..3cc9b1f 100644 --- a/packages/web/components/issue-related-metadata.tsx +++ b/packages/web/components/issue-related-metadata.tsx @@ -4,7 +4,7 @@ import dynamic from 'next/dynamic' import { useMemo } from 'react' import { type OhbugEventLike } from 'common' import { type FC } from 'react' -import AccordionSection from './card-section' +import AccordionSection from './accordion-section' import Wrapper from './wrapper' @@ -24,13 +24,11 @@ const IssueRelatedMetadata: FC<Props> = ({ event, tab }) => { }, [event]) return ( - <div> - <Wrapper> - <AccordionSection title="Custom Metadata"> - <DynamicReactJson src={metadata[tab]} /> - </AccordionSection> - </Wrapper> - </div> + <Wrapper> + <AccordionSection title="Custom Metadata"> + <DynamicReactJson src={metadata[tab]} /> + </AccordionSection> + </Wrapper> ) } diff --git a/packages/web/components/issue-related-rrweb.tsx b/packages/web/components/issue-related-rrweb.tsx index 9ffad4a..12e392d 100644 --- a/packages/web/components/issue-related-rrweb.tsx +++ b/packages/web/components/issue-related-rrweb.tsx @@ -29,11 +29,9 @@ const IssueRelatedRrweb: FC<Props> = ({ event }) => { } }) return ( - <div> - <Wrapper> - <div ref={rootRef} /> - </Wrapper> - </div> + <Wrapper> + <div ref={rootRef} /> + </Wrapper> ) } diff --git a/packages/web/components/layout.tsx b/packages/web/components/layout.tsx index 61ede3d..d974a08 100644 --- a/packages/web/components/layout.tsx +++ b/packages/web/components/layout.tsx @@ -2,16 +2,14 @@ import { useState } from 'react' import { useIsomorphicLayoutEffect, useWindowScroll } from 'react-use' -import { twMerge } from 'tailwind-merge' import { type FC, type ReactNode } from 'react' import Nav from './nav' import NavMenu from './nav-menu' import User from './user' import Logo from './logo' import Footer from './footer' - import Wrapper from './wrapper' -import { scrollWindowTo } from '~/libs/utils' +import { cn, scrollWindowTo } from '~/libs/utils' const HeadHeight = 64 const NavHeight = 48 @@ -40,34 +38,30 @@ const Layout: FC<Props> = ({ children }) => { </div> {/* navMenu */} <div - className={ - twMerge( - 'backdrop-blur shadow-sm w-full', - scrollNavVisible ? 'sticky' : 'relative', - scrollNavVisible && 'top-0', - scrollNavVisible && 'z-10', - ) - } style={{ height: NavHeight }} + className={cn( + 'backdrop-blur shadow-sm w-full', + scrollNavVisible ? 'sticky' : 'relative', + scrollNavVisible && 'top-0', + scrollNavVisible && 'z-10', + )} > <nav className=" h-full flex items-center justify-between container mx-auto" > <div className="flex relative"> <Logo - className={ - twMerge( - 'relative transition-all', - scrollNavVisible ? 'opacity-100' : 'opacity-0', - scrollNavVisible ? 'visible' : 'invisible', - ) - } - onClick={() => scrollWindowTo()} style={{ height: NavHeight, width: NavHeight, transform: scrollNavVisible ? 'translateZ(0)' : `translate3d(0,-${NavHeight}px,0)` }} + className={cn( + 'relative transition-all', + scrollNavVisible ? 'opacity-100' : 'opacity-0', + scrollNavVisible ? 'visible' : 'invisible', + )} + onClick={() => scrollWindowTo()} /> <div - className="transition-transform" + className="transition-transform flex items-center" style={ { transform: scrollNavVisible ? 'translate3d(24px,0,0)' : `translate3d(-${NavHeight + 12}px,0,0)` } } @@ -77,13 +71,11 @@ const Layout: FC<Props> = ({ children }) => { </div> <div - className={ - twMerge( - 'transition-all', - scrollNavVisible ? 'opacity-100' : 'opacity-0', - scrollNavVisible ? 'visible' : 'invisible', - ) - } + className={cn( + 'transition-all', + scrollNavVisible ? 'opacity-100' : 'opacity-0', + scrollNavVisible ? 'visible' : 'invisible', + )} style={ { transform: scrollNavVisible ? 'translateZ(0)' : `translate3d(0,-${NavHeight}px,0)` } } diff --git a/packages/web/components/load-more-button.tsx b/packages/web/components/load-more-button.tsx index 0397c38..0febad8 100644 --- a/packages/web/components/load-more-button.tsx +++ b/packages/web/components/load-more-button.tsx @@ -1,6 +1,6 @@ 'use client' -import type { MouseEventHandler } from 'react' +import { type MouseEventHandler } from 'react' import { Button } from '~/components/ui/button' interface Props { @@ -14,9 +14,9 @@ export default function LoadingMoreButton({ isLoading, isReachingEnd, onClick }: <Button className="w-full mt-6" disabled={isLoading || isReachingEnd} - onClick={onClick} size="sm" variant="outline" + onClick={onClick} > { isLoading diff --git a/packages/web/components/loading.tsx b/packages/web/components/loading.tsx index c965cde..ab29a7b 100644 --- a/packages/web/components/loading.tsx +++ b/packages/web/components/loading.tsx @@ -1,6 +1,6 @@ 'use client' -import type { FC } from 'react' +import { type FC } from 'react' import Spinning from './spinning' const Loading: FC = () => { diff --git a/packages/web/components/login-button.tsx b/packages/web/components/login-button.tsx index 17d41e3..6e61f70 100644 --- a/packages/web/components/login-button.tsx +++ b/packages/web/components/login-button.tsx @@ -1,7 +1,7 @@ 'use client' -import type { FC } from 'react' import { signIn, signOut, useSession } from 'next-auth/react' +import { type FC } from 'react' import { Button } from '~/components/ui/button' const LoginButton: FC = () => { diff --git a/packages/web/components/logo.tsx b/packages/web/components/logo.tsx index c1677e8..decf8af 100644 --- a/packages/web/components/logo.tsx +++ b/packages/web/components/logo.tsx @@ -1,11 +1,11 @@ 'use client' -import type { CSSProperties } from 'react' import { forwardRef } from 'react' import Link from 'next/link' import Image from 'next/image' import { twMerge } from 'tailwind-merge' import { useTheme } from 'next-themes' +import { type CSSProperties } from 'react' interface Props { className?: string @@ -20,13 +20,13 @@ const Logo = forwardRef<HTMLAnchorElement, Props>((props, ref) => { <Link href="/" {...props} - className={twMerge('inline-block cursor-pointer relative w-16 h-16', props.className)} ref={ref} + className={twMerge('inline-block cursor-pointer relative w-16 h-16', props.className)} > <Image - alt="logo" fill priority + alt="logo" src={theme === 'dark' ? '/logo-white.svg' : '/logo.svg'} /> </Link> diff --git a/packages/web/components/nav-container.tsx b/packages/web/components/nav-container.tsx index f115268..e048e7a 100644 --- a/packages/web/components/nav-container.tsx +++ b/packages/web/components/nav-container.tsx @@ -1,7 +1,7 @@ 'use client' -import type { ReactNode } from 'react' import Link from 'next/link' +import { type ReactNode } from 'react' import { Button } from '~/components/ui/button' import { cn } from '~/libs/utils' @@ -15,15 +15,15 @@ interface Props { navs: Nav[] } -export default function NavContainer({ children, navs }:Props) { +export default function NavContainer({ children, navs }: Props) { return ( - <div className='flex justify-between'> + <div className="flex justify-between"> <div> { navs.map(nav => ( <Link - href={nav.href} key={nav.href} + href={nav.href} > <Button className={cn(nav.active ? 'font-bold' : 'font-normal')} diff --git a/packages/web/components/nav-menu.tsx b/packages/web/components/nav-menu.tsx index c471eab..d66001b 100644 --- a/packages/web/components/nav-menu.tsx +++ b/packages/web/components/nav-menu.tsx @@ -1,10 +1,9 @@ 'use client' -import { useCallback, useMemo } from 'react' -import { usePathname, useRouter } from 'next-intl/client' -import { type FC, type Key } from 'react' +import { useMemo } from 'react' +import Link from 'next/link' import useCurrentProject from '~/hooks/use-current-project' -import { Tabs, TabsList, TabsTrigger } from '~/components/ui/tabs' +import { NavigationMenu, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, navigationMenuTriggerStyle } from '~/components/ui/navigation-menu' interface NavMenuItem { label: string @@ -12,9 +11,7 @@ interface NavMenuItem { as: string } -const NavMenu: FC = () => { - const router = useRouter() - const pathname = usePathname() +export default function NavMenu() { const { projectId } = useCurrentProject() const navMenuList = useMemo<NavMenuItem[]>(() => [ { @@ -59,37 +56,27 @@ const NavMenu: FC = () => { }, ], [projectId]) - const active = useMemo(() => { - return navMenuList.find(item => pathname.includes(item.as)) - }, [navMenuList, pathname]) - const handleSelectionChange = useCallback((key: Key) => { - const item = navMenuList.find(item => item.link === key) - if (item) { - router.push(item.as) - } - }, [navMenuList]) - return ( - <Tabs - className="flex items-center gap-4 h-full w-full" - onValueChange={handleSelectionChange} - value={active?.link} - > - <TabsList> + <NavigationMenu> + <NavigationMenuList> { navMenuList.map((item) => { return ( - <TabsTrigger - value={item.link} - > - {item.label} - </TabsTrigger> + <NavigationMenuItem key={item.link}> + <Link + legacyBehavior + passHref + href={item.as} + > + <NavigationMenuLink className={navigationMenuTriggerStyle()}> + {item.label} + </NavigationMenuLink> + </Link> + </NavigationMenuItem> ) }) } - </TabsList> - </Tabs> + </NavigationMenuList> + </NavigationMenu> ) } - -export default NavMenu diff --git a/packages/web/components/pagination.tsx b/packages/web/components/pagination.tsx index 0dbbeed..accde74 100644 --- a/packages/web/components/pagination.tsx +++ b/packages/web/components/pagination.tsx @@ -23,24 +23,24 @@ export default function Pagination({ page = 1, onChange, isReachingEnd, ...props return ( <div - className='flex items-center justify-end gap-2' + className="flex items-center justify-end gap-2" {...props} > <Button - variant="outline" className="h-8 w-8 p-0" - onClick={handlePrev} disabled={page <= 1} + variant="outline" + onClick={handlePrev} > <span className="sr-only">Go to previous page</span> <i className="i-ri-arrow-left-s-line" /> </Button> <Button - variant="outline" className="h-8 w-8 p-0" disabled={isReachingEnd} + variant="outline" onClick={handleNext} - > + > <span className="sr-only">Go to next page</span> <i className="i-ri-arrow-right-s-line" /> </Button> diff --git a/packages/web/components/project-card.tsx b/packages/web/components/project-card.tsx index e9a4368..dc75fe8 100644 --- a/packages/web/components/project-card.tsx +++ b/packages/web/components/project-card.tsx @@ -26,19 +26,22 @@ export default function ProjectCard({ project }: Props) { return ( <Link href={`/${project.id}/profile`}> <Card> - <CardHeader></CardHeader> + <CardHeader /> <CardContent> <div className="flex gap-6"> <Avatar> - <AvatarImage src={project.image ?? ''} alt={project.name}></AvatarImage> + <AvatarImage + alt={project.name} + src={project.image ?? ''} + /> <AvatarFallback>{project.name}</AvatarFallback> </Avatar> - <div className='space-x-6'> - <span className='cursor-pointer font-semibold'> + <div className="space-x-6"> + <span className="cursor-pointer font-semibold"> {project.name} </span> - <span className='text-xs text-stone-500'> + <span className="text-xs text-stone-500"> Events: {project.eventCount ?? 0} </span> </div> @@ -53,7 +56,7 @@ export default function ProjectCard({ project }: Props) { data={trends} type="14d" /> - ) + ) } </div> </CardContent> diff --git a/packages/web/components/project.tsx b/packages/web/components/project.tsx index a2bd18a..74dc07c 100644 --- a/packages/web/components/project.tsx +++ b/packages/web/components/project.tsx @@ -1,17 +1,15 @@ 'use client' -import type { FC } from 'react' import { useCallback, useEffect, useMemo, useState } from 'react' -import Link from 'next/link' -import type { User } from '@prisma/client' +import { type User } from '@prisma/client' import { usePathname, useRouter } from 'next-intl/client' import { useSession } from 'next-auth/react' +import { type FC } from 'react' import Loading from './loading' import { useStore } from '~/store' import { serviceGetProjectsWithEventCount } from '~/services/projects' import { useQuery } from '~/hooks/use-query' import { Avatar, AvatarFallback, AvatarImage } from '~/components/ui/avatar' -import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuSeparator, DropdownMenuShortcut } from '~/components/ui/dropdown-menu' import { Button } from '~/components/ui/button' import { Popover, PopoverContent, PopoverTrigger } from '~/components/ui/popover' import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator } from '~/components/ui/command' @@ -53,65 +51,75 @@ const ProjectComponent: FC = () => { } return ( - <Popover open={open} onOpenChange={setOpen}> - <PopoverTrigger asChild> - <Button - variant="outline" - role="combobox" - aria-expanded={open} - aria-label="Select a team" - className="w-[200px] justify-between" - > - <Avatar className="mr-2 h-5 w-5"> - <AvatarImage src={currentProject?.image ?? ''} alt={currentProject?.name} /> - <AvatarFallback>{currentProject?.name}</AvatarFallback> - </Avatar> - {currentProject?.name} - <i className='i-ri-expand-up-down-line ml-auto h-4 w-4 shrink-0 opacity-50'></i> - </Button> - </PopoverTrigger> - <PopoverContent className="w-[200px] p-0"> - <Command> - <CommandList> - <CommandInput placeholder="Search team..." /> - <CommandEmpty>No team found.</CommandEmpty> - <CommandGroup> - {projects?.map((project) => ( - <CommandItem - key={project.id} - onSelect={() => { - setOpen(false) - handleSelectProject(project.id.toString()) - }} - className="text-sm" - > - <Avatar className="mr-2 h-5 w-5"> - <AvatarImage src={project.image ?? ''} alt={project.name} /> - <AvatarFallback>{project.name}</AvatarFallback> - </Avatar> - {project.name} - <i className={cn( - "'i-ri-check-line' ml-auto h-4 w-4", - project.id.toString() === currentProject?.id.toString() - ? "opacity-100" - : "opacity-0" - )}></i> - </CommandItem> - ))} - </CommandGroup> - </CommandList> - <CommandSeparator /> - <CommandList> - <CommandGroup> - <CommandItem onClick={handleCreateProject}> - <i className='i-ri-add-line mr-2'></i> - Create Project + <Popover + open={open} + onOpenChange={setOpen} + > + <PopoverTrigger asChild> + <Button + aria-expanded={open} + aria-label="Select a team" + className="w-[200px] justify-between" + role="combobox" + variant="outline" + > + <Avatar className="mr-2 h-5 w-5"> + <AvatarImage + alt={currentProject?.name} + src={currentProject?.image ?? ''} + /> + <AvatarFallback>{currentProject?.name}</AvatarFallback> + </Avatar> + {currentProject?.name} + <i className="i-ri-expand-up-down-line ml-auto h-4 w-4 shrink-0 opacity-50" /> + </Button> + </PopoverTrigger> + <PopoverContent className="w-[200px] p-0"> + <Command> + <CommandList> + <CommandInput placeholder="Search team..." /> + <CommandEmpty>No team found.</CommandEmpty> + <CommandGroup> + {projects?.map(project => ( + <CommandItem + key={project.id} + className="text-sm" + onSelect={() => { + setOpen(false) + handleSelectProject(project.id.toString()) + }} + > + <Avatar className="mr-2 h-5 w-5"> + <AvatarImage + alt={project.name} + src={project.image ?? ''} + /> + <AvatarFallback>{project.name}</AvatarFallback> + </Avatar> + {project.name} + <i className={cn( + '\'i-ri-check-line\' ml-auto h-4 w-4', + project.id.toString() === currentProject?.id.toString() + ? 'opacity-100' + : 'opacity-0', + )} + /> </CommandItem> - </CommandGroup> - </CommandList> - </Command> - </PopoverContent> - </Popover> + ))} + </CommandGroup> + </CommandList> + <CommandSeparator /> + <CommandList> + <CommandGroup> + <CommandItem onClick={handleCreateProject}> + <i className="i-ri-add-line mr-2" /> + Create Project + </CommandItem> + </CommandGroup> + </CommandList> + </Command> + </PopoverContent> + </Popover> ) } diff --git a/packages/web/components/release-list.tsx b/packages/web/components/release-list.tsx index 28c89e6..a912d57 100644 --- a/packages/web/components/release-list.tsx +++ b/packages/web/components/release-list.tsx @@ -1,14 +1,13 @@ 'use client' -import type { FC } from 'react' import { useCallback } from 'react' import dayjs from 'dayjs' import Link from 'next/link' -import type { Release } from '@prisma/client' +import { type Release } from '@prisma/client' +import { type FC } from 'react' import useCurrentProject from '~/hooks/use-current-project' import { serviceDeleteRelease } from '~/services/releases' import { useToast } from '~/components/ui/use-toast' - import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from '~/components/ui/dropdown-menu' import { Button } from '~/components/ui/button' @@ -18,7 +17,7 @@ interface Props { mutate: () => Promise<void> } const ReleaseList: FC<Props> = ({ releases, mutate }) => { - const {toast} = useToast() + const { toast } = useToast() const { projectId } = useCurrentProject() const onDelete = useCallback((id: number) => { @@ -40,49 +39,51 @@ const ReleaseList: FC<Props> = ({ releases, mutate }) => { }, [mutate]) return ( - <div className='h-full w-full overflow-x-hidden overflow-y-auto rounded-lg'> + <div className="h-full w-full overflow-x-hidden overflow-y-auto rounded-lg"> { releases.map(release => ( <div key={release.id}> - <div className='flex flex-col flex-1'> - <span className='font-semibold'>{release.appVersion}</span> + <div className="flex flex-col flex-1"> + <span className="font-semibold">{release.appVersion}</span> <span> {release.appType} </span> </div> - <div className='flex flex-col flex-1'> - <span className='font-semibold'>sourceMap files</span> + <div className="flex flex-col flex-1"> + <span className="font-semibold">sourceMap files</span> <Link - className='font-semibold' + className="font-semibold" href={`/${projectId}/releases/${release.id}/sourceMaps`} > {(release.sourceMaps as Array<any>)?.length} </Link> </div> - <div className='flex items-center justify-end gap-2 flex-1'> + <div className="flex items-center justify-end gap-2 flex-1"> <Tooltip> <TooltipTrigger> - <span className='text-stone-500'> + <span className="text-stone-500"> {dayjs(release.createdAt).fromNow()} - </span></TooltipTrigger> + </span> + </TooltipTrigger> <TooltipContent> <span>{dayjs(release.createdAt).format('YYYY-MM-DD HH:mm:ss')}</span> </TooltipContent> </Tooltip> <DropdownMenu> <DropdownMenuTrigger asChild> - <Button size="icon" variant="outline"> + <Button + size="icon" + variant="outline" + > <i className="i-ri-more-line" /> </Button> </DropdownMenuTrigger> <DropdownMenuContent className="w-56"> <DropdownMenuGroup> <DropdownMenuItem - onClick={ - () => { - onDelete(release.id) - } - } + onClick={() => { + onDelete(release.id) + }} > Delete </DropdownMenuItem> diff --git a/packages/web/components/spinning.tsx b/packages/web/components/spinning.tsx index d267b46..1d64379 100644 --- a/packages/web/components/spinning.tsx +++ b/packages/web/components/spinning.tsx @@ -1,6 +1,6 @@ 'use client' -import type { FC } from 'react' +import { type FC } from 'react' const Spinning: FC = () => { return ( diff --git a/packages/web/components/stack-info.tsx b/packages/web/components/stack-info.tsx index 3e64931..8af3196 100644 --- a/packages/web/components/stack-info.tsx +++ b/packages/web/components/stack-info.tsx @@ -1,8 +1,8 @@ 'use client' -import type { ReactElement } from 'react' import { useMemo } from 'react' -import type { Result } from 'source-map-trace' +import { type Result } from 'source-map-trace' +import { type ReactElement } from 'react' import { cn } from '~/libs/utils' interface Props { @@ -12,23 +12,23 @@ interface Props { export default function StackInfo({ source }: Props) { const title = useMemo( () => ( - <div className='space-x-1'> - <code className='font-semibold'> + <div className="space-x-1"> + <code className="font-semibold"> {source?.parsed?.source} </code> - <span className='inline-block m-0 opacity-60'> + <span className="inline-block m-0 opacity-60"> in </span> - <code className='font-semibold'> + <code className="font-semibold"> {source?.parsed?.name} </code> - <span className='inline-block m-0 opacity-60'> + <span className="inline-block m-0 opacity-60"> at line </span> - <code className='font-semibold'> + <code className="font-semibold"> {source?.parsed?.line}: </code> - <code className='font-semibold'> + <code className="font-semibold"> {source?.parsed?.column} </code> </div> @@ -37,18 +37,18 @@ export default function StackInfo({ source }: Props) { ) return ( - <pre className='mt-4 break-word'> + <pre className="mt-4 break-word"> <div>{title}</div> <ol - className='list-inside list-decimal m-0 py-2' + className="list-inside list-decimal m-0 py-2" start={source?.code?.[0].number} > { source?.code?.map(({ code, number, highlight }): ReactElement => { return ( <li - className={cn('pl-6', highlight ? 'bg-red-500' : 'bg-inherit', highlight ? 'text-white' : 'text-inherit')} key={number} + className={cn('pl-6', highlight ? 'bg-red-500' : 'bg-inherit', highlight ? 'text-white' : 'text-inherit')} > <span>{code}</span> </li> diff --git a/packages/web/components/title.tsx b/packages/web/components/title.tsx index 72892d3..82a6240 100644 --- a/packages/web/components/title.tsx +++ b/packages/web/components/title.tsx @@ -2,8 +2,10 @@ import { type ReactNode } from 'react' import Wrapper from './wrapper' +import { cn } from '~/libs/utils' interface Props { + className?: string children: ReactNode rightNodes?: ReactNode bottomNodes?: ReactNode @@ -11,34 +13,29 @@ interface Props { const PADDING = '12' -export default function Title({ children, rightNodes, bottomNodes, ...props }: Props) { +export default function Title({ className, children, rightNodes, bottomNodes, ...props }: Props) { return ( - <div + <Wrapper + className={cn('flex flex-col justify-between', className)} + style={{ + paddingBottom: bottomNodes ? '0' : PADDING, + paddingTop: PADDING, + }} {...props} > - <Wrapper - className="flex flex-col justify-between" - style={ - { - paddingBottom: bottomNodes ? '0' : PADDING, - paddingTop: PADDING, - } - } - > - <div className="flex items-center justify-between"> - { + <div className="flex items-center justify-between"> + { typeof children === 'string' ? ( <h2 className="text-2xl font-semibold"> {children} </h2> - ) + ) : children } - <div>{rightNodes}</div> - </div> - <div style={{ marginTop: bottomNodes ? 6 : 0 }}>{bottomNodes}</div> - </Wrapper> - </div> + <div>{rightNodes}</div> + </div> + <div style={{ marginTop: bottomNodes ? 6 : 0 }}>{bottomNodes}</div> + </Wrapper> ) } diff --git a/packages/web/components/trend-chart.tsx b/packages/web/components/trend-chart.tsx index cacde54..6b43bed 100644 --- a/packages/web/components/trend-chart.tsx +++ b/packages/web/components/trend-chart.tsx @@ -1,18 +1,20 @@ 'use client' -import type { ReactNode } from 'react' import { memo, useEffect, useMemo, useRef } from 'react' -import type { Options } from 'highcharts' import Highcharts from 'highcharts' import HighchartsExporting from 'highcharts/modules/exporting' import HighchartsReact from 'highcharts-react-official' import dayjs from 'dayjs' +import { useTheme } from 'next-themes' +import { type Options } from 'highcharts' +import { type ReactNode } from 'react' import Loading from './loading' import { theme as chartTheme } from '~/styles/chart.theme' import { colors } from '~/styles/colors' -import { useTheme } from 'next-themes' -if (typeof Highcharts === 'object') { HighchartsExporting(Highcharts) } +if (typeof Highcharts === 'object') { + HighchartsExporting(Highcharts) +} interface MiniChartProps { type: '24h' | '14d' @@ -33,11 +35,15 @@ const TrendChart = memo<MiniChartProps>(({ type, data, title, variant = 'mini', const { theme } = useTheme() useEffect(() => { - if (typeof Highcharts === 'object') { Highcharts.setOptions(chartTheme) } + if (typeof Highcharts === 'object') { + Highcharts.setOptions(chartTheme) + } }, []) useEffect(() => { ref.current.chart.showLoading() - if (data) { ref.current.chart.hideLoading() } + if (data) { + ref.current.chart.hideLoading() + } }, [data]) const options = useMemo<Options>( @@ -167,9 +173,13 @@ const TrendChart = memo<MiniChartProps>(({ type, data, title, variant = 'mini', headerFormat: '', pointFormatter() { const { name, y } = this - if (type === '24h') { return `<div style="text-align: center"><span>${dayjs(name).format('YYYY-MM-DD')}<br />${dayjs(name).format('h:00 A → h:59 A')}</span><br /><b>${y} ${unit}</b></div>` } + if (type === '24h') { + return `<div style="text-align: center"><span>${dayjs(name).format('YYYY-MM-DD')}<br />${dayjs(name).format('h:00 A → h:59 A')}</span><br /><b>${y} ${unit}</b></div>` + } - if (type === '14d') { return `<div style="text-align: center"><span>${dayjs(name).format('YYYY-MM-DD')}</span><br /><b>${y} ${unit}</b></div>` } + if (type === '14d') { + return `<div style="text-align: center"><span>${dayjs(name).format('YYYY-MM-DD')}</span><br /><b>${y} ${unit}</b></div>` + } return '' }, @@ -186,9 +196,9 @@ const TrendChart = memo<MiniChartProps>(({ type, data, title, variant = 'mini', <div> {title} <HighchartsReact + ref={ref} highcharts={Highcharts} options={options} - ref={ref} /> </div> ) diff --git a/packages/web/components/ui/accordion.tsx b/packages/web/components/ui/accordion.tsx index 4d89d2a..ba80d7f 100644 --- a/packages/web/components/ui/accordion.tsx +++ b/packages/web/components/ui/accordion.tsx @@ -1,10 +1,10 @@ -"use client" +'use client' -import * as React from "react" -import * as AccordionPrimitive from "@radix-ui/react-accordion" -import { ChevronDown } from "lucide-react" +import * as React from 'react' +import * as AccordionPrimitive from '@radix-ui/react-accordion' +import { ChevronDown } from 'lucide-react' -import { cn } from "~/libs/utils" +import { cn } from '~/libs/utils' const Accordion = AccordionPrimitive.Root @@ -14,11 +14,11 @@ const AccordionItem = React.forwardRef< >(({ className, ...props }, ref) => ( <AccordionPrimitive.Item ref={ref} - className={cn("border-b", className)} + className={cn('border-b', className)} {...props} /> )) -AccordionItem.displayName = "AccordionItem" +AccordionItem.displayName = 'AccordionItem' const AccordionTrigger = React.forwardRef< React.ElementRef<typeof AccordionPrimitive.Trigger>, @@ -28,8 +28,8 @@ const AccordionTrigger = React.forwardRef< <AccordionPrimitive.Trigger ref={ref} className={cn( - "flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180", - className + 'flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180', + className, )} {...props} > @@ -47,8 +47,8 @@ const AccordionContent = React.forwardRef< <AccordionPrimitive.Content ref={ref} className={cn( - "overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down", - className + 'overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down', + className, )} {...props} > diff --git a/packages/web/components/ui/avatar.tsx b/packages/web/components/ui/avatar.tsx index c98a737..73133be 100644 --- a/packages/web/components/ui/avatar.tsx +++ b/packages/web/components/ui/avatar.tsx @@ -1,9 +1,9 @@ -"use client" +'use client' -import * as React from "react" -import * as AvatarPrimitive from "@radix-ui/react-avatar" +import * as React from 'react' +import * as AvatarPrimitive from '@radix-ui/react-avatar' -import { cn } from "~/libs/utils" +import { cn } from '~/libs/utils' const Avatar = React.forwardRef< React.ElementRef<typeof AvatarPrimitive.Root>, @@ -12,8 +12,8 @@ const Avatar = React.forwardRef< <AvatarPrimitive.Root ref={ref} className={cn( - "relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full", - className + 'relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full', + className, )} {...props} /> @@ -26,7 +26,7 @@ const AvatarImage = React.forwardRef< >(({ className, ...props }, ref) => ( <AvatarPrimitive.Image ref={ref} - className={cn("aspect-square h-full w-full", className)} + className={cn('aspect-square h-full w-full', className)} {...props} /> )) @@ -39,8 +39,8 @@ const AvatarFallback = React.forwardRef< <AvatarPrimitive.Fallback ref={ref} className={cn( - "flex h-full w-full items-center justify-center rounded-full bg-muted", - className + 'flex h-full w-full items-center justify-center rounded-full bg-muted', + className, )} {...props} /> diff --git a/packages/web/components/ui/badge.tsx b/packages/web/components/ui/badge.tsx index ce9e25b..f47b033 100644 --- a/packages/web/components/ui/badge.tsx +++ b/packages/web/components/ui/badge.tsx @@ -1,35 +1,36 @@ -import * as React from "react" -import { cva, type VariantProps } from "class-variance-authority" +import * as React from 'react' +import { type VariantProps, cva } from 'class-variance-authority' -import { cn } from "~/libs/utils" +import { cn } from '~/libs/utils' const badgeVariants = cva( - "inline-flex items-center rounded-full border border-stone-200 px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-stone-950 focus:ring-offset-2 dark:border-stone-800 dark:focus:ring-stone-300", + 'inline-flex items-center rounded-full border border-stone-200 px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-stone-950 focus:ring-offset-2 dark:border-stone-800 dark:focus:ring-stone-300', { variants: { variant: { default: - "border-transparent bg-stone-900 text-stone-50 hover:bg-stone-900/80 dark:bg-stone-50 dark:text-stone-900 dark:hover:bg-stone-50/80", + 'border-transparent bg-stone-900 text-stone-50 hover:bg-stone-900/80 dark:bg-stone-50 dark:text-stone-900 dark:hover:bg-stone-50/80', secondary: - "border-transparent bg-stone-100 text-stone-900 hover:bg-stone-100/80 dark:bg-stone-800 dark:text-stone-50 dark:hover:bg-stone-800/80", + 'border-transparent bg-stone-100 text-stone-900 hover:bg-stone-100/80 dark:bg-stone-800 dark:text-stone-50 dark:hover:bg-stone-800/80', destructive: - "border-transparent bg-red-500 text-stone-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-stone-50 dark:hover:bg-red-900/80", - outline: "text-stone-950 dark:text-stone-50", + 'border-transparent bg-red-500 text-stone-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-stone-50 dark:hover:bg-red-900/80', + outline: 'text-stone-950 dark:text-stone-50', }, }, - defaultVariants: { - variant: "default", - }, - } + defaultVariants: { variant: 'default' }, + }, ) export interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, - VariantProps<typeof badgeVariants> {} + VariantProps<typeof badgeVariants> {} function Badge({ className, variant, ...props }: BadgeProps) { return ( - <div className={cn(badgeVariants({ variant }), className)} {...props} /> + <div + className={cn(badgeVariants({ variant }), className)} + {...props} + /> ) } diff --git a/packages/web/components/ui/button.tsx b/packages/web/components/ui/button.tsx index 3845f33..f0e0d3a 100644 --- a/packages/web/components/ui/button.tsx +++ b/packages/web/components/ui/button.tsx @@ -34,7 +34,7 @@ const buttonVariants = cva( export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, - VariantProps<typeof buttonVariants> { + VariantProps<typeof buttonVariants> { asChild?: boolean } @@ -42,8 +42,8 @@ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(({ className, va const Comp = asChild ? Slot : 'button' return ( <Comp - className={cn(buttonVariants({ variant, size, className }))} ref={ref} + className={cn(buttonVariants({ variant, size, className }))} {...props} /> ) diff --git a/packages/web/components/ui/card.tsx b/packages/web/components/ui/card.tsx index d07056a..a22d45f 100644 --- a/packages/web/components/ui/card.tsx +++ b/packages/web/components/ui/card.tsx @@ -7,13 +7,11 @@ const Card = React.forwardRef< React.HTMLAttributes<HTMLDivElement> >(({ className, ...props }, ref) => ( <div - className={ - cn( - 'rounded-lg border bg-card text-card-foreground shadow-sm', - className, - ) - } ref={ref} + className={cn( + 'rounded-lg border bg-card text-card-foreground shadow-sm', + className, + )} {...props} /> )) @@ -24,8 +22,8 @@ const CardHeader = React.forwardRef< React.HTMLAttributes<HTMLDivElement> >(({ className, ...props }, ref) => ( <div - className={cn('flex flex-col space-y-1.5 p-6', className)} ref={ref} + className={cn('flex flex-col space-y-1.5 p-6', className)} {...props} /> )) @@ -36,13 +34,11 @@ const CardTitle = React.forwardRef< React.HTMLAttributes<HTMLHeadingElement> >(({ className, ...props }, ref) => ( <h3 - className={ - cn( - 'text-2xl font-semibold leading-none tracking-tight', - className, - ) - } ref={ref} + className={cn( + 'text-2xl font-semibold leading-none tracking-tight', + className, + )} {...props} /> )) @@ -53,8 +49,8 @@ const CardDescription = React.forwardRef< React.HTMLAttributes<HTMLParagraphElement> >(({ className, ...props }, ref) => ( <p - className={cn('text-sm text-muted-foreground', className)} ref={ref} + className={cn('text-sm text-muted-foreground', className)} {...props} /> )) @@ -65,8 +61,8 @@ const CardContent = React.forwardRef< React.HTMLAttributes<HTMLDivElement> >(({ className, ...props }, ref) => ( <div - className={cn('p-6 pt-0', className)} ref={ref} + className={cn('p-6 pt-0', className)} {...props} /> )) @@ -77,8 +73,8 @@ const CardFooter = React.forwardRef< React.HTMLAttributes<HTMLDivElement> >(({ className, ...props }, ref) => ( <div - className={cn('flex items-center p-6 pt-0', className)} ref={ref} + className={cn('flex items-center p-6 pt-0', className)} {...props} /> )) diff --git a/packages/web/components/ui/checkbox.tsx b/packages/web/components/ui/checkbox.tsx index 1cf6c06..18abc0e 100644 --- a/packages/web/components/ui/checkbox.tsx +++ b/packages/web/components/ui/checkbox.tsx @@ -1,10 +1,10 @@ -"use client" +'use client' -import * as React from "react" -import * as CheckboxPrimitive from "@radix-ui/react-checkbox" -import { Check } from "lucide-react" +import * as React from 'react' +import * as CheckboxPrimitive from '@radix-ui/react-checkbox' +import { Check } from 'lucide-react' -import { cn } from "~/libs/utils" +import { cn } from '~/libs/utils' const Checkbox = React.forwardRef< React.ElementRef<typeof CheckboxPrimitive.Root>, @@ -13,13 +13,13 @@ const Checkbox = React.forwardRef< <CheckboxPrimitive.Root ref={ref} className={cn( - "peer h-4 w-4 shrink-0 rounded-sm border border-stone-200 border-stone-900 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stone-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-stone-900 data-[state=checked]:text-stone-50 dark:border-stone-800 dark:border-stone-50 dark:ring-offset-stone-950 dark:focus-visible:ring-stone-300 dark:data-[state=checked]:bg-stone-50 dark:data-[state=checked]:text-stone-900", - className + 'peer h-4 w-4 shrink-0 rounded-sm border border-stone-200 border-stone-900 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stone-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-stone-900 data-[state=checked]:text-stone-50 dark:border-stone-800 dark:border-stone-50 dark:ring-offset-stone-950 dark:focus-visible:ring-stone-300 dark:data-[state=checked]:bg-stone-50 dark:data-[state=checked]:text-stone-900', + className, )} {...props} > <CheckboxPrimitive.Indicator - className={cn("flex items-center justify-center text-current")} + className={cn('flex items-center justify-center text-current')} > <Check className="h-4 w-4" /> </CheckboxPrimitive.Indicator> diff --git a/packages/web/components/ui/command.tsx b/packages/web/components/ui/command.tsx index 467fbf8..30b675c 100644 --- a/packages/web/components/ui/command.tsx +++ b/packages/web/components/ui/command.tsx @@ -1,12 +1,12 @@ -"use client" +'use client' -import * as React from "react" -import { DialogProps } from "@radix-ui/react-dialog" -import { Command as CommandPrimitive } from "cmdk" -import { Search } from "lucide-react" +import * as React from 'react' +import { Command as CommandPrimitive } from 'cmdk' +import { Search } from 'lucide-react' +import { type DialogProps } from '@radix-ui/react-dialog' -import { cn } from "~/libs/utils" -import { Dialog, DialogContent } from "~/components/ui/dialog" +import { cn } from '~/libs/utils' +import { Dialog, DialogContent } from '~/components/ui/dialog' const Command = React.forwardRef< React.ElementRef<typeof CommandPrimitive>, @@ -15,8 +15,8 @@ const Command = React.forwardRef< <CommandPrimitive ref={ref} className={cn( - "flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground", - className + 'flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground', + className, )} {...props} /> @@ -41,13 +41,16 @@ const CommandInput = React.forwardRef< React.ElementRef<typeof CommandPrimitive.Input>, React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input> >(({ className, ...props }, ref) => ( - <div className="flex items-center border-b px-3" cmdk-input-wrapper=""> + <div + className="flex items-center border-b px-3" + cmdk-input-wrapper="" + > <Search className="mr-2 h-4 w-4 shrink-0 opacity-50" /> <CommandPrimitive.Input ref={ref} className={cn( - "flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50", - className + 'flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50', + className, )} {...props} /> @@ -62,7 +65,7 @@ const CommandList = React.forwardRef< >(({ className, ...props }, ref) => ( <CommandPrimitive.List ref={ref} - className={cn("max-h-[300px] overflow-y-auto overflow-x-hidden", className)} + className={cn('max-h-[300px] overflow-y-auto overflow-x-hidden', className)} {...props} /> )) @@ -89,8 +92,8 @@ const CommandGroup = React.forwardRef< <CommandPrimitive.Group ref={ref} className={cn( - "overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground", - className + 'overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground', + className, )} {...props} /> @@ -104,7 +107,7 @@ const CommandSeparator = React.forwardRef< >(({ className, ...props }, ref) => ( <CommandPrimitive.Separator ref={ref} - className={cn("-mx-1 h-px bg-border", className)} + className={cn('-mx-1 h-px bg-border', className)} {...props} /> )) @@ -117,8 +120,8 @@ const CommandItem = React.forwardRef< <CommandPrimitive.Item ref={ref} className={cn( - "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", - className + 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', + className, )} {...props} /> @@ -133,14 +136,14 @@ const CommandShortcut = ({ return ( <span className={cn( - "ml-auto text-xs tracking-widest text-muted-foreground", - className + 'ml-auto text-xs tracking-widest text-muted-foreground', + className, )} {...props} /> ) } -CommandShortcut.displayName = "CommandShortcut" +CommandShortcut.displayName = 'CommandShortcut' export { Command, diff --git a/packages/web/components/ui/dialog.tsx b/packages/web/components/ui/dialog.tsx index a813e7c..3e36b6f 100644 --- a/packages/web/components/ui/dialog.tsx +++ b/packages/web/components/ui/dialog.tsx @@ -1,10 +1,10 @@ -"use client" +'use client' -import * as React from "react" -import * as DialogPrimitive from "@radix-ui/react-dialog" -import { X } from "lucide-react" +import * as React from 'react' +import * as DialogPrimitive from '@radix-ui/react-dialog' +import { X } from 'lucide-react' -import { cn } from "~/libs/utils" +import { cn } from '~/libs/utils' const Dialog = DialogPrimitive.Root @@ -14,7 +14,10 @@ const DialogPortal = ({ className, ...props }: DialogPrimitive.DialogPortalProps) => ( - <DialogPrimitive.Portal className={cn(className)} {...props} /> + <DialogPrimitive.Portal + className={cn(className)} + {...props} + /> ) DialogPortal.displayName = DialogPrimitive.Portal.displayName @@ -25,8 +28,8 @@ const DialogOverlay = React.forwardRef< <DialogPrimitive.Overlay ref={ref} className={cn( - "fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", - className + 'fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0', + className, )} {...props} /> @@ -42,8 +45,8 @@ const DialogContent = React.forwardRef< <DialogPrimitive.Content ref={ref} className={cn( - "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full", - className + 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full', + className, )} {...props} > @@ -63,13 +66,13 @@ const DialogHeader = ({ }: React.HTMLAttributes<HTMLDivElement>) => ( <div className={cn( - "flex flex-col space-y-1.5 text-center sm:text-left", - className + 'flex flex-col space-y-1.5 text-center sm:text-left', + className, )} {...props} /> ) -DialogHeader.displayName = "DialogHeader" +DialogHeader.displayName = 'DialogHeader' const DialogFooter = ({ className, @@ -77,13 +80,13 @@ const DialogFooter = ({ }: React.HTMLAttributes<HTMLDivElement>) => ( <div className={cn( - "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", - className + 'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', + className, )} {...props} /> ) -DialogFooter.displayName = "DialogFooter" +DialogFooter.displayName = 'DialogFooter' const DialogTitle = React.forwardRef< React.ElementRef<typeof DialogPrimitive.Title>, @@ -92,8 +95,8 @@ const DialogTitle = React.forwardRef< <DialogPrimitive.Title ref={ref} className={cn( - "text-lg font-semibold leading-none tracking-tight", - className + 'text-lg font-semibold leading-none tracking-tight', + className, )} {...props} /> @@ -106,7 +109,7 @@ const DialogDescription = React.forwardRef< >(({ className, ...props }, ref) => ( <DialogPrimitive.Description ref={ref} - className={cn("text-sm text-muted-foreground", className)} + className={cn('text-sm text-muted-foreground', className)} {...props} /> )) diff --git a/packages/web/components/ui/dropdown-menu.tsx b/packages/web/components/ui/dropdown-menu.tsx index 51bd6f7..3724754 100644 --- a/packages/web/components/ui/dropdown-menu.tsx +++ b/packages/web/components/ui/dropdown-menu.tsx @@ -24,14 +24,12 @@ const DropdownMenuSubTrigger = React.forwardRef< } >(({ className, inset, children, ...props }, ref) => ( <DropdownMenuPrimitive.SubTrigger - className={ - cn( - 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent', - inset && 'pl-8', - className, - ) - } ref={ref} + className={cn( + 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent', + inset && 'pl-8', + className, + )} {...props} > {children} @@ -46,13 +44,11 @@ const DropdownMenuSubContent = React.forwardRef< React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent> >(({ className, ...props }, ref) => ( <DropdownMenuPrimitive.SubContent - className={ - cn( - 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', - className, - ) - } ref={ref} + className={cn( + 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', + className, + )} {...props} /> )) @@ -65,14 +61,12 @@ const DropdownMenuContent = React.forwardRef< >(({ className, sideOffset = 4, ...props }, ref) => ( <DropdownMenuPrimitive.Portal> <DropdownMenuPrimitive.Content - className={ - cn( - 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', - className, - ) - } ref={ref} sideOffset={sideOffset} + className={cn( + 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', + className, + )} {...props} /> </DropdownMenuPrimitive.Portal> @@ -86,14 +80,12 @@ const DropdownMenuItem = React.forwardRef< } >(({ className, inset, ...props }, ref) => ( <DropdownMenuPrimitive.Item - className={ - cn( - 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', - inset && 'pl-8', - className, - ) - } ref={ref} + className={cn( + 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', + inset && 'pl-8', + className, + )} {...props} /> )) @@ -104,14 +96,12 @@ const DropdownMenuCheckboxItem = React.forwardRef< React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem> >(({ className, children, checked, ...props }, ref) => ( <DropdownMenuPrimitive.CheckboxItem - checked={checked} - className={ - cn( - 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', - className, - ) - } ref={ref} + checked={checked} + className={cn( + 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', + className, + )} {...props} > <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center"> @@ -130,13 +120,11 @@ const DropdownMenuRadioItem = React.forwardRef< React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem> >(({ className, children, ...props }, ref) => ( <DropdownMenuPrimitive.RadioItem - className={ - cn( - 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', - className, - ) - } ref={ref} + className={cn( + 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', + className, + )} {...props} > <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center"> @@ -156,14 +144,12 @@ const DropdownMenuLabel = React.forwardRef< } >(({ className, inset, ...props }, ref) => ( <DropdownMenuPrimitive.Label - className={ - cn( - 'px-2 py-1.5 text-sm font-semibold', - inset && 'pl-8', - className, - ) - } ref={ref} + className={cn( + 'px-2 py-1.5 text-sm font-semibold', + inset && 'pl-8', + className, + )} {...props} /> )) @@ -174,8 +160,8 @@ const DropdownMenuSeparator = React.forwardRef< React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator> >(({ className, ...props }, ref) => ( <DropdownMenuPrimitive.Separator - className={cn('-mx-1 my-1 h-px bg-muted', className)} ref={ref} + className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} /> )) diff --git a/packages/web/components/ui/form.tsx b/packages/web/components/ui/form.tsx index 5382c47..bdf3840 100644 --- a/packages/web/components/ui/form.tsx +++ b/packages/web/components/ui/form.tsx @@ -1,37 +1,35 @@ -import * as React from "react" -import * as LabelPrimitive from "@radix-ui/react-label" -import { Slot } from "@radix-ui/react-slot" +import * as React from 'react' +import { Slot } from '@radix-ui/react-slot' +import { + type ControllerProps, + type FieldPath, + type FieldValues, +} from 'react-hook-form' import { Controller, - ControllerProps, - FieldPath, - FieldValues, FormProvider, useFormContext, -} from "react-hook-form" +} from 'react-hook-form' +import type * as LabelPrimitive from '@radix-ui/react-label' -import { cn } from "~/libs/utils" -import { Label } from "~/components/ui/label" +import { cn } from '~/libs/utils' +import { Label } from '~/components/ui/label' const Form = FormProvider -type FormFieldContextValue< +interface FormFieldContextValue< TFieldValues extends FieldValues = FieldValues, - TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> -> = { + TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>, +> { name: TName } -const FormFieldContext = React.createContext<FormFieldContextValue>( - {} as FormFieldContextValue -) +const FormFieldContext = React.createContext<FormFieldContextValue>({} as FormFieldContextValue) const FormField = < TFieldValues extends FieldValues = FieldValues, - TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> ->({ - ...props -}: ControllerProps<TFieldValues, TName>) => { + TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>, +>({ ...props }: ControllerProps<TFieldValues, TName>) => { return ( <FormFieldContext.Provider value={{ name: props.name }}> <Controller {...props} /> @@ -39,6 +37,12 @@ const FormField = < ) } +interface FormItemContextValue { + id: string +} + +const FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue) + const useFormField = () => { const fieldContext = React.useContext(FormFieldContext) const itemContext = React.useContext(FormItemContext) @@ -47,7 +51,7 @@ const useFormField = () => { const fieldState = getFieldState(fieldContext.name, formState) if (!fieldContext) { - throw new Error("useFormField should be used within <FormField>") + throw new Error('useFormField should be used within <FormField>') } const { id } = itemContext @@ -62,14 +66,6 @@ const useFormField = () => { } } -type FormItemContextValue = { - id: string -} - -const FormItemContext = React.createContext<FormItemContextValue>( - {} as FormItemContextValue -) - const FormItem = React.forwardRef< HTMLDivElement, React.HTMLAttributes<HTMLDivElement> @@ -78,11 +74,15 @@ const FormItem = React.forwardRef< return ( <FormItemContext.Provider value={{ id }}> - <div ref={ref} className={cn("space-y-2", className)} {...props} /> + <div + ref={ref} + className={cn('space-y-2', className)} + {...props} + /> </FormItemContext.Provider> ) }) -FormItem.displayName = "FormItem" +FormItem.displayName = 'FormItem' const FormLabel = React.forwardRef< React.ElementRef<typeof LabelPrimitive.Root>, @@ -93,13 +93,13 @@ const FormLabel = React.forwardRef< return ( <Label ref={ref} - className={cn(error && "text-destructive", className)} + className={cn(error && 'text-destructive', className)} htmlFor={formItemId} {...props} /> ) }) -FormLabel.displayName = "FormLabel" +FormLabel.displayName = 'FormLabel' const FormControl = React.forwardRef< React.ElementRef<typeof Slot>, @@ -110,18 +110,18 @@ const FormControl = React.forwardRef< return ( <Slot ref={ref} + aria-invalid={!!error} id={formItemId} aria-describedby={ !error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}` } - aria-invalid={!!error} {...props} /> ) }) -FormControl.displayName = "FormControl" +FormControl.displayName = 'FormControl' const FormDescription = React.forwardRef< HTMLParagraphElement, @@ -132,13 +132,13 @@ const FormDescription = React.forwardRef< return ( <p ref={ref} + className={cn('text-sm text-muted-foreground', className)} id={formDescriptionId} - className={cn("text-sm text-muted-foreground", className)} {...props} /> ) }) -FormDescription.displayName = "FormDescription" +FormDescription.displayName = 'FormDescription' const FormMessage = React.forwardRef< HTMLParagraphElement, @@ -154,15 +154,15 @@ const FormMessage = React.forwardRef< return ( <p ref={ref} + className={cn('text-sm font-medium text-destructive', className)} id={formMessageId} - className={cn("text-sm font-medium text-destructive", className)} {...props} > {body} </p> ) }) -FormMessage.displayName = "FormMessage" +FormMessage.displayName = 'FormMessage' export { useFormField, diff --git a/packages/web/components/ui/input.tsx b/packages/web/components/ui/input.tsx index c214019..64a5c56 100644 --- a/packages/web/components/ui/input.tsx +++ b/packages/web/components/ui/input.tsx @@ -1,25 +1,23 @@ -import * as React from "react" +import * as React from 'react' -import { cn } from "~/libs/utils" +import { cn } from '~/libs/utils' export interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {} -const Input = React.forwardRef<HTMLInputElement, InputProps>( - ({ className, type, ...props }, ref) => { - return ( - <input - type={type} - className={cn( - "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50", - className - )} - ref={ref} - {...props} - /> - ) - } -) -Input.displayName = "Input" +const Input = React.forwardRef<HTMLInputElement, InputProps>(({ className, type, ...props }, ref) => { + return ( + <input + ref={ref} + type={type} + className={cn( + 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50', + className, + )} + {...props} + /> + ) +}) +Input.displayName = 'Input' export { Input } diff --git a/packages/web/components/ui/label.tsx b/packages/web/components/ui/label.tsx index 249e1fc..07e6eec 100644 --- a/packages/web/components/ui/label.tsx +++ b/packages/web/components/ui/label.tsx @@ -1,19 +1,17 @@ -"use client" +'use client' -import * as React from "react" -import * as LabelPrimitive from "@radix-ui/react-label" -import { cva, type VariantProps } from "class-variance-authority" +import * as React from 'react' +import * as LabelPrimitive from '@radix-ui/react-label' +import { type VariantProps, cva } from 'class-variance-authority' -import { cn } from "~/libs/utils" +import { cn } from '~/libs/utils' -const labelVariants = cva( - "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" -) +const labelVariants = cva('text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70') const Label = React.forwardRef< React.ElementRef<typeof LabelPrimitive.Root>, React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & - VariantProps<typeof labelVariants> + VariantProps<typeof labelVariants> >(({ className, ...props }, ref) => ( <LabelPrimitive.Root ref={ref} diff --git a/packages/web/components/ui/navigation-menu.tsx b/packages/web/components/ui/navigation-menu.tsx new file mode 100644 index 0000000..d7b354c --- /dev/null +++ b/packages/web/components/ui/navigation-menu.tsx @@ -0,0 +1,126 @@ +import * as React from 'react' +import * as NavigationMenuPrimitive from '@radix-ui/react-navigation-menu' +import { cva } from 'class-variance-authority' +import { ChevronDown } from 'lucide-react' + +import { cn } from '~/libs/utils' + +const NavigationMenuList = React.forwardRef< + React.ElementRef<typeof NavigationMenuPrimitive.List>, + React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.List> +>(({ className, ...props }, ref) => ( + <NavigationMenuPrimitive.List + ref={ref} + className={cn( + 'group flex flex-1 list-none items-center justify-center space-x-1', + className, + )} + {...props} + /> +)) +NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName + +const NavigationMenuItem = NavigationMenuPrimitive.Item + +const navigationMenuTriggerStyle = cva('group inline-flex w-max items-center justify-center rounded-md px-3 py-2 text-sm font-medium transition-colors hover:bg-stone-100 hover:text-stone-900 focus:bg-stone-100 focus:text-stone-900 focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-stone-100/50 data-[state=open]:bg-stone-100/50 dark:bg-stone-950 dark:hover:bg-stone-800 dark:hover:text-stone-50 dark:focus:bg-stone-800 dark:focus:text-stone-50 dark:data-[active]:bg-stone-800/50 dark:data-[state=open]:bg-stone-800/50') + +const NavigationMenuTrigger = React.forwardRef< + React.ElementRef<typeof NavigationMenuPrimitive.Trigger>, + React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Trigger> +>(({ className, children, ...props }, ref) => ( + <NavigationMenuPrimitive.Trigger + ref={ref} + className={cn(navigationMenuTriggerStyle(), 'group', className)} + {...props} + > + {children}{''} + <ChevronDown + aria-hidden="true" + className="relative top-[1px] ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180" + /> + </NavigationMenuPrimitive.Trigger> +)) +NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName + +const NavigationMenuContent = React.forwardRef< + React.ElementRef<typeof NavigationMenuPrimitive.Content>, + React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Content> +>(({ className, ...props }, ref) => ( + <NavigationMenuPrimitive.Content + ref={ref} + className={cn( + 'left-0 top-0 w-full data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 md:absolute md:w-auto', + className, + )} + {...props} + /> +)) +NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName + +const NavigationMenuLink = NavigationMenuPrimitive.Link + +const NavigationMenuViewport = React.forwardRef< + React.ElementRef<typeof NavigationMenuPrimitive.Viewport>, + React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Viewport> +>(({ className, ...props }, ref) => ( + <div className={cn('absolute left-0 top-full flex justify-center')}> + <NavigationMenuPrimitive.Viewport + ref={ref} + className={cn( + 'origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border border-stone-200 bg-white text-stone-950 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)] dark:border-stone-800 dark:bg-stone-950 dark:text-stone-50', + className, + )} + {...props} + /> + </div> +)) +NavigationMenuViewport.displayName + = NavigationMenuPrimitive.Viewport.displayName + +const NavigationMenuIndicator = React.forwardRef< + React.ElementRef<typeof NavigationMenuPrimitive.Indicator>, + React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Indicator> +>(({ className, ...props }, ref) => ( + <NavigationMenuPrimitive.Indicator + ref={ref} + className={cn( + 'top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in', + className, + )} + {...props} + > + <div className="relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-stone-200 shadow-md dark:bg-stone-800" /> + </NavigationMenuPrimitive.Indicator> +)) +NavigationMenuIndicator.displayName + = NavigationMenuPrimitive.Indicator.displayName + +const NavigationMenu = React.forwardRef< + React.ElementRef<typeof NavigationMenuPrimitive.Root>, + React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Root> +>(({ className, children, ...props }, ref) => ( + <NavigationMenuPrimitive.Root + ref={ref} + className={cn( + 'relative z-10 flex max-w-max flex-1 items-center justify-center', + className, + )} + {...props} + > + {children} + <NavigationMenuViewport /> + </NavigationMenuPrimitive.Root> +)) +NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName + +export { + navigationMenuTriggerStyle, + NavigationMenu, + NavigationMenuList, + NavigationMenuItem, + NavigationMenuContent, + NavigationMenuTrigger, + NavigationMenuLink, + NavigationMenuIndicator, + NavigationMenuViewport, +} diff --git a/packages/web/components/ui/popover.tsx b/packages/web/components/ui/popover.tsx index 9a06e06..9809c4f 100644 --- a/packages/web/components/ui/popover.tsx +++ b/packages/web/components/ui/popover.tsx @@ -1,9 +1,9 @@ -"use client" +'use client' -import * as React from "react" -import * as PopoverPrimitive from "@radix-ui/react-popover" +import * as React from 'react' +import * as PopoverPrimitive from '@radix-ui/react-popover' -import { cn } from "~/libs/utils" +import { cn } from '~/libs/utils' const Popover = PopoverPrimitive.Root @@ -12,15 +12,15 @@ const PopoverTrigger = PopoverPrimitive.Trigger const PopoverContent = React.forwardRef< React.ElementRef<typeof PopoverPrimitive.Content>, React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> ->(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( +>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => ( <PopoverPrimitive.Portal> <PopoverPrimitive.Content ref={ref} align={align} sideOffset={sideOffset} className={cn( - "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", - className + 'z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', + className, )} {...props} /> diff --git a/packages/web/components/ui/select.tsx b/packages/web/components/ui/select.tsx index 65b7a8a..93a7abb 100644 --- a/packages/web/components/ui/select.tsx +++ b/packages/web/components/ui/select.tsx @@ -1,10 +1,10 @@ -"use client" +'use client' -import * as React from "react" -import * as SelectPrimitive from "@radix-ui/react-select" -import { Check, ChevronDown } from "lucide-react" +import * as React from 'react' +import * as SelectPrimitive from '@radix-ui/react-select' +import { Check, ChevronDown } from 'lucide-react' -import { cn } from "~/libs/utils" +import { cn } from '~/libs/utils' const Select = SelectPrimitive.Root @@ -19,8 +19,8 @@ const SelectTrigger = React.forwardRef< <SelectPrimitive.Trigger ref={ref} className={cn( - "flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50", - className + 'flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50', + className, )} {...props} > @@ -35,24 +35,24 @@ SelectTrigger.displayName = SelectPrimitive.Trigger.displayName const SelectContent = React.forwardRef< React.ElementRef<typeof SelectPrimitive.Content>, React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content> ->(({ className, children, position = "popper", ...props }, ref) => ( +>(({ className, children, position = 'popper', ...props }, ref) => ( <SelectPrimitive.Portal> <SelectPrimitive.Content ref={ref} + position={position} className={cn( - "relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", - position === "popper" && - "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", - className + 'relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', + position === 'popper' + && 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1', + className, )} - position={position} {...props} > <SelectPrimitive.Viewport className={cn( - "p-1", - position === "popper" && - "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]" + 'p-1', + position === 'popper' + && 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]', )} > {children} @@ -68,7 +68,7 @@ const SelectLabel = React.forwardRef< >(({ className, ...props }, ref) => ( <SelectPrimitive.Label ref={ref} - className={cn("py-1.5 pl-8 pr-2 text-sm font-semibold", className)} + className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)} {...props} /> )) @@ -81,8 +81,8 @@ const SelectItem = React.forwardRef< <SelectPrimitive.Item ref={ref} className={cn( - "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", - className + 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', + className, )} {...props} > @@ -103,7 +103,7 @@ const SelectSeparator = React.forwardRef< >(({ className, ...props }, ref) => ( <SelectPrimitive.Separator ref={ref} - className={cn("-mx-1 my-1 h-px bg-muted", className)} + className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props} /> )) diff --git a/packages/web/components/ui/separator.tsx b/packages/web/components/ui/separator.tsx index 2e657a9..74b3931 100644 --- a/packages/web/components/ui/separator.tsx +++ b/packages/web/components/ui/separator.tsx @@ -1,31 +1,29 @@ -"use client" +'use client' -import * as React from "react" -import * as SeparatorPrimitive from "@radix-ui/react-separator" +import * as React from 'react' +import * as SeparatorPrimitive from '@radix-ui/react-separator' -import { cn } from "~/libs/utils" +import { cn } from '~/libs/utils' const Separator = React.forwardRef< React.ElementRef<typeof SeparatorPrimitive.Root>, React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root> ->( - ( - { className, orientation = "horizontal", decorative = true, ...props }, - ref - ) => ( - <SeparatorPrimitive.Root - ref={ref} - decorative={decorative} - orientation={orientation} - className={cn( - "shrink-0 bg-border", - orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]", - className - )} - {...props} - /> - ) -) +>(( + { className, orientation = 'horizontal', decorative = true, ...props }, + ref, +) => ( + <SeparatorPrimitive.Root + ref={ref} + decorative={decorative} + orientation={orientation} + className={cn( + 'shrink-0 bg-border', + orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]', + className, + )} + {...props} + /> +)) Separator.displayName = SeparatorPrimitive.Root.displayName export { Separator } diff --git a/packages/web/components/ui/skeleton.tsx b/packages/web/components/ui/skeleton.tsx index f3daf42..db8b1c5 100644 --- a/packages/web/components/ui/skeleton.tsx +++ b/packages/web/components/ui/skeleton.tsx @@ -1,4 +1,4 @@ -import { cn } from "~/libs/utils" +import { cn } from '~/libs/utils' function Skeleton({ className, @@ -6,7 +6,7 @@ function Skeleton({ }: React.HTMLAttributes<HTMLDivElement>) { return ( <div - className={cn("animate-pulse rounded-md bg-stone-100 dark:bg-stone-800", className)} + className={cn('animate-pulse rounded-md bg-stone-100 dark:bg-stone-800', className)} {...props} /> ) diff --git a/packages/web/components/ui/switch.tsx b/packages/web/components/ui/switch.tsx index 08fafd5..d86979f 100644 --- a/packages/web/components/ui/switch.tsx +++ b/packages/web/components/ui/switch.tsx @@ -1,9 +1,9 @@ -"use client" +'use client' -import * as React from "react" -import * as SwitchPrimitives from "@radix-ui/react-switch" +import * as React from 'react' +import * as SwitchPrimitives from '@radix-ui/react-switch' -import { cn } from "~/libs/utils" +import { cn } from '~/libs/utils' const Switch = React.forwardRef< React.ElementRef<typeof SwitchPrimitives.Root>, @@ -11,16 +11,14 @@ const Switch = React.forwardRef< >(({ className, ...props }, ref) => ( <SwitchPrimitives.Root className={cn( - "peer inline-flex h-[24px] w-[44px] shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2 focus-visible:ring-offset-white disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-slate-900 data-[state=unchecked]:bg-slate-200 dark:focus-visible:ring-slate-300 dark:focus-visible:ring-offset-slate-950 dark:data-[state=checked]:bg-slate-50 dark:data-[state=unchecked]:bg-slate-800", - className + 'peer inline-flex h-[24px] w-[44px] shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2 focus-visible:ring-offset-white disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-slate-900 data-[state=unchecked]:bg-slate-200 dark:focus-visible:ring-slate-300 dark:focus-visible:ring-offset-slate-950 dark:data-[state=checked]:bg-slate-50 dark:data-[state=unchecked]:bg-slate-800', + className, )} {...props} ref={ref} > <SwitchPrimitives.Thumb - className={cn( - "pointer-events-none block h-5 w-5 rounded-full bg-white shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0 dark:bg-slate-950" - )} + className={cn('pointer-events-none block h-5 w-5 rounded-full bg-white shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0 dark:bg-slate-950')} /> </SwitchPrimitives.Root> )) diff --git a/packages/web/components/ui/table.tsx b/packages/web/components/ui/table.tsx index 51f54ce..f14b016 100644 --- a/packages/web/components/ui/table.tsx +++ b/packages/web/components/ui/table.tsx @@ -8,8 +8,8 @@ const Table = React.forwardRef< >(({ className, ...props }, ref) => ( <div className="w-full overflow-auto"> <table - className={cn('w-full caption-bottom text-sm', className)} ref={ref} + className={cn('w-full caption-bottom text-sm', className)} {...props} /> </div> @@ -21,8 +21,8 @@ const TableHeader = React.forwardRef< React.HTMLAttributes<HTMLTableSectionElement> >(({ className, ...props }, ref) => ( <thead - className={cn('[&_tr]:border-b', className)} ref={ref} + className={cn('[&_tr]:border-b', className)} {...props} /> )) @@ -33,8 +33,8 @@ const TableBody = React.forwardRef< React.HTMLAttributes<HTMLTableSectionElement> >(({ className, ...props }, ref) => ( <tbody - className={cn('[&_tr:last-child]:border-0', className)} ref={ref} + className={cn('[&_tr:last-child]:border-0', className)} {...props} /> )) @@ -45,8 +45,8 @@ const TableFooter = React.forwardRef< React.HTMLAttributes<HTMLTableSectionElement> >(({ className, ...props }, ref) => ( <tfoot - className={cn('bg-primary font-medium text-primary-foreground', className)} ref={ref} + className={cn('bg-primary font-medium text-primary-foreground', className)} {...props} /> )) @@ -57,13 +57,11 @@ const TableRow = React.forwardRef< React.HTMLAttributes<HTMLTableRowElement> >(({ className, ...props }, ref) => ( <tr - className={ - cn( - 'border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted', - className, - ) - } ref={ref} + className={cn( + 'border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted', + className, + )} {...props} /> )) @@ -74,13 +72,11 @@ const TableHead = React.forwardRef< React.ThHTMLAttributes<HTMLTableCellElement> >(({ className, ...props }, ref) => ( <th - className={ - cn( - 'h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0', - className, - ) - } ref={ref} + className={cn( + 'h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0', + className, + )} {...props} /> )) @@ -91,8 +87,8 @@ const TableCell = React.forwardRef< React.TdHTMLAttributes<HTMLTableCellElement> >(({ className, ...props }, ref) => ( <td - className={cn('p-4 align-middle [&:has([role=checkbox])]:pr-0', className)} ref={ref} + className={cn('p-4 align-middle [&:has([role=checkbox])]:pr-0', className)} {...props} /> )) @@ -103,8 +99,8 @@ const TableCaption = React.forwardRef< React.HTMLAttributes<HTMLTableCaptionElement> >(({ className, ...props }, ref) => ( <caption - className={cn('mt-4 text-sm text-muted-foreground', className)} ref={ref} + className={cn('mt-4 text-sm text-muted-foreground', className)} {...props} /> )) diff --git a/packages/web/components/ui/tabs.tsx b/packages/web/components/ui/tabs.tsx index 18cce9e..3806472 100644 --- a/packages/web/components/ui/tabs.tsx +++ b/packages/web/components/ui/tabs.tsx @@ -1,9 +1,9 @@ -"use client" +'use client' -import * as React from "react" -import * as TabsPrimitive from "@radix-ui/react-tabs" +import * as React from 'react' +import * as TabsPrimitive from '@radix-ui/react-tabs' -import { cn } from "~/libs/utils" +import { cn } from '~/libs/utils' const Tabs = TabsPrimitive.Root @@ -14,8 +14,8 @@ const TabsList = React.forwardRef< <TabsPrimitive.List ref={ref} className={cn( - "inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground", - className + 'inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground', + className, )} {...props} /> @@ -29,8 +29,8 @@ const TabsTrigger = React.forwardRef< <TabsPrimitive.Trigger ref={ref} className={cn( - "inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm", - className + 'inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm', + className, )} {...props} /> @@ -44,8 +44,8 @@ const TabsContent = React.forwardRef< <TabsPrimitive.Content ref={ref} className={cn( - "mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2", - className + 'mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', + className, )} {...props} /> diff --git a/packages/web/components/ui/toast.tsx b/packages/web/components/ui/toast.tsx index 7b31566..fb7fc7b 100644 --- a/packages/web/components/ui/toast.tsx +++ b/packages/web/components/ui/toast.tsx @@ -1,9 +1,9 @@ -import * as React from "react" -import * as ToastPrimitives from "@radix-ui/react-toast" -import { cva, type VariantProps } from "class-variance-authority" -import { X } from "lucide-react" +import * as React from 'react' +import * as ToastPrimitives from '@radix-ui/react-toast' +import { type VariantProps, cva } from 'class-variance-authority' +import { X } from 'lucide-react' -import { cn } from "~/libs/utils" +import { cn } from '~/libs/utils' const ToastProvider = ToastPrimitives.Provider @@ -14,8 +14,8 @@ const ToastViewport = React.forwardRef< <ToastPrimitives.Viewport ref={ref} className={cn( - "fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]", - className + 'fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]', + className, )} {...props} /> @@ -23,25 +23,23 @@ const ToastViewport = React.forwardRef< ToastViewport.displayName = ToastPrimitives.Viewport.displayName const toastVariants = cva( - "group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full", + 'group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full', { variants: { variant: { - default: "border bg-background text-foreground", + default: 'border bg-background text-foreground', destructive: - "destructive group border-destructive bg-destructive text-destructive-foreground", + 'destructive group border-destructive bg-destructive text-destructive-foreground', }, }, - defaultVariants: { - variant: "default", - }, - } + defaultVariants: { variant: 'default' }, + }, ) const Toast = React.forwardRef< React.ElementRef<typeof ToastPrimitives.Root>, React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> & - VariantProps<typeof toastVariants> + VariantProps<typeof toastVariants> >(({ className, variant, ...props }, ref) => { return ( <ToastPrimitives.Root @@ -60,8 +58,8 @@ const ToastAction = React.forwardRef< <ToastPrimitives.Action ref={ref} className={cn( - "inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive", - className + 'inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive', + className, )} {...props} /> @@ -74,11 +72,11 @@ const ToastClose = React.forwardRef< >(({ className, ...props }, ref) => ( <ToastPrimitives.Close ref={ref} + toast-close="" className={cn( - "absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600", - className + 'absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600', + className, )} - toast-close="" {...props} > <X className="h-4 w-4" /> @@ -92,7 +90,7 @@ const ToastTitle = React.forwardRef< >(({ className, ...props }, ref) => ( <ToastPrimitives.Title ref={ref} - className={cn("text-sm font-semibold", className)} + className={cn('text-sm font-semibold', className)} {...props} /> )) @@ -104,7 +102,7 @@ const ToastDescription = React.forwardRef< >(({ className, ...props }, ref) => ( <ToastPrimitives.Description ref={ref} - className={cn("text-sm opacity-90", className)} + className={cn('text-sm opacity-90', className)} {...props} /> )) diff --git a/packages/web/components/ui/toaster.tsx b/packages/web/components/ui/toaster.tsx index 8b67a2d..c348304 100644 --- a/packages/web/components/ui/toaster.tsx +++ b/packages/web/components/ui/toaster.tsx @@ -1,4 +1,4 @@ -"use client" +'use client' import { Toast, @@ -7,22 +7,23 @@ import { ToastProvider, ToastTitle, ToastViewport, -} from "~/components/ui/toast" -import { useToast } from "~/components/ui/use-toast" +} from '~/components/ui/toast' +import { useToast } from '~/components/ui/use-toast' export function Toaster() { const { toasts } = useToast() return ( <ToastProvider> - {toasts.map(function ({ id, title, description, action, ...props }) { + {toasts.map(({ id, title, description, action, ...props }) => { return ( - <Toast key={id} {...props}> + <Toast + key={id} + {...props} + > <div className="grid gap-1"> - {title && <ToastTitle>{title}</ToastTitle>} - {description && ( - <ToastDescription>{description}</ToastDescription> - )} + {title ? <ToastTitle>{title}</ToastTitle> : null} + {description ? <ToastDescription>{description}</ToastDescription> : null} </div> {action} <ToastClose /> diff --git a/packages/web/components/ui/tooltip.tsx b/packages/web/components/ui/tooltip.tsx index 59f7de4..da8e65b 100644 --- a/packages/web/components/ui/tooltip.tsx +++ b/packages/web/components/ui/tooltip.tsx @@ -1,9 +1,9 @@ -"use client" +'use client' -import * as React from "react" -import * as TooltipPrimitive from "@radix-ui/react-tooltip" +import * as React from 'react' +import * as TooltipPrimitive from '@radix-ui/react-tooltip' -import { cn } from "~/libs/utils" +import { cn } from '~/libs/utils' const TooltipProvider = TooltipPrimitive.Provider @@ -19,8 +19,8 @@ const TooltipContent = React.forwardRef< ref={ref} sideOffset={sideOffset} className={cn( - "z-50 overflow-hidden rounded-md border border-slate-200 bg-white px-3 py-1.5 text-sm text-slate-950 shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-slate-800 dark:bg-slate-950 dark:text-slate-50", - className + 'z-50 overflow-hidden rounded-md border border-slate-200 bg-white px-3 py-1.5 text-sm text-slate-950 shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-slate-800 dark:bg-slate-950 dark:text-slate-50', + className, )} {...props} /> diff --git a/packages/web/components/ui/use-toast.ts b/packages/web/components/ui/use-toast.ts index b742263..baa08a4 100644 --- a/packages/web/components/ui/use-toast.ts +++ b/packages/web/components/ui/use-toast.ts @@ -1,10 +1,10 @@ // Inspired by react-hot-toast library -import * as React from "react" +import * as React from 'react' -import type { - ToastActionElement, - ToastProps, -} from "~/components/ui/toast" +import { + type ToastActionElement, + type ToastProps, +} from '~/components/ui/toast' const TOAST_LIMIT = 1 const TOAST_REMOVE_DELAY = 1000000 @@ -17,10 +17,10 @@ type ToasterToast = ToastProps & { } const actionTypes = { - ADD_TOAST: "ADD_TOAST", - UPDATE_TOAST: "UPDATE_TOAST", - DISMISS_TOAST: "DISMISS_TOAST", - REMOVE_TOAST: "REMOVE_TOAST", + ADD_TOAST: 'ADD_TOAST', + UPDATE_TOAST: 'UPDATE_TOAST', + DISMISS_TOAST: 'DISMISS_TOAST', + REMOVE_TOAST: 'REMOVE_TOAST', } as const let count = 0 @@ -34,21 +34,21 @@ type ActionType = typeof actionTypes type Action = | { - type: ActionType["ADD_TOAST"] - toast: ToasterToast - } + type: ActionType['ADD_TOAST'] + toast: ToasterToast + } | { - type: ActionType["UPDATE_TOAST"] - toast: Partial<ToasterToast> - } + type: ActionType['UPDATE_TOAST'] + toast: Partial<ToasterToast> + } | { - type: ActionType["DISMISS_TOAST"] - toastId?: ToasterToast["id"] - } + type: ActionType['DISMISS_TOAST'] + toastId?: ToasterToast['id'] + } | { - type: ActionType["REMOVE_TOAST"] - toastId?: ToasterToast["id"] - } + type: ActionType['REMOVE_TOAST'] + toastId?: ToasterToast['id'] + } interface State { toasts: ToasterToast[] @@ -64,8 +64,8 @@ const addToRemoveQueue = (toastId: string) => { const timeout = setTimeout(() => { toastTimeouts.delete(toastId) dispatch({ - type: "REMOVE_TOAST", - toastId: toastId, + type: 'REMOVE_TOAST', + toastId, }) }, TOAST_REMOVE_DELAY) @@ -74,28 +74,28 @@ const addToRemoveQueue = (toastId: string) => { export const reducer = (state: State, action: Action): State => { switch (action.type) { - case "ADD_TOAST": + case 'ADD_TOAST': return { ...state, toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT), } - case "UPDATE_TOAST": + case 'UPDATE_TOAST': return { ...state, - toasts: state.toasts.map((t) => - t.id === action.toast.id ? { ...t, ...action.toast } : t - ), + toasts: state.toasts.map(t => + t.id === action.toast.id ? { ...t, ...action.toast } : t), } - case "DISMISS_TOAST": { + case 'DISMISS_TOAST': { const { toastId } = action // ! Side effects ! - This could be extracted into a dismissToast() action, // but I'll keep it here for simplicity if (toastId) { addToRemoveQueue(toastId) - } else { + } + else { state.toasts.forEach((toast) => { addToRemoveQueue(toast.id) }) @@ -103,17 +103,16 @@ export const reducer = (state: State, action: Action): State => { return { ...state, - toasts: state.toasts.map((t) => + toasts: state.toasts.map(t => t.id === toastId || toastId === undefined ? { ...t, open: false, } - : t - ), + : t), } } - case "REMOVE_TOAST": + case 'REMOVE_TOAST': if (action.toastId === undefined) { return { ...state, @@ -122,7 +121,7 @@ export const reducer = (state: State, action: Action): State => { } return { ...state, - toasts: state.toasts.filter((t) => t.id !== action.toastId), + toasts: state.toasts.filter(t => t.id !== action.toastId), } } } @@ -138,20 +137,20 @@ function dispatch(action: Action) { }) } -type Toast = Omit<ToasterToast, "id"> +type Toast = Omit<ToasterToast, 'id'> function toast({ ...props }: Toast) { const id = genId() const update = (props: ToasterToast) => dispatch({ - type: "UPDATE_TOAST", + type: 'UPDATE_TOAST', toast: { ...props, id }, }) - const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id }) + const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id }) dispatch({ - type: "ADD_TOAST", + type: 'ADD_TOAST', toast: { ...props, id, @@ -163,7 +162,7 @@ function toast({ ...props }: Toast) { }) return { - id: id, + id, dismiss, update, } @@ -185,7 +184,7 @@ function useToast() { return { ...state, toast, - dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }), + dismiss: (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId }), } } diff --git a/packages/web/components/user.tsx b/packages/web/components/user.tsx index a6fc115..6f78148 100644 --- a/packages/web/components/user.tsx +++ b/packages/web/components/user.tsx @@ -4,7 +4,7 @@ import { signIn, signOut, useSession } from 'next-auth/react' import { useTranslations } from 'next-intl' import Theme from './theme' import Intl from './intl' -import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup, DropdownMenuItem, DropdownMenuShortcut } from '~/components/ui/dropdown-menu' +import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger } from '~/components/ui/dropdown-menu' import { Avatar, AvatarFallback, AvatarImage } from '~/components/ui/avatar' import { Button } from '~/components/ui/button' @@ -16,15 +16,21 @@ export default function UserComponent() { return ( <DropdownMenu> <DropdownMenuTrigger asChild> - <Button variant="outline" className="relative h-8 w-8 rounded-full"> + <Button + className="relative h-8 w-8 rounded-full" + variant="outline" + > <Avatar className="h-8 w-8"> - <AvatarImage src={session.user?.image ?? ''} alt={session.user?.name ?? ''} /> + <AvatarImage + alt={session.user?.name ?? ''} + src={session.user?.image ?? ''} + /> <AvatarFallback>{session.user?.name ?? ''}</AvatarFallback> </Avatar> </Button> </DropdownMenuTrigger> - <DropdownMenuContent className='w-56'> + <DropdownMenuContent className="w-56"> <DropdownMenuLabel> <div className="flex flex-col space-y-1"> <p className="text-sm font-medium leading-none">{session.user?.name ?? ''}</p> diff --git a/packages/web/components/users-list.tsx b/packages/web/components/users-list.tsx index bcdfbab..7d32388 100644 --- a/packages/web/components/users-list.tsx +++ b/packages/web/components/users-list.tsx @@ -5,7 +5,7 @@ import { useCallback } from 'react' import { type Key } from 'react' import { type EventUser } from '@prisma/client' import useCurrentProject from '~/hooks/use-current-project' -import { Table, TableBody, TableCell, TableHeader, TableHead, TableRow } from '~/components/ui/table' +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '~/components/ui/table' type User = EventUser & { _count: { @@ -94,7 +94,7 @@ export default function UsersList({ users }: Props) { }, [projectId]) return ( - <Table className='rounded-md border'> + <Table className="rounded-md border"> <TableHeader> <TableRow> {columns.map(column => <TableHead key={column.key}>{column.label}</TableHead>)} @@ -108,7 +108,7 @@ export default function UsersList({ users }: Props) { {columns.map(column => <TableCell>{renderCell(user, column.key)}</TableCell>)} </TableRow> )) - :[] + : [] } </TableBody> </Table> diff --git a/packages/web/components/wrapper.tsx b/packages/web/components/wrapper.tsx index 1481555..8acc949 100644 --- a/packages/web/components/wrapper.tsx +++ b/packages/web/components/wrapper.tsx @@ -1,8 +1,8 @@ 'use client' -import type { CSSProperties, ReactNode } from 'react' import { forwardRef } from 'react' import { twMerge } from 'tailwind-merge' +import { type CSSProperties, type ReactNode } from 'react' interface Props { children: ReactNode @@ -13,8 +13,8 @@ interface Props { const Wrapper = forwardRef<HTMLDivElement, Props>(({ children, className, style, ...props }, ref) => { return ( <div - className={twMerge('container mx-auto py-4', className)} ref={ref} + className={twMerge('container mx-auto py-4', className)} style={style} {...props} > diff --git a/packages/web/db.ts b/packages/web/db.ts index d3bdb89..68345c3 100644 --- a/packages/web/db.ts +++ b/packages/web/db.ts @@ -19,7 +19,9 @@ function createClient() { if (!isLocalHost) { databaseUrl.host = `${databaseUrl.host}` - if (!isReadReplicaRegion) { databaseUrl.port = '5432' } + if (!isReadReplicaRegion) { + databaseUrl.port = '5432' + } } console.warn(`🔌 setting up prisma client to ${databaseUrl.host}`) @@ -112,14 +114,14 @@ const methods = [ '$queryRaw', '$queryRawUnsafe', ] -function createProxy<T extends Object>(target: T, tempLink: any[] = []): T { +function createProxy<T extends object>(target: T, tempLink: any[] = []): T { return new Proxy(target, { get(_target, prop: string) { if (!prop.includes('$')) { tempLink.push(prop) } if (operates.includes(prop)) { - return async(args: any) => { + return async (args: any) => { tempLink.push(args) const result = await handleFetch(tempLink) tempLink.length = 0 @@ -128,7 +130,7 @@ function createProxy<T extends Object>(target: T, tempLink: any[] = []): T { } if (methods.includes(prop)) { tempLink.push(prop) - return async(args: any) => { + return async (args: any) => { tempLink.push(args) const result = await handleFetch(tempLink) tempLink.length = 0 @@ -142,10 +144,10 @@ function createProxy<T extends Object>(target: T, tempLink: any[] = []): T { export function getPrisma() { if (typeof window === 'undefined') { - if (!global.__db__) { - global.__db__ = createClient() + if (!globalThis.__db__) { + globalThis.__db__ = createClient() } - return global.__db__ + return globalThis.__db__ } const tempLink: any[] = [] return createProxy({} as PrismaClient, tempLink) diff --git a/packages/web/environment.d.ts b/packages/web/environment.d.ts index db97615..1050e3a 100644 --- a/packages/web/environment.d.ts +++ b/packages/web/environment.d.ts @@ -1,5 +1,4 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ - +/* eslint-disable unused-imports/no-unused-vars */ namespace NodeJS { interface ProcessEnv { NEXT_PUBLIC_VERSION: number diff --git a/packages/web/fs.ts b/packages/web/fs.ts index c2763b2..2019c14 100644 --- a/packages/web/fs.ts +++ b/packages/web/fs.ts @@ -45,12 +45,12 @@ const methods = [ 'mkdtemp', 'writeFile', 'appendFile', 'readFile', 'watch', ] -function createProxy<T extends Object>(target: T, tempLink: any[] = []): T { +function createProxy<T extends object>(target: T, tempLink: any[] = []): T { return new Proxy(target, { get(_target, prop: string) { if (methods.includes(prop)) { tempLink.push(prop) - return async(...args: any[]) => { + return async (...args: any[]) => { tempLink.push(args) const result = await handleFetch(tempLink) tempLink.length = 0 @@ -64,10 +64,11 @@ function createProxy<T extends Object>(target: T, tempLink: any[] = []): T { export function getFs() { if (typeof window === 'undefined') { - if (!global.__fs__) { - global.__fs__ = require('node:fs/promises') + if (!globalThis.__fs__) { + // eslint-disable-next-line @typescript-eslint/no-require-imports + globalThis.__fs__ = require('node:fs/promises') } - return global.__fs__ + return globalThis.__fs__ } const tempLink: any[] = [] return createProxy({} as typeof import('node:fs/promises'), tempLink) diff --git a/packages/web/hooks/use-infinite.ts b/packages/web/hooks/use-infinite.ts index 4e26bc8..aee1a2e 100644 --- a/packages/web/hooks/use-infinite.ts +++ b/packages/web/hooks/use-infinite.ts @@ -37,7 +37,7 @@ export function useInfinite<T = any>( ...prevState, data: !pagination ? prevState.data - ? res.length + ? res.length > 0 ? [...prevState.data, ...res] : res : res @@ -47,13 +47,13 @@ export function useInfinite<T = any>( })) return res }) - .catch((err) => { + .catch((error) => { callId === lastCallId.current && set(prevState => ({ ...prevState, - error: err, + error, isLoading: false, })) - return err + return error }) }, [keyLoading, state.size, pagination, ...deps]) useEffect(() => { @@ -66,7 +66,7 @@ export function useInfinite<T = any>( }, deps) const isEmpty = useMemo(() => state.result?.[0]?.length === 0, [state.result]) const isReachingEnd = useMemo( - () => isEmpty || (state.result && state.result[state.result.length - 1]?.length < PAGE_SIZE), + () => isEmpty || (state.result && (state.result.at(-1)?.length ?? 0) < PAGE_SIZE), [isEmpty, state.result], ) const setSize = useCallback((value: number) => { diff --git a/packages/web/hooks/use-invite-member.ts b/packages/web/hooks/use-invite-member.ts index adda7b2..8665b9a 100644 --- a/packages/web/hooks/use-invite-member.ts +++ b/packages/web/hooks/use-invite-member.ts @@ -7,7 +7,7 @@ import { serviceBindProjectMembers } from '~/services/users' export function useInviteMember() { const [inviteValue, setInviteValue] = useAtom(inviteAtom) useEffectOnce(() => { - (async() => { + (async () => { if (inviteValue) { const user = (await getSession())?.user // @ts-expect-error next-auth types are wrong diff --git a/packages/web/hooks/use-query.ts b/packages/web/hooks/use-query.ts index 6171a27..0050b5f 100644 --- a/packages/web/hooks/use-query.ts +++ b/packages/web/hooks/use-query.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useRef, useState } from 'react' -import {useToast} from '~/components/ui/use-toast' +import { useToast } from '~/components/ui/use-toast' interface State<T> { isLoading: boolean @@ -15,7 +15,7 @@ export function useQuery<T = any>( fn: () => (Promise<T>), options?: Options, ) { - const {toast} = useToast() + const { toast } = useToast() const { enabled = true, deps = [] } = options ?? {} const lastCallId = useRef(0) const [state, set] = useState<State<T>>({ isLoading: false }) @@ -36,20 +36,20 @@ export function useQuery<T = any>( } return res }) - .catch((err) => { + .catch((error) => { if (callId === lastCallId.current) { set(prevState => ({ ...prevState, - error: err, + error, isLoading: false, })) toast({ title: 'Error', - description: err.message, - status: 'error', + description: error.message, + variant: 'destructive', }) } - return err + return error }) }, [fn, ...deps]) useEffect(() => { diff --git a/packages/web/libs/middleware.ts b/packages/web/libs/middleware.ts index 73bc5a5..f39d229 100644 --- a/packages/web/libs/middleware.ts +++ b/packages/web/libs/middleware.ts @@ -1,6 +1,6 @@ -import type { User } from '@prisma/client' -import type { Session } from 'next-auth' import { getServerSession } from 'next-auth' +import { type User } from '@prisma/client' +import { type Session } from 'next-auth' import { getAuthOptions } from '~/auth' export async function getAuth() { diff --git a/packages/web/libs/utils.tsx b/packages/web/libs/utils.tsx index 558873e..46381a8 100644 --- a/packages/web/libs/utils.tsx +++ b/packages/web/libs/utils.tsx @@ -63,7 +63,7 @@ export function getMessageAndIconByActionType(action: OhbugAction): { if (action.data?.selector) { return { message: action.data?.selector, - icon: <i className="i-ri-cursor-fill"></i>, + icon: <i className="i-ri-cursor-fill" />, color: 'gray', } } @@ -71,10 +71,10 @@ export function getMessageAndIconByActionType(action: OhbugAction): { message: ( <> <span>{action.message}</span>{' '} - <span className='text-stone-500'>{renderStringOrJson(action.data)}</span> + <span className="text-stone-500">{renderStringOrJson(action.data)}</span> </> ), - icon: <i className="i-ri-cursor-fill"></i>, + icon: <i className="i-ri-cursor-fill" />, color: 'gray', } case 'navigation': @@ -85,7 +85,7 @@ export function getMessageAndIconByActionType(action: OhbugAction): { <strong>To:</strong> <em>{action.data?.to}</em> </> ), - icon: <i className="i-ri-router-fill"></i>, + icon: <i className="i-ri-router-fill" />, color: 'gray', } case 'ajax': @@ -96,7 +96,7 @@ export function getMessageAndIconByActionType(action: OhbugAction): { <em>{action.data?.req?.url}</em>{' '} </> ), - icon: <i className="i-ri-loader-2-fill"></i>, + icon: <i className="i-ri-loader-2-fill" />, color: 'gray', } case 'fetch': @@ -107,19 +107,19 @@ export function getMessageAndIconByActionType(action: OhbugAction): { <em>{action.data?.req?.url}</em>{' '} </> ), - icon: <i className="i-ri-loader-2-fill"></i>, + icon: <i className="i-ri-loader-2-fill" />, color: 'gray', } case 'console': return { message: `[${action.message}] ${JSON.stringify(action.data)}`, - icon: <i className="i-ri-terminal-box-fill"></i>, + icon: <i className="i-ri-terminal-box-fill" />, color: 'gray', } case 'exception': return { message: renderStringOrJson(action.message), - icon: <i className="i-ri-bug-fill"></i>, + icon: <i className="i-ri-bug-fill" />, color: 'red', } default: @@ -127,10 +127,10 @@ export function getMessageAndIconByActionType(action: OhbugAction): { message: ( <> <span>{action.message}</span>{' '} - <span className='text-stone-500'>{renderStringOrJson(action.data)}</span> + <span className="text-stone-500">{renderStringOrJson(action.data)}</span> </> ), - icon: <i className="i-ri-gift-2-fill"></i>, + icon: <i className="i-ri-gift-2-fill" />, color: 'gray', } } diff --git a/packages/web/middleware.ts b/packages/web/middleware.ts index ad3f84d..7f7947e 100644 --- a/packages/web/middleware.ts +++ b/packages/web/middleware.ts @@ -23,7 +23,7 @@ const authMiddleware = withAuth( ) export default function middleware(req: NextRequest) { - const publicPathnameRegex = RegExp( + const publicPathnameRegex = new RegExp( `^(/(${locales.join('|')}))?(${publicPages.join('|')})?/?$`, 'i', ) diff --git a/packages/web/next.config.js b/packages/web/next.config.js index d7ea109..aa4449a 100644 --- a/packages/web/next.config.js +++ b/packages/web/next.config.js @@ -1,9 +1,7 @@ /** @type {import('next').NextConfig} */ const nextConfig = { output: 'standalone', - experimental: { - serverActions: true, - }, + experimental: { serverActions: true }, webpack: (config) => { config.resolve.fallback = { 'node:fs': false, diff --git a/packages/web/package.json b/packages/web/package.json index 9af6c1d..3037b98 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -11,7 +11,7 @@ "@egoist/tailwindcss-icons": "^1.1.0", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", - "@hookform/resolvers": "^3.3.0", + "@hookform/resolvers": "^3.3.1", "@iconify-json/ri": "^1.1.12", "@next-auth/prisma-adapter": "^1.0.7", "@ohbug/extension-feedback": "^0.7.2", @@ -25,6 +25,7 @@ "@radix-ui/react-dialog": "^1.0.4", "@radix-ui/react-dropdown-menu": "^2.0.5", "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-navigation-menu": "^1.1.3", "@radix-ui/react-popover": "^1.0.6", "@radix-ui/react-select": "^1.2.2", "@radix-ui/react-separator": "^1.0.3", @@ -37,7 +38,7 @@ "@types/nprogress": "^0.2.0", "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", - "@types/ua-parser-js": "^0.7.36", + "@types/ua-parser-js": "^0.7.37", "autoprefixer": "^10.4.15", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", @@ -45,17 +46,17 @@ "common": "workspace:*", "config": "workspace:*", "downshift": "^8.1.0", - "framer-motion": "^10.16.1", + "framer-motion": "^10.16.2", "highcharts": "^11.1.0", "highcharts-react-official": "^3.2.0", - "jotai": "^2.4.0", - "lucide-react": "^0.269.0", + "jotai": "^2.4.1", + "lucide-react": "^0.274.0", "next": "^13.4.19", "next-auth": "^4.23.1", "next-intl": "^2.20.0", "next-themes": "^0.2.1", "nprogress": "^0.2.0", - "postcss": "^8.4.28", + "postcss": "^8.4.29", "react": "^18.2.0", "react-dom": "^18.2.0", "react-hook-form": "^7.45.4", @@ -66,7 +67,7 @@ "rrweb-player": "^1.0.0-alpha.4", "source-map-trace": "^0.2.6", "tailwind-merge": "^1.14.0", - "tailwindcss-animate": "^1.0.6", + "tailwindcss-animate": "^1.0.7", "ua-parser-js": "^1.0.35", "web-vitals": "^3.4.0", "zod": "^3.22.2", diff --git a/packages/web/services/alerts.ts b/packages/web/services/alerts.ts index d883881..0d514d2 100644 --- a/packages/web/services/alerts.ts +++ b/packages/web/services/alerts.ts @@ -1,7 +1,7 @@ -import type { Prisma } from '@prisma/client' -import type { OmitAlert, Pagination } from 'common' import { pagination } from 'common' import dayjs from 'dayjs' +import { type Prisma } from '@prisma/client' +import { type OmitAlert, type Pagination } from 'common' import { getPrisma } from '~/db' export function serviceCreateAlert({ projectId, ...alert }: OmitAlert) { @@ -91,7 +91,7 @@ export async function serviceGetAlertEventTrends({ id, type }: ServiceGetAlertEv time: dayjs(v.time).utc().tz(dayjs.tz.guess()).format(format), })) - return Array.from(new Array(interval + 1)).map((_, index) => { + return Array.from(Array.from({ length: interval + 1 })).map((_, index) => { const time = dayjs(min).add(index, unit).format(format) const match = trends.find(v => (v.time === time)) if (match) return match diff --git a/packages/web/services/eventUsers.ts b/packages/web/services/event-users.ts similarity index 97% rename from packages/web/services/eventUsers.ts rename to packages/web/services/event-users.ts index 04af62f..c931f36 100644 --- a/packages/web/services/eventUsers.ts +++ b/packages/web/services/event-users.ts @@ -1,5 +1,5 @@ -import type { Pagination } from 'common' import { PAGE_SIZE, pagination } from 'common' +import { type Pagination } from 'common' import { getPrisma } from '~/db' interface ServiceGetEventUsersParams extends Pagination { diff --git a/packages/web/services/events.ts b/packages/web/services/events.ts index ea12f47..7d96f78 100644 --- a/packages/web/services/events.ts +++ b/packages/web/services/events.ts @@ -1,6 +1,6 @@ import { getStackFrame, getTheSourceByError } from 'source-map-trace' -import type { OhbugEventLike, Pagination, ReceiveSourceMapFile } from 'common' import { PAGE_SIZE, pagination } from 'common' +import { type OhbugEventLike, type Pagination, type ReceiveSourceMapFile } from 'common' import { serviceGetProject } from './projects' import { getPrisma } from '~/db' @@ -65,12 +65,14 @@ export async function serviceGetEventSource(event: OhbugEventLike) { const sourceFileName = originalname.split('.map')[0] return stackFrame.fileName?.includes(sourceFileName) }) - if (sourceMapTarget) { return getTheSourceByError(sourceMapTarget.path, event.detail) } + if (sourceMapTarget) { + return getTheSourceByError(sourceMapTarget.path, event.detail) + } } } return undefined } - catch (_) { + catch { return undefined } } diff --git a/packages/web/services/feedbacks.ts b/packages/web/services/feedbacks.ts index fa39a2c..df59eb3 100644 --- a/packages/web/services/feedbacks.ts +++ b/packages/web/services/feedbacks.ts @@ -1,5 +1,5 @@ -import type { Pagination } from 'common' import { PAGE_SIZE, pagination } from 'common' +import { type Pagination } from 'common' import { serviceGetProject } from './projects' import { getPrisma } from '~/db' diff --git a/packages/web/services/issues.ts b/packages/web/services/issues.ts index 64a35fd..00d098d 100644 --- a/packages/web/services/issues.ts +++ b/packages/web/services/issues.ts @@ -1,7 +1,7 @@ import dayjs from 'dayjs' -import type { Pagination } from 'common' import { PAGE_SIZE, pagination } from 'common' -import type { Prisma } from '@prisma/client' +import { type Prisma } from '@prisma/client' +import { type Pagination } from 'common' import { serviceGetProject } from './projects' import { getPrisma } from '~/db' @@ -68,7 +68,7 @@ export async function serviceGetIssuesTrends({ ids, type }: ServiceGetIssuesTren })) return ids.split(',').reduce<serviceGetIssuesTrendsReturn>((acc, issueId) => { - acc[issueId] = Array.from(new Array(interval + 1)).map((_, index) => { + acc[issueId] = Array.from(Array.from({ length: interval + 1 })).map((_, index) => { const time = dayjs(min).add(index, unit).format(format) const match = trends.find(v => (v.time === time) && (v.issueId === issueId)) if (match) return match diff --git a/packages/web/services/metrics.ts b/packages/web/services/metrics.ts index 5568de9..14ca093 100644 --- a/packages/web/services/metrics.ts +++ b/packages/web/services/metrics.ts @@ -1,5 +1,5 @@ import dayjs from 'dayjs' -import type { MetricType } from 'common' +import { type MetricType } from 'common' import { getPrisma } from '~/db' interface ServiceGetMetricsTrendsParams { @@ -34,7 +34,7 @@ export async function serviceGetMetricsTrends({ projectId, type, metric }: Servi time: dayjs(v.time).utc().tz(dayjs.tz.guess()).format(format), })) - return Array.from(new Array(interval + 1)).map((_, index) => { + return Array.from(Array.from({ length: interval + 1 })).map((_, index) => { const time = dayjs(min).add(index, unit).format(format) const match = trends.find(v => (v.time === time)) if (match) return match diff --git a/packages/web/services/projects.ts b/packages/web/services/projects.ts index 07b79af..b167da7 100644 --- a/packages/web/services/projects.ts +++ b/packages/web/services/projects.ts @@ -1,6 +1,6 @@ -import type { Project, User } from '@prisma/client' import dayjs from 'dayjs' -import type { ProjectWithEventCount, ProjectWithMembers } from 'common' +import { type ProjectWithEventCount, type ProjectWithMembers } from 'common' +import { type Project, type User } from '@prisma/client' import { getPrisma } from '~/db' export async function serviceGetProject(id: number) { @@ -38,7 +38,7 @@ export async function serviceGetProjectsWithEventCount(user: User): Promise<Proj try { eventCount = await getPrisma().event.count({ where: { apiKey: project.apiKey } }) } - catch (_) {} + catch {} projectWithEventCounts.push({ ...project, eventCount, @@ -55,7 +55,7 @@ interface ServiceCreateProjectData { export async function serviceCreateProject(data: ServiceCreateProjectData, user: User) { let isDefault = false const projects = await serviceGetProjects(user) - if (!projects.length) isDefault = true + if (projects.length === 0) isDefault = true const userId = user.id ?? (await getPrisma().user.findUnique({ where: { email: user.email! } }))?.id return getPrisma().project.create({ @@ -103,7 +103,7 @@ export async function serviceGetProjectTrends({ id, type }: ServiceGetProjectTre time: dayjs(v.time).utc().tz(dayjs.tz.guess()).format(format), })) - return Array.from(new Array(interval + 1)).map((_, index) => { + return Array.from(Array.from({ length: interval + 1 })).map((_, index) => { const time = dayjs(min).add(index, unit).format(format) const match = trends.find(v => (v.time === time)) if (match) return match diff --git a/packages/web/services/releases.ts b/packages/web/services/releases.ts index 868a3e4..f2aee6c 100644 --- a/packages/web/services/releases.ts +++ b/packages/web/services/releases.ts @@ -1,6 +1,6 @@ -import type { Pagination } from 'common' import { pagination } from 'common' -import type { Prisma } from '@prisma/client' +import { type Prisma } from '@prisma/client' +import { type Pagination } from 'common' import { getPrisma } from '~/db' import { getFs } from '~/fs' @@ -34,6 +34,6 @@ export async function serviceDeleteRelease({ id }: ServiceGetReleaseParams) { } } } - catch (e) {} + catch {} return getPrisma().release.delete({ where: { id } }) } diff --git a/packages/web/services/users.ts b/packages/web/services/users.ts index a111f71..2662189 100644 --- a/packages/web/services/users.ts +++ b/packages/web/services/users.ts @@ -23,9 +23,7 @@ export async function serviceLogin({ email, password }: ServiceCreateUserParams) const pass = md5(md5(password)) const user = await getPrisma().user.findUnique({ where: { email } }) if (user) { - if (user.password) { - if (user.password === pass) return user - } + if (user.password && user.password === pass) return user throw new Error('Login failed email or password error') } return serviceCreateUser({ email, password }) diff --git a/packages/web/services/views.ts b/packages/web/services/views.ts index 83d4d86..fff33c7 100644 --- a/packages/web/services/views.ts +++ b/packages/web/services/views.ts @@ -1,4 +1,4 @@ -import type { Prisma } from '@prisma/client' +import { type Prisma } from '@prisma/client' import { getPrisma } from '~/db' interface serviceGetUserViewParams { diff --git a/packages/web/store/index.ts b/packages/web/store/index.ts index 93f9bc1..9d4a0dd 100644 --- a/packages/web/store/index.ts +++ b/packages/web/store/index.ts @@ -1,6 +1,6 @@ import { create } from 'zustand' -import type { ProjectSlice } from './project' import { createProjectSlice } from './project' +import { type ProjectSlice } from './project' type StoreState = ProjectSlice diff --git a/packages/web/store/project.ts b/packages/web/store/project.ts index 5f714b8..b3001ef 100644 --- a/packages/web/store/project.ts +++ b/packages/web/store/project.ts @@ -1,5 +1,5 @@ -import type { Project } from '@prisma/client' -import type { StateCreator } from 'zustand' +import { type Project } from '@prisma/client' +import { type StateCreator } from 'zustand' export interface ProjectSlice { project?: Project diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8a4b34a..b626aed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,47 +43,47 @@ importers: version: 0.2.6 devDependencies: '@antfu/ni': - specifier: ^0.21.6 - version: 0.21.6 + specifier: ^0.21.8 + version: 0.21.8 '@babel/types': specifier: ^7.22.11 version: 7.22.11 '@chenyueban/eslint-config': - specifier: ^3.0.5 - version: 3.0.5(eslint@8.48.0)(typescript@5.2.2) + specifier: ^3.0.8 + version: 3.0.8(eslint@8.48.0)(typescript@5.2.2) '@chenyueban/tsconfig': - specifier: ^3.0.5 - version: 3.0.5(typescript@5.2.2) + specifier: ^3.0.8 + version: 3.0.8(typescript@5.2.2) '@commitlint/cli': specifier: ^17.7.1 - version: 17.7.1(@swc/core@1.3.80) + version: 17.7.1(@swc/core@1.3.82) '@release-it/conventional-changelog': specifier: ^7.0.0 version: 7.0.0(release-it@16.1.5) '@swc/cli': specifier: ^0.1.62 - version: 0.1.62(@swc/core@1.3.80) + version: 0.1.62(@swc/core@1.3.82) '@swc/core': - specifier: ^1.3.80 - version: 1.3.80 + specifier: ^1.3.82 + version: 1.3.82 '@types/js-yaml': specifier: ^4.0.5 version: 4.0.5 '@types/node': - specifier: ^20.5.6 - version: 20.5.6 + specifier: ^20.5.8 + version: 20.5.8 '@types/ramda': specifier: ^0.29.3 version: 0.29.3 commitizen: specifier: ^4.3.0 - version: 4.3.0(@swc/core@1.3.80) + version: 4.3.0(@swc/core@1.3.82) cross-env: specifier: ^7.0.3 version: 7.0.3 cz-conventional-changelog: specifier: ^3.3.0 - version: 3.3.0(@swc/core@1.3.80) + version: 3.3.0(@swc/core@1.3.82) eslint: specifier: ^8.48.0 version: 8.48.0 @@ -107,10 +107,10 @@ importers: version: 0.11.2 tsup: specifier: ^7.2.0 - version: 7.2.0(@swc/core@1.3.80)(ts-node@10.9.1)(typescript@5.2.2) + version: 7.2.0(@swc/core@1.3.82)(ts-node@10.9.1)(typescript@5.2.2) tsx: - specifier: ^3.12.7 - version: 3.12.7 + specifier: ^3.12.8 + version: 3.12.8 typescript: specifier: ^5.2.2 version: 5.2.2 @@ -131,34 +131,34 @@ importers: dependencies: '@nestjs/axios': specifier: ^3.0.0 - version: 3.0.0(@nestjs/common@10.2.1)(axios@1.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + version: 3.0.0(@nestjs/common@10.2.4)(axios@1.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/bull': specifier: ^10.0.1 - version: 10.0.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(bull@4.11.3) + version: 10.0.1(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(bull@4.11.3) '@nestjs/cli': - specifier: ^10.1.16 - version: 10.1.16(@swc/cli@0.1.62)(@swc/core@1.3.80)(esbuild@0.18.19) + specifier: ^10.1.17 + version: 10.1.17(@swc/cli@0.1.62)(@swc/core@1.3.82)(esbuild@0.18.19) '@nestjs/common': - specifier: ^10.2.1 - version: 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.2.4 + version: 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': - specifier: ^10.2.1 - version: 10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.2.4 + version: 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/mapped-types': specifier: ^2.0.2 - version: 2.0.2(@nestjs/common@10.2.1)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + version: 2.0.2(@nestjs/common@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) '@nestjs/platform-fastify': - specifier: ^10.2.1 - version: 10.2.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1) + specifier: ^10.2.4 + version: 10.2.4(@nestjs/common@10.2.4)(@nestjs/core@10.2.4) '@nestjs/schedule': specifier: ^3.0.3 - version: 3.0.3(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(reflect-metadata@0.1.13) + version: 3.0.3(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(reflect-metadata@0.1.13) '@nestjs/schematics': specifier: ^10.0.2 version: 10.0.2(typescript@5.2.2) '@nestjs/swagger': - specifier: ^7.1.8 - version: 7.1.8(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + specifier: ^7.1.10 + version: 7.1.10(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) '@types/bull': specifier: ^4.10.0 version: 4.10.0 @@ -169,14 +169,14 @@ importers: specifier: ^4.17.17 version: 4.17.17 '@types/markdown-it': - specifier: ^13.0.0 - version: 13.0.0 + specifier: ^13.0.1 + version: 13.0.1 '@types/nodemailer': specifier: ^6.4.9 version: 6.4.9 '@webundsoehne/nest-fastify-file-upload': specifier: ^2.1.0 - version: 2.1.0(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(@nestjs/platform-fastify@10.2.1) + version: 2.1.0(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(@nestjs/platform-fastify@10.2.4) bull: specifier: ^4.11.3 version: 4.11.3 @@ -193,8 +193,8 @@ importers: specifier: workspace:* version: link:../config cron: - specifier: ^2.4.1 - version: 2.4.1 + specifier: ^2.4.3 + version: 2.4.3 dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -209,7 +209,7 @@ importers: version: 3.3.6 nestjs-pino: specifier: ^3.4.0 - version: 3.4.0(@nestjs/common@10.2.1)(pino-http@8.4.0) + version: 3.4.0(@nestjs/common@10.2.4)(pino-http@8.4.0) pino: specifier: ^8.15.0 version: 8.15.0 @@ -234,7 +234,7 @@ importers: version: 9.4.4(typescript@5.2.2)(webpack@5.88.2) ts-node: specifier: ^10.9.1 - version: 10.9.1(@swc/core@1.3.80)(@types/node@20.5.6)(typescript@5.2.2) + version: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.8)(typescript@5.2.2) packages/web: dependencies: @@ -248,8 +248,8 @@ importers: specifier: ^11.11.0 version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.21)(react@18.2.0) '@hookform/resolvers': - specifier: ^3.3.0 - version: 3.3.0(react-hook-form@7.45.4) + specifier: ^3.3.1 + version: 3.3.1(react-hook-form@7.45.4) '@iconify-json/ri': specifier: ^1.1.12 version: 1.1.12 @@ -289,6 +289,9 @@ importers: '@radix-ui/react-label': specifier: ^2.0.2 version: 2.0.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-navigation-menu': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-popover': specifier: ^1.0.6 version: 1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) @@ -326,11 +329,11 @@ importers: specifier: ^18.2.7 version: 18.2.7 '@types/ua-parser-js': - specifier: ^0.7.36 - version: 0.7.36 + specifier: ^0.7.37 + version: 0.7.37 autoprefixer: specifier: ^10.4.15 - version: 10.4.15(postcss@8.4.28) + version: 10.4.15(postcss@8.4.29) class-variance-authority: specifier: ^0.7.0 version: 0.7.0 @@ -350,8 +353,8 @@ importers: specifier: ^8.1.0 version: 8.1.0(react@18.2.0) framer-motion: - specifier: ^10.16.1 - version: 10.16.1(react-dom@18.2.0)(react@18.2.0) + specifier: ^10.16.2 + version: 10.16.2(react-dom@18.2.0)(react@18.2.0) highcharts: specifier: ^11.1.0 version: 11.1.0 @@ -359,11 +362,11 @@ importers: specifier: ^3.2.0 version: 3.2.0(highcharts@11.1.0)(react@18.2.0) jotai: - specifier: ^2.4.0 - version: 2.4.0(@types/react@18.2.21)(react@18.2.0) + specifier: ^2.4.1 + version: 2.4.1(@types/react@18.2.21)(react@18.2.0) lucide-react: - specifier: ^0.269.0 - version: 0.269.0(react@18.2.0) + specifier: ^0.274.0 + version: 0.274.0(react@18.2.0) next: specifier: ^13.4.19 version: 13.4.19(react-dom@18.2.0)(react@18.2.0) @@ -380,8 +383,8 @@ importers: specifier: ^0.2.0 version: 0.2.0 postcss: - specifier: ^8.4.28 - version: 8.4.28 + specifier: ^8.4.29 + version: 8.4.29 react: specifier: ^18.2.0 version: 18.2.0 @@ -413,8 +416,8 @@ importers: specifier: ^1.14.0 version: 1.14.0 tailwindcss-animate: - specifier: ^1.0.6 - version: 1.0.6(tailwindcss@3.3.3) + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.3.3) ua-parser-js: specifier: ^1.0.35 version: 1.0.35 @@ -525,8 +528,8 @@ packages: find-up: 5.0.0 dev: false - /@antfu/ni@0.21.6: - resolution: {integrity: sha512-Hj0BKIOspbo+OsPT5mjONeqpuVb4bxp9jdJ4p/b5GxgYNIqJjBcJdp0DEON7CJflKoWuHf7I52wO5kOJJ4DveQ==} + /@antfu/ni@0.21.8: + resolution: {integrity: sha512-90X8pU2szlvw0AJo9EZMbYc2eQKkmO7mAdC4tD4r5co2Mm56MT37MIG8EyB7p4WRheuzGxuLDxJ63mF6+Zajiw==} hasBin: true dev: true @@ -585,26 +588,26 @@ packages: '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 - /@chenyueban/eslint-config@3.0.5(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-whFg8PUas0gBw6wF+bO2l7YhWuGMoaA19MKPGxlgWRTJ5GlmIeo1Qa58swy6tewCBKScpUyatwgXl04PWVn/Cw==} + /@chenyueban/eslint-config@3.0.8(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-J0vRwfjvohKyV9q7DK6IUq/sGOxKS5l/Ax/DYOdG7vtwQi9oHbn7ktH+LNuZrwR0YTJvzBKT/vivixbBBJE+Zg==} engines: {node: '>=16', npm: '>=7'} peerDependencies: eslint: ^8.0.0 dependencies: - '@eslint/js': 8.47.0 - '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.48.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.4.1(eslint@8.48.0)(typescript@5.2.2) + '@eslint/js': 8.48.0 + '@typescript-eslint/eslint-plugin': 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) eslint: 8.48.0 eslint-define-config: 1.23.0 - eslint-plugin-antfu: 0.40.3(eslint@8.48.0)(typescript@5.2.2) + eslint-plugin-antfu: 0.41.0(eslint@8.48.0)(typescript@5.2.2) eslint-plugin-eslint-comments: 3.2.0(eslint@8.48.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.48.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint@8.48.0) eslint-plugin-jsonc: 2.9.0(eslint@8.48.0) eslint-plugin-markdown: 3.0.1(eslint@8.48.0) eslint-plugin-react: 7.33.2(eslint@8.48.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.48.0) eslint-plugin-unicorn: 48.0.1(eslint@8.48.0) - eslint-plugin-unused-imports: 3.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.48.0) + eslint-plugin-unused-imports: 3.0.0(@typescript-eslint/eslint-plugin@6.5.0)(eslint@8.48.0) eslint-plugin-vue: 9.17.0(eslint@8.48.0) eslint-plugin-yml: 1.8.0(eslint@8.48.0) globals: 13.21.0 @@ -619,8 +622,8 @@ packages: - typescript dev: true - /@chenyueban/tsconfig@3.0.5(typescript@5.2.2): - resolution: {integrity: sha512-6MfWp0G3XWJwgpx6OIm62JM3S4kaIYehxdUEn+UX1zXbvny1Zmj8j4jq5holO5aGsrkodw5nGBFlGAQ9Hu79AQ==} + /@chenyueban/tsconfig@3.0.8(typescript@5.2.2): + resolution: {integrity: sha512-JT7Qc1xD5bjiFK2dWdy0w52/Z1sQkahf5jr2ltQXDjI4sJamA31uSed6RvGfshRYXgIqCz3hewgjpJgH2Go6Fg==} engines: {node: '>=16', npm: '>=7'} peerDependencies: typescript: ^4.4.2 @@ -635,14 +638,14 @@ packages: dev: false optional: true - /@commitlint/cli@17.7.1(@swc/core@1.3.80): + /@commitlint/cli@17.7.1(@swc/core@1.3.82): resolution: {integrity: sha512-BCm/AT06SNCQtvFv921iNhudOHuY16LswT0R3OeolVGLk8oP+Rk9TfQfgjH7QPMjhvp76bNqGFEcpKojxUNW1g==} engines: {node: '>=v14'} hasBin: true dependencies: '@commitlint/format': 17.4.4 '@commitlint/lint': 17.7.0 - '@commitlint/load': 17.7.1(@swc/core@1.3.80) + '@commitlint/load': 17.7.1(@swc/core@1.3.82) '@commitlint/read': 17.5.1 '@commitlint/types': 17.4.4 execa: 5.1.1 @@ -708,7 +711,7 @@ packages: '@commitlint/types': 17.4.4 dev: true - /@commitlint/load@17.7.1(@swc/core@1.3.80): + /@commitlint/load@17.7.1(@swc/core@1.3.82): resolution: {integrity: sha512-S/QSOjE1ztdogYj61p6n3UbkUvweR17FQ0zDbNtoTLc+Hz7vvfS7ehoTMQ27hPSjVBpp7SzEcOQu081RLjKHJQ==} engines: {node: '>=v14'} dependencies: @@ -724,7 +727,7 @@ packages: lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@swc/core@1.3.80)(@types/node@20.5.6)(typescript@5.2.2) + ts-node: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.8)(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - '@swc/core' @@ -949,33 +952,24 @@ packages: /@esbuild-kit/cjs-loader@2.4.2: resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} dependencies: - '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/core-utils': 3.2.2 get-tsconfig: 4.6.2 dev: true - /@esbuild-kit/core-utils@3.1.0: - resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} + /@esbuild-kit/core-utils@3.2.2: + resolution: {integrity: sha512-Ub6LaRaAgF80dTSzUdXpFLM1pVDdmEVB9qb5iAzSpyDlX/mfJTFGOnZ516O05p5uWWteNviMKi4PAyEuRxI5gA==} dependencies: - esbuild: 0.17.19 + esbuild: 0.18.20 source-map-support: 0.5.21 dev: true /@esbuild-kit/esm-loader@2.5.5: resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} dependencies: - '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/core-utils': 3.2.2 get-tsconfig: 4.6.2 dev: true - /@esbuild/android-arm64@0.17.19: - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.18.19: resolution: {integrity: sha512-4+jkUFQxZkQfQOOxfGVZB38YUWHMJX2ihZwF+2nh8m7bHdWXpixiurgGRN3c/KMSwlltbYI0/i929jwBRMFzbA==} engines: {node: '>=12'} @@ -984,10 +978,10 @@ packages: requiresBuild: true optional: true - /@esbuild/android-arm@0.17.19: - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true @@ -1001,10 +995,10 @@ packages: requiresBuild: true optional: true - /@esbuild/android-x64@0.17.19: - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} - cpu: [x64] + cpu: [arm] os: [android] requiresBuild: true dev: true @@ -1018,11 +1012,11 @@ packages: requiresBuild: true optional: true - /@esbuild/darwin-arm64@0.17.19: - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] + cpu: [x64] + os: [android] requiresBuild: true dev: true optional: true @@ -1035,10 +1029,10 @@ packages: requiresBuild: true optional: true - /@esbuild/darwin-x64@0.17.19: - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} - cpu: [x64] + cpu: [arm64] os: [darwin] requiresBuild: true dev: true @@ -1052,11 +1046,11 @@ packages: requiresBuild: true optional: true - /@esbuild/freebsd-arm64@0.17.19: - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] + cpu: [x64] + os: [darwin] requiresBuild: true dev: true optional: true @@ -1069,10 +1063,10 @@ packages: requiresBuild: true optional: true - /@esbuild/freebsd-x64@0.17.19: - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} - cpu: [x64] + cpu: [arm64] os: [freebsd] requiresBuild: true dev: true @@ -1086,11 +1080,11 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-arm64@0.17.19: - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} - cpu: [arm64] - os: [linux] + cpu: [x64] + os: [freebsd] requiresBuild: true dev: true optional: true @@ -1103,10 +1097,10 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-arm@0.17.19: - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true @@ -1120,10 +1114,10 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-ia32@0.17.19: - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} - cpu: [ia32] + cpu: [arm] os: [linux] requiresBuild: true dev: true @@ -1137,10 +1131,10 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-loong64@0.17.19: - resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} - cpu: [loong64] + cpu: [ia32] os: [linux] requiresBuild: true dev: true @@ -1154,10 +1148,10 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-mips64el@0.17.19: - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} - cpu: [mips64el] + cpu: [loong64] os: [linux] requiresBuild: true dev: true @@ -1171,10 +1165,10 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-ppc64@0.17.19: - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} - cpu: [ppc64] + cpu: [mips64el] os: [linux] requiresBuild: true dev: true @@ -1188,10 +1182,10 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-riscv64@0.17.19: - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} - cpu: [riscv64] + cpu: [ppc64] os: [linux] requiresBuild: true dev: true @@ -1205,10 +1199,10 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-s390x@0.17.19: - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} - cpu: [s390x] + cpu: [riscv64] os: [linux] requiresBuild: true dev: true @@ -1222,10 +1216,10 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-x64@0.17.19: - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} - cpu: [x64] + cpu: [s390x] os: [linux] requiresBuild: true dev: true @@ -1239,11 +1233,11 @@ packages: requiresBuild: true optional: true - /@esbuild/netbsd-x64@0.17.19: - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} cpu: [x64] - os: [netbsd] + os: [linux] requiresBuild: true dev: true optional: true @@ -1256,11 +1250,11 @@ packages: requiresBuild: true optional: true - /@esbuild/openbsd-x64@0.17.19: - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} cpu: [x64] - os: [openbsd] + os: [netbsd] requiresBuild: true dev: true optional: true @@ -1273,11 +1267,11 @@ packages: requiresBuild: true optional: true - /@esbuild/sunos-x64@0.17.19: - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} cpu: [x64] - os: [sunos] + os: [openbsd] requiresBuild: true dev: true optional: true @@ -1290,11 +1284,11 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-arm64@0.17.19: - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} - cpu: [arm64] - os: [win32] + cpu: [x64] + os: [sunos] requiresBuild: true dev: true optional: true @@ -1307,10 +1301,10 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-ia32@0.17.19: - resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} - cpu: [ia32] + cpu: [arm64] os: [win32] requiresBuild: true dev: true @@ -1324,10 +1318,10 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-x64@0.17.19: - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} - cpu: [x64] + cpu: [ia32] os: [win32] requiresBuild: true dev: true @@ -1341,6 +1335,15 @@ packages: requiresBuild: true optional: true + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1373,11 +1376,6 @@ packages: - supports-color dev: true - /@eslint/js@8.47.0: - resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@eslint/js@8.48.0: resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1516,8 +1514,8 @@ packages: tslib: 2.6.1 dev: false - /@hookform/resolvers@3.3.0(react-hook-form@7.45.4): - resolution: {integrity: sha512-tgK3nWlfFLlqhqpXZmFMP3RN5E7mlbGfnM2h2ILVsW1TNGuFSod0ePW0grlIY2GAbL4pJdtmOT4HQSZsTwOiKg==} + /@hookform/resolvers@3.3.1(react-hook-form@7.45.4): + resolution: {integrity: sha512-K7KCKRKjymxIB90nHDQ7b9nli474ru99ZbqxiqDAWYsYhOsU3/4qLxW91y+1n04ic13ajjZ66L3aXbNef8PELQ==} peerDependencies: react-hook-form: ^7.0.0 dependencies: @@ -1707,7 +1705,7 @@ packages: dev: false optional: true - /@nestjs/axios@3.0.0(@nestjs/common@10.2.1)(axios@1.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + /@nestjs/axios@3.0.0(@nestjs/common@10.2.4)(axios@1.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): resolution: {integrity: sha512-ULdH03jDWkS5dy9X69XbUVbhC+0pVnrRcj7bIK/ytTZ76w7CgvTZDJqsIyisg3kNOiljRW/4NIjSf3j6YGvl+g==} peerDependencies: '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -1715,39 +1713,39 @@ packages: reflect-metadata: ^0.1.12 rxjs: ^6.0.0 || ^7.0.0 dependencies: - '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) axios: 1.4.0 reflect-metadata: 0.1.13 rxjs: 7.8.1 dev: false - /@nestjs/bull-shared@10.0.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1): + /@nestjs/bull-shared@10.0.1(@nestjs/common@10.2.4)(@nestjs/core@10.2.4): resolution: {integrity: sha512-8Td36l2i5x9+iQWjPB5Bd5+6u5Eangb5DclNcwrdwKqvd28xE92MSW97P4JV52C2kxrTjZwx8ck/wObAwtpQPw==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 dependencies: - '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) tslib: 2.6.0 dev: false - /@nestjs/bull@10.0.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(bull@4.11.3): + /@nestjs/bull@10.0.1(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(bull@4.11.3): resolution: {integrity: sha512-1GcJ8BkHDgQdBMZ7SqAqgUHiFnISXmpGvewFeTc8wf87JLk2PweiKv9j9/KQKU+NI237pCe82XB0bXzTnsdxSw==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 bull: ^3.3 || ^4.0.0 dependencies: - '@nestjs/bull-shared': 10.0.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1) - '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/bull-shared': 10.0.1(@nestjs/common@10.2.4)(@nestjs/core@10.2.4) + '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) bull: 4.11.3 tslib: 2.6.0 dev: false - /@nestjs/cli@10.1.16(@swc/cli@0.1.62)(@swc/core@1.3.80)(esbuild@0.18.19): - resolution: {integrity: sha512-nZ9vs7D0BMOW9XrN7hN7BJl2Z0s+CRFwhDPVmJP2lc50mDsAcnWDLFuttupPc/AknO570Xqoxf1Q2cQ5YSgjpA==} + /@nestjs/cli@10.1.17(@swc/cli@0.1.62)(@swc/core@1.3.82)(esbuild@0.18.19): + resolution: {integrity: sha512-jUEnR2DgC15Op+IhcRWb6cyJrhec9CUQO+GtxCF2Dv9MwLcr4sTDq1UOkfs09HAhpuI8otgF2LoWGTlW3qRuqg==} engines: {node: '>= 16'} hasBin: true peerDependencies: @@ -1763,8 +1761,8 @@ packages: '@angular-devkit/schematics': 16.2.0(chokidar@3.5.3) '@angular-devkit/schematics-cli': 16.2.0(chokidar@3.5.3) '@nestjs/schematics': 10.0.2(chokidar@3.5.3)(typescript@5.1.6) - '@swc/cli': 0.1.62(@swc/core@1.3.80) - '@swc/core': 1.3.80 + '@swc/cli': 0.1.62(@swc/core@1.3.82) + '@swc/core': 1.3.82 chalk: 4.1.2 chokidar: 3.5.3 cli-table3: 0.6.3 @@ -1781,7 +1779,7 @@ packages: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.1.6 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.18.19) + webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.19) webpack-node-externals: 3.0.0 transitivePeerDependencies: - esbuild @@ -1789,8 +1787,8 @@ packages: - webpack-cli dev: false - /@nestjs/common@10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-zo5OQbNmchV58SHw4vBCLIbsCrpZmNuW9W4m5BE1lB+9FW9ZiLQeZjIxzlL3bEKiI9cezRvDhct/53LPS8R4aA==} + /@nestjs/common@10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-3Lg4PUaSDucf14V8rPCH212NqrK09AJbY0NKqFsb4j5OIE+TuOzVZR/yjaJ8JNxH2hjskJNCZie0D/9tA2lzlA==} peerDependencies: class-transformer: '*' class-validator: '*' @@ -1807,12 +1805,12 @@ packages: iterare: 1.2.1 reflect-metadata: 0.1.13 rxjs: 7.8.1 - tslib: 2.6.1 + tslib: 2.6.2 uid: 2.0.2 dev: false - /@nestjs/core@10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-oH1jmCrVUkBkbeiEzAaYZ5unddn5bW/Id15pPGblYeLGAmfjXW9+G5VCffoGpO1DxBZdZu5/qcXTYyCR6rgXTg==} + /@nestjs/core@10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-aWeii2l+3pNCc9kIRdLbXQMvrgSZD0jZgXOZv7bZwVf9mClMMi7TussLI4On12VbqVE7LE3gsNgRTwgQJlVC8g==} requiresBuild: true peerDependencies: '@nestjs/common': ^10.0.0 @@ -1829,20 +1827,20 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 path-to-regexp: 3.2.0 reflect-metadata: 0.1.13 rxjs: 7.8.1 - tslib: 2.6.1 + tslib: 2.6.2 uid: 2.0.2 transitivePeerDependencies: - encoding dev: false - /@nestjs/mapped-types@2.0.2(@nestjs/common@10.2.1)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): + /@nestjs/mapped-types@2.0.2(@nestjs/common@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): resolution: {integrity: sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -1855,14 +1853,14 @@ packages: class-validator: optional: true dependencies: - '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) class-transformer: 0.5.1 class-validator: 0.14.0 reflect-metadata: 0.1.13 dev: false - /@nestjs/platform-fastify@10.2.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1): - resolution: {integrity: sha512-ROY2K5Rl1ADYAx8JfOwZDNXrS0TYOCFmWUx9lhfgpUV7ppWfMrA1tV0Kjo+SDSwMpExXbLcNRwVzNCsLTqH/Lg==} + /@nestjs/platform-fastify@10.2.4(@nestjs/common@10.2.4)(@nestjs/core@10.2.4): + resolution: {integrity: sha512-tkFjvAjWzhE0C8GzjESBA7QYeNomCy4F4j3gsfTrLKQVGWBRjAyjzfdV8gWxAz6I1RF7uV7fAQ6tpxepymqEwQ==} peerDependencies: '@fastify/static': ^6.0.0 '@fastify/view': ^7.0.0 || ^8.0.0 @@ -1877,25 +1875,25 @@ packages: '@fastify/cors': 8.3.0 '@fastify/formbody': 7.4.0 '@fastify/middie': 8.3.0 - '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - fastify: 4.21.0 + '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) + fastify: 4.22.0 light-my-request: 5.10.0 path-to-regexp: 3.2.0 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - supports-color dev: false - /@nestjs/schedule@3.0.3(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(reflect-metadata@0.1.13): + /@nestjs/schedule@3.0.3(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(reflect-metadata@0.1.13): resolution: {integrity: sha512-xsMA4dmP3LcW3rt2iMPfm88bDbCj/hLuDsLrKmJQlbnxyCYtBwLtmu/4cSfZELLM7pTDT+E8QDAqGwhYyUUjxg==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 reflect-metadata: ^0.1.12 dependencies: - '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) cron: 2.4.1 reflect-metadata: 0.1.13 uuid: 9.0.0 @@ -1931,8 +1929,8 @@ packages: - chokidar dev: false - /@nestjs/swagger@7.1.8(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): - resolution: {integrity: sha512-Jpl3laGAqvyWccc3auLU0mMjl5hJ2kqzzDb63ynJi5NMbFlgBwrR8FCGBVstSsqL9YSJWLR4L1BZzVmVExcY+g==} + /@nestjs/swagger@7.1.10(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-qreCcxgHFyFX1mOfK36pxiziy4xoa/XcxC0h4Zr9yH54WuqMqO9aaNFhFyuQ1iyd/3YBVQB21Un4gQnh9iGm0w==} peerDependencies: '@fastify/static': ^6.0.0 '@nestjs/common': ^9.0.0 || ^10.0.0 @@ -1948,16 +1946,16 @@ packages: class-validator: optional: true dependencies: - '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/mapped-types': 2.0.2(@nestjs/common@10.2.1)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/mapped-types': 2.0.2(@nestjs/common@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) class-transformer: 0.5.1 class-validator: 0.14.0 js-yaml: 4.1.0 lodash: 4.17.21 path-to-regexp: 3.2.0 reflect-metadata: 0.1.13 - swagger-ui-dist: 5.3.1 + swagger-ui-dist: 5.4.2 dev: false /@next-auth/prisma-adapter@1.0.7(@prisma/client@5.2.0)(next-auth@4.23.1): @@ -2373,7 +2371,7 @@ packages: resolution: {integrity: sha512-eAhFr8c+7Q6MtxvkwgEGAg91XZXoZzASIsUzoGQAqt/hlMIPHlsN9CO2Lxr012jBU/I/pnQteopq+sQbZQjKIA==} dependencies: '@ohbug/types': 2.2.1 - '@types/node': 20.5.6 + '@types/node': 20.5.8 dev: false /@ohbug/vue@2.0.10(vue@3.3.4): @@ -2945,6 +2943,40 @@ packages: react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) dev: false + /@radix-ui/react-navigation-menu@1.1.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-x4Uv0N47ABx3/frJazYXxvMpZeKJe0qmRIgQ2o3lhTqnTVg+CaZfVVO4nQLn3QJcDkTz8icElKffhFng47XIBA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.6 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@radix-ui/react-popover@1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA==} peerDependencies: @@ -3569,7 +3601,7 @@ packages: engines: {node: '>=14.16'} dev: true - /@swc/cli@0.1.62(@swc/core@1.3.80): + /@swc/cli@0.1.62(@swc/core@1.3.82): resolution: {integrity: sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==} engines: {node: '>= 12.13'} hasBin: true @@ -3581,95 +3613,95 @@ packages: optional: true dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.3.80 + '@swc/core': 1.3.82 commander: 7.2.0 fast-glob: 3.3.1 semver: 7.5.4 slash: 3.0.0 source-map: 0.7.4 - /@swc/core-darwin-arm64@1.3.80: - resolution: {integrity: sha512-rhoFTcQMUGfO7IkfOnopPSF6O0/aVJ58B7KueIKbvrMe6YvSfFj9QfObELFjYCcrJZTvUWBhig0QrsfPIiUphA==} + /@swc/core-darwin-arm64@1.3.82: + resolution: {integrity: sha512-JfsyDW34gVKD3uE0OUpUqYvAD3yseEaicnFP6pB292THtLJb0IKBBnK50vV/RzEJtc1bR3g1kNfxo2PeurZTrA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@swc/core-darwin-x64@1.3.80: - resolution: {integrity: sha512-0dOLedFpVXe+ugkKHXsqSxMKqvQYfFtibWbrZ7j8wOaErzSGPr0VpyWvepNVb9s046725kPXSw+fsGhqZR8wrw==} + /@swc/core-darwin-x64@1.3.82: + resolution: {integrity: sha512-ogQWgNMq7qTpITjcP3dnzkFNj7bh6SwMr859GvtOTrE75H7L7jDWxESfH4f8foB/LGxBKiDNmxKhitCuAsZK4A==} engines: {node: '>=10'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.80: - resolution: {integrity: sha512-QIjwP3PtDeHBDkwF6+ZZqdUsqAhORbMpxrw2jq3mHe4lQrxBttSFTq018vlMRo2mFEorOvXdadzaD9m+NymPrw==} + /@swc/core-linux-arm-gnueabihf@1.3.82: + resolution: {integrity: sha512-7TMXG1lXlNhD0kUiEqs+YlGV4irAdBa2quuy+XI3oJf2fBK6dQfEq4xBy65B3khrorzQS3O0oDGQ+cmdpHExHA==} engines: {node: '>=10'} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-gnu@1.3.80: - resolution: {integrity: sha512-cg8WriIueab58ZwkzXmIACnjSzFLzOBwxlC9k65gPXMNgCjab2YbqEYvAbjBqneuqaao02gW6tad2uhjgYaExw==} + /@swc/core-linux-arm64-gnu@1.3.82: + resolution: {integrity: sha512-26JkOujbzcItPAmIbD5vHJxQVy5ihcSu3YHTKwope1h28sApZdtE7S3e2G3gsZRTIdsCQkXUtAQeqHxGWWR3pw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-musl@1.3.80: - resolution: {integrity: sha512-AhdCQ7QKx5mWrtpaOA1mFRiWWvuiiUtspvo0QSpspDetRKTND1rlf/3UB5+gp0kCeCNUTsVmJWU7fIA9ICZtXA==} + /@swc/core-linux-arm64-musl@1.3.82: + resolution: {integrity: sha512-8Izj9tuuMpoc3cqiPBRtwqpO1BZ/+sfZVsEhLxrbOFlcSb8LnKyMle1g3JMMUwI4EU75RGVIzZMn8A6GOKdJbA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-gnu@1.3.80: - resolution: {integrity: sha512-+2e5oni1vOrLIjM5Q2/GIzK/uS2YEtuJqnjPvCK8SciRJsSl8OgVsRvyCDbmKeZNtJ2Q+o/O2AQ2w1qpAJG6jg==} + /@swc/core-linux-x64-gnu@1.3.82: + resolution: {integrity: sha512-0GSrIBScQwTaPv46T2qB7XnDYxndRCpwH4HMjh6FN+I+lfPUhTSJKW8AonqrqT1TbpFIgvzQs7EnTsD7AnSCow==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-musl@1.3.80: - resolution: {integrity: sha512-8OK9IlI1zpWOm7vIp1iXmZSEzLAwFpqhsGSEhxPavpOx2m54kLFdPcw/Uv3n461f6TCtszIxkGq1kSqBUdfUBA==} + /@swc/core-linux-x64-musl@1.3.82: + resolution: {integrity: sha512-KJUnaaepDKNzrEbwz4jv0iC3/t9x0NSoe06fnkAlhh2+NFKWKKJhVCOBTrpds8n7eylBDIXUlK34XQafjVMUdg==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-win32-arm64-msvc@1.3.80: - resolution: {integrity: sha512-RKhatwiAGlffnF6z2Mm3Ddid0v3KB+uf5m/Gc7N9zO/EUAV0PnHRuYuZSGyqodHmGFC+mK8YrCooFCEmHL9n+w==} + /@swc/core-win32-arm64-msvc@1.3.82: + resolution: {integrity: sha512-TR3MHKhDYIyGyFcyl2d/p1ftceXcubAhX5wRSOdtOyr5+K/v3jbyCCqN7bbqO5o43wQVCwwR/drHleYyDZvg8Q==} engines: {node: '>=10'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-ia32-msvc@1.3.80: - resolution: {integrity: sha512-3jiiZzU/kaw7k4zUp1yMq1QiUe4wJVtCEXIhf+fKuBsIwm7rdvyK/+PIx5KHnZy4TGQnYczKBRhJA5nuBcrUCQ==} + /@swc/core-win32-ia32-msvc@1.3.82: + resolution: {integrity: sha512-ZX4HzVVt6hs84YUg70UvyBJnBOIspmQQM0iXSzBvOikk3zRoN7BnDwQH4GScvevCEBuou60+i4I6d5kHLOfh8Q==} engines: {node: '>=10'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-x64-msvc@1.3.80: - resolution: {integrity: sha512-2eZtIoIWQBWqykfms92Zd37lveYOBWQTZjdooBGlsLHtcoQLkNpf1NXmR6TKY0yy8q6Yl3OhPvY+izjmO08MSg==} + /@swc/core-win32-x64-msvc@1.3.82: + resolution: {integrity: sha512-4mJMnex21kbQoaHeAmHnVwQN9/XAfPszJ6n9HI7SVH+aAHnbBIR0M59/b50/CJMjTj5niUGk7EwQ3nhVNOG32g==} engines: {node: '>=10'} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@swc/core@1.3.80: - resolution: {integrity: sha512-yX2xV5I/lYswHHR+44TPvzBgq3/Y8N1YWpTQADYuvSiX3Jxyvemk5Jpx3rRtigYb8WBkWAAf2i5d5ZJ2M7hhgw==} + /@swc/core@1.3.82: + resolution: {integrity: sha512-jpC1a18HMH67018Ij2jh+hT7JBFu7ZKcQVfrZ8K6JuEY+kjXmbea07P9MbQUZbAe0FB+xi3CqEVCP73MebodJQ==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -3680,16 +3712,16 @@ packages: dependencies: '@swc/types': 0.1.4 optionalDependencies: - '@swc/core-darwin-arm64': 1.3.80 - '@swc/core-darwin-x64': 1.3.80 - '@swc/core-linux-arm-gnueabihf': 1.3.80 - '@swc/core-linux-arm64-gnu': 1.3.80 - '@swc/core-linux-arm64-musl': 1.3.80 - '@swc/core-linux-x64-gnu': 1.3.80 - '@swc/core-linux-x64-musl': 1.3.80 - '@swc/core-win32-arm64-msvc': 1.3.80 - '@swc/core-win32-ia32-msvc': 1.3.80 - '@swc/core-win32-x64-msvc': 1.3.80 + '@swc/core-darwin-arm64': 1.3.82 + '@swc/core-darwin-x64': 1.3.82 + '@swc/core-linux-arm-gnueabihf': 1.3.82 + '@swc/core-linux-arm64-gnu': 1.3.82 + '@swc/core-linux-arm64-musl': 1.3.82 + '@swc/core-linux-x64-gnu': 1.3.82 + '@swc/core-linux-x64-musl': 1.3.82 + '@swc/core-win32-arm64-msvc': 1.3.82 + '@swc/core-win32-ia32-msvc': 1.3.82 + '@swc/core-win32-x64-msvc': 1.3.82 /@swc/helpers@0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} @@ -3775,7 +3807,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.5.6 + '@types/node': 20.5.8 dev: false /@types/bull@4.10.0: @@ -3792,20 +3824,20 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 20.5.6 + '@types/node': 20.5.8 '@types/responselike': 1.0.0 /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.5.6 + '@types/node': 20.5.8 dev: false /@types/cron@2.4.0: resolution: {integrity: sha512-5bBaAkqvSFBX8JMi/xCofNzG5E594TNsApMz68dLd/sQYz/HGQqgcxGHTRjOvD4G3Y+YF1Oo3S7QdCvKt1KAJQ==} deprecated: This is a stub types definition. cron provides its own type definitions, so you do not need this installed. dependencies: - cron: 2.4.1 + cron: 2.4.3 dev: false /@types/crypto-js@4.1.1: @@ -3834,7 +3866,7 @@ packages: /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 20.5.6 + '@types/node': 20.5.8 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -3874,14 +3906,18 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.5.6 + '@types/node': 20.5.8 /@types/linkify-it@3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} dev: false - /@types/markdown-it@13.0.0: - resolution: {integrity: sha512-mPTaUl5glYfzdJFeCsvhXQwZKdyszNAZcMm5ZTP5SfpTu+vIbog7J3z8Fa4x/Fzv5TB4R6OA/pHBYIYmkYOWGQ==} + /@types/luxon@3.3.2: + resolution: {integrity: sha512-l5cpE57br4BIjK+9BSkFBOsWtwv6J9bJpC7gdXIzZyI0vuKvNTk0wZZrkQxMGsUAuGW9+WMNWF2IJMD7br2yeQ==} + dev: false + + /@types/markdown-it@13.0.1: + resolution: {integrity: sha512-SUEb8Frsxs3D5Gg9xek6i6EG6XQ5s+O+ZdQzIPESZVZw3Pv3CPQfjCJBI+RgqZd1IBeu18S0Rn600qpPnEK37w==} dependencies: '@types/linkify-it': 3.0.2 '@types/mdurl': 1.0.2 @@ -3918,8 +3954,8 @@ packages: resolution: {integrity: sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg==} dev: false - /@types/node@20.5.6: - resolution: {integrity: sha512-Gi5wRGPbbyOTX+4Y2iULQ27oUPrefaB0PxGQJnfyWN3kvEDGM3mIB5M/gQLmitZf7A9FmLeaqxD3L1CXpm3VKQ==} + /@types/node@20.5.8: + resolution: {integrity: sha512-eajsR9aeljqNhK028VG0Wuw+OaY5LLxYmxeoXynIoE6jannr9/Ucd1LL0hSSoafk5LTYG+FfqsyGt81Q6Zkybw==} /@types/nodemailer@6.4.9: resolution: {integrity: sha512-XYG8Gv+sHjaOtUpiuytahMy2mM3rectgroNbs6R3djZEKmPNiIJwe9KqOJBGzKKnNZNKvnuvmugBgpq3w/S0ig==} @@ -3974,7 +4010,7 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.5.6 + '@types/node': 20.5.8 /@types/scheduler@0.16.3: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} @@ -3988,7 +4024,7 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.5.6 + '@types/node': 20.5.8 dev: false /@types/serve-static@1.15.2: @@ -3996,11 +4032,11 @@ packages: dependencies: '@types/http-errors': 2.0.1 '@types/mime': 3.0.1 - '@types/node': 20.5.6 + '@types/node': 20.5.8 dev: false - /@types/ua-parser-js@0.7.36: - resolution: {integrity: sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==} + /@types/ua-parser-js@0.7.37: + resolution: {integrity: sha512-4sOxS3ZWXC0uHJLYcWAaLMxTvjRX3hT96eF4YWUh1ovTaenvibaZOE5uXtIp4mksKMLRwo7YDiCBCw6vBiUPVg==} dev: false /@types/unist@2.0.7: @@ -4011,8 +4047,8 @@ packages: resolution: {integrity: sha512-NclP0IbzHj/4tJZKFqKh8E7kZdgss+MCUYV9G+TLltFfDA4lFgE4PKPpDIyS2FlcdANIfSx273emkupvChigbw==} dev: false - /@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==} + /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -4023,11 +4059,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.4.1(eslint@8.48.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.4.1 - '@typescript-eslint/type-utils': 6.4.1(eslint@8.48.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.4.1(eslint@8.48.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.4.1 + '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/type-utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 eslint: 8.48.0 graphemer: 1.4.0 @@ -4040,8 +4076,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.4.1(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==} + /@typescript-eslint/parser@6.5.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -4050,10 +4086,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.4.1 - '@typescript-eslint/types': 6.4.1 - '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.4.1 + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 eslint: 8.48.0 typescript: 5.2.2 @@ -4061,16 +4097,16 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager@6.4.1: - resolution: {integrity: sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==} + /@typescript-eslint/scope-manager@6.5.0: + resolution: {integrity: sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.4.1 - '@typescript-eslint/visitor-keys': 6.4.1 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/visitor-keys': 6.5.0 dev: true - /@typescript-eslint/type-utils@6.4.1(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==} + /@typescript-eslint/type-utils@6.5.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -4079,8 +4115,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2) - '@typescript-eslint/utils': 6.4.1(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) + '@typescript-eslint/utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) debug: 4.3.4 eslint: 8.48.0 ts-api-utils: 1.0.1(typescript@5.2.2) @@ -4089,13 +4125,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types@6.4.1: - resolution: {integrity: sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==} + /@typescript-eslint/types@6.5.0: + resolution: {integrity: sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.4.1(typescript@5.2.2): - resolution: {integrity: sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==} + /@typescript-eslint/typescript-estree@6.5.0(typescript@5.2.2): + resolution: {integrity: sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -4103,8 +4139,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.4.1 - '@typescript-eslint/visitor-keys': 6.4.1 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -4115,8 +4151,8 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.4.1(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==} + /@typescript-eslint/utils@6.5.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -4124,9 +4160,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.4.1 - '@typescript-eslint/types': 6.4.1 - '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) eslint: 8.48.0 semver: 7.5.4 transitivePeerDependencies: @@ -4134,12 +4170,12 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@6.4.1: - resolution: {integrity: sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==} + /@typescript-eslint/visitor-keys@6.5.0: + resolution: {integrity: sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.4.1 - eslint-visitor-keys: 3.4.2 + '@typescript-eslint/types': 6.5.0 + eslint-visitor-keys: 3.4.3 dev: true /@vue/compiler-core@3.3.4: @@ -4169,7 +4205,7 @@ packages: '@vue/shared': 3.3.4 estree-walker: 2.0.2 magic-string: 0.30.2 - postcss: 8.4.28 + postcss: 8.4.29 source-map-js: 1.0.2 dev: false @@ -4316,7 +4352,7 @@ packages: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 - /@webundsoehne/nest-fastify-file-upload@2.1.0(@nestjs/common@10.2.1)(@nestjs/core@10.2.1)(@nestjs/platform-fastify@10.2.1): + /@webundsoehne/nest-fastify-file-upload@2.1.0(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(@nestjs/platform-fastify@10.2.4): resolution: {integrity: sha512-VtxfqG4WGW3fG1MD///HQRizYQNuY8YByeJdVKroFFZizXmj8XgLNAaTWDO/ff9hx2sPXF3vm6J8erq//DAODg==} engines: {node: '>=12'} peerDependencies: @@ -4324,9 +4360,9 @@ packages: '@nestjs/core': '>= 7 < 10' '@nestjs/platform-fastify': '>= 7 < 10' dependencies: - '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.1(@nestjs/common@10.2.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/platform-fastify': 10.2.1(@nestjs/common@10.2.1)(@nestjs/core@10.2.1) + '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/platform-fastify': 10.2.4(@nestjs/common@10.2.4)(@nestjs/core@10.2.4) fastify-multer: 2.0.3 dev: false @@ -4703,7 +4739,7 @@ packages: engines: {node: '>=8.0.0'} dev: false - /autoprefixer@10.4.15(postcss@8.4.28): + /autoprefixer@10.4.15(postcss@8.4.29): resolution: {integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -4715,7 +4751,7 @@ packages: fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: false @@ -5301,13 +5337,13 @@ packages: repeat-string: 1.6.1 dev: false - /commitizen@4.3.0(@swc/core@1.3.80): + /commitizen@4.3.0(@swc/core@1.3.82): resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(@swc/core@1.3.80) + cz-conventional-changelog: 3.3.0(@swc/core@1.3.82) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -5551,7 +5587,7 @@ packages: dependencies: '@types/node': 20.4.7 cosmiconfig: 8.2.0 - ts-node: 10.9.1(@swc/core@1.3.80)(@types/node@20.5.6)(typescript@5.2.2) + ts-node: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.8)(typescript@5.2.2) typescript: 5.2.2 dev: true @@ -5592,6 +5628,13 @@ packages: luxon: 3.3.0 dev: false + /cron@2.4.3: + resolution: {integrity: sha512-YBvExkQYF7w0PxyeFLRyr817YVDhGxaCi5/uRRMqa4aWD3IFKRd+uNbpW1VWMdqQy8PZ7CElc+accXJcauPKzQ==} + dependencies: + '@types/luxon': 3.3.2 + luxon: 3.3.0 + dev: false + /cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} @@ -5657,18 +5700,18 @@ packages: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: false - /cz-conventional-changelog@3.3.0(@swc/core@1.3.80): + /cz-conventional-changelog@3.3.0(@swc/core@1.3.82): resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.3.0(@swc/core@1.3.80) + commitizen: 4.3.0(@swc/core@1.3.82) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 17.7.1(@swc/core@1.3.80) + '@commitlint/load': 17.7.1(@swc/core@1.3.82) transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -6089,36 +6132,6 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - 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 - dev: true - /esbuild@0.18.19: resolution: {integrity: sha512-ra3CaIKCzJp5bU5BDfrCc0FRqKj71fQi+gbld0aj6lN0ifuX2fWJYPgLVLGwPfA+ruKna+OWwOvf/yHj6n+i0g==} engines: {node: '>=12'} @@ -6148,6 +6161,36 @@ packages: '@esbuild/win32-ia32': 0.18.19 '@esbuild/win32-x64': 0.18.19 + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -6196,7 +6239,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.8)(eslint@8.48.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.8)(eslint@8.48.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -6217,7 +6260,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.4.1(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) debug: 3.2.7 eslint: 8.48.0 eslint-import-resolver-node: 0.3.8 @@ -6225,10 +6268,10 @@ packages: - supports-color dev: true - /eslint-plugin-antfu@0.40.3(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-1f0OifSyaIQNHAHNzh0wHfUKkc3cP3fDDOk51WtCBL7ffgd4dSEq95FJIRUyGKecq4CY3d3gHpOOUbClcHiV1w==} + /eslint-plugin-antfu@0.41.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-JeEeDZgz7oqYPYWYNQHdXrKaW2nhJz/70jeMZUkaNjVp72cpsJPH3idiEhIhGu3wjFdsOMCoEkboT/DQXlCaqA==} dependencies: - '@typescript-eslint/utils': 6.4.1(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) transitivePeerDependencies: - eslint - supports-color @@ -6246,7 +6289,7 @@ packages: ignore: 5.2.4 dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.4.1)(eslint@8.48.0): + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.5.0)(eslint@8.48.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: @@ -6256,7 +6299,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.4.1(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) array-includes: 3.1.6 array.prototype.findlastindex: 1.2.2 array.prototype.flat: 1.3.1 @@ -6265,7 +6308,7 @@ packages: doctrine: 2.1.0 eslint: 8.48.0 eslint-import-resolver-node: 0.3.8 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.4.1)(eslint-import-resolver-node@0.3.8)(eslint@8.48.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.8)(eslint@8.48.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -6363,7 +6406,7 @@ packages: strip-indent: 3.0.0 dev: true - /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.4.1)(eslint@8.48.0): + /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.5.0)(eslint@8.48.0): resolution: {integrity: sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -6373,7 +6416,7 @@ packages: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2) eslint: 8.48.0 eslint-rule-composer: 0.3.0 dev: true @@ -6431,11 +6474,6 @@ packages: estraverse: 5.3.0 dev: true - /eslint-visitor-keys@3.4.2: - resolution: {integrity: sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -6736,8 +6774,8 @@ packages: resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} dev: false - /fastify@4.21.0: - resolution: {integrity: sha512-tsu4bcwE4HetxqW8prA5fbC9bKHMYDp7jGEDWyzK1l90a3uOaLoIcQbdGcWeODNLVJviQnzh1wvIjTZE3MJFEg==} + /fastify@4.22.0: + resolution: {integrity: sha512-HLoBmetdQ6zaJohKW6jzUww8NnwHzkbIbUEyAzM+Nnf7cZVSXRuUV+6b2/xLmu6GGkruIFJ/bIQoKWYRx4wnAQ==} dependencies: '@fastify/ajv-compiler': 3.5.0 '@fastify/error': 3.3.0 @@ -6974,7 +7012,7 @@ packages: semver: 7.5.4 tapable: 2.2.1 typescript: 5.1.6 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.18.19) + webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.19) dev: false /form-data-encoder@2.1.4: @@ -7007,8 +7045,8 @@ packages: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: false - /framer-motion@10.16.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-K6TXr5mZtitC/dxQCBdg7xzdN0d5IAIrlaqCPKtIQVdzVPGC0qBuJKXggHX1vjnP5gPOFwB1KbCCTWcnFc3kWg==} + /framer-motion@10.16.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aY6L9YMvqMWtfOQptaUvvr8dp97jskXY5UYLQM0vOPxKeERrG/Z034EIQZ/52u7MeCT0HlCQy3/l0HdUZCB9Tw==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 @@ -8287,7 +8325,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.5.6 + '@types/node': 20.5.8 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -8299,8 +8337,8 @@ packages: resolution: {integrity: sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==} dev: false - /jotai@2.4.0(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-NUHJdAJe3C8Prf0DD6EzezCATjkNvfCNI7pgkaX7bCPPsqE0oK8L9RzZsEhz/UxFoGRayXwacTvAli0VEYKkqQ==} + /jotai@2.4.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-S4CTLpsZV+LABBXL5PgkMl+5jK3ljfbWmcLqtN7CQ2vio/Hrg3T6IKk/vf2/9hnp1imTPDsaFv7D54de/7Sa+w==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=17.0.0' @@ -8390,7 +8428,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.10.0 - eslint-visitor-keys: 3.4.2 + eslint-visitor-keys: 3.4.3 espree: 9.6.1 semver: 7.5.4 dev: true @@ -8720,8 +8758,8 @@ packages: engines: {node: '>=12'} dev: true - /lucide-react@0.269.0(react@18.2.0): - resolution: {integrity: sha512-+ViEb/2eJJt43/CtxpTfvqu/8gzK49cSUdeuqRuFYiZmX9AvwfumtETM4plhXHymfHb6/mVbHg9uIlc13y+uew==} + /lucide-react@0.274.0(react@18.2.0): + resolution: {integrity: sha512-qiWcojRXEwDiSimMX1+arnxha+ROJzZjJaVvCC0rsG6a9pUPjZePXSq7em4ZKMp0NDm1hyzPNkM7UaWC3LU2AA==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 dependencies: @@ -9152,7 +9190,7 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - /nestjs-pino@3.4.0(@nestjs/common@10.2.1)(pino-http@8.4.0): + /nestjs-pino@3.4.0(@nestjs/common@10.2.4)(pino-http@8.4.0): resolution: {integrity: sha512-L79tk+WqVJApGxD4K40srSHopwlBX8WVPoIJtVhWaxJUfk9ND6eZp7kmgdgwQw8PpYUeoeOhS1g2j0Ep3c0NJA==} engines: {node: '>= 14'} requiresBuild: true @@ -9160,7 +9198,7 @@ packages: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 dependencies: - '@nestjs/common': 10.2.1(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) pino-http: 8.4.0 dev: false @@ -10046,27 +10084,27 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - /postcss-import@15.1.0(postcss@8.4.28): + /postcss-import@15.1.0(postcss@8.4.29): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.4 - /postcss-js@4.0.1(postcss@8.4.28): + /postcss-js@4.0.1(postcss@8.4.29): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.28 + postcss: 8.4.29 - /postcss-load-config@4.0.1(postcss@8.4.28)(ts-node@10.9.1): + /postcss-load-config@4.0.1(postcss@8.4.29)(ts-node@10.9.1): resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} engines: {node: '>= 14'} peerDependencies: @@ -10079,17 +10117,17 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.28 - ts-node: 10.9.1(@swc/core@1.3.80)(@types/node@20.5.6)(typescript@5.2.2) + postcss: 8.4.29 + ts-node: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.8)(typescript@5.2.2) yaml: 2.3.1 - /postcss-nested@6.0.1(postcss@8.4.28): + /postcss-nested@6.0.1(postcss@8.4.29): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 /postcss-selector-parser@6.0.13: @@ -10111,8 +10149,8 @@ packages: source-map-js: 1.0.2 dev: false - /postcss@8.4.28: - resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} + /postcss@8.4.29: + resolution: {integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 @@ -11561,8 +11599,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /swagger-ui-dist@5.3.1: - resolution: {integrity: sha512-El78OvXp9zMasfPrshtkW1CRx8AugAKoZuGGOTW+8llJzOV1RtDJYqQRz/6+2OakjeWWnZuRlN2Qj1Y0ilux3w==} + /swagger-ui-dist@5.4.2: + resolution: {integrity: sha512-vT5QxP/NOr9m4gLZl+SpavWI3M9Fdh30+Sdw9rEtZbkqNmNNEPhjXas2xTD9rsJYYdLzAiMfwXvtooWH3xbLJA==} dev: false /symbol-observable@4.0.0: @@ -11574,8 +11612,8 @@ packages: resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} dev: false - /tailwindcss-animate@1.0.6(tailwindcss@3.3.3): - resolution: {integrity: sha512-4WigSGMvbl3gCCact62ZvOngA+PRqhAn7si3TQ3/ZuPuQZcIEtVap+ENSXbzWhpojKB8CpvnIsrwBu8/RnHtuw==} + /tailwindcss-animate@1.0.7(tailwindcss@3.3.3): + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' dependencies: @@ -11601,11 +11639,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.28 - postcss-import: 15.1.0(postcss@8.4.28) - postcss-js: 4.0.1(postcss@8.4.28) - postcss-load-config: 4.0.1(postcss@8.4.28)(ts-node@10.9.1) - postcss-nested: 6.0.1(postcss@8.4.28) + postcss: 8.4.29 + postcss-import: 15.1.0(postcss@8.4.29) + postcss-js: 4.0.1(postcss@8.4.29) + postcss-load-config: 4.0.1(postcss@8.4.29)(ts-node@10.9.1) + postcss-nested: 6.0.1(postcss@8.4.29) postcss-selector-parser: 6.0.13 resolve: 1.22.4 sucrase: 3.34.0 @@ -11632,7 +11670,7 @@ packages: resolution: {integrity: sha512-HM4chXXDaHCAl1AFbSlyHUFjoaEKTewVE0j6ni5S5mRdPdJdva4AfcmXgBZYnRBiJagl6QuVtsqLjqHUiiO20A==} hasBin: true dependencies: - '@antfu/ni': 0.21.6 + '@antfu/ni': 0.21.8 '@npmcli/config': 6.2.1 detect-indent: 7.0.1 execa: 7.2.0 @@ -11646,7 +11684,7 @@ packages: - supports-color dev: true - /terser-webpack-plugin@5.3.9(@swc/core@1.3.80)(esbuild@0.18.19)(webpack@5.88.2): + /terser-webpack-plugin@5.3.9(@swc/core@1.3.82)(esbuild@0.18.19)(webpack@5.88.2): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -11663,13 +11701,13 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.18 - '@swc/core': 1.3.80 + '@swc/core': 1.3.82 esbuild: 0.18.19 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.19.2 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.18.19) + webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.19) /terser@5.19.2: resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} @@ -11820,10 +11858,10 @@ packages: micromatch: 4.0.5 semver: 7.5.4 typescript: 5.2.2 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.18.19) + webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.19) dev: true - /ts-node@10.9.1(@swc/core@1.3.80)(@types/node@20.5.6)(typescript@5.2.2): + /ts-node@10.9.1(@swc/core@1.3.82)(@types/node@20.5.8)(typescript@5.2.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -11838,12 +11876,12 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.3.80 + '@swc/core': 1.3.82 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.5.6 + '@types/node': 20.5.8 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -11892,7 +11930,11 @@ packages: /tslib@2.6.1: resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} - /tsup@7.2.0(@swc/core@1.3.80)(ts-node@10.9.1)(typescript@5.2.2): + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + + /tsup@7.2.0(@swc/core@1.3.82)(ts-node@10.9.1)(typescript@5.2.2): resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} engines: {node: '>=16.14'} hasBin: true @@ -11908,7 +11950,7 @@ packages: typescript: optional: true dependencies: - '@swc/core': 1.3.80 + '@swc/core': 1.3.82 bundle-require: 4.0.1(esbuild@0.18.19) cac: 6.7.14 chokidar: 3.5.3 @@ -11917,7 +11959,7 @@ packages: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.1(postcss@8.4.28)(ts-node@10.9.1) + postcss-load-config: 4.0.1(postcss@8.4.29)(ts-node@10.9.1) resolve-from: 5.0.0 rollup: 3.27.2 source-map: 0.8.0-beta.0 @@ -11929,12 +11971,12 @@ packages: - ts-node dev: true - /tsx@3.12.7: - resolution: {integrity: sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==} + /tsx@3.12.8: + resolution: {integrity: sha512-Lt9KYaRGF023tlLInPj8rgHwsZU8qWLBj4iRXNWxTfjIkU7canGL806AqKear1j722plHuiYNcL2ZCo6uS9UJA==} hasBin: true dependencies: '@esbuild-kit/cjs-loader': 2.4.2 - '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/core-utils': 3.2.2 '@esbuild-kit/esm-loader': 2.5.5 optionalDependencies: fsevents: 2.3.2 @@ -12323,7 +12365,7 @@ packages: debug: 4.3.4 eslint: 8.48.0 eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.2 + eslint-visitor-keys: 3.4.3 espree: 9.6.1 esquery: 1.5.0 lodash: 4.17.21 @@ -12382,7 +12424,7 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack@5.88.2(@swc/core@1.3.80)(esbuild@0.18.19): + /webpack@5.88.2(@swc/core@1.3.82)(esbuild@0.18.19): resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -12413,7 +12455,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(@swc/core@1.3.80)(esbuild@0.18.19)(webpack@5.88.2) + terser-webpack-plugin: 5.3.9(@swc/core@1.3.82)(esbuild@0.18.19)(webpack@5.88.2) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -12609,7 +12651,7 @@ packages: resolution: {integrity: sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==} engines: {node: ^14.17.0 || >=16.0.0} dependencies: - eslint-visitor-keys: 3.4.2 + eslint-visitor-keys: 3.4.3 lodash: 4.17.21 yaml: 2.3.1 dev: true From 508b40b0584cb5510469a82cf0d0e27c83c504e1 Mon Sep 17 00:00:00 2001 From: chenyueban <jasonchan0527@gmail.com> Date: Sun, 3 Sep 2023 19:26:03 +0800 Subject: [PATCH 09/23] style: remove unnecessary code and format code --- packages/server/src/app.module.ts | 4 +- .../[locale]/[projectId]/profile/profile.tsx | 38 +++--- packages/web/components/data-table.tsx | 108 ++++++++++++++++++ packages/web/components/project-card.tsx | 30 +++-- packages/web/components/title.tsx | 20 ++-- 5 files changed, 150 insertions(+), 50 deletions(-) create mode 100644 packages/web/components/data-table.tsx diff --git a/packages/server/src/app.module.ts b/packages/server/src/app.module.ts index 9c43613..fcfb085 100644 --- a/packages/server/src/app.module.ts +++ b/packages/server/src/app.module.ts @@ -1,13 +1,13 @@ import { Module } from '@nestjs/common' +import { SharedModule } from '~/shared.module' import { ApiModule } from '~/api/api.module' import { TasksModule } from '~/tasks/tasks.module' -import { SharedModule } from '~/shared.module' @Module({ imports: [ + SharedModule, ApiModule, TasksModule, - SharedModule, ], }) export class AppModule {} diff --git a/packages/web/app/[locale]/[projectId]/profile/profile.tsx b/packages/web/app/[locale]/[projectId]/profile/profile.tsx index 65371f0..22f146b 100644 --- a/packages/web/app/[locale]/[projectId]/profile/profile.tsx +++ b/packages/web/app/[locale]/[projectId]/profile/profile.tsx @@ -18,6 +18,7 @@ import { Button } from '~/components/ui/button' import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' import { Switch } from '~/components/ui/switch' import { Label } from '~/components/ui/label' +import LoadingMoreButton from '~/components/load-more-button' interface Props { project?: Project @@ -212,42 +213,31 @@ const Events = ({ project }: Props) => { return ( <Wrapper> <EventsList events={data} /> - <Button - className="mt-6 w-full" - disabled={isLoading || isReachingEnd} - size="sm" + <LoadingMoreButton + isLoading={isLoading} + isReachingEnd={isReachingEnd} onClick={() => setSize(size + 1)} - > - { - isLoading - ? 'Loading...' - : isReachingEnd - ? 'No More Events' - : 'Load More' - } - </Button> + /> </Wrapper> ) } export default function Profile({ project, trends, views }: Props) { return ( - <div> + <div className="space-y-8"> <Title - rightNodes={ - ( - <Link href={`/${project?.id}/settings`}> - <Button> - <i className="i-ri-settings-2-line mr-2" /> Setting - </Button> - </Link> - ) - } + rightNodes={( + <Link href={`/${project?.id}/settings`}> + <Button> + <i className="i-ri-settings-2-line mr-2" /> Setting + </Button> + </Link> + )} > {project?.name} -
+
diff --git a/packages/web/components/data-table.tsx b/packages/web/components/data-table.tsx new file mode 100644 index 0000000..d24ce01 --- /dev/null +++ b/packages/web/components/data-table.tsx @@ -0,0 +1,108 @@ +'use client' + +import { + flexRender, + getCoreRowModel, + getPaginationRowModel, + useReactTable, +} from '@tanstack/react-table' +import { type ColumnDef } from '@tanstack/react-table' + +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from '~/components/ui/table' +import { Button } from '~/components/ui/button' + +interface DataTableProps { + columns: ColumnDef[] + data: TData[] +} + +export default function DataTable({ + columns, + data, +}: DataTableProps) { + const table = useReactTable({ + data, + columns, + getCoreRowModel: getCoreRowModel(), + getPaginationRowModel: getPaginationRowModel(), + }) + + return ( +
+
+ + + {table.getHeaderGroups().map(headerGroup => ( + + {headerGroup.headers.map((header) => { + return ( + + {header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + header.getContext(), + )} + + ) + })} + + ))} + + + {table.getRowModel().rows?.length + ? ( + table.getRowModel().rows.map(row => ( + + {row.getVisibleCells().map(cell => ( + + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + ))} + + )) + ) + : ( + + + No results. + + + )} + +
+
+
+ + +
+
+ ) +} diff --git a/packages/web/components/project-card.tsx b/packages/web/components/project-card.tsx index dc75fe8..9ee49d2 100644 --- a/packages/web/components/project-card.tsx +++ b/packages/web/components/project-card.tsx @@ -26,8 +26,7 @@ export default function ProjectCard({ project }: Props) { return ( - - +
{project.name} -
+
{project.name} @@ -46,19 +45,18 @@ export default function ProjectCard({ project }: Props) {
- -
- { - isLoading - ? - : ( - - ) - } -
+ + + { + isLoading + ? + : ( + + ) + } diff --git a/packages/web/components/title.tsx b/packages/web/components/title.tsx index 82a6240..c87a93f 100644 --- a/packages/web/components/title.tsx +++ b/packages/web/components/title.tsx @@ -11,16 +11,13 @@ interface Props { bottomNodes?: ReactNode } -const PADDING = '12' - export default function Title({ className, children, rightNodes, bottomNodes, ...props }: Props) { return (
@@ -35,7 +32,14 @@ export default function Title({ className, children, rightNodes, bottomNodes, .. }
{rightNodes}
-
{bottomNodes}
+
+ {bottomNodes} +
) } From fa3bdb87739b462b03e7bd7527e3e586bb982cce Mon Sep 17 00:00:00 2001 From: chenyueban Date: Tue, 5 Sep 2023 14:21:48 +0800 Subject: [PATCH 10/23] fix: Update dependencies --- package.json | 2 +- packages/server/package.json | 1 + .../server/src/common/logger/logger.module.ts | 2 +- packages/server/src/main.ts | 2 +- packages/server/src/shared.module.ts | 10 +- packages/server/tsconfig.json | 2 +- packages/web/package.json | 2 +- pnpm-lock.yaml | 1105 +++++++---------- 8 files changed, 474 insertions(+), 652 deletions(-) diff --git a/package.json b/package.json index 6ff39c3..6595085 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "@swc/cli": "^0.1.62", "@swc/core": "^1.3.82", "@types/js-yaml": "^4.0.5", - "@types/node": "^20.5.8", + "@types/node": "^20.5.9", "@types/ramda": "^0.29.3", "commitizen": "^4.3.0", "cross-env": "^7.0.3", diff --git a/packages/server/package.json b/packages/server/package.json index 827ec0f..0012ce3 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -17,6 +17,7 @@ "@nestjs/cli": "^10.1.17", "@nestjs/common": "^10.2.4", "@nestjs/core": "^10.2.4", + "@nestjs/devtools-integration": "^0.1.5", "@nestjs/mapped-types": "^2.0.2", "@nestjs/platform-fastify": "^10.2.4", "@nestjs/schedule": "^3.0.3", diff --git a/packages/server/src/common/logger/logger.module.ts b/packages/server/src/common/logger/logger.module.ts index b6544d3..7df4635 100644 --- a/packages/server/src/common/logger/logger.module.ts +++ b/packages/server/src/common/logger/logger.module.ts @@ -5,7 +5,7 @@ import pino from 'pino' @Module({ imports: [ LoggerModuleBase.forRoot({ - pinoHttp: { stream: pino.destination('./logs.log') }, + pinoHttp: { stream: pino.destination('./logs/logs.log') }, useExisting: true, }), ], diff --git a/packages/server/src/main.ts b/packages/server/src/main.ts index 664d4a5..0a6cc1e 100644 --- a/packages/server/src/main.ts +++ b/packages/server/src/main.ts @@ -25,7 +25,7 @@ async function bootstrap() { // 50mb bodyLimit: 624288000, }), - { bufferLogs: true }, + { bufferLogs: true, snapshot: true, abortOnError: false }, ) app.useLogger(app.get(Logger)) app.useGlobalInterceptors(new LoggerErrorInterceptor()) diff --git a/packages/server/src/shared.module.ts b/packages/server/src/shared.module.ts index f901cab..5511620 100644 --- a/packages/server/src/shared.module.ts +++ b/packages/server/src/shared.module.ts @@ -1,7 +1,15 @@ import { Global, Module } from '@nestjs/common' import { ScheduleModule } from '@nestjs/schedule' +import { DevtoolsModule } from '@nestjs/devtools-integration' import { BullModuleConfig, LoggerModule } from '~/common' @Global() -@Module({ imports: [BullModuleConfig, ScheduleModule.forRoot(), LoggerModule] }) +@Module({ + imports: [ + BullModuleConfig, + ScheduleModule.forRoot(), + LoggerModule, + DevtoolsModule.register({ http: process.env.NODE_ENV !== 'production' }), + ], +}) export class SharedModule {} diff --git a/packages/server/tsconfig.json b/packages/server/tsconfig.json index 37db5ac..d9ad686 100644 --- a/packages/server/tsconfig.json +++ b/packages/server/tsconfig.json @@ -2,7 +2,7 @@ "extends": "../../tsconfig.json", "compilerOptions": { "module": "commonjs", - "target": "es2019", + "target": "ES2021", "outDir": "./dist", "baseUrl": ".", "paths": { diff --git a/packages/web/package.json b/packages/web/package.json index 3037b98..8075324 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -59,7 +59,7 @@ "postcss": "^8.4.29", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-hook-form": "^7.45.4", + "react-hook-form": "^7.46.0", "react-icons": "^4.10.1", "react-json-view": "^1.21.3", "react-use": "^17.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b626aed..0ba6c5a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -70,8 +70,8 @@ importers: specifier: ^4.0.5 version: 4.0.5 '@types/node': - specifier: ^20.5.8 - version: 20.5.8 + specifier: ^20.5.9 + version: 20.5.9 '@types/ramda': specifier: ^0.29.3 version: 0.29.3 @@ -131,19 +131,22 @@ importers: dependencies: '@nestjs/axios': specifier: ^3.0.0 - version: 3.0.0(@nestjs/common@10.2.4)(axios@1.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + version: 3.0.0(@nestjs/common@10.2.4)(axios@1.5.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/bull': specifier: ^10.0.1 version: 10.0.1(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(bull@4.11.3) '@nestjs/cli': specifier: ^10.1.17 - version: 10.1.17(@swc/cli@0.1.62)(@swc/core@1.3.82)(esbuild@0.18.19) + version: 10.1.17(@swc/cli@0.1.62)(@swc/core@1.3.82)(esbuild@0.18.20) '@nestjs/common': specifier: ^10.2.4 version: 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': specifier: ^10.2.4 version: 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/devtools-integration': + specifier: ^0.1.5 + version: 0.1.5(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(reflect-metadata@0.1.13) '@nestjs/mapped-types': specifier: ^2.0.2 version: 2.0.2(@nestjs/common@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) @@ -234,7 +237,7 @@ importers: version: 9.4.4(typescript@5.2.2)(webpack@5.88.2) ts-node: specifier: ^10.9.1 - version: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.8)(typescript@5.2.2) + version: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.9)(typescript@5.2.2) packages/web: dependencies: @@ -249,7 +252,7 @@ importers: version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.21)(react@18.2.0) '@hookform/resolvers': specifier: ^3.3.1 - version: 3.3.1(react-hook-form@7.45.4) + version: 3.3.1(react-hook-form@7.46.0) '@iconify-json/ri': specifier: ^1.1.12 version: 1.1.12 @@ -392,8 +395,8 @@ importers: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) react-hook-form: - specifier: ^7.45.4 - version: 7.45.4(react@18.2.0) + specifier: ^7.46.0 + version: 7.46.0(react@18.2.0) react-icons: specifier: ^4.10.1 version: 4.10.1(react@18.2.0) @@ -533,14 +536,15 @@ packages: hasBin: true dev: true - /@antfu/utils@0.7.5: - resolution: {integrity: sha512-dlR6LdS+0SzOAPx/TPRhnoi7hE251OVeT2Snw0RguNbBSbjUHdWr0l3vcUUDg26rEysT89kCbtw1lVorBXLLCg==} + /@antfu/utils@0.7.6: + resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==} - /@babel/code-frame@7.22.5: - resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.5 + '@babel/highlight': 7.22.13 + chalk: 2.4.2 /@babel/helper-module-imports@7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} @@ -557,27 +561,27 @@ packages: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} - /@babel/highlight@7.22.5: - resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} + /@babel/highlight@7.22.13: + resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.5 chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.22.7: - resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} + /@babel/parser@7.22.14: + resolution: {integrity: sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ==} engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.22.11 dev: false - /@babel/runtime@7.22.6: - resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} + /@babel/runtime@7.22.11: + resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.13.11 + regenerator-runtime: 0.14.0 dev: false /@babel/types@7.22.11: @@ -721,13 +725,13 @@ packages: '@commitlint/types': 17.4.4 '@types/node': 20.4.7 chalk: 4.1.2 - cosmiconfig: 8.2.0 - cosmiconfig-typescript-loader: 4.4.0(@types/node@20.4.7)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.2.2) + cosmiconfig: 8.3.2(typescript@5.2.2) + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.4.7)(cosmiconfig@8.3.2)(ts-node@10.9.1)(typescript@5.2.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.8)(typescript@5.2.2) + ts-node: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.9)(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - '@swc/core' @@ -813,7 +817,7 @@ packages: peerDependencies: tailwindcss: '*' dependencies: - '@iconify/utils': 2.1.7 + '@iconify/utils': 2.1.9 tailwindcss: 3.3.3(ts-node@10.9.1) transitivePeerDependencies: - supports-color @@ -823,7 +827,7 @@ packages: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: '@babel/helper-module-imports': 7.22.5 - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/serialize': 1.1.2 @@ -882,7 +886,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.2 @@ -918,7 +922,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.1 '@emotion/react': 11.11.1(@types/react@18.2.21)(react@18.2.0) @@ -953,7 +957,7 @@ packages: resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} dependencies: '@esbuild-kit/core-utils': 3.2.2 - get-tsconfig: 4.6.2 + get-tsconfig: 4.7.0 dev: true /@esbuild-kit/core-utils@3.2.2: @@ -967,32 +971,15 @@ packages: resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} dependencies: '@esbuild-kit/core-utils': 3.2.2 - get-tsconfig: 4.6.2 + get-tsconfig: 4.7.0 dev: true - /@esbuild/android-arm64@0.18.19: - resolution: {integrity: sha512-4+jkUFQxZkQfQOOxfGVZB38YUWHMJX2ihZwF+2nh8m7bHdWXpixiurgGRN3c/KMSwlltbYI0/i929jwBRMFzbA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - optional: true - /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.18.19: - resolution: {integrity: sha512-1uOoDurJYh5MNqPqpj3l/TQCI1V25BXgChEldCB7D6iryBYqYKrbZIhYO5AI9fulf66sM8UJpc3UcCly2Tv28w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true optional: true /@esbuild/android-arm@0.18.20: @@ -1001,15 +988,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.18.19: - resolution: {integrity: sha512-ae5sHYiP/Ogj2YNrLZbWkBmyHIDOhPgpkGvFnke7XFGQldBDWvc/AyYwSLpNuKw9UNkgnLlB/jPpnBmlF3G9Bg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true optional: true /@esbuild/android-x64@0.18.20: @@ -1018,15 +996,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.18.19: - resolution: {integrity: sha512-HIpQvNQWFYROmWDANMRL+jZvvTQGOiTuwWBIuAsMaQrnStedM+nEKJBzKQ6bfT9RFKH2wZ+ej+DY7+9xHBTFPg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true optional: true /@esbuild/darwin-arm64@0.18.20: @@ -1035,15 +1004,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.18.19: - resolution: {integrity: sha512-m6JdvXJQt0thNLIcWOeG079h2ivhYH4B5sVCgqb/B29zTcFd7EE8/J1nIUHhdtwGeItdUeqKaqqb4towwxvglQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true optional: true /@esbuild/darwin-x64@0.18.20: @@ -1052,15 +1012,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.18.19: - resolution: {integrity: sha512-G0p4EFMPZhGn/xVNspUyMQbORH3nlKTV0bFNHPIwLraBuAkTeMyxNviTe0ZXUbIXQrR1lrwniFjNFU4s+x7veQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true optional: true /@esbuild/freebsd-arm64@0.18.20: @@ -1069,15 +1020,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.18.19: - resolution: {integrity: sha512-hBxgRlG42+W+j/1/cvlnSa+3+OBKeDCyO7OG2ICya1YJaSCYfSpuG30KfOnQHI7Ytgu4bRqCgrYXxQEzy0zM5Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true optional: true /@esbuild/freebsd-x64@0.18.20: @@ -1086,15 +1028,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.18.19: - resolution: {integrity: sha512-X8g33tczY0GsJq3lhyBrjnFtaKjWVpp1gMq5IlF9BQJ3TUfSK74nQnz9mRIEejmcV+OIYn6bkOJeUaU1Knrljg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-arm64@0.18.20: @@ -1103,15 +1036,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.18.19: - resolution: {integrity: sha512-qtWyoQskfJlb9MD45mvzCEKeO4uCnDZ7lPFeNqbfaaJHqBiH9qA5Vu2EuckqYZuFMJWy1l4dxTf9NOulCVfUjg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-arm@0.18.20: @@ -1120,15 +1044,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.18.19: - resolution: {integrity: sha512-SAkRWJgb+KN+gOhmbiE6/wu23D6HRcGQi15cB13IVtBZZgXxygTV5GJlUAKLQ5Gcx0gtlmt+XIxEmSqA6sZTOw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-ia32@0.18.20: @@ -1137,15 +1052,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.18.19: - resolution: {integrity: sha512-YLAslaO8NsB9UOxBchos82AOMRDbIAWChwDKfjlGrHSzS3v1kxce7dGlSTsrb0PJwo1KYccypN3VNjQVLtz7LA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-loong64@0.18.20: @@ -1154,15 +1060,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.18.19: - resolution: {integrity: sha512-vSYFtlYds/oTI8aflEP65xo3MXChMwBOG1eWPGGKs/ev9zkTeXVvciU+nifq8J1JYMz+eQ4J9JDN0O2RKF8+1Q==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-mips64el@0.18.20: @@ -1171,15 +1068,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.18.19: - resolution: {integrity: sha512-tgG41lRVwlzqO9tv9l7aXYVw35BxKXLtPam1qALScwSqPivI8hjkZLNH0deaaSCYCFT9cBIdB+hUjWFlFFLL9A==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-ppc64@0.18.20: @@ -1188,15 +1076,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.18.19: - resolution: {integrity: sha512-EgBZFLoN1S5RuB4cCJI31pBPsjE1nZ+3+fHRjguq9Ibrzo29bOLSBcH1KZJvRNh5qtd+fcYIGiIUia8Jw5r1lQ==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-riscv64@0.18.20: @@ -1205,15 +1084,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.18.19: - resolution: {integrity: sha512-q1V1rtHRojAzjSigZEqrcLkpfh5K09ShCoIsdTakozVBnM5rgV58PLFticqDp5UJ9uE0HScov9QNbbl8HBo6QQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-s390x@0.18.20: @@ -1222,15 +1092,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.18.19: - resolution: {integrity: sha512-D0IiYjpZRXxGZLQfsydeAD7ZWqdGyFLBj5f2UshJpy09WPs3qizDCsEr8zyzcym6Woj/UI9ZzMIXwvoXVtyt0A==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true optional: true /@esbuild/linux-x64@0.18.20: @@ -1239,15 +1100,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.18.19: - resolution: {integrity: sha512-3tt3SOS8L3D54R8oER41UdDshlBIAjYhdWRPiZCTZ1E41+shIZBpTjaW5UaN/jD1ENE/Ok5lkeqhoNMbxstyxw==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true optional: true /@esbuild/netbsd-x64@0.18.20: @@ -1256,15 +1108,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.18.19: - resolution: {integrity: sha512-MxbhcuAYQPlfln1EMc4T26OUoeg/YQc6wNoEV8xvktDKZhLtBxjkoeESSo9BbPaGKhAPzusXYj5n8n5A8iZSrA==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true optional: true /@esbuild/openbsd-x64@0.18.20: @@ -1273,15 +1116,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.18.19: - resolution: {integrity: sha512-m0/UOq1wj25JpWqOJxoWBRM9VWc3c32xiNzd+ERlYstUZ6uwx5SZsQUtkiFHaYmcaoj+f6+Tfcl7atuAz3idwQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true optional: true /@esbuild/sunos-x64@0.18.20: @@ -1290,15 +1124,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.18.19: - resolution: {integrity: sha512-L4vb6pcoB1cEcXUHU6EPnUhUc4+/tcz4OqlXTWPcSQWxegfmcOprhmIleKKwmMNQVc4wrx/+jB7tGkjjDmiupg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true optional: true /@esbuild/win32-arm64@0.18.20: @@ -1307,15 +1132,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.18.19: - resolution: {integrity: sha512-rQng7LXSKdrDlNDb7/v0fujob6X0GAazoK/IPd9C3oShr642ri8uIBkgM37/l8B3Rd5sBQcqUXoDdEy75XC/jg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true optional: true /@esbuild/win32-ia32@0.18.20: @@ -1324,15 +1140,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.18.19: - resolution: {integrity: sha512-z69jhyG20Gq4QL5JKPLqUT+eREuqnDAFItLbza4JCmpvUnIlY73YNjd5djlO7kBiiZnvTnJuAbOjIoZIOa1GjA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true optional: true /@esbuild/win32-x64@0.18.20: @@ -1341,7 +1148,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): @@ -1354,8 +1160,8 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.6.2: - resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + /@eslint-community/regexpp@4.8.0: + resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true @@ -1446,8 +1252,8 @@ packages: '@floating-ui/utils': 0.1.1 dev: false - /@floating-ui/react-dom@2.0.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==} + /@floating-ui/react-dom@2.0.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -1465,20 +1271,20 @@ packages: resolution: {integrity: sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==} dependencies: '@formatjs/intl-localematcher': 0.2.25 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@formatjs/ecma402-abstract@1.17.0: resolution: {integrity: sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==} dependencies: '@formatjs/intl-localematcher': 0.4.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@formatjs/fast-memoize@1.2.1: resolution: {integrity: sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@formatjs/icu-messageformat-parser@2.1.0: @@ -1486,44 +1292,44 @@ packages: dependencies: '@formatjs/ecma402-abstract': 1.11.4 '@formatjs/icu-skeleton-parser': 1.3.6 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@formatjs/icu-skeleton-parser@1.3.6: resolution: {integrity: sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==} dependencies: '@formatjs/ecma402-abstract': 1.11.4 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@formatjs/intl-localematcher@0.2.25: resolution: {integrity: sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@formatjs/intl-localematcher@0.2.32: resolution: {integrity: sha512-k/MEBstff4sttohyEpXxCmC3MqbUn9VvHGlZ8fauLzkbwXmVrEeyzS+4uhrvAk9DWU9/7otYWxyDox4nT/KVLQ==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@formatjs/intl-localematcher@0.4.0: resolution: {integrity: sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: false - /@hookform/resolvers@3.3.1(react-hook-form@7.45.4): + /@hookform/resolvers@3.3.1(react-hook-form@7.46.0): resolution: {integrity: sha512-K7KCKRKjymxIB90nHDQ7b9nli474ru99ZbqxiqDAWYsYhOsU3/4qLxW91y+1n04ic13ajjZ66L3aXbNef8PELQ==} peerDependencies: react-hook-form: ^7.0.0 dependencies: - react-hook-form: 7.45.4(react@18.2.0) + react-hook-form: 7.46.0(react@18.2.0) dev: false - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + /@humanwhocodes/config-array@0.11.11: + resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -1561,11 +1367,11 @@ packages: resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} dev: false - /@iconify/utils@2.1.7: - resolution: {integrity: sha512-P8S3z/L1LcV4Qem9AoCfVAaTFGySEMzFEY4CHZLkfRj0Fv9LiR+AwjDgrDrzyI93U2L2mg9JHsbTJ52mF8suNw==} + /@iconify/utils@2.1.9: + resolution: {integrity: sha512-mo+A4n3MwLlWlg1SoSO+Dt6pOPWKElk9sSJ6ZpuzbB9OcjxN8RUWxU3ulPwB1nglErWKRam2x4BAohbYF7FiFA==} dependencies: '@antfu/install-pkg': 0.1.1 - '@antfu/utils': 0.7.5 + '@antfu/utils': 0.7.6 '@iconify/types': 2.0.0 debug: 4.3.4 kolorist: 1.8.0 @@ -1596,11 +1402,7 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 - - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} + '@jridgewell/trace-mapping': 0.3.19 /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} @@ -1614,19 +1416,16 @@ packages: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + '@jridgewell/trace-mapping': 0.3.19 /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/trace-mapping@0.3.18: - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -1705,7 +1504,7 @@ packages: dev: false optional: true - /@nestjs/axios@3.0.0(@nestjs/common@10.2.4)(axios@1.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + /@nestjs/axios@3.0.0(@nestjs/common@10.2.4)(axios@1.5.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): resolution: {integrity: sha512-ULdH03jDWkS5dy9X69XbUVbhC+0pVnrRcj7bIK/ytTZ76w7CgvTZDJqsIyisg3kNOiljRW/4NIjSf3j6YGvl+g==} peerDependencies: '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -1714,7 +1513,7 @@ packages: rxjs: ^6.0.0 || ^7.0.0 dependencies: '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - axios: 1.4.0 + axios: 1.5.0 reflect-metadata: 0.1.13 rxjs: 7.8.1 dev: false @@ -1744,7 +1543,7 @@ packages: tslib: 2.6.0 dev: false - /@nestjs/cli@10.1.17(@swc/cli@0.1.62)(@swc/core@1.3.82)(esbuild@0.18.19): + /@nestjs/cli@10.1.17(@swc/cli@0.1.62)(@swc/core@1.3.82)(esbuild@0.18.20): resolution: {integrity: sha512-jUEnR2DgC15Op+IhcRWb6cyJrhec9CUQO+GtxCF2Dv9MwLcr4sTDq1UOkfs09HAhpuI8otgF2LoWGTlW3qRuqg==} engines: {node: '>= 16'} hasBin: true @@ -1779,7 +1578,7 @@ packages: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.1.6 - webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.19) + webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.20) webpack-node-externals: 3.0.0 transitivePeerDependencies: - esbuild @@ -1840,6 +1639,22 @@ packages: - encoding dev: false + /@nestjs/devtools-integration@0.1.5(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-iwxvfxa3kzOulG/Fje82Ww80OVsA8rzYR+UAEKrdGExRRGQRGQ0+bHfG0XLlPG3XIuM5J2MRMo7x1bN8ZIs9Gg==} + peerDependencies: + '@nestjs/common': ^9.3.7 || ^10.0.0 + '@nestjs/core': ^9.3.7 || ^10.0.0 + reflect-metadata: ^0.1.12 + dependencies: + '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) + chalk: 4.1.2 + node-fetch: 2.7.0 + reflect-metadata: 0.1.13 + transitivePeerDependencies: + - encoding + dev: false + /@nestjs/mapped-types@2.0.2(@nestjs/common@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): resolution: {integrity: sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==} peerDependencies: @@ -2122,7 +1937,7 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@npmcli/name-from-folder': 2.0.0 - glob: 10.3.3 + glob: 10.3.4 minimatch: 9.0.3 read-package-json-fast: 3.0.2 dev: true @@ -2164,7 +1979,7 @@ packages: dependencies: chalk: 4.1.2 consola: 2.15.3 - node-fetch: 2.6.12 + node-fetch: 2.7.0 transitivePeerDependencies: - encoding dev: false @@ -2259,7 +2074,7 @@ packages: '@octokit/request-error': 3.0.3 '@octokit/types': 9.3.2 is-plain-object: 5.0.0 - node-fetch: 2.6.12 + node-fetch: 2.7.0 universal-user-agent: 6.0.0 transitivePeerDependencies: - encoding @@ -2314,7 +2129,7 @@ packages: dependencies: '@ohbug/types': 2.2.1 '@ohbug/utils': 2.0.8 - solid-js: 1.7.9 + solid-js: 1.7.11 dev: false /@ohbug/extension-rrweb@1.10.1(rrweb@2.0.0-alpha.4): @@ -2371,7 +2186,7 @@ packages: resolution: {integrity: sha512-eAhFr8c+7Q6MtxvkwgEGAg91XZXoZzASIsUzoGQAqt/hlMIPHlsN9CO2Lxr012jBU/I/pnQteopq+sQbZQjKIA==} dependencies: '@ohbug/types': 2.2.1 - '@types/node': 20.5.8 + '@types/node': 20.5.9 dev: false /@ohbug/vue@2.0.10(vue@3.3.4): @@ -2441,19 +2256,19 @@ packages: /@radix-ui/number@1.0.1: resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 dev: false /@radix-ui/primitive@1.0.0: resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 dev: false /@radix-ui/primitive@1.0.1: resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 dev: false /@radix-ui/react-accordion@1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): @@ -2469,7 +2284,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) @@ -2498,7 +2313,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 @@ -2519,7 +2334,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -2543,7 +2358,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -2571,7 +2386,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -2599,7 +2414,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) @@ -2615,7 +2430,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 react: 18.2.0 dev: false @@ -2628,7 +2443,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@types/react': 18.2.21 react: 18.2.0 dev: false @@ -2638,7 +2453,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 react: 18.2.0 dev: false @@ -2651,7 +2466,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@types/react': 18.2.21 react: 18.2.0 dev: false @@ -2662,7 +2477,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) '@radix-ui/react-context': 1.0.0(react@18.2.0) @@ -2696,7 +2511,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -2726,7 +2541,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@types/react': 18.2.21 react: 18.2.0 dev: false @@ -2737,7 +2552,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) @@ -2760,7 +2575,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) @@ -2785,7 +2600,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -2804,7 +2619,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 react: 18.2.0 dev: false @@ -2817,7 +2632,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@types/react': 18.2.21 react: 18.2.0 dev: false @@ -2828,7 +2643,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) @@ -2849,7 +2664,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -2864,7 +2679,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) react: 18.2.0 dev: false @@ -2878,7 +2693,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 react: 18.2.0 @@ -2897,7 +2712,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 @@ -2918,7 +2733,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -2956,7 +2771,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -2990,7 +2805,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -3025,8 +2840,8 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 - '@floating-ui/react-dom': 2.0.1(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.22.11 + '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -3048,7 +2863,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -3067,7 +2882,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 @@ -3081,7 +2896,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) react: 18.2.0 @@ -3101,7 +2916,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 @@ -3116,7 +2931,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-slot': 1.0.0(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -3135,7 +2950,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 @@ -3156,7 +2971,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -3185,7 +3000,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) @@ -3226,7 +3041,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 @@ -3239,7 +3054,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) react: 18.2.0 dev: false @@ -3253,7 +3068,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 react: 18.2.0 @@ -3272,7 +3087,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -3299,7 +3114,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -3327,7 +3142,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -3359,7 +3174,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) @@ -3383,7 +3198,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 react: 18.2.0 dev: false @@ -3396,7 +3211,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@types/react': 18.2.21 react: 18.2.0 dev: false @@ -3406,7 +3221,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) react: 18.2.0 dev: false @@ -3420,7 +3235,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 react: 18.2.0 @@ -3431,7 +3246,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) react: 18.2.0 dev: false @@ -3445,7 +3260,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 react: 18.2.0 @@ -3456,7 +3271,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 react: 18.2.0 dev: false @@ -3469,7 +3284,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@types/react': 18.2.21 react: 18.2.0 dev: false @@ -3483,7 +3298,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@types/react': 18.2.21 react: 18.2.0 dev: false @@ -3497,7 +3312,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/rect': 1.0.1 '@types/react': 18.2.21 react: 18.2.0 @@ -3512,7 +3327,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 react: 18.2.0 @@ -3531,7 +3346,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 @@ -3542,7 +3357,7 @@ packages: /@radix-ui/rect@1.0.1: resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 dev: false /@release-it/conventional-changelog@7.0.0(release-it@16.1.5): @@ -3558,35 +3373,46 @@ packages: semver: 7.5.1 dev: true - /@rrweb/types@2.0.0-alpha.10: - resolution: {integrity: sha512-SjpFUq7XJVmMZXuntngmsNH6KCIsFH39tq+vTB96J/tfPkeUsEHszhc4HbeKbcs2TBa+FxAWLb3VQ4fX00Bddg==} + /@rrweb/types@2.0.0-alpha.11: + resolution: {integrity: sha512-8ccocIkT5J/bfNRQY85qR/g6p5YQFpgFO2cMt4+Ex7w31Lq0yqZBRaoYEsawQKpLrn5KOHkdn2UTUrna7WMQuA==} dependencies: - rrweb-snapshot: 2.0.0-alpha.10 + rrweb-snapshot: 2.0.0-alpha.11 dev: false /@rrweb/types@2.0.0-alpha.9: resolution: {integrity: sha512-yS2KghLSmSSxo6H7tHrJ6u+nWJA9zCXaKFyc79rUSX8RHHSImRqocTqJ8jz794kCIWA90rvaQayRONdHO+vB0Q==} dependencies: - rrweb-snapshot: 2.0.0-alpha.10 + rrweb-snapshot: 2.0.0-alpha.11 dev: false - /@sigstore/bundle@1.0.0: - resolution: {integrity: sha512-yLvrWDOh6uMOUlFCTJIZEnwOT9Xte7NPXUqVexEKGSF5XtBAuSg5du0kn3dRR0p47a4ah10Y0mNt8+uyeQXrBQ==} + /@sigstore/bundle@1.1.0: + resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - '@sigstore/protobuf-specs': 0.2.0 + '@sigstore/protobuf-specs': 0.2.1 dev: true - /@sigstore/protobuf-specs@0.2.0: - resolution: {integrity: sha512-8ZhZKAVfXjIspDWwm3D3Kvj0ddbJ0HqDZ/pOs5cx88HpT8mVsotFrg7H1UMnXOuDHz6Zykwxn4mxG3QLuN+RUg==} + /@sigstore/protobuf-specs@0.2.1: + resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true + /@sigstore/sign@1.0.0: + resolution: {integrity: sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@sigstore/bundle': 1.1.0 + '@sigstore/protobuf-specs': 0.2.1 + make-fetch-happen: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + /@sigstore/tuf@1.0.3: resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - '@sigstore/protobuf-specs': 0.2.0 + '@sigstore/protobuf-specs': 0.2.1 tuf-js: 1.1.7 transitivePeerDependencies: - supports-color @@ -3726,7 +3552,7 @@ packages: /@swc/helpers@0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@swc/types@0.1.4: @@ -3807,7 +3633,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.5.8 + '@types/node': 20.5.9 dev: false /@types/bull@4.10.0: @@ -3824,13 +3650,13 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 20.5.8 + '@types/node': 20.5.9 '@types/responselike': 1.0.0 /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.5.8 + '@types/node': 20.5.9 dev: false /@types/cron@2.4.0: @@ -3863,11 +3689,11 @@ packages: /@types/estree@1.0.1: resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} - /@types/express-serve-static-core@4.17.35: - resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} + /@types/express-serve-static-core@4.17.36: + resolution: {integrity: sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==} dependencies: - '@types/node': 20.5.8 - '@types/qs': 6.9.7 + '@types/node': 20.5.9 + '@types/qs': 6.9.8 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 dev: false @@ -3876,8 +3702,8 @@ packages: resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} dependencies: '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.35 - '@types/qs': 6.9.7 + '@types/express-serve-static-core': 4.17.36 + '@types/qs': 6.9.8 '@types/serve-static': 1.15.2 dev: false @@ -3906,10 +3732,10 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.5.8 + '@types/node': 20.5.9 - /@types/linkify-it@3.0.2: - resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} + /@types/linkify-it@3.0.3: + resolution: {integrity: sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g==} dev: false /@types/luxon@3.3.2: @@ -3919,14 +3745,14 @@ packages: /@types/markdown-it@13.0.1: resolution: {integrity: sha512-SUEb8Frsxs3D5Gg9xek6i6EG6XQ5s+O+ZdQzIPESZVZw3Pv3CPQfjCJBI+RgqZd1IBeu18S0Rn600qpPnEK37w==} dependencies: - '@types/linkify-it': 3.0.2 + '@types/linkify-it': 3.0.3 '@types/mdurl': 1.0.2 dev: false /@types/mdast@3.0.12: resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} dependencies: - '@types/unist': 2.0.7 + '@types/unist': 2.0.8 dev: true /@types/mdurl@1.0.2: @@ -3950,17 +3776,13 @@ packages: requiresBuild: true dev: true - /@types/node@20.4.8: - resolution: {integrity: sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg==} - dev: false - - /@types/node@20.5.8: - resolution: {integrity: sha512-eajsR9aeljqNhK028VG0Wuw+OaY5LLxYmxeoXynIoE6jannr9/Ucd1LL0hSSoafk5LTYG+FfqsyGt81Q6Zkybw==} + /@types/node@20.5.9: + resolution: {integrity: sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==} /@types/nodemailer@6.4.9: resolution: {integrity: sha512-XYG8Gv+sHjaOtUpiuytahMy2mM3rectgroNbs6R3djZEKmPNiIJwe9KqOJBGzKKnNZNKvnuvmugBgpq3w/S0ig==} dependencies: - '@types/node': 20.4.8 + '@types/node': 20.5.9 dev: false /@types/normalize-package-data@2.4.1: @@ -3979,8 +3801,8 @@ packages: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} dev: false - /@types/qs@6.9.7: - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + /@types/qs@6.9.8: + resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==} dev: false /@types/ramda@0.29.3: @@ -4010,21 +3832,21 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.5.8 + '@types/node': 20.5.9 /@types/scheduler@0.16.3: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} dev: false - /@types/semver@7.5.0: - resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + /@types/semver@7.5.1: + resolution: {integrity: sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==} dev: true /@types/send@0.17.1: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.5.8 + '@types/node': 20.5.9 dev: false /@types/serve-static@1.15.2: @@ -4032,19 +3854,19 @@ packages: dependencies: '@types/http-errors': 2.0.1 '@types/mime': 3.0.1 - '@types/node': 20.5.8 + '@types/node': 20.5.9 dev: false /@types/ua-parser-js@0.7.37: resolution: {integrity: sha512-4sOxS3ZWXC0uHJLYcWAaLMxTvjRX3hT96eF4YWUh1ovTaenvibaZOE5uXtIp4mksKMLRwo7YDiCBCw6vBiUPVg==} dev: false - /@types/unist@2.0.7: - resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} + /@types/unist@2.0.8: + resolution: {integrity: sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==} dev: true - /@types/validator@13.9.0: - resolution: {integrity: sha512-NclP0IbzHj/4tJZKFqKh8E7kZdgss+MCUYV9G+TLltFfDA4lFgE4PKPpDIyS2FlcdANIfSx273emkupvChigbw==} + /@types/validator@13.11.1: + resolution: {integrity: sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==} dev: false /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2): @@ -4058,7 +3880,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.6.2 + '@eslint-community/regexpp': 4.8.0 '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 6.5.0 '@typescript-eslint/type-utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) @@ -4070,7 +3892,7 @@ packages: ignore: 5.2.4 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.2.2) + ts-api-utils: 1.0.2(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - supports-color @@ -4119,7 +3941,7 @@ packages: '@typescript-eslint/utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) debug: 4.3.4 eslint: 8.48.0 - ts-api-utils: 1.0.1(typescript@5.2.2) + ts-api-utils: 1.0.2(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - supports-color @@ -4145,7 +3967,7 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.2.2) + ts-api-utils: 1.0.2(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - supports-color @@ -4159,7 +3981,7 @@ packages: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 + '@types/semver': 7.5.1 '@typescript-eslint/scope-manager': 6.5.0 '@typescript-eslint/types': 6.5.0 '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) @@ -4181,7 +4003,7 @@ packages: /@vue/compiler-core@3.3.4: resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} dependencies: - '@babel/parser': 7.22.7 + '@babel/parser': 7.22.14 '@vue/shared': 3.3.4 estree-walker: 2.0.2 source-map-js: 1.0.2 @@ -4197,14 +4019,14 @@ packages: /@vue/compiler-sfc@3.3.4: resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} dependencies: - '@babel/parser': 7.22.7 + '@babel/parser': 7.22.14 '@vue/compiler-core': 3.3.4 '@vue/compiler-dom': 3.3.4 '@vue/compiler-ssr': 3.3.4 '@vue/reactivity-transform': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 - magic-string: 0.30.2 + magic-string: 0.30.3 postcss: 8.4.29 source-map-js: 1.0.2 dev: false @@ -4219,11 +4041,11 @@ packages: /@vue/reactivity-transform@3.3.4: resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} dependencies: - '@babel/parser': 7.22.7 + '@babel/parser': 7.22.14 '@vue/compiler-core': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 - magic-string: 0.30.2 + magic-string: 0.30.3 dev: false /@vue/reactivity@3.3.4: @@ -4599,7 +4421,7 @@ packages: resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} engines: {node: '>=10'} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: false /array-buffer-byte-length@1.0.0: @@ -4633,8 +4455,8 @@ packages: engines: {node: '>=8'} dev: true - /array.prototype.findlastindex@1.2.2: - resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} + /array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -4710,7 +4532,7 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: true /async-retry@1.3.3: @@ -4747,8 +4569,8 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.21.10 - caniuse-lite: 1.0.30001522 - fraction.js: 4.2.0 + caniuse-lite: 1.0.30001525 + fraction.js: 4.3.6 normalize-range: 0.1.2 picocolors: 1.0.0 postcss: 8.4.29 @@ -4770,8 +4592,8 @@ packages: - supports-color dev: false - /axios@1.4.0: - resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} + /axios@1.5.0: + resolution: {integrity: sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==} dependencies: follow-redirects: 1.15.2 form-data: 4.0.0 @@ -4784,7 +4606,7 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 cosmiconfig: 7.1.0 resolve: 1.22.4 dev: false @@ -4906,8 +4728,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001522 - electron-to-chromium: 1.4.485 + caniuse-lite: 1.0.30001525 + electron-to-chromium: 1.4.508 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.10) @@ -4941,11 +4763,11 @@ packages: resolution: {integrity: sha512-DhS0XtiAuejkAY08iGOdDK35eex/yGNoezlWqGJTu9FqWFF/oBjUhpsusE9SXiI4culyDbOoFs+l3ar0VXhFqQ==} engines: {node: '>=12'} dependencies: - cron-parser: 4.8.1 + cron-parser: 4.9.0 get-port: 5.1.1 ioredis: 5.3.2 lodash: 4.17.21 - msgpackr: 1.9.6 + msgpackr: 1.9.7 semver: 7.5.4 uuid: 8.3.2 transitivePeerDependencies: @@ -4959,13 +4781,13 @@ packages: run-applescript: 5.0.0 dev: true - /bundle-require@4.0.1(esbuild@0.18.19): + /bundle-require@4.0.1(esbuild@0.18.20): resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.17' dependencies: - esbuild: 0.18.19 + esbuild: 0.18.20 load-tsconfig: 0.2.5 dev: true @@ -4981,20 +4803,20 @@ packages: engines: {node: '>=8'} dev: true - /cacache@17.1.3: - resolution: {integrity: sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==} + /cacache@17.1.4: + resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@npmcli/fs': 3.1.0 - fs-minipass: 3.0.2 - glob: 10.3.3 + fs-minipass: 3.0.3 + glob: 10.3.4 lru-cache: 7.18.3 - minipass: 5.0.0 + minipass: 7.0.3 minipass-collect: 1.0.2 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 p-map: 4.0.0 - ssri: 10.0.4 + ssri: 10.0.5 tar: 6.1.15 unique-filename: 3.0.0 dev: true @@ -5072,12 +4894,8 @@ packages: engines: {node: '>=14.16'} dev: true - /caniuse-lite@1.0.30001519: - resolution: {integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==} - dev: false - - /caniuse-lite@1.0.30001522: - resolution: {integrity: sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==} + /caniuse-lite@1.0.30001525: + resolution: {integrity: sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==} /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -5126,7 +4944,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} @@ -5149,8 +4967,8 @@ packages: /class-validator@0.14.0: resolution: {integrity: sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==} dependencies: - '@types/validator': 13.9.0 - libphonenumber-js: 1.10.39 + '@types/validator': 13.11.1 + libphonenumber-js: 1.10.44 validator: 13.11.0 dev: false @@ -5373,7 +5191,7 @@ packages: dev: false /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} /concat-stream@2.0.0: resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} @@ -5499,7 +5317,7 @@ packages: handlebars: 4.7.8 json-stringify-safe: 5.0.1 meow: 8.1.2 - semver: 7.5.4 + semver: 7.5.1 split: 1.0.1 dev: true @@ -5575,7 +5393,7 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - /cosmiconfig-typescript-loader@4.4.0(@types/node@20.4.7)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.2.2): + /cosmiconfig-typescript-loader@4.4.0(@types/node@20.4.7)(cosmiconfig@8.3.2)(ts-node@10.9.1)(typescript@5.2.2): resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} engines: {node: '>=v14.21.3'} requiresBuild: true @@ -5586,8 +5404,8 @@ packages: typescript: '>=4' dependencies: '@types/node': 20.4.7 - cosmiconfig: 8.2.0 - ts-node: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.8)(typescript@5.2.2) + cosmiconfig: 8.3.2(typescript@5.2.2) + ts-node: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.9)(typescript@5.2.2) typescript: 5.2.2 dev: true @@ -5612,20 +5430,37 @@ packages: path-type: 4.0.0 dev: true + /cosmiconfig@8.3.2(typescript@5.2.2): + resolution: {integrity: sha512-/PvU3MjSLVKJMRHsL6GW+wHQ9RaJuMW6fnn56sXNy+kP1L8nI/SHk9F9giIA+dnfzjKNJAulRjOR/fi9kzGuNA==} + engines: {node: '>=18'} + requiresBuild: true + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.2.2 + dev: true + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - /cron-parser@4.8.1: - resolution: {integrity: sha512-jbokKWGcyU4gl6jAfX97E1gDpY12DJ1cLJZmoDzaAln/shZ+S3KBFBuA2Q6WeUN4gJf/8klnV1EfvhA2lK5IRQ==} + /cron-parser@4.9.0: + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} dependencies: - luxon: 3.3.0 + luxon: 3.4.2 dev: false /cron@2.4.1: resolution: {integrity: sha512-ty0hUSPuENwDtIShDFxUxWEIsqiu2vhoFtt6Vwrbg4lHGtJX2/cV2p0hH6/qaEM9Pj+i6mQoau48BO5wBpkP4w==} dependencies: - luxon: 3.3.0 + luxon: 3.4.2 dev: false /cron@2.4.3: @@ -5646,7 +5481,7 @@ packages: /cross-fetch@3.1.8: resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} dependencies: - node-fetch: 2.6.12 + node-fetch: 2.7.0 transitivePeerDependencies: - encoding dev: false @@ -5786,7 +5621,7 @@ packages: mimic-response: 3.1.0 /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + resolution: {integrity: sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=} dev: true /deep-extend@0.6.0: @@ -5948,12 +5783,12 @@ packages: peerDependencies: react: '>=16.12.0' dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 compute-scroll-into-view: 2.0.4 prop-types: 15.8.1 react: 18.2.0 react-is: 17.0.2 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /eastasianwidth@0.2.0: @@ -5961,11 +5796,11 @@ packages: dev: true /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} dev: false - /electron-to-chromium@1.4.485: - resolution: {integrity: sha512-1ndQ5IBNEnFirPwvyud69GHL+31FkE09gH/CJ6m3KCbkx3i0EVOrjwz4UNxRmN9H8OVHbC6vMRZGN1yCvjSs9w==} + /electron-to-chromium@1.4.508: + resolution: {integrity: sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==} /emoji-regex@10.2.1: resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} @@ -6033,7 +5868,7 @@ packages: call-bind: 1.0.2 es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 + function.prototype.name: 1.1.6 get-intrinsic: 1.2.1 get-symbol-description: 1.0.0 globalthis: 1.0.3 @@ -6086,8 +5921,8 @@ packages: stop-iteration-iterator: 1.0.0 dev: true - /es-iterator-helpers@1.0.13: - resolution: {integrity: sha512-LK3VGwzvaPWobO8xzXXGRUOGw8Dcjyfk62CsY/wfHN75CwsJPbuypOYJxK6g5RyEL8YDjIWcl6jgd8foO6mmrA==} + /es-iterator-helpers@1.0.14: + resolution: {integrity: sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==} dependencies: asynciterator.prototype: 1.0.0 call-bind: 1.0.2 @@ -6101,7 +5936,7 @@ packages: has-proto: 1.0.1 has-symbols: 1.0.3 internal-slot: 1.0.5 - iterator.prototype: 1.1.0 + iterator.prototype: 1.1.1 safe-array-concat: 1.0.0 dev: true @@ -6132,35 +5967,6 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild@0.18.19: - resolution: {integrity: sha512-ra3CaIKCzJp5bU5BDfrCc0FRqKj71fQi+gbld0aj6lN0ifuX2fWJYPgLVLGwPfA+ruKna+OWwOvf/yHj6n+i0g==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.18.19 - '@esbuild/android-arm64': 0.18.19 - '@esbuild/android-x64': 0.18.19 - '@esbuild/darwin-arm64': 0.18.19 - '@esbuild/darwin-x64': 0.18.19 - '@esbuild/freebsd-arm64': 0.18.19 - '@esbuild/freebsd-x64': 0.18.19 - '@esbuild/linux-arm': 0.18.19 - '@esbuild/linux-arm64': 0.18.19 - '@esbuild/linux-ia32': 0.18.19 - '@esbuild/linux-loong64': 0.18.19 - '@esbuild/linux-mips64el': 0.18.19 - '@esbuild/linux-ppc64': 0.18.19 - '@esbuild/linux-riscv64': 0.18.19 - '@esbuild/linux-s390x': 0.18.19 - '@esbuild/linux-x64': 0.18.19 - '@esbuild/netbsd-x64': 0.18.19 - '@esbuild/openbsd-x64': 0.18.19 - '@esbuild/sunos-x64': 0.18.19 - '@esbuild/win32-arm64': 0.18.19 - '@esbuild/win32-ia32': 0.18.19 - '@esbuild/win32-x64': 0.18.19 - /esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -6189,7 +5995,6 @@ packages: '@esbuild/win32-arm64': 0.18.20 '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - dev: true /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -6229,8 +6034,8 @@ packages: engines: {node: ^16.13.0 || >=18.0.0, npm: '>=7.0.0', pnpm: '>= 8.6.0'} dev: true - /eslint-import-resolver-node@0.3.8: - resolution: {integrity: sha512-tEe+Pok22qIGaK3KoMP+N96GVDS66B/zreoVVmiavLvRUEmGRtvb4B8wO9jwnb8d2lvHtrkhZ7UD73dWBVnf/Q==} + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7 is-core-module: 2.13.0 @@ -6239,7 +6044,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.8)(eslint@8.48.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -6263,7 +6068,7 @@ packages: '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) debug: 3.2.7 eslint: 8.48.0 - eslint-import-resolver-node: 0.3.8 + eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color dev: true @@ -6301,21 +6106,21 @@ packages: dependencies: '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) array-includes: 3.1.6 - array.prototype.findlastindex: 1.2.2 + array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.48.0 - eslint-import-resolver-node: 0.3.8 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.8)(eslint@8.48.0) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.6 - object.groupby: 1.0.0 - object.values: 1.1.6 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 semver: 6.3.1 tsconfig-paths: 3.14.2 transitivePeerDependencies: @@ -6367,19 +6172,19 @@ packages: array.prototype.flatmap: 1.3.1 array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 - es-iterator-helpers: 1.0.13 + es-iterator-helpers: 1.0.14 eslint: 8.48.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - object.hasown: 1.1.2 - object.values: 1.1.6 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.hasown: 1.1.3 + object.values: 1.1.7 prop-types: 15.8.1 resolve: 2.0.0-next.4 semver: 6.3.1 - string.prototype.matchall: 4.0.8 + string.prototype.matchall: 4.0.9 dev: true /eslint-plugin-unicorn@48.0.1(eslint@8.48.0): @@ -6485,10 +6290,10 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) - '@eslint-community/regexpp': 4.6.2 + '@eslint-community/regexpp': 4.8.0 '@eslint/eslintrc': 2.1.2 '@eslint/js': 8.48.0 - '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/config-array': 0.11.11 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 @@ -6858,7 +6663,7 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 3.0.4 + flat-cache: 3.1.0 dev: true /file-type@17.1.6: @@ -6944,11 +6749,12 @@ packages: resolve-dir: 1.0.1 dev: true - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} + /flat-cache@3.1.0: + resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} + engines: {node: '>=12.0.0'} dependencies: flatted: 3.2.7 + keyv: 4.5.3 rimraf: 3.0.2 dev: true @@ -6999,7 +6805,7 @@ packages: typescript: '>3.6.0' webpack: ^5.11.0 dependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.22.13 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 7.1.0 @@ -7012,7 +6818,7 @@ packages: semver: 7.5.4 tapable: 2.2.1 typescript: 5.1.6 - webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.19) + webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.20) dev: false /form-data-encoder@2.1.4: @@ -7041,8 +6847,8 @@ packages: engines: {node: '>= 0.6'} dev: false - /fraction.js@4.2.0: - resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + /fraction.js@4.3.6: + resolution: {integrity: sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==} dev: false /framer-motion@10.16.2(react-dom@18.2.0)(react@18.2.0): @@ -7058,7 +6864,7 @@ packages: dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - tslib: 2.6.1 + tslib: 2.6.2 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 dev: false @@ -7107,11 +6913,11 @@ packages: minipass: 3.3.6 dev: true - /fs-minipass@3.0.2: - resolution: {integrity: sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==} + /fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - minipass: 5.0.0 + minipass: 7.0.3 dev: true /fs-monkey@1.0.4: @@ -7121,8 +6927,8 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true @@ -7131,8 +6937,8 @@ packages: /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -7215,8 +7021,8 @@ packages: get-intrinsic: 1.2.1 dev: true - /get-tsconfig@4.6.2: - resolution: {integrity: sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==} + /get-tsconfig@4.7.0: + resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} dependencies: resolve-pkg-maps: 1.0.0 dev: true @@ -7269,7 +7075,7 @@ packages: hasBin: true dependencies: meow: 8.1.2 - semver: 7.5.4 + semver: 7.5.1 dev: true /git-up@7.0.0: @@ -7306,15 +7112,15 @@ packages: /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - /glob@10.3.3: - resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} + /glob@10.3.4: + resolution: {integrity: sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: foreground-child: 3.1.1 - jackspeak: 2.2.2 + jackspeak: 2.3.1 minimatch: 9.0.3 - minipass: 7.0.2 + minipass: 7.0.3 path-scurry: 1.10.1 dev: true @@ -7896,7 +7702,7 @@ packages: '@formatjs/ecma402-abstract': 1.11.4 '@formatjs/fast-memoize': 1.2.1 '@formatjs/icu-messageformat-parser': 2.1.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /invariant@2.2.4: @@ -8302,18 +8108,17 @@ packages: iterate-iterator: 1.0.2 dev: true - /iterator.prototype@1.1.0: - resolution: {integrity: sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==} + /iterator.prototype@1.1.1: + resolution: {integrity: sha512-9E+nePc8C9cnQldmNl6bgpTY6zI4OPRZd97fhJ/iVZ1GifIUDVV5F6x1nEDqpe8KaMEZGT4xgrwKQDxXnjOIZQ==} dependencies: define-properties: 1.2.0 get-intrinsic: 1.2.1 has-symbols: 1.0.3 - has-tostringtag: 1.0.0 - reflect.getprototypeof: 1.0.3 + reflect.getprototypeof: 1.0.4 dev: true - /jackspeak@2.2.2: - resolution: {integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==} + /jackspeak@2.3.1: + resolution: {integrity: sha512-4iSY3Bh1Htv+kLhiiZunUhQ+OYXIn0ze3ulq8JeWrFKmhPAJSySV2+kdtRh2pGcCeF0s6oR8Oc+pYZynJj4t8A==} engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 @@ -8325,16 +8130,16 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.5.8 + '@types/node': 20.5.9 merge-stream: 2.0.0 supports-color: 8.1.1 - /jiti@1.19.1: - resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} + /jiti@1.19.3: + resolution: {integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==} hasBin: true - /jose@4.14.4: - resolution: {integrity: sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==} + /jose@4.14.5: + resolution: {integrity: sha512-56ns1XlSI8d5V0t7hilPu8dMbE4YIwrTJU6e7bV1Abyu6oel4tSc4YmD742MoWV3U+vn7O0WlKpinzu2DP0HWw==} dev: false /jotai@2.4.1(@types/react@18.2.21)(react@18.2.0): @@ -8461,7 +8266,7 @@ packages: array-includes: 3.1.6 array.prototype.flat: 1.3.1 object.assign: 4.1.4 - object.values: 1.1.6 + object.values: 1.1.7 dev: true /keyv@4.5.3: @@ -8498,8 +8303,8 @@ packages: type-check: 0.4.0 dev: true - /libphonenumber-js@1.10.39: - resolution: {integrity: sha512-iPMM/NbSNIrdwbr94rAOos6krB7snhfzEptmk/DJUtTPs+P9gOhZ1YXVPcRgjpp3jJByclfm/Igvz45spfJK7g==} + /libphonenumber-js@1.10.44: + resolution: {integrity: sha512-svlRdNBI5WgBjRC20GrCfbFiclbF0Cx+sCcQob/C1r57nsoq0xg8r65QbTyVyweQIlB33P+Uahyho6EMYgcOyQ==} dev: false /light-my-request@5.10.0: @@ -8662,6 +8467,7 @@ packages: /lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + requiresBuild: true dev: true /lodash.snakecase@4.1.1: @@ -8737,8 +8543,8 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /lru-cache@10.0.0: - resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==} + /lru-cache@10.0.1: + resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} engines: {node: 14 || >=16.14} /lru-cache@4.1.5: @@ -8771,6 +8577,11 @@ packages: engines: {node: '>=12'} dev: false + /luxon@3.4.2: + resolution: {integrity: sha512-uBoAVCVcajsrqy3pv7eo5jEUz1oeLmCcnMv8n4AJpT5hbpN9lUssAXibNElpbLce3Mhm9dyBzwYLs9zctM/0tA==} + engines: {node: '>=12'} + dev: false + /macos-release@2.5.1: resolution: {integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==} engines: {node: '>=6'} @@ -8795,8 +8606,8 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: false - /magic-string@0.30.2: - resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} + /magic-string@0.30.3: + resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -8810,20 +8621,20 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: agentkeepalive: 4.5.0 - cacache: 17.1.3 + cacache: 17.1.4 http-cache-semantics: 4.1.1 http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-lambda: 1.0.1 lru-cache: 7.18.3 minipass: 5.0.0 - minipass-fetch: 3.0.3 + minipass-fetch: 3.0.4 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 negotiator: 0.6.3 promise-retry: 2.0.1 socks-proxy-agent: 7.0.0 - ssri: 10.0.4 + ssri: 10.0.5 transitivePeerDependencies: - supports-color dev: true @@ -8874,7 +8685,7 @@ packages: dev: false /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} engines: {node: '>= 0.6'} dev: false @@ -9015,11 +8826,11 @@ packages: minipass: 3.3.6 dev: true - /minipass-fetch@3.0.3: - resolution: {integrity: sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==} + /minipass-fetch@3.0.4: + resolution: {integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - minipass: 5.0.0 + minipass: 7.0.3 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: @@ -9071,8 +8882,8 @@ packages: engines: {node: '>=8'} dev: true - /minipass@7.0.2: - resolution: {integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==} + /minipass@7.0.3: + resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} engines: {node: '>=16 || 14 >=14.17'} /minizlib@2.1.2: @@ -9092,13 +8903,13 @@ packages: engines: {node: '>=10'} hasBin: true - /mlly@1.4.0: - resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + /mlly@1.4.1: + resolution: {integrity: sha512-SCDs78Q2o09jiZiE2WziwVBEqXQ02XkGdUy45cbJf+BpYRIjArXRJ1Wbowxkb+NaM9DWvS3UC9GiO/6eqvQ/pg==} dependencies: acorn: 8.10.0 pathe: 1.1.1 pkg-types: 1.0.3 - ufo: 1.2.0 + ufo: 1.3.0 dev: true /mnemonist@0.39.5: @@ -9135,8 +8946,8 @@ packages: dev: false optional: true - /msgpackr@1.9.6: - resolution: {integrity: sha512-50rmb6+ZWvEm0vJn8R8CwI1Eavss3h5rgtKrcdUal3EkZcpqw82+xsmc7RoHb8fYB5V4EOU2NDaOitDAdO0t+w==} + /msgpackr@1.9.7: + resolution: {integrity: sha512-baUNaLvKQvVhzfWTNO07njwbZK1Lxjtb0P1JL6/EhXdLTHzR57/mZqqJC39TtQKvOmkJA4pcejS4dbk7BDgLLA==} optionalDependencies: msgpackr-extract: 3.0.2 dev: false @@ -9225,16 +9036,16 @@ packages: nodemailer: optional: true dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 '@panva/hkdf': 1.1.1 cookie: 0.5.0 - jose: 4.14.4 + jose: 4.14.5 next: 13.4.19(react-dom@18.2.0)(react@18.2.0) nodemailer: 6.9.4 oauth: 0.9.15 openid-client: 5.4.3 - preact: 10.16.0 - preact-render-to-string: 5.2.6(preact@10.16.0) + preact: 10.17.1 + preact-render-to-string: 5.2.6(preact@10.17.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) uuid: 8.3.2 @@ -9284,7 +9095,7 @@ packages: '@next/env': 13.4.19 '@swc/helpers': 0.5.1 busboy: 1.6.0 - caniuse-lite: 1.0.30001519 + caniuse-lite: 1.0.30001525 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -9321,8 +9132,8 @@ packages: lodash: 4.17.21 dev: false - /node-fetch@2.6.12: - resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -9407,7 +9218,7 @@ packages: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.0 - semver: 7.5.4 + semver: 7.5.1 validate-npm-package-license: 3.0.4 dev: true @@ -9446,8 +9257,8 @@ packages: npm-normalize-package-bin: 3.0.1 dev: true - /npm-install-checks@6.1.1: - resolution: {integrity: sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==} + /npm-install-checks@6.2.0: + resolution: {integrity: sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: semver: 7.5.4 @@ -9479,7 +9290,7 @@ packages: resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - npm-install-checks: 6.1.1 + npm-install-checks: 6.2.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 semver: 7.5.4 @@ -9491,7 +9302,7 @@ packages: dependencies: make-fetch-happen: 11.1.1 minipass: 5.0.0 - minipass-fetch: 3.0.3 + minipass-fetch: 3.0.4 minipass-json-stream: 1.0.1 minizlib: 2.1.2 npm-package-arg: 10.1.0 @@ -9575,8 +9386,8 @@ packages: object-keys: 1.1.1 dev: true - /object.entries@1.1.6: - resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + /object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -9584,8 +9395,8 @@ packages: es-abstract: 1.22.1 dev: true - /object.fromentries@2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -9593,8 +9404,8 @@ packages: es-abstract: 1.22.1 dev: true - /object.groupby@1.0.0: - resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} + /object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -9602,15 +9413,15 @@ packages: get-intrinsic: 1.2.1 dev: true - /object.hasown@1.1.2: - resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + /object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} dependencies: define-properties: 1.2.0 es-abstract: 1.22.1 dev: true - /object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -9669,7 +9480,7 @@ packages: /openid-client@5.4.3: resolution: {integrity: sha512-sVQOvjsT/sbSfYsQI/9liWQGVZH/Pp3rrtlGEwgk/bbHfrUDZ24DN57lAagIwFtuEu+FM9Ev7r85s8S/yPjimQ==} dependencies: - jose: 4.14.4 + jose: 4.14.5 lru-cache: 6.0.0 object-hash: 2.2.0 oidc-token-hash: 5.0.3 @@ -9856,8 +9667,8 @@ packages: '@npmcli/installed-package-contents': 2.0.2 '@npmcli/promise-spawn': 6.0.2 '@npmcli/run-script': 6.0.2 - cacache: 17.1.3 - fs-minipass: 3.0.2 + cacache: 17.1.4 + fs-minipass: 3.0.3 minipass: 5.0.0 npm-package-arg: 10.1.0 npm-packlist: 7.0.4 @@ -9867,8 +9678,8 @@ packages: promise-retry: 2.0.1 read-package-json: 6.0.4 read-package-json-fast: 3.0.2 - sigstore: 1.8.0 - ssri: 10.0.4 + sigstore: 1.9.0 + ssri: 10.0.5 tar: 6.1.15 transitivePeerDependencies: - bluebird @@ -9904,7 +9715,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.5 + '@babel/code-frame': 7.22.13 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -9959,8 +9770,8 @@ packages: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.0.0 - minipass: 7.0.2 + lru-cache: 10.0.1 + minipass: 7.0.3 /path-to-regexp@3.2.0: resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} @@ -10065,7 +9876,7 @@ packages: real-require: 0.2.0 safe-stable-stringify: 2.4.3 sonic-boom: 3.3.0 - thread-stream: 2.3.0 + thread-stream: 2.4.0 dev: false /pirates@4.0.6: @@ -10076,7 +9887,7 @@ packages: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: jsonc-parser: 3.2.0 - mlly: 1.4.0 + mlly: 1.4.1 pathe: 1.1.1 dev: true @@ -10118,8 +9929,8 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.29 - ts-node: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.8)(typescript@5.2.2) - yaml: 2.3.1 + ts-node: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.9)(typescript@5.2.2) + yaml: 2.3.2 /postcss-nested@6.0.1(postcss@8.4.29): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} @@ -10157,17 +9968,17 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 - /preact-render-to-string@5.2.6(preact@10.16.0): + /preact-render-to-string@5.2.6(preact@10.17.1): resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} peerDependencies: preact: '>=10' dependencies: - preact: 10.16.0 + preact: 10.17.1 pretty-format: 3.8.0 dev: false - /preact@10.16.0: - resolution: {integrity: sha512-XTSj3dJ4roKIC93pald6rWuB2qQJO9gO2iLLyTe87MrjQN+HklueLsmskbywEWqCHlclgz3/M4YLL2iBr9UmMA==} + /preact@10.17.1: + resolution: {integrity: sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA==} dev: false /prelude-ls@1.2.1: @@ -10368,8 +10179,8 @@ packages: scheduler: 0.23.0 dev: false - /react-hook-form@7.45.4(react@18.2.0): - resolution: {integrity: sha512-HGDV1JOOBPZj10LB3+OZgfDBTn+IeEsNOKiq/cxbQAIbKaiJUe/KV8DBUzsx0Gx/7IG/orWqRRm736JwOfUSWQ==} + /react-hook-form@7.46.0(react@18.2.0): + resolution: {integrity: sha512-sc22pXwuKgbWBR5/EYWOVoFw4i/w893tDRUgQY2/Xb7wlpajJBrqAMFhb4z1CDhZ0TSFFfX62+iKx3gCXnCHHw==} engines: {node: '>=12.22.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 @@ -10403,7 +10214,7 @@ packages: react-base16-styling: 0.6.0 react-dom: 18.2.0(react@18.2.0) react-lifecycles-compat: 3.0.4 - react-textarea-autosize: 8.5.2(@types/react@18.2.21)(react@18.2.0) + react-textarea-autosize: 8.5.3(@types/react@18.2.21)(react@18.2.0) transitivePeerDependencies: - '@types/react' - encoding @@ -10426,7 +10237,7 @@ packages: '@types/react': 18.2.21 react: 18.2.0 react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) - tslib: 2.6.1 + tslib: 2.6.2 dev: false /react-remove-scroll@2.5.4(@types/react@18.2.21)(react@18.2.0): @@ -10443,7 +10254,7 @@ packages: react: 18.2.0 react-remove-scroll-bar: 2.3.4(@types/react@18.2.21)(react@18.2.0) react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) - tslib: 2.6.1 + tslib: 2.6.2 use-callback-ref: 1.3.0(@types/react@18.2.21)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.2.21)(react@18.2.0) dev: false @@ -10462,7 +10273,7 @@ packages: react: 18.2.0 react-remove-scroll-bar: 2.3.4(@types/react@18.2.21)(react@18.2.0) react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) - tslib: 2.6.1 + tslib: 2.6.2 use-callback-ref: 1.3.0(@types/react@18.2.21)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.2.21)(react@18.2.0) dev: false @@ -10481,16 +10292,16 @@ packages: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: false - /react-textarea-autosize@8.5.2(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-uOkyjkEl0ByEK21eCJMHDGBAAd/BoFQBawYK5XItjAmCTeSbjxghd8qnt7nzsLYzidjnoObu6M26xts0YGKsGg==} + /react-textarea-autosize@8.5.3(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} engines: {node: '>=10'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 react: 18.2.0 use-composed-ref: 1.3.0(react@18.2.0) use-latest: 1.2.1(@types/react@18.2.21)(react@18.2.0) @@ -10498,14 +10309,14 @@ packages: - '@types/react' dev: false - /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.6.1): + /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.6.2): resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} peerDependencies: react: '*' tslib: '*' dependencies: react: 18.2.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /react-use@17.4.0(react-dom@18.2.0)(react@18.2.0): @@ -10523,13 +10334,13 @@ packages: nano-css: 5.3.5(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.6.1) + react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.6.2) resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 set-harmonic-interval: 1.0.1 throttle-debounce: 3.0.1 ts-easing: 0.2.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /react@16.14.0: @@ -10565,7 +10376,7 @@ packages: resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - glob: 10.3.3 + glob: 10.3.4 json-parse-even-better-errors: 3.0.0 normalize-package-data: 5.0.0 npm-normalize-package-bin: 3.0.1 @@ -10685,8 +10496,8 @@ packages: resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} dev: false - /reflect.getprototypeof@1.0.3: - resolution: {integrity: sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==} + /reflect.getprototypeof@1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -10697,8 +10508,8 @@ packages: which-builtin-type: 1.1.3 dev: true - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} dev: false /regexp-tree@0.1.27: @@ -10908,15 +10719,15 @@ packages: engines: {node: '>=14'} hasBin: true dependencies: - glob: 10.3.3 + glob: 10.3.4 dev: true - /rollup@3.27.2: - resolution: {integrity: sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ==} + /rollup@3.28.1: + resolution: {integrity: sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /rrdom@0.1.7: @@ -10932,8 +10743,8 @@ packages: rrweb: 2.0.0-alpha.4 dev: false - /rrweb-snapshot@2.0.0-alpha.10: - resolution: {integrity: sha512-RRkQcgYfpsv1zCmd4EeIr5m2brHwqL2HGQF5S4PgZa3+7iJ0VJOnpmFs+hu4h+et+ArjW8bl0b7aAhKkFAVEfg==} + /rrweb-snapshot@2.0.0-alpha.11: + resolution: {integrity: sha512-N0dzeJA2VhrlSOadkKwCVmV/DuNOwBH+Lhx89hAf9PQK4lCS8AP4AaylhqUdZOYHqwVjqsYel/uZ4hN79vuLhw==} dev: false /rrweb-snapshot@2.0.0-alpha.4: @@ -10943,7 +10754,7 @@ packages: /rrweb@2.0.0-alpha.4: resolution: {integrity: sha512-wEHUILbxDPcNwkM3m4qgPgXAiBJyqCbbOHyVoNEVBJzHszWEFYyTbrZqUdeb1EfmTRC2PsumCIkVcomJ/xcOzA==} dependencies: - '@rrweb/types': 2.0.0-alpha.10 + '@rrweb/types': 2.0.0-alpha.11 '@types/css-font-loading-module': 0.0.7 '@xstate/fsm': 1.6.5 base64-arraybuffer: 1.0.2 @@ -10956,7 +10767,7 @@ packages: /rtl-css-js@1.16.1: resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} dependencies: - '@babel/runtime': 7.22.6 + '@babel/runtime': 7.22.11 dev: false /run-applescript@5.0.0: @@ -10983,7 +10794,7 @@ packages: /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 /safe-array-concat@1.0.0: resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} @@ -11161,13 +10972,14 @@ packages: engines: {node: '>=14'} dev: true - /sigstore@1.8.0: - resolution: {integrity: sha512-ogU8qtQ3VFBawRJ8wjsBEX/vIFeHuGs1fm4jZtjWQwjo8pfAt7T/rh+udlAN4+QUe0IzA8qRSc/YZ7dHP6kh+w==} + /sigstore@1.9.0: + resolution: {integrity: sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true dependencies: - '@sigstore/bundle': 1.0.0 - '@sigstore/protobuf-specs': 0.2.0 + '@sigstore/bundle': 1.1.0 + '@sigstore/protobuf-specs': 0.2.1 + '@sigstore/sign': 1.0.0 '@sigstore/tuf': 1.0.3 make-fetch-happen: 11.1.1 transitivePeerDependencies: @@ -11230,8 +11042,8 @@ packages: smart-buffer: 4.2.0 dev: true - /solid-js@1.7.9: - resolution: {integrity: sha512-p1orXnauMQmwYULZtuPAXyKNRGEN2qh60kLX4YURa3jvulxAqjlh2kWEljXCtAVR6UZPC16NXdj9ASHcH383Fg==} + /solid-js@1.7.11: + resolution: {integrity: sha512-JkuvsHt8jqy7USsy9xJtT18aF9r2pFO+GB8JQ2XGTvtF49rGTObB46iebD25sE3qVNvIbwglXOXdALnJq9IHtQ==} dependencies: csstype: 3.1.2 seroval: 0.5.1 @@ -11342,11 +11154,11 @@ packages: through: 2.3.8 dev: true - /ssri@10.0.4: - resolution: {integrity: sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==} + /ssri@10.0.5: + resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - minipass: 5.0.0 + minipass: 7.0.3 dev: true /stack-generator@2.0.10: @@ -11428,8 +11240,8 @@ packages: strip-ansi: 7.1.0 dev: true - /string.prototype.matchall@4.0.8: - resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + /string.prototype.matchall@4.0.9: + resolution: {integrity: sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -11633,7 +11445,7 @@ packages: fast-glob: 3.3.1 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.19.1 + jiti: 1.19.3 lilconfig: 2.1.0 micromatch: 4.0.5 normalize-path: 3.0.0 @@ -11684,7 +11496,7 @@ packages: - supports-color dev: true - /terser-webpack-plugin@5.3.9(@swc/core@1.3.82)(esbuild@0.18.19)(webpack@5.88.2): + /terser-webpack-plugin@5.3.9(@swc/core@1.3.82)(esbuild@0.18.20)(webpack@5.88.2): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -11700,17 +11512,17 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.19 '@swc/core': 1.3.82 - esbuild: 0.18.19 + esbuild: 0.18.20 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.19.2 - webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.19) + terser: 5.19.3 + webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.20) - /terser@5.19.2: - resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} + /terser@5.19.3: + resolution: {integrity: sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==} engines: {node: '>=10'} hasBin: true dependencies: @@ -11743,8 +11555,8 @@ packages: dependencies: any-promise: 1.3.0 - /thread-stream@2.3.0: - resolution: {integrity: sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==} + /thread-stream@2.4.0: + resolution: {integrity: sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==} dependencies: real-require: 0.2.0 dev: false @@ -11830,8 +11642,8 @@ packages: dependencies: escape-string-regexp: 5.0.0 - /ts-api-utils@1.0.1(typescript@5.2.2): - resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} + /ts-api-utils@1.0.2(typescript@5.2.2): + resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' @@ -11858,10 +11670,10 @@ packages: micromatch: 4.0.5 semver: 7.5.4 typescript: 5.2.2 - webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.19) + webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.20) dev: true - /ts-node@10.9.1(@swc/core@1.3.82)(@types/node@20.5.8)(typescript@5.2.2): + /ts-node@10.9.1(@swc/core@1.3.82)(@types/node@20.5.9)(typescript@5.2.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -11881,7 +11693,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.5.8 + '@types/node': 20.5.9 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -11927,12 +11739,8 @@ packages: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} dev: false - /tslib@2.6.1: - resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} - /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false /tsup@7.2.0(@swc/core@1.3.82)(ts-node@10.9.1)(typescript@5.2.2): resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} @@ -11951,17 +11759,17 @@ packages: optional: true dependencies: '@swc/core': 1.3.82 - bundle-require: 4.0.1(esbuild@0.18.19) + bundle-require: 4.0.1(esbuild@0.18.20) cac: 6.7.14 chokidar: 3.5.3 debug: 4.3.4 - esbuild: 0.18.19 + esbuild: 0.18.20 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 postcss-load-config: 4.0.1(postcss@8.4.29)(ts-node@10.9.1) resolve-from: 5.0.0 - rollup: 3.27.2 + rollup: 3.28.1 source-map: 0.8.0-beta.0 sucrase: 3.34.0 tree-kill: 1.2.2 @@ -11979,7 +11787,7 @@ packages: '@esbuild-kit/core-utils': 3.2.2 '@esbuild-kit/esm-loader': 2.5.5 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /tuf-js@1.1.7: @@ -12114,8 +11922,8 @@ packages: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} dev: false - /ufo@1.2.0: - resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} + /ufo@1.3.0: + resolution: {integrity: sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==} dev: true /uglify-js@3.17.4: @@ -12145,10 +11953,10 @@ packages: /unconfig@0.3.10: resolution: {integrity: sha512-tj317lhIq2iZF/NXrJnU1t2UaGUKKz1eL1sK2t63Oq66V9BxqvZV12m55fp/fpQJ+DDmVlLgo7cnLVOZkhlO/A==} dependencies: - '@antfu/utils': 0.7.5 + '@antfu/utils': 0.7.6 defu: 6.1.2 - jiti: 1.19.1 - mlly: 1.4.0 + jiti: 1.19.3 + mlly: 1.4.1 dev: true /unique-filename@3.0.0: @@ -12175,7 +11983,7 @@ packages: /unist-util-stringify-position@2.0.3: resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} dependencies: - '@types/unist': 2.0.7 + '@types/unist': 2.0.8 dev: true /universal-user-agent@6.0.0: @@ -12248,7 +12056,7 @@ packages: dependencies: '@types/react': 18.2.21 react: 18.2.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /use-composed-ref@1.3.0(react@18.2.0): @@ -12310,7 +12118,7 @@ packages: '@types/react': 18.2.21 detect-node-es: 1.1.0 react: 18.2.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /use-sync-external-store@1.2.0(react@18.2.0): @@ -12424,7 +12232,7 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack@5.88.2(@swc/core@1.3.82)(esbuild@0.18.19): + /webpack@5.88.2(@swc/core@1.3.82)(esbuild@0.18.20): resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -12455,7 +12263,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(@swc/core@1.3.82)(esbuild@0.18.19)(webpack@5.88.2) + terser-webpack-plugin: 5.3.9(@swc/core@1.3.82)(esbuild@0.18.20)(webpack@5.88.2) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -12490,7 +12298,7 @@ packages: resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} engines: {node: '>= 0.4'} dependencies: - function.prototype.name: 1.1.5 + function.prototype.name: 1.1.6 has-tostringtag: 1.0.0 is-async-function: 2.0.0 is-date-object: 1.0.5 @@ -12653,7 +12461,7 @@ packages: dependencies: eslint-visitor-keys: 3.4.3 lodash: 4.17.21 - yaml: 2.3.1 + yaml: 2.3.2 dev: true /yaml@1.10.2: @@ -12664,6 +12472,11 @@ packages: /yaml@2.3.1: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} + dev: true + + /yaml@2.3.2: + resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} + engines: {node: '>= 14'} /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} From df1862e018152fe42a8b686babc08fd49545154d Mon Sep 17 00:00:00 2001 From: chenyueban Date: Tue, 5 Sep 2023 15:07:56 +0800 Subject: [PATCH 11/23] chore: update deps --- .gitignore | 3 +- eslint.config.js | 1 + package.json | 8 +- packages/common/package.json | 2 +- packages/server/logs/README.md | 3 + packages/server/package.json | 3 +- packages/server/src/api/alert/alert.core.ts | 9 +- .../server/src/api/alert/alert.processor.ts | 11 +- packages/server/src/api/alert/email.ts | 2 +- packages/server/src/api/alert/webhook.ts | 4 +- .../src/api/report/report.controller.ts | 4 +- packages/server/src/api/report/report.core.ts | 4 +- .../server/src/api/report/report.interface.ts | 22 +- .../server/src/api/report/report.processor.ts | 9 +- .../server/src/api/report/report.service.ts | 8 +- .../api/source-map/source-map.controller.ts | 8 +- .../src/api/source-map/source-map.module.ts | 2 +- .../api/source-map/source-map.processor.ts | 11 +- .../src/api/source-map/source-map.service.ts | 6 +- packages/server/src/shared.module.ts | 2 - packages/server/src/tasks/tasks.service.ts | 2 +- packages/web/package.json | 6 +- pnpm-lock.yaml | 611 ++++++++---------- 23 files changed, 337 insertions(+), 404 deletions(-) create mode 100644 packages/server/logs/README.md diff --git a/.gitignore b/.gitignore index 855ad0c..c58ce06 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ tsconfig.tsbuildinfo secrets # Logs -logs +logs/* *.log npm-debug.log* yarn-debug.log* @@ -44,7 +44,6 @@ ohbug.config.development.yml # docker postgres-data -logs # vercel .vercel diff --git a/eslint.config.js b/eslint.config.js index 53374f7..10703a4 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -6,6 +6,7 @@ export default [ rules: { 'import/no-default-export': 'off', '@typescript-eslint/no-extraneous-class': 'off', + '@typescript-eslint/consistent-type-imports': 'off', }, }, ] diff --git a/package.json b/package.json index 6595085..64e5c18 100644 --- a/package.json +++ b/package.json @@ -52,11 +52,11 @@ }, "devDependencies": { "@antfu/ni": "^0.21.8", - "@babel/types": "^7.22.11", - "@chenyueban/eslint-config": "^3.0.8", - "@chenyueban/tsconfig": "^3.0.8", + "@babel/types": "^7.22.15", + "@chenyueban/eslint-config": "^3.0.9", + "@chenyueban/tsconfig": "^3.0.9", "@commitlint/cli": "^17.7.1", - "@release-it/conventional-changelog": "^7.0.0", + "@release-it/conventional-changelog": "^7.0.1", "@swc/cli": "^0.1.62", "@swc/core": "^1.3.82", "@types/js-yaml": "^4.0.5", diff --git a/packages/common/package.json b/packages/common/package.json index ac94e29..e34d1d7 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -24,6 +24,6 @@ "crypto-js": "^4.1.1" }, "devDependencies": { - "@types/crypto-js": "^4.1.1" + "@types/crypto-js": "^4.1.2" } } diff --git a/packages/server/logs/README.md b/packages/server/logs/README.md new file mode 100644 index 0000000..32fd659 --- /dev/null +++ b/packages/server/logs/README.md @@ -0,0 +1,3 @@ +# logs + +Logs dir diff --git a/packages/server/package.json b/packages/server/package.json index 0012ce3..75daf1b 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -17,7 +17,6 @@ "@nestjs/cli": "^10.1.17", "@nestjs/common": "^10.2.4", "@nestjs/core": "^10.2.4", - "@nestjs/devtools-integration": "^0.1.5", "@nestjs/mapped-types": "^2.0.2", "@nestjs/platform-fastify": "^10.2.4", "@nestjs/schedule": "^3.0.3", @@ -41,7 +40,7 @@ "nanoid": "3.3.6", "nestjs-pino": "^3.4.0", "pino": "^8.15.0", - "pino-http": "^8.4.0", + "pino-http": "^8.5.0", "pino-pretty": "^10.2.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1" diff --git a/packages/server/src/api/alert/alert.core.ts b/packages/server/src/api/alert/alert.core.ts index c712d21..ff34cd3 100644 --- a/packages/server/src/api/alert/alert.core.ts +++ b/packages/server/src/api/alert/alert.core.ts @@ -1,10 +1,9 @@ -import { AlertConditionTopic, AlertFilterTopic } from 'common' +import { AlertConditionTopic, AlertFilterTopic, ConditionOption, FilterOption, Interval } from 'common' import dayjs from 'dayjs' import markdownIt from 'markdown-it' -import { type ConditionOption, type FilterOption, type Interval } from 'common' -import { type Alert, type AlertLevel, type Event, type Issue } from '@prisma/client' -import { type GetAlertStatusParams } from '../report/report.interface' -import { type PrismaService } from '~/common' +import { Alert, AlertLevel, Event, Issue } from '@prisma/client' +import { GetAlertStatusParams } from '../report/report.interface' +import { PrismaService } from '~/common' function getIntervalMs(interval: Interval) { switch ((interval)) { diff --git a/packages/server/src/api/alert/alert.processor.ts b/packages/server/src/api/alert/alert.processor.ts index a4596c9..d47e733 100644 --- a/packages/server/src/api/alert/alert.processor.ts +++ b/packages/server/src/api/alert/alert.processor.ts @@ -1,14 +1,13 @@ import { OnQueueError, Process, Processor } from '@nestjs/bull' import { getConfig } from 'config' -import { type Job } from 'bull' -import { type Action } from 'common' -import { type HttpService } from '@nestjs/axios' -import { type GetAlertStatusParams } from '../report/report.interface' +import { Job } from 'bull' +import { Action } from 'common' +import { HttpService } from '@nestjs/axios' +import { GetAlertStatusParams } from '../report/report.interface' import { getAlertContent, getAlertStatus } from './alert.core' import email from './email' import webhook from './webhook' -import { type PrismaService } from '~/common' -import { ForbiddenException } from '~/common' +import { ForbiddenException, PrismaService } from '~/common' @Processor('alert') export class AlertProcessor { diff --git a/packages/server/src/api/alert/email.ts b/packages/server/src/api/alert/email.ts index 73d9b98..60978c0 100644 --- a/packages/server/src/api/alert/email.ts +++ b/packages/server/src/api/alert/email.ts @@ -1,5 +1,5 @@ import nodemailer from 'nodemailer' -import type SMTPTransport from 'nodemailer/lib/smtp-transport' +import SMTPTransport from 'nodemailer/lib/smtp-transport' interface SendMail { server: SMTPTransport.Options | string diff --git a/packages/server/src/api/alert/webhook.ts b/packages/server/src/api/alert/webhook.ts index 7b1e1a2..e0e2b89 100644 --- a/packages/server/src/api/alert/webhook.ts +++ b/packages/server/src/api/alert/webhook.ts @@ -1,6 +1,6 @@ import { lastValueFrom } from 'rxjs' -import { type HttpService } from '@nestjs/axios' -import { type Action } from 'common' +import { HttpService } from '@nestjs/axios' +import { Action } from 'common' interface Content { title: string diff --git a/packages/server/src/api/report/report.controller.ts b/packages/server/src/api/report/report.controller.ts index 0c22f55..2302b40 100644 --- a/packages/server/src/api/report/report.controller.ts +++ b/packages/server/src/api/report/report.controller.ts @@ -1,6 +1,6 @@ import { Body, Controller, HttpCode, Ip, Post, Req } from '@nestjs/common' -import { type OhbugEvent } from '@ohbug/types' -import { type ReportService } from './report.service' +import { OhbugEvent } from '@ohbug/types' +import { ReportService } from './report.service' /** * 用于接收上报数据 diff --git a/packages/server/src/api/report/report.core.ts b/packages/server/src/api/report/report.core.ts index 5e9d87a..a66d7f8 100644 --- a/packages/server/src/api/report/report.core.ts +++ b/packages/server/src/api/report/report.core.ts @@ -1,8 +1,8 @@ import { EventTypes } from '@ohbug/core' import { md5 } from 'common' import { - type AggregationDataAndMetaData, - type OhbugEventDetail, + AggregationDataAndMetaData, + OhbugEventDetail, } from './report.interface' /** diff --git a/packages/server/src/api/report/report.interface.ts b/packages/server/src/api/report/report.interface.ts index efee001..7b08878 100644 --- a/packages/server/src/api/report/report.interface.ts +++ b/packages/server/src/api/report/report.interface.ts @@ -1,16 +1,16 @@ import { - type AjaxErrorDetail, - type FetchErrorDetail, - type ResourceErrorDetail, - type UncaughtErrorDetail, - type UnhandledrejectionErrorDetail, - type UnknownErrorDetail, - type WebsocketErrorDetail, + AjaxErrorDetail, + FetchErrorDetail, + ResourceErrorDetail, + UncaughtErrorDetail, + UnhandledrejectionErrorDetail, + UnknownErrorDetail, + WebsocketErrorDetail, } from '@ohbug/browser' -import { type ReactErrorDetail } from '@ohbug/react' -import { type VueErrorDetail } from '@ohbug/vue' -import { type OhbugEventLike } from 'common' -import { type Alert, type Event, type Issue, type Prisma } from '@prisma/client' +import { ReactErrorDetail } from '@ohbug/react' +import { VueErrorDetail } from '@ohbug/vue' +import { OhbugEventLike } from 'common' +import { Alert, Event, Issue, Prisma } from '@prisma/client' export type OhbugEventDetail = UncaughtErrorDetail & UnhandledrejectionErrorDetail & diff --git a/packages/server/src/api/report/report.processor.ts b/packages/server/src/api/report/report.processor.ts index 6daddc6..0b318a8 100644 --- a/packages/server/src/api/report/report.processor.ts +++ b/packages/server/src/api/report/report.processor.ts @@ -1,9 +1,8 @@ import { InjectQueue, OnQueueError, Process, Processor } from '@nestjs/bull' -import { type Job, type Queue } from 'bull' -import { type Prisma } from '@prisma/client' -import { type CreateEventParams, type CreateFeedbackParams, type CreateMetricParams, type CreateViewParams, type GetAlertStatusParams } from './report.interface' -import { type PrismaService } from '~/common' -import { ForbiddenException } from '~/common' +import { Job, Queue } from 'bull' +import { Prisma } from '@prisma/client' +import { CreateEventParams, CreateFeedbackParams, CreateMetricParams, CreateViewParams, GetAlertStatusParams } from './report.interface' +import { ForbiddenException, PrismaService } from '~/common' @Processor('document') export class ReportProcessor { diff --git a/packages/server/src/api/report/report.service.ts b/packages/server/src/api/report/report.service.ts index 1105418..5a61d08 100644 --- a/packages/server/src/api/report/report.service.ts +++ b/packages/server/src/api/report/report.service.ts @@ -1,13 +1,13 @@ import { Injectable } from '@nestjs/common' import { InjectQueue } from '@nestjs/bull' -import { type OhbugEventLike } from 'common' -import { type OhbugEvent } from '@ohbug/types' -import { type Queue } from 'bull' +import { OhbugEventLike } from 'common' +import { OhbugEvent } from '@ohbug/types' +import { Queue } from 'bull' import { getMd5FromAggregationData, switchErrorDetailAndGetAggregationDataAndMetaData, } from './report.core' -import { type CreateEventParams, type CreateFeedbackParams, type CreateMetricParams, type CreateViewParams } from './report.interface' +import { CreateEventParams, CreateFeedbackParams, CreateMetricParams, CreateViewParams } from './report.interface' import { ForbiddenException } from '~/common' @Injectable() diff --git a/packages/server/src/api/source-map/source-map.controller.ts b/packages/server/src/api/source-map/source-map.controller.ts index 1ddafc7..c658733 100644 --- a/packages/server/src/api/source-map/source-map.controller.ts +++ b/packages/server/src/api/source-map/source-map.controller.ts @@ -6,10 +6,10 @@ import { UseInterceptors, } from '@nestjs/common' import { FileInterceptor } from '@webundsoehne/nest-fastify-file-upload' -import { type ReceiveSourceMapFile } from 'common' +import { ReceiveSourceMapFile } from 'common' import { UPLOAD_DEST } from './source-map.constant' -import { type SourceMapService } from './source-map.service' -import { type ReceiveSourceMapDto } from './source-map.dto' +import { SourceMapService } from './source-map.service' +import { ReceiveSourceMapDto } from './source-map.dto' /** * 用于接受上报 SourceMap,经过处理后入库 @@ -27,7 +27,7 @@ export class SourceMapController { @Post('upload') @UseInterceptors(FileInterceptor('file', { dest: UPLOAD_DEST })) async receiveSourceMap( - @UploadedFile() file: ReceiveSourceMapFile, + @UploadedFile() file: ReceiveSourceMapFile, @Body() body: ReceiveSourceMapDto, ) { return this.sourceMapService.handleSourceMap(file, body) diff --git a/packages/server/src/api/source-map/source-map.module.ts b/packages/server/src/api/source-map/source-map.module.ts index 58bd670..168268f 100644 --- a/packages/server/src/api/source-map/source-map.module.ts +++ b/packages/server/src/api/source-map/source-map.module.ts @@ -6,7 +6,7 @@ import { SourceMapProcessor } from './source-map.processor' import { PrismaService } from '~/common' @Module({ - imports: [BullModule.registerQueue({ name: 'source-map' })], + imports: [BullModule.registerQueue({ name: 'sourceMap' })], controllers: [SourceMapController], providers: [SourceMapService, PrismaService, SourceMapProcessor], }) diff --git a/packages/server/src/api/source-map/source-map.processor.ts b/packages/server/src/api/source-map/source-map.processor.ts index 84c3b3f..9258c73 100644 --- a/packages/server/src/api/source-map/source-map.processor.ts +++ b/packages/server/src/api/source-map/source-map.processor.ts @@ -1,13 +1,12 @@ import { unlink } from 'node:fs/promises' import { Process, Processor } from '@nestjs/bull' import { nanoid } from 'nanoid' -import { type Job } from 'bull' -import { type Prisma, type Project, type Release } from '@prisma/client' -import { type ReceiveSourceMapFile, type SourceMapData } from 'common' +import { Job } from 'bull' +import { Prisma, Project, Release } from '@prisma/client' +import { ReceiveSourceMapFile, SourceMapData } from 'common' import { maxSourceMap } from '../source-map/source-map.constant' -import { type ReceiveSourceMapDto } from '../source-map/source-map.dto' -import { type PrismaService } from '~/common' -import { ForbiddenException } from '~/common' +import { ReceiveSourceMapDto } from '../source-map/source-map.dto' +import { ForbiddenException, PrismaService } from '~/common' @Processor('sourceMap') export class SourceMapProcessor { diff --git a/packages/server/src/api/source-map/source-map.service.ts b/packages/server/src/api/source-map/source-map.service.ts index 6637232..fa7f310 100644 --- a/packages/server/src/api/source-map/source-map.service.ts +++ b/packages/server/src/api/source-map/source-map.service.ts @@ -1,8 +1,8 @@ import { Injectable } from '@nestjs/common' import { InjectQueue } from '@nestjs/bull' -import { type Queue } from 'bull' -import { type ReceiveSourceMapFile } from 'common' -import { type ReceiveSourceMapDto } from './source-map.dto' +import { Queue } from 'bull' +import { ReceiveSourceMapFile } from 'common' +import { ReceiveSourceMapDto } from './source-map.dto' @Injectable() export class SourceMapService { diff --git a/packages/server/src/shared.module.ts b/packages/server/src/shared.module.ts index 5511620..d6c1235 100644 --- a/packages/server/src/shared.module.ts +++ b/packages/server/src/shared.module.ts @@ -1,6 +1,5 @@ import { Global, Module } from '@nestjs/common' import { ScheduleModule } from '@nestjs/schedule' -import { DevtoolsModule } from '@nestjs/devtools-integration' import { BullModuleConfig, LoggerModule } from '~/common' @Global() @@ -9,7 +8,6 @@ import { BullModuleConfig, LoggerModule } from '~/common' BullModuleConfig, ScheduleModule.forRoot(), LoggerModule, - DevtoolsModule.register({ http: process.env.NODE_ENV !== 'production' }), ], }) export class SharedModule {} diff --git a/packages/server/src/tasks/tasks.service.ts b/packages/server/src/tasks/tasks.service.ts index 56db3dd..8019b3f 100644 --- a/packages/server/src/tasks/tasks.service.ts +++ b/packages/server/src/tasks/tasks.service.ts @@ -2,7 +2,7 @@ import { Injectable, Logger } from '@nestjs/common' import { Cron, CronExpression } from '@nestjs/schedule' import { getConfig } from 'config' import dayjs from 'dayjs' -import { type PrismaService } from '~/common' +import { PrismaService } from '~/common' @Injectable() export class TasksService { diff --git a/packages/web/package.json b/packages/web/package.json index 8075324..06739f2 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -46,9 +46,9 @@ "common": "workspace:*", "config": "workspace:*", "downshift": "^8.1.0", - "framer-motion": "^10.16.2", + "framer-motion": "^10.16.3", "highcharts": "^11.1.0", - "highcharts-react-official": "^3.2.0", + "highcharts-react-official": "^3.2.1", "jotai": "^2.4.1", "lucide-react": "^0.274.0", "next": "^13.4.19", @@ -59,7 +59,7 @@ "postcss": "^8.4.29", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-hook-form": "^7.46.0", + "react-hook-form": "^7.46.1", "react-icons": "^4.10.1", "react-json-view": "^1.21.3", "react-use": "^17.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ba6c5a..e956945 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,20 +46,20 @@ importers: specifier: ^0.21.8 version: 0.21.8 '@babel/types': - specifier: ^7.22.11 - version: 7.22.11 + specifier: ^7.22.15 + version: 7.22.15 '@chenyueban/eslint-config': - specifier: ^3.0.8 - version: 3.0.8(eslint@8.48.0)(typescript@5.2.2) + specifier: ^3.0.9 + version: 3.0.9(eslint@8.48.0)(typescript@5.2.2) '@chenyueban/tsconfig': - specifier: ^3.0.8 - version: 3.0.8(typescript@5.2.2) + specifier: ^3.0.9 + version: 3.0.9(typescript@5.2.2) '@commitlint/cli': specifier: ^17.7.1 version: 17.7.1(@swc/core@1.3.82) '@release-it/conventional-changelog': - specifier: ^7.0.0 - version: 7.0.0(release-it@16.1.5) + specifier: ^7.0.1 + version: 7.0.1(release-it@16.1.5) '@swc/cli': specifier: ^0.1.62 version: 0.1.62(@swc/core@1.3.82) @@ -122,8 +122,8 @@ importers: version: 4.1.1 devDependencies: '@types/crypto-js': - specifier: ^4.1.1 - version: 4.1.1 + specifier: ^4.1.2 + version: 4.1.2 packages/config: {} @@ -144,9 +144,6 @@ importers: '@nestjs/core': specifier: ^10.2.4 version: 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/devtools-integration': - specifier: ^0.1.5 - version: 0.1.5(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(reflect-metadata@0.1.13) '@nestjs/mapped-types': specifier: ^2.0.2 version: 2.0.2(@nestjs/common@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) @@ -212,13 +209,13 @@ importers: version: 3.3.6 nestjs-pino: specifier: ^3.4.0 - version: 3.4.0(@nestjs/common@10.2.4)(pino-http@8.4.0) + version: 3.4.0(@nestjs/common@10.2.4)(pino-http@8.5.0) pino: specifier: ^8.15.0 version: 8.15.0 pino-http: - specifier: ^8.4.0 - version: 8.4.0 + specifier: ^8.5.0 + version: 8.5.0 pino-pretty: specifier: ^10.2.0 version: 10.2.0 @@ -252,7 +249,7 @@ importers: version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.21)(react@18.2.0) '@hookform/resolvers': specifier: ^3.3.1 - version: 3.3.1(react-hook-form@7.46.0) + version: 3.3.1(react-hook-form@7.46.1) '@iconify-json/ri': specifier: ^1.1.12 version: 1.1.12 @@ -356,14 +353,14 @@ importers: specifier: ^8.1.0 version: 8.1.0(react@18.2.0) framer-motion: - specifier: ^10.16.2 - version: 10.16.2(react-dom@18.2.0)(react@18.2.0) + specifier: ^10.16.3 + version: 10.16.3(react-dom@18.2.0)(react@18.2.0) highcharts: specifier: ^11.1.0 version: 11.1.0 highcharts-react-official: - specifier: ^3.2.0 - version: 3.2.0(highcharts@11.1.0)(react@18.2.0) + specifier: ^3.2.1 + version: 3.2.1(highcharts@11.1.0)(react@18.2.0) jotai: specifier: ^2.4.1 version: 2.4.1(@types/react@18.2.21)(react@18.2.0) @@ -395,8 +392,8 @@ importers: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) react-hook-form: - specifier: ^7.46.0 - version: 7.46.0(react@18.2.0) + specifier: ^7.46.1 + version: 7.46.1(react@18.2.0) react-icons: specifier: ^4.10.1 version: 4.10.1(react@18.2.0) @@ -550,13 +547,17 @@ packages: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.11 + '@babel/types': 7.22.15 dev: false /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.22.15: + resolution: {integrity: sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} @@ -574,7 +575,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.11 + '@babel/types': 7.22.15 dev: false /@babel/runtime@7.22.11: @@ -584,16 +585,16 @@ packages: regenerator-runtime: 0.14.0 dev: false - /@babel/types@7.22.11: - resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} + /@babel/types@7.22.15: + resolution: {integrity: sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.15 to-fast-properties: 2.0.0 - /@chenyueban/eslint-config@3.0.8(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-J0vRwfjvohKyV9q7DK6IUq/sGOxKS5l/Ax/DYOdG7vtwQi9oHbn7ktH+LNuZrwR0YTJvzBKT/vivixbBBJE+Zg==} + /@chenyueban/eslint-config@3.0.9(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-w8pYDsEEPkXib5bcMts76HkUaD9u6j9QAgOdAXHBOOlYtkarbKe3P+0RJul7APFdTay8MExPWpV73dMyeh7UBA==} engines: {node: '>=16', npm: '>=7'} peerDependencies: eslint: ^8.0.0 @@ -626,8 +627,8 @@ packages: - typescript dev: true - /@chenyueban/tsconfig@3.0.8(typescript@5.2.2): - resolution: {integrity: sha512-JT7Qc1xD5bjiFK2dWdy0w52/Z1sQkahf5jr2ltQXDjI4sJamA31uSed6RvGfshRYXgIqCz3hewgjpJgH2Go6Fg==} + /@chenyueban/tsconfig@3.0.9(typescript@5.2.2): + resolution: {integrity: sha512-z+GypJPDROP6UGRiZIvR8BhB8/vDQA1D4k7j0DlNhzP1QymX+3H9n/t/mQdtWl7MzAMJaGHxn6L/3WUBVe/w4g==} engines: {node: '>=16', npm: '>=7'} peerDependencies: typescript: ^4.4.2 @@ -1320,12 +1321,12 @@ packages: tslib: 2.6.2 dev: false - /@hookform/resolvers@3.3.1(react-hook-form@7.46.0): + /@hookform/resolvers@3.3.1(react-hook-form@7.46.1): resolution: {integrity: sha512-K7KCKRKjymxIB90nHDQ7b9nli474ru99ZbqxiqDAWYsYhOsU3/4qLxW91y+1n04ic13ajjZ66L3aXbNef8PELQ==} peerDependencies: react-hook-form: ^7.0.0 dependencies: - react-hook-form: 7.46.0(react@18.2.0) + react-hook-form: 7.46.1(react@18.2.0) dev: false /@humanwhocodes/config-array@0.11.11: @@ -1348,9 +1349,9 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@hutson/parse-repository-url@3.0.2: - resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} - engines: {node: '>=6.9.0'} + /@hutson/parse-repository-url@5.0.0: + resolution: {integrity: sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==} + engines: {node: '>=10.13.0'} dev: true /@iarna/toml@2.2.5: @@ -1639,22 +1640,6 @@ packages: - encoding dev: false - /@nestjs/devtools-integration@0.1.5(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(reflect-metadata@0.1.13): - resolution: {integrity: sha512-iwxvfxa3kzOulG/Fje82Ww80OVsA8rzYR+UAEKrdGExRRGQRGQ0+bHfG0XLlPG3XIuM5J2MRMo7x1bN8ZIs9Gg==} - peerDependencies: - '@nestjs/common': ^9.3.7 || ^10.0.0 - '@nestjs/core': ^9.3.7 || ^10.0.0 - reflect-metadata: ^0.1.12 - dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) - chalk: 4.1.2 - node-fetch: 2.7.0 - reflect-metadata: 0.1.13 - transitivePeerDependencies: - - encoding - dev: false - /@nestjs/mapped-types@2.0.2(@nestjs/common@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): resolution: {integrity: sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==} peerDependencies: @@ -3360,17 +3345,17 @@ packages: '@babel/runtime': 7.22.11 dev: false - /@release-it/conventional-changelog@7.0.0(release-it@16.1.5): - resolution: {integrity: sha512-DBzyVS6c4g8w+xomCsygkmLeQBUq41Wvzy0vGgbdCLOxYnwI0cDaF6HOLPkrifH1qLa1uJ9i1pYA+hNyHkNanQ==} + /@release-it/conventional-changelog@7.0.1(release-it@16.1.5): + resolution: {integrity: sha512-qvMSzyaTWVCgbAFJ4OYb2HC2S+h47hqua6A/aYe5surdp9dXu47POz22tJUMyKr4z66g+nh2TElFqaWrLmOC3Q==} engines: {node: '>=16'} peerDependencies: release-it: ^16.0.0 dependencies: concat-stream: 2.0.0 - conventional-changelog: 4.0.0 - conventional-recommended-bump: 7.0.1 + conventional-changelog: 5.0.0 + conventional-recommended-bump: 8.0.0 release-it: 16.1.5 - semver: 7.5.1 + semver: 7.5.4 dev: true /@rrweb/types@2.0.0-alpha.11: @@ -3666,8 +3651,8 @@ packages: cron: 2.4.3 dev: false - /@types/crypto-js@4.1.1: - resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==} + /@types/crypto-js@4.1.2: + resolution: {integrity: sha512-t33RNmTu5ufG/sorROIafiCVJMx3jz95bXUMoPAZcUD14fxMXnuTzqzXZoxpR0tNx2xpw11Dlmem9vGCsrSOfA==} dev: true /@types/css-font-loading-module@0.0.7: @@ -5042,14 +5027,6 @@ packages: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} dev: false - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -5241,113 +5218,116 @@ packages: compare-func: 2.0.0 dev: true - /conventional-changelog-atom@3.0.0: - resolution: {integrity: sha512-pnN5bWpH+iTUWU3FaYdw5lJmfWeqSyrUkG+wyHBI9tC1dLNnHkbAOg1SzTQ7zBqiFrfo55h40VsGXWMdopwc5g==} - engines: {node: '>=14'} + /conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + dependencies: + compare-func: 2.0.0 dev: true - /conventional-changelog-codemirror@3.0.0: - resolution: {integrity: sha512-wzchZt9HEaAZrenZAUUHMCFcuYzGoZ1wG/kTRMICxsnW5AXohYMRxnyecP9ob42Gvn5TilhC0q66AtTPRSNMfw==} - engines: {node: '>=14'} + /conventional-changelog-atom@4.0.0: + resolution: {integrity: sha512-q2YtiN7rnT1TGwPTwjjBSIPIzDJCRE+XAUahWxnh+buKK99Kks4WLMHoexw38GXx9OUxAsrp44f9qXe5VEMYhw==} + engines: {node: '>=16'} dev: true - /conventional-changelog-conventionalcommits@6.1.0: - resolution: {integrity: sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==} - engines: {node: '>=14'} + /conventional-changelog-codemirror@4.0.0: + resolution: {integrity: sha512-hQSojc/5imn1GJK3A75m9hEZZhc3urojA5gMpnar4JHmgLnuM3CUIARPpEk86glEKr3c54Po3WV/vCaO/U8g3Q==} + engines: {node: '>=16'} + dev: true + + /conventional-changelog-conventionalcommits@7.0.1: + resolution: {integrity: sha512-VfFJxBmi+LYXeb4pIfZGbuaFCpWZh0qXbUAKP/s6B8tigV6R4D8j5PDlTtMMWawa7+DcNySVoF7kPWz0EMYuCQ==} + engines: {node: '>=16'} dependencies: compare-func: 2.0.0 dev: true - /conventional-changelog-core@5.0.2: - resolution: {integrity: sha512-RhQOcDweXNWvlRwUDCpaqXzbZemKPKncCWZG50Alth72WITVd6nhVk9MJ6w1k9PFNBcZ3YwkdkChE+8+ZwtUug==} - engines: {node: '>=14'} + /conventional-changelog-core@6.0.0: + resolution: {integrity: sha512-7WPwzTp3eRMot/2mbTAHF8m/0Ue4F/R/sMpSjmhBYi/+xnW2SqnXL/FMuYqEpNC2v3rjzRZ4p+9tYcKfHn02Cg==} + engines: {node: '>=16'} dependencies: + '@hutson/parse-repository-url': 5.0.0 add-stream: 1.0.0 - conventional-changelog-writer: 6.0.1 - conventional-commits-parser: 4.0.0 - dateformat: 3.0.3 - get-pkg-repo: 4.2.1 - git-raw-commits: 3.0.0 + conventional-changelog-writer: 7.0.0 + conventional-commits-parser: 5.0.0 + git-raw-commits: 4.0.0 git-remote-origin-url: 2.0.0 - git-semver-tags: 5.0.1 - normalize-package-data: 3.0.3 - read-pkg: 3.0.0 - read-pkg-up: 3.0.0 + git-semver-tags: 6.0.0 + hosted-git-info: 7.0.0 + normalize-package-data: 6.0.0 + read-pkg: 8.1.0 + read-pkg-up: 10.1.0 dev: true - /conventional-changelog-ember@3.0.0: - resolution: {integrity: sha512-7PYthCoSxIS98vWhVcSphMYM322OxptpKAuHYdVspryI0ooLDehRXWeRWgN+zWSBXKl/pwdgAg8IpLNSM1/61A==} - engines: {node: '>=14'} + /conventional-changelog-ember@4.0.0: + resolution: {integrity: sha512-D0IMhwcJUg1Y8FSry6XAplEJcljkHVlvAZddhhsdbL1rbsqRsMfGx/PIkPYq0ru5aDgn+OxhQ5N5yR7P9mfsvA==} + engines: {node: '>=16'} dev: true - /conventional-changelog-eslint@4.0.0: - resolution: {integrity: sha512-nEZ9byP89hIU0dMx37JXQkE1IpMmqKtsaR24X7aM3L6Yy/uAtbb+ogqthuNYJkeO1HyvK7JsX84z8649hvp43Q==} - engines: {node: '>=14'} + /conventional-changelog-eslint@5.0.0: + resolution: {integrity: sha512-6JtLWqAQIeJLn/OzUlYmzd9fKeNSWmQVim9kql+v4GrZwLx807kAJl3IJVc3jTYfVKWLxhC3BGUxYiuVEcVjgA==} + engines: {node: '>=16'} dev: true - /conventional-changelog-express@3.0.0: - resolution: {integrity: sha512-HqxihpUMfIuxvlPvC6HltA4ZktQEUan/v3XQ77+/zbu8No/fqK3rxSZaYeHYant7zRxQNIIli7S+qLS9tX9zQA==} - engines: {node: '>=14'} + /conventional-changelog-express@4.0.0: + resolution: {integrity: sha512-yWyy5c7raP9v7aTvPAWzqrztACNO9+FEI1FSYh7UP7YT1AkWgv5UspUeB5v3Ibv4/o60zj2o9GF2tqKQ99lIsw==} + engines: {node: '>=16'} dev: true - /conventional-changelog-jquery@4.0.0: - resolution: {integrity: sha512-TTIN5CyzRMf8PUwyy4IOLmLV2DFmPtasKN+x7EQKzwSX8086XYwo+NeaeA3VUT8bvKaIy5z/JoWUvi7huUOgaw==} - engines: {node: '>=14'} + /conventional-changelog-jquery@5.0.0: + resolution: {integrity: sha512-slLjlXLRNa/icMI3+uGLQbtrgEny3RgITeCxevJB+p05ExiTgHACP5p3XiMKzjBn80n+Rzr83XMYfRInEtCPPw==} + engines: {node: '>=16'} dev: true - /conventional-changelog-jshint@3.0.0: - resolution: {integrity: sha512-bQof4byF4q+n+dwFRkJ/jGf9dCNUv4/kCDcjeCizBvfF81TeimPZBB6fT4HYbXgxxfxWXNl/i+J6T0nI4by6DA==} - engines: {node: '>=14'} + /conventional-changelog-jshint@4.0.0: + resolution: {integrity: sha512-LyXq1bbl0yG0Ai1SbLxIk8ZxUOe3AjnlwE6sVRQmMgetBk+4gY9EO3d00zlEt8Y8gwsITytDnPORl8al7InTjg==} + engines: {node: '>=16'} dependencies: compare-func: 2.0.0 dev: true - /conventional-changelog-preset-loader@3.0.0: - resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} - engines: {node: '>=14'} + /conventional-changelog-preset-loader@4.0.0: + resolution: {integrity: sha512-xYGvKMkJs8o6vnKDbo2v5VcalZmH54lVU+OCvFQvxj3AQKRMJhbKwvBVsSXfQSuhaG9r6mdK8TIMOaiwiStasg==} + engines: {node: '>=16'} dev: true - /conventional-changelog-writer@6.0.1: - resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} - engines: {node: '>=14'} + /conventional-changelog-writer@7.0.0: + resolution: {integrity: sha512-9/6vTDd3wDbH9yayZNOq53UWI4QqYlbiLBtWf+alsQA/bBFHG+k3KnQ8Fu/xzHqsbQfzPg3w1H1piWYn/GD9Tw==} + engines: {node: '>=16'} hasBin: true dependencies: - conventional-commits-filter: 3.0.0 - dateformat: 3.0.3 + conventional-commits-filter: 4.0.0 handlebars: 4.7.8 json-stringify-safe: 5.0.1 - meow: 8.1.2 - semver: 7.5.1 - split: 1.0.1 + meow: 12.1.1 + semver: 7.5.4 + split2: 4.2.0 dev: true - /conventional-changelog@4.0.0: - resolution: {integrity: sha512-JbZjwE1PzxQCvm+HUTIr+pbSekS8qdOZzMakdFyPtdkEWwFvwEJYONzjgMm0txCb2yBcIcfKDmg8xtCKTdecNQ==} - engines: {node: '>=14'} + /conventional-changelog@5.0.0: + resolution: {integrity: sha512-k0c3lCtY3+k75gyrIoO7WEyBd4HLxu8QmTTPxM4D+vKk9wN06GZ/iaVJXQsGZae3Cezb02Is5PJ70fia3zZG8Q==} + engines: {node: '>=16'} dependencies: - conventional-changelog-angular: 6.0.0 - conventional-changelog-atom: 3.0.0 - conventional-changelog-codemirror: 3.0.0 - conventional-changelog-conventionalcommits: 6.1.0 - conventional-changelog-core: 5.0.2 - conventional-changelog-ember: 3.0.0 - conventional-changelog-eslint: 4.0.0 - conventional-changelog-express: 3.0.0 - conventional-changelog-jquery: 4.0.0 - conventional-changelog-jshint: 3.0.0 - conventional-changelog-preset-loader: 3.0.0 + conventional-changelog-angular: 7.0.0 + conventional-changelog-atom: 4.0.0 + conventional-changelog-codemirror: 4.0.0 + conventional-changelog-conventionalcommits: 7.0.1 + conventional-changelog-core: 6.0.0 + conventional-changelog-ember: 4.0.0 + conventional-changelog-eslint: 5.0.0 + conventional-changelog-express: 4.0.0 + conventional-changelog-jquery: 5.0.0 + conventional-changelog-jshint: 4.0.0 + conventional-changelog-preset-loader: 4.0.0 dev: true /conventional-commit-types@3.0.0: resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} dev: true - /conventional-commits-filter@3.0.0: - resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} - engines: {node: '>=14'} - dependencies: - lodash.ismatch: 4.4.0 - modify-values: 1.0.1 + /conventional-commits-filter@4.0.0: + resolution: {integrity: sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==} + engines: {node: '>=16'} dev: true /conventional-commits-parser@4.0.0: @@ -5361,18 +5341,29 @@ packages: split2: 3.2.2 dev: true - /conventional-recommended-bump@7.0.1: - resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} - engines: {node: '>=14'} + /conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + dev: true + + /conventional-recommended-bump@8.0.0: + resolution: {integrity: sha512-yvGN+VMy00WIe/pJufpmN+I4B2cM/WFK+CFCmDcjyVLyQR6J1KT2iecmA4NQ58gQAiNkvStEjcZp/W9h1JDM1A==} + engines: {node: '>=16'} hasBin: true dependencies: concat-stream: 2.0.0 - conventional-changelog-preset-loader: 3.0.0 - conventional-commits-filter: 3.0.0 - conventional-commits-parser: 4.0.0 - git-raw-commits: 3.0.0 - git-semver-tags: 5.0.1 - meow: 8.1.2 + conventional-changelog-preset-loader: 4.0.0 + conventional-commits-filter: 4.0.0 + conventional-commits-parser: 5.0.0 + git-raw-commits: 4.0.0 + git-semver-tags: 6.0.0 + meow: 12.1.1 dev: true /convert-source-map@1.9.0: @@ -5392,6 +5383,7 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false /cosmiconfig-typescript-loader@4.4.0(@types/node@20.4.7)(cosmiconfig@8.3.2)(ts-node@10.9.1)(typescript@5.2.2): resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} @@ -5557,6 +5549,11 @@ packages: engines: {node: '>=8'} dev: true + /dargs@8.1.0: + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} + dev: true + /data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -5567,10 +5564,6 @@ packages: engines: {node: '>= 14'} dev: true - /dateformat@3.0.3: - resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - dev: true - /dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: false @@ -6193,7 +6186,7 @@ packages: peerDependencies: eslint: '>=8.44.0' dependencies: - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.15 '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) ci-info: 3.8.0 clean-regexp: 1.0.0 @@ -6711,13 +6704,6 @@ packages: /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - /find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} - dependencies: - locate-path: 2.0.0 - dev: true - /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -6733,6 +6719,14 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + dev: true + /find-versions@5.1.0: resolution: {integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==} engines: {node: '>=12'} @@ -6851,8 +6845,8 @@ packages: resolution: {integrity: sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==} dev: false - /framer-motion@10.16.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-aY6L9YMvqMWtfOQptaUvvr8dp97jskXY5UYLQM0vOPxKeERrG/Z034EIQZ/52u7MeCT0HlCQy3/l0HdUZCB9Tw==} + /framer-motion@10.16.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1OMs6wY964hX8YjiCeYQlgrZDbkKvZztnynTUgUZjdzq2au6PZUsodmUY6GAudUgImrWqTrtpSwMbi1ETmIx4A==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 @@ -6983,17 +6977,6 @@ packages: engines: {node: '>=6'} dev: false - /get-pkg-repo@4.2.1: - resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} - engines: {node: '>=6.9.0'} - hasBin: true - dependencies: - '@hutson/parse-repository-url': 3.0.2 - hosted-git-info: 4.1.0 - through2: 2.0.5 - yargs: 16.2.0 - dev: true - /get-port@5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} @@ -7051,14 +7034,14 @@ packages: through2: 4.0.2 dev: true - /git-raw-commits@3.0.0: - resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} - engines: {node: '>=14'} + /git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} hasBin: true dependencies: - dargs: 7.0.0 - meow: 8.1.2 - split2: 3.2.2 + dargs: 8.1.0 + meow: 12.1.1 + split2: 4.2.0 dev: true /git-remote-origin-url@2.0.0: @@ -7069,13 +7052,13 @@ packages: pify: 2.3.0 dev: true - /git-semver-tags@5.0.1: - resolution: {integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==} - engines: {node: '>=14'} + /git-semver-tags@6.0.0: + resolution: {integrity: sha512-v5BL6psuUy+Ftuo99141XlOIDoJtKw5+YyDANS7fknSP0iT4cVIanc3toDsH4K+VpIWc19l2/xkwQmXMfloeUA==} + engines: {node: '>=16'} hasBin: true dependencies: - meow: 8.1.2 - semver: 7.5.1 + meow: 12.1.1 + semver: 7.5.4 dev: true /git-up@7.0.0: @@ -7383,8 +7366,8 @@ packages: readable-stream: 3.6.2 dev: false - /highcharts-react-official@3.2.0(highcharts@11.1.0)(react@18.2.0): - resolution: {integrity: sha512-71IJZsLmEboYFjONpwC3NRsg6JKvtKYtS5Si3e6s6MLRSOFNOY8KILTkzvO36kjpeR/A0X3/kvvewE+GMPpkjw==} + /highcharts-react-official@3.2.1(highcharts@11.1.0)(react@18.2.0): + resolution: {integrity: sha512-hyQTX7ezCxl7JqumaWiGsroGWalzh24GedQIgO3vJbkGOZ6ySRAltIYjfxhrq4HszJOySZegotEF7v+haQ75UA==} peerDependencies: highcharts: '>=6.0.0' react: '>=16.8.0' @@ -7428,6 +7411,13 @@ packages: lru-cache: 7.18.3 dev: true + /hosted-git-info@7.0.0: + resolution: {integrity: sha512-ICclEpTLhHj+zCuSb2/usoNXSVkxUSIopre+b1w8NDY9Dntp9LO4vLdHYI336TH8sAqwrRgnSfdkBG2/YpisHA==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + lru-cache: 10.0.1 + dev: true + /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -8012,6 +8002,13 @@ packages: text-extensions: 1.9.0 dev: true + /is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + dependencies: + text-extensions: 2.4.0 + dev: true + /is-typed-array@1.1.12: resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} engines: {node: '>= 0.4'} @@ -8070,10 +8067,6 @@ packages: engines: {node: '>=12'} dev: true - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true - /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true @@ -8189,10 +8182,6 @@ packages: /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true - /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -8322,6 +8311,11 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + /lines-and-columns@2.0.3: + resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /linkify-it@4.0.1: resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} dependencies: @@ -8365,16 +8359,6 @@ packages: wrap-ansi: 8.1.0 dev: true - /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - dev: true - /load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -8388,14 +8372,6 @@ packages: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} - /locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} - dependencies: - p-locate: 2.0.0 - path-exists: 3.0.0 - dev: true - /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -8409,6 +8385,13 @@ packages: dependencies: p-locate: 5.0.0 + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: true + /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: true @@ -8441,10 +8424,6 @@ packages: resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} dev: true - /lodash.ismatch@4.4.0: - resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} - dev: true - /lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} dev: true @@ -8696,6 +8675,11 @@ packages: fs-monkey: 1.0.4 dev: false + /meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + dev: true + /meow@8.1.2: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} @@ -8918,11 +8902,6 @@ packages: obliterator: 2.0.4 dev: false - /modify-values@1.0.1: - resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} - engines: {node: '>=0.10.0'} - dev: true - /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -9001,7 +8980,7 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - /nestjs-pino@3.4.0(@nestjs/common@10.2.4)(pino-http@8.4.0): + /nestjs-pino@3.4.0(@nestjs/common@10.2.4)(pino-http@8.5.0): resolution: {integrity: sha512-L79tk+WqVJApGxD4K40srSHopwlBX8WVPoIJtVhWaxJUfk9ND6eZp7kmgdgwQw8PpYUeoeOhS1g2j0Ep3c0NJA==} engines: {node: '>= 14'} requiresBuild: true @@ -9010,7 +8989,7 @@ packages: pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 dependencies: '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - pino-http: 8.4.0 + pino-http: 8.5.0 dev: false /netmask@2.0.2: @@ -9218,7 +9197,7 @@ packages: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.0 - semver: 7.5.1 + semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -9232,6 +9211,16 @@ packages: validate-npm-package-license: 3.0.4 dev: true + /normalize-package-data@6.0.0: + resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + hosted-git-info: 7.0.0 + is-core-module: 2.13.0 + semver: 7.5.4 + validate-npm-package-license: 3.0.4 + dev: true + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -9566,13 +9555,6 @@ packages: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} - /p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} - dependencies: - p-try: 1.0.0 - dev: true - /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -9586,11 +9568,11 @@ packages: dependencies: yocto-queue: 0.1.0 - /p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - p-limit: 1.3.0 + yocto-queue: 1.0.0 dev: true /p-locate@4.1.0: @@ -9606,6 +9588,13 @@ packages: dependencies: p-limit: 3.1.0 + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: true + /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -9613,11 +9602,6 @@ packages: aggregate-error: 3.1.0 dev: true - /p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - dev: true - /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -9703,14 +9687,6 @@ packages: is-hexadecimal: 1.0.4 dev: true - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: true - /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -9720,6 +9696,17 @@ packages: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + /parse-json@7.1.0: + resolution: {integrity: sha512-ihtdrgbqdONYD156Ap6qTcaGcGdkdAxodO1wLqQ/j7HP1u2sFYppINiq4jyC8F+Nm+4fVufylCV00QmkTHkSUg==} + engines: {node: '>=16'} + dependencies: + '@babel/code-frame': 7.22.13 + error-ex: 1.3.2 + json-parse-even-better-errors: 3.0.0 + lines-and-columns: 2.0.3 + type-fest: 3.13.1 + dev: true + /parse-passwd@1.0.0: resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} engines: {node: '>=0.10.0'} @@ -9737,15 +9724,15 @@ packages: parse-path: 7.0.0 dev: true - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: true - /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -9781,13 +9768,6 @@ packages: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: false - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - dependencies: - pify: 3.0.0 - dev: true - /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -9817,11 +9797,6 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true - /pino-abstract-transport@1.0.0: resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} dependencies: @@ -9829,8 +9804,8 @@ packages: split2: 4.2.0 dev: false - /pino-http@8.4.0: - resolution: {integrity: sha512-9I1eRLxsujQJwLQTrHBU0wDlwnry2HzV2TlDwAsmZ9nT3Y2NQBLrz+DYp73L4i11vl/eudnFT8Eg0Kp62tMwEw==} + /pino-http@8.5.0: + resolution: {integrity: sha512-kLGKNLyfWfdmrG1Ug0YdYpCTGbNcuD/YGC3g+elRU/Cm44UTs+tj/dZTxDN3bYauekxFxdLZhJuZdKKl0cml9w==} dependencies: get-caller-file: 2.0.5 pino: 8.15.0 @@ -10003,10 +9978,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true - /process-warning@2.2.0: resolution: {integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==} dev: false @@ -10179,8 +10150,8 @@ packages: scheduler: 0.23.0 dev: false - /react-hook-form@7.46.0(react@18.2.0): - resolution: {integrity: sha512-sc22pXwuKgbWBR5/EYWOVoFw4i/w893tDRUgQY2/Xb7wlpajJBrqAMFhb4z1CDhZ0TSFFfX62+iKx3gCXnCHHw==} + /react-hook-form@7.46.1(react@18.2.0): + resolution: {integrity: sha512-0GfI31LRTBd5tqbXMGXT1Rdsv3rnvy0FjEk8Gn9/4tp6+s77T7DPZuGEpBRXOauL+NhyGT5iaXzdIM2R6F/E+w==} engines: {node: '>=12.22.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 @@ -10382,12 +10353,13 @@ packages: npm-normalize-package-bin: 3.0.1 dev: true - /read-pkg-up@3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} + /read-pkg-up@10.1.0: + resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==} + engines: {node: '>=16'} dependencies: - find-up: 2.1.0 - read-pkg: 3.0.0 + find-up: 6.3.0 + read-pkg: 8.1.0 + type-fest: 4.3.1 dev: true /read-pkg-up@7.0.1: @@ -10399,15 +10371,6 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - dev: true - /read-pkg@5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} @@ -10418,16 +10381,14 @@ packages: type-fest: 0.6.0 dev: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + /read-pkg@8.1.0: + resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} + engines: {node: '>=16'} dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 6.0.0 + parse-json: 7.1.0 + type-fest: 4.3.1 dev: true /readable-stream@3.6.2: @@ -10806,10 +10767,6 @@ packages: isarray: 2.0.5 dev: true - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -10885,14 +10842,6 @@ packages: hasBin: true dev: true - /semver@7.5.1: - resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} @@ -11146,13 +11095,6 @@ packages: /split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - dev: false - - /split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} - dependencies: - through: 2.3.8 - dev: true /ssri@10.0.5: resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} @@ -11278,12 +11220,6 @@ packages: es-abstract: 1.22.1 dev: true - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: true - /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: @@ -11540,6 +11476,11 @@ packages: engines: {node: '>=0.10'} dev: true + /text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + dev: true + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -11566,13 +11507,6 @@ packages: engines: {node: '>=10'} dev: false - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: true - /through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: @@ -11842,6 +11776,16 @@ packages: engines: {node: '>=12.20'} dev: true + /type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + dev: true + + /type-fest@4.3.1: + resolution: {integrity: sha512-pphNW/msgOUSkJbH58x8sqpq8uQj6b0ZKGxEsLKMUnGorRcDjrUaLS+39+/ub41JNTwrrMyJcUB8+YZs3mbwqw==} + engines: {node: '>=16'} + dev: true + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -12443,6 +12387,7 @@ packages: /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + dev: false /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} @@ -12487,19 +12432,6 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: true - /yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -12521,6 +12453,11 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + /zod@3.21.4: resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} dev: false From 0319688ae7030cc80b970a275369386334c0f6b8 Mon Sep 17 00:00:00 2001 From: chenyueban Date: Tue, 5 Sep 2023 16:32:33 +0800 Subject: [PATCH 12/23] refactor: reconstruct using react table --- .../[locale]/[projectId]/feedbacks/page.tsx | 19 +- .../app/[locale]/[projectId]/users/page.tsx | 19 +- packages/web/components/data-table.tsx | 28 +-- packages/web/components/events-list.tsx | 174 ++++++++---------- packages/web/components/feedbacks-list.tsx | 67 ++++--- packages/web/components/users-list.tsx | 109 ++++------- 6 files changed, 161 insertions(+), 255 deletions(-) diff --git a/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx b/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx index 2905052..f6473bd 100644 --- a/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx +++ b/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx @@ -11,6 +11,7 @@ import useCurrentProject from '~/hooks/use-current-project' import { useInfinite } from '~/hooks/use-infinite' import { serviceGetFeedbacks } from '~/services/feedbacks' import { Button } from '~/components/ui/button' +import LoadingMoreButton from '~/components/load-more-button' export default function FeedbacksPage() { const ct = useTranslations('Common') @@ -49,21 +50,11 @@ export default function FeedbacksPage() { - + />
) diff --git a/packages/web/app/[locale]/[projectId]/users/page.tsx b/packages/web/app/[locale]/[projectId]/users/page.tsx index a9340b8..de5f5ce 100644 --- a/packages/web/app/[locale]/[projectId]/users/page.tsx +++ b/packages/web/app/[locale]/[projectId]/users/page.tsx @@ -11,7 +11,7 @@ import useCurrentProject from '~/hooks/use-current-project' import { useInfinite } from '~/hooks/use-infinite' import { serviceGetEventUsers } from '~/services/event-users' import { Input } from '~/components/ui/input' -import { Button } from '~/components/ui/button' +import LoadingMoreButton from '~/components/load-more-button' export default function UsersPage() { const ct = useTranslations('Common') @@ -65,20 +65,11 @@ export default function UsersPage() { - + />
) diff --git a/packages/web/components/data-table.tsx b/packages/web/components/data-table.tsx index d24ce01..878e5b3 100644 --- a/packages/web/components/data-table.tsx +++ b/packages/web/components/data-table.tsx @@ -3,11 +3,11 @@ import { flexRender, getCoreRowModel, - getPaginationRowModel, useReactTable, } from '@tanstack/react-table' import { type ColumnDef } from '@tanstack/react-table' +import Loading from '~/components/loading' import { Table, TableBody, @@ -16,22 +16,24 @@ import { TableHeader, TableRow, } from '~/components/ui/table' -import { Button } from '~/components/ui/button' interface DataTableProps { columns: ColumnDef[] - data: TData[] + data?: TData[] } export default function DataTable({ columns, data, }: DataTableProps) { + if (!data) { + return + } + const table = useReactTable({ data, columns, getCoreRowModel: getCoreRowModel(), - getPaginationRowModel: getPaginationRowModel(), }) return ( @@ -85,24 +87,6 @@ export default function DataTable({
-
- - -
) } diff --git a/packages/web/components/events-list.tsx b/packages/web/components/events-list.tsx index 9bf4573..9091313 100644 --- a/packages/web/components/events-list.tsx +++ b/packages/web/components/events-list.tsx @@ -2,120 +2,90 @@ import Link from 'next/link' import dayjs from 'dayjs' -import { type FC, useCallback } from 'react' import { type Event } from '@prisma/client' import { type OhbugEventLike } from 'common' +import { ColumnDef } from '@tanstack/react-table' +import { useMemo } from 'react' import { renderStringOrJson } from '~/libs/utils' import useCurrentProject from '~/hooks/use-current-project' -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '~/components/ui/table' - -const columns = [ - { name: 'TITLE', key: 'description' }, - { name: 'TRENDS', key: 'appType' }, - { name: 'APPVERSION', key: 'appVersion' }, - { name: 'CATEGORY', key: 'category' }, - { name: 'RELEASESTAGE', key: 'releaseStage' }, - { name: 'USER', key: 'user' }, - { name: 'SDK', key: 'sdk' }, - { name: 'DEVICE', key: 'device' }, - { name: 'METADATA', key: 'metadata' }, -] +import DataTable from '~/components/data-table' interface Props { events?: Event[] | OhbugEventLike[] } -const EventsList: FC = ({ events }) => { +export default function EventsList({ events }: Props) { const { projectId } = useCurrentProject() - const renderCell = useCallback((event: Event | OhbugEventLike, columnKey: string) => { - switch (columnKey) { - case 'description': - return ( -
- - {dayjs(event.createdAt).format('YYYY-MM-DD HH:mm:ss')} - -
{event.type}: {renderStringOrJson((event.detail as any).message ?? event.detail)}
-
- ) - case 'appType': - return ( -
{event.appType}
- ) - case 'appVersion': - return ( -
{event.appVersion}
- ) - case 'category': - return ( -
{event.category}
- ) - case 'releaseStage': - return ( -
{event.releaseStage}
- ) - case 'users': - return ( -
{renderStringOrJson(('user' in event) ? event.user : '')}
- ) - case 'sdk': - return ( -
{renderStringOrJson(event.sdk)}
- ) - case 'device': - return ( -
{renderStringOrJson(event.device)}
- ) - case 'metadata': - return ( -
{renderStringOrJson(event.metadata)}
- ) - default: - return null - } - }, []) + const columns = useMemo[]>( + () => [ + { + id: 'description', + header: 'TITLE', + cell: ({ row }) => { + const detail = row.getValue('detail') + return ( +
+ + {dayjs(row.getValue('createdAt')).format('YYYY-MM-DD HH:mm:ss')} + +
{row.getValue('type')}: {renderStringOrJson((detail as any)?.message ?? detail)}
+
+ ) + }, + }, + { + accessorKey: 'appType', + header: 'APPTYPE', + }, + { + accessorKey: 'appVersion', + header: 'APPVERSION', + }, + { + accessorKey: 'category', + header: 'CATEGORY', + }, + { + accessorKey: 'releaseStage', + header: 'RELEASESTAGE', + }, + { + accessorKey: 'user', + header: 'USER', + cell: ({ row }) => ( +
{renderStringOrJson(row.getValue('user' || ''))}
+ ), + }, + { + accessorKey: 'sdk', + header: 'SDK', + cell: ({ row }) => ( +
{renderStringOrJson(row.getValue('sdk'))}
+ ), + }, + { + accessorKey: 'device', + header: 'DEVICE', + cell: ({ row }) => ( +
{renderStringOrJson(row.getValue('device'))}
+ ), + }, + { + accessorKey: 'metadata', + header: 'METADATA', + cell: ({ row }) => ( +
{renderStringOrJson(row.getValue('metadata'))}
+ ), + }, + ], + [projectId], + ) return ( - - - { - columns.map(column => ( - - {column.name} - - )) - } - - - { - events - ? events.map(event => ( - - { - Object.keys(event).map(columnKey => ( - {renderCell(event, columnKey)} - )) - } - - )) - : ( - - - No results. - - - ) - } - -
+ ) } - -export default EventsList diff --git a/packages/web/components/feedbacks-list.tsx b/packages/web/components/feedbacks-list.tsx index 721193e..0d10486 100644 --- a/packages/web/components/feedbacks-list.tsx +++ b/packages/web/components/feedbacks-list.tsx @@ -2,50 +2,49 @@ import Link from 'next/link' import dayjs from 'dayjs' -import { type FC } from 'react' +import { useMemo } from 'react' import { type EventUser, type Feedback } from '@prisma/client' +import { ColumnDef } from '@tanstack/react-table' +import DataTable from '~/components/data-table' import { renderStringOrJson } from '~/libs/utils' import useCurrentProject from '~/hooks/use-current-project' -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '~/components/ui/table' interface Props { feedbacks?: (Feedback & { user: EventUser })[] } -const FeedbacksList: FC = ({ feedbacks }) => { +export default function FeedbacksList({ feedbacks }: Props) { const { projectId } = useCurrentProject() + const columns = useMemo[]>( + () => [ + { + accessorKey: 'detail', + header: 'feedback', + cell: ({ row }) => ( + + {(row.getValue('detail') as any)?.feedback} + + ), + }, + { + accessorKey: 'createdAt', + header: 'createdAt', + cell: ({ row }) => dayjs(row.getValue('createdAt')).format('YYYY-MM-DD HH:mm:ss'), + }, + { + accessorKey: 'user', + header: 'user', + cell: ({ row }) => renderStringOrJson(row.getValue('user')), + }, + ], + [projectId], + ) + return ( - - - - feedback - createdAt - user - - - - { - feedbacks?.map((feedback) => { - const detail = feedback.detail as any - return ( - - - - {detail.feedback} - - - - {dayjs(feedback.createdAt).format('YYYY-MM-DD HH:mm:ss')} - - {renderStringOrJson(feedback.user)} - - ) - }) - } - -
+ ) } - -export default FeedbacksList diff --git a/packages/web/components/users-list.tsx b/packages/web/components/users-list.tsx index 7d32388..d6d9c37 100644 --- a/packages/web/components/users-list.tsx +++ b/packages/web/components/users-list.tsx @@ -1,11 +1,11 @@ 'use client' import Link from 'next/link' -import { useCallback } from 'react' -import { type Key } from 'react' +import { useMemo } from 'react' import { type EventUser } from '@prisma/client' +import { ColumnDef } from '@tanstack/react-table' import useCurrentProject from '~/hooks/use-current-project' -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '~/components/ui/table' +import DataTable from '~/components/data-table' type User = EventUser & { _count: { @@ -40,77 +40,48 @@ function getUserView(user: EventUser) { return result.join(' / ') } -const columns = [ - { - key: 'user', - label: 'user', - }, - { - key: 'issues', - label: 'issues', - }, - { - key: 'metrics', - label: 'metrics', - }, - { - key: 'feedbacks', - label: 'feedbacks', - }, - { - key: 'pageViews', - label: 'pageViews', - }, - { - key: 'userViews', - label: 'userViews', - }, -] - export default function UsersList({ users }: Props) { const { projectId } = useCurrentProject() - const renderCell = useCallback((item: User, columnKey: Key) => { - switch (columnKey) { - case 'user': - return ( - - {getUserView(item)} + const columns = useMemo[]>( + () => [ + { + header: 'user', + cell: ({ row }) => ( + + {getUserView(row.original)} - ) - case 'issues': - return item._count.issues - case 'metrics': - return item._count.metrics - case 'feedbacks': - return item._count.feedbacks - case 'pageViews': - return item._count.pageViews - case 'userViews': - return item._count.userViews - default: - return null - } - }, [projectId]) + ), + }, + { + accessorKey: '_count', + header: 'issues', + cell: ({ row }) => (row.getValue('_count') as User['_count'])?.issues, + }, + { + header: 'metrics', + cell: ({ row }) => (row.getValue('_count') as User['_count'])?.metrics, + }, + { + header: 'feedbacks', + cell: ({ row }) => (row.getValue('_count') as User['_count'])?.feedbacks, + }, + { + header: 'pageViews', + cell: ({ row }) => (row.getValue('_count') as User['_count'])?.pageViews, + }, + { + header: 'userViews', + cell: ({ row }) => (row.getValue('_count') as User['_count'])?.userViews, + }, + ], + [projectId], + ) return ( - - - - {columns.map(column => {column.label})} - - - - { - users - ? users.map(user => ( - - {columns.map(column => {renderCell(user, column.key)})} - - )) - : [] - } - -
+ ) } From bf57d1d6a89b9205e45877148d819c6c5b5079ef Mon Sep 17 00:00:00 2001 From: chenyueban Date: Tue, 5 Sep 2023 17:07:27 +0800 Subject: [PATCH 13/23] feat(ui): Add Snippet component for displaying and copying code snippets --- .../[locale]/[projectId]/settings/page.tsx | 3 +- packages/web/components/ui/snippet.tsx | 77 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 packages/web/components/ui/snippet.tsx diff --git a/packages/web/app/[locale]/[projectId]/settings/page.tsx b/packages/web/app/[locale]/[projectId]/settings/page.tsx index e5b9773..e9cb046 100644 --- a/packages/web/app/[locale]/[projectId]/settings/page.tsx +++ b/packages/web/app/[locale]/[projectId]/settings/page.tsx @@ -17,6 +17,7 @@ import { Input } from '~/components/ui/input' import { Button } from '~/components/ui/button' import { Avatar, AvatarFallback, AvatarImage } from '~/components/ui/avatar' import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '~/components/ui/dialog' +import { Snippet } from '~/components/ui/snippet' interface CommonProps { project?: ProjectWithMembers @@ -102,7 +103,7 @@ const SettingsProjectApiKey = ({ project }: CommonProps) => { {t('apiKeyDescription')} - {project?.apiKey ?? ''} + {project?.apiKey ?? ''} ) diff --git a/packages/web/components/ui/snippet.tsx b/packages/web/components/ui/snippet.tsx new file mode 100644 index 0000000..fc1356b --- /dev/null +++ b/packages/web/components/ui/snippet.tsx @@ -0,0 +1,77 @@ +import * as React from 'react' +import { type VariantProps, cva } from 'class-variance-authority' +import { useCopyToClipboard } from 'react-use' + +import { Tooltip, TooltipContent, TooltipTrigger } from './tooltip' +import { cn } from '~/libs/utils' + +const snippetVariants = cva( + 'inline-flex items-center rounded-xl px-4 py-2.5 text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-stone-950 focus:ring-offset-2 dark:focus:ring-stone-300', + { + variants: { + variant: { + default: + 'bg-stone-100 text-stone-900 hover:bg-stone-100/80 dark:bg-stone-800 dark:text-stone-50 dark:hover:bg-stone-800/80', + destructive: + 'bg-red-500 text-stone-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-stone-50 dark:hover:bg-red-900/80', + outline: 'text-stone-950 dark:text-stone-50', + }, + }, + defaultVariants: { variant: 'default' }, + }, +) + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps { + children: string +} + +function Snippet({ className, variant, children, ...props }: BadgeProps) { + const [state, copyToClipboard] = useCopyToClipboard() + const [copied, setCopied] = React.useState(false) + const handleCopy = React.useCallback(() => { + copyToClipboard(children) + setCopied(true) + setTimeout(() => { + setCopied(false) + }, 3000) + }, [children]) + + return ( +
+ {children} + + +
+ { + copied + ? state.error + ? ( + + ) + : ( + + ) + : ( + + ) + } +
+
+ {state.error?.message || 'Copy to clipboard'} +
+
+ ) +} + +export { Snippet, snippetVariants } From 43092b2ffdb786313df5608006257e35abe946b8 Mon Sep 17 00:00:00 2001 From: chenyueban Date: Tue, 5 Sep 2023 17:22:21 +0800 Subject: [PATCH 14/23] style: refactor CSS variables in globals.css --- packages/web/app/globals.css | 76 -------------------------------- packages/web/components/logo.tsx | 4 +- packages/web/styles/globals.css | 76 +++++++++++++++----------------- 3 files changed, 38 insertions(+), 118 deletions(-) delete mode 100644 packages/web/app/globals.css diff --git a/packages/web/app/globals.css b/packages/web/app/globals.css deleted file mode 100644 index e4e2494..0000000 --- a/packages/web/app/globals.css +++ /dev/null @@ -1,76 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - :root { - --background: 0 0% 100%; - --foreground: 20 14.3% 4.1%; - - --card: 0 0% 100%; - --card-foreground: 20 14.3% 4.1%; - - --popover: 0 0% 100%; - --popover-foreground: 20 14.3% 4.1%; - - --primary: 24 9.8% 10%; - --primary-foreground: 60 9.1% 97.8%; - - --secondary: 60 4.8% 95.9%; - --secondary-foreground: 24 9.8% 10%; - - --muted: 60 4.8% 95.9%; - --muted-foreground: 25 5.3% 44.7%; - - --accent: 60 4.8% 95.9%; - --accent-foreground: 24 9.8% 10%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 60 9.1% 97.8%; - - --border: 20 5.9% 90%; - --input: 20 5.9% 90%; - --ring: 20 14.3% 4.1%; - - --radius: 0.5rem; - } - - .dark { - --background: 20 14.3% 4.1%; - --foreground: 60 9.1% 97.8%; - - --card: 20 14.3% 4.1%; - --card-foreground: 60 9.1% 97.8%; - - --popover: 20 14.3% 4.1%; - --popover-foreground: 60 9.1% 97.8%; - - --primary: 60 9.1% 97.8%; - --primary-foreground: 24 9.8% 10%; - - --secondary: 12 6.5% 15.1%; - --secondary-foreground: 60 9.1% 97.8%; - - --muted: 12 6.5% 15.1%; - --muted-foreground: 24 5.4% 63.9%; - - --accent: 12 6.5% 15.1%; - --accent-foreground: 60 9.1% 97.8%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 60 9.1% 97.8%; - - --border: 12 6.5% 15.1%; - --input: 12 6.5% 15.1%; - --ring: 24 5.7% 82.9%; - } -} - -@layer base { - * { - @apply border-border; - } - body { - @apply bg-background text-foreground; - } -} \ No newline at end of file diff --git a/packages/web/components/logo.tsx b/packages/web/components/logo.tsx index decf8af..afa08c3 100644 --- a/packages/web/components/logo.tsx +++ b/packages/web/components/logo.tsx @@ -14,7 +14,7 @@ interface Props { } const Logo = forwardRef((props, ref) => { - const { theme } = useTheme() + const { resolvedTheme } = useTheme() return ( ((props, ref) => { fill priority alt="logo" - src={theme === 'dark' ? '/logo-white.svg' : '/logo.svg'} + src={resolvedTheme === 'dark' ? '/logo-white.svg' : '/logo.svg'} /> ) diff --git a/packages/web/styles/globals.css b/packages/web/styles/globals.css index 67a2820..bc408d1 100644 --- a/packages/web/styles/globals.css +++ b/packages/web/styles/globals.css @@ -5,68 +5,64 @@ @layer base { :root { --background: 0 0% 100%; - --foreground: 222.2 47.4% 11.2%; + --foreground: 20 14.3% 4.1%; - --muted: 210 40% 96.1%; - --muted-foreground: 215.4 16.3% 46.9%; + --card: 0 0% 100%; + --card-foreground: 20 14.3% 4.1%; --popover: 0 0% 100%; - --popover-foreground: 222.2 47.4% 11.2%; - - --border: 214.3 31.8% 91.4%; - --input: 214.3 31.8% 91.4%; + --popover-foreground: 20 14.3% 4.1%; - --card: 0 0% 100%; - --card-foreground: 222.2 47.4% 11.2%; + --primary: 24 9.8% 10%; + --primary-foreground: 60 9.1% 97.8%; - --primary: 222.2 47.4% 11.2%; - --primary-foreground: 210 40% 98%; + --secondary: 60 4.8% 95.9%; + --secondary-foreground: 24 9.8% 10%; - --secondary: 210 40% 96.1%; - --secondary-foreground: 222.2 47.4% 11.2%; + --muted: 60 4.8% 95.9%; + --muted-foreground: 25 5.3% 44.7%; - --accent: 210 40% 96.1%; - --accent-foreground: 222.2 47.4% 11.2%; + --accent: 60 4.8% 95.9%; + --accent-foreground: 24 9.8% 10%; - --destructive: 0 100% 50%; - --destructive-foreground: 210 40% 98%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 60 9.1% 97.8%; - --ring: 215 20.2% 65.1%; + --border: 20 5.9% 90%; + --input: 20 5.9% 90%; + --ring: 20 14.3% 4.1%; --radius: 0.5rem; } .dark { - --background: 224 71% 4%; - --foreground: 213 31% 91%; + --background: 20 14.3% 4.1%; + --foreground: 60 9.1% 97.8%; - --muted: 223 47% 11%; - --muted-foreground: 215.4 16.3% 56.9%; + --card: 20 14.3% 4.1%; + --card-foreground: 60 9.1% 97.8%; - --accent: 216 34% 17%; - --accent-foreground: 210 40% 98%; + --popover: 20 14.3% 4.1%; + --popover-foreground: 60 9.1% 97.8%; - --popover: 224 71% 4%; - --popover-foreground: 215 20.2% 65.1%; + --primary: 60 9.1% 97.8%; + --primary-foreground: 24 9.8% 10%; - --border: 216 34% 17%; - --input: 216 34% 17%; + --secondary: 12 6.5% 15.1%; + --secondary-foreground: 60 9.1% 97.8%; - --card: 224 71% 4%; - --card-foreground: 213 31% 91%; + --muted: 12 6.5% 15.1%; + --muted-foreground: 24 5.4% 63.9%; - --primary: 210 40% 98%; - --primary-foreground: 222.2 47.4% 1.2%; + --accent: 12 6.5% 15.1%; + --accent-foreground: 60 9.1% 97.8%; - --secondary: 222.2 47.4% 11.2%; - --secondary-foreground: 210 40% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 60 9.1% 97.8%; - --destructive: 0 63% 31%; - --destructive-foreground: 210 40% 98%; - - --ring: 216 34% 17%; - - --radius: 0.5rem; + --border: 12 6.5% 15.1%; + --input: 12 6.5% 15.1%; + --ring: 24 5.7% 82.9%; } } From a2ae3f6f4418a3331e77f9ee1360356433b8fc68 Mon Sep 17 00:00:00 2001 From: chenyueban Date: Sat, 9 Sep 2023 23:58:06 +0800 Subject: [PATCH 15/23] feat: use recharts --- .../[projectId]/alerts/[alertId]/alert-id.tsx | 8 +- .../app/[locale]/[projectId]/metrics/page.tsx | 70 ++--- .../[locale]/[projectId]/profile/profile.tsx | 45 +-- packages/web/components/accordion-section.tsx | 6 +- packages/web/components/charts/bar-chart.tsx | 79 ++++++ packages/web/components/charts/line-chart.tsx | 81 ++++++ .../charts/reference-line-chart.tsx | 94 +++++++ .../components/charts/vertical-bar-chart.tsx | 80 ++++++ .../web/components/event-detail-profile.tsx | 144 ++++++---- .../web/components/event-detail-trend.tsx | 44 ++- packages/web/components/feedbacks-list.tsx | 12 +- packages/web/components/introduce-chart.tsx | 2 +- packages/web/components/issue-detail-tabs.tsx | 2 +- .../web/components/issue-detail-title.tsx | 12 +- packages/web/components/issue-list.tsx | 10 +- packages/web/components/layout.tsx | 2 +- packages/web/components/logo.tsx | 4 +- packages/web/components/project-card.tsx | 28 +- packages/web/components/trend-chart.tsx | 209 -------------- packages/web/components/ui/snippet.tsx | 2 +- packages/web/components/ui/tabs.tsx | 4 +- packages/web/components/ui/tooltip.tsx | 9 +- packages/web/components/wrapper.tsx | 4 +- packages/web/package.json | 3 +- packages/web/styles/chart.theme.ts | 32 --- pnpm-lock.yaml | 265 ++++++++++++++++-- 26 files changed, 801 insertions(+), 450 deletions(-) create mode 100644 packages/web/components/charts/bar-chart.tsx create mode 100644 packages/web/components/charts/line-chart.tsx create mode 100644 packages/web/components/charts/reference-line-chart.tsx create mode 100644 packages/web/components/charts/vertical-bar-chart.tsx delete mode 100644 packages/web/components/trend-chart.tsx delete mode 100644 packages/web/styles/chart.theme.ts diff --git a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alert-id.tsx b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alert-id.tsx index 10fd8af..3eb3bae 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alert-id.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alert-id.tsx @@ -12,7 +12,7 @@ import AccordionSection from '~/components/accordion-section' import Title from '~/components/title' import useCurrentProject from '~/hooks/use-current-project' import EventsList from '~/components/events-list' -import TrendChart from '~/components/trend-chart' +import BarChart from '~/components/charts/bar-chart' import { Button } from '~/components/ui/button' import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' import { Badge } from '~/components/ui/badge' @@ -137,11 +137,11 @@ export default function AlertId({ alert, alertEvents, alertEventTrends }: Props) - diff --git a/packages/web/app/[locale]/[projectId]/metrics/page.tsx b/packages/web/app/[locale]/[projectId]/metrics/page.tsx index a9d23f2..4851158 100644 --- a/packages/web/app/[locale]/[projectId]/metrics/page.tsx +++ b/packages/web/app/[locale]/[projectId]/metrics/page.tsx @@ -2,9 +2,10 @@ import { useTranslations } from 'next-intl' import Link from 'next/link' +import { CLSThresholds, FCPThresholds, FIDThresholds, INPThresholds, LCPThresholds, TTFBThresholds } from 'web-vitals' import IntroduceChart from '~/components/introduce-chart' import Title from '~/components/title' -import TrendChart from '~/components/trend-chart' +import ReferenceLineChart from '~/components/charts/reference-line-chart' import Wrapper from '~/components/wrapper' import useCurrentProject from '~/hooks/use-current-project' import { average } from '~/libs/utils' @@ -12,13 +13,6 @@ import { serviceGetMetricsTrends } from '~/services/metrics' import { useQuery } from '~/hooks/use-query' import { Button } from '~/components/ui/button' -const CLS_THRESHOLD = [0.1, 0.25] -const FID_THRESHOLD = [100, 300] -const LCP_THRESHOLD = [2500, 4000] -const FCP_THRESHOLD = [1800, 3000] -const INP_THRESHOLD = [200, 500] -const TTFB_THRESHOLD = [800, 1800] - export default function MetricsPage() { const ct = useTranslations('Common') const t = useTranslations('Metrics') @@ -98,15 +92,13 @@ export default function MetricsPage() { unit="ms" value={average(CLSData?.map(v => v.value) ?? [])} > - @@ -116,15 +108,13 @@ export default function MetricsPage() { unit="ms" value={average(FIDData?.map(v => v.value) ?? [])} > - @@ -134,15 +124,13 @@ export default function MetricsPage() { unit="ms" value={average(LCPData?.map(v => v.value) ?? [])} > - @@ -152,15 +140,13 @@ export default function MetricsPage() { unit="ms" value={average(INPData?.map(v => v.value) ?? [])} > - @@ -170,15 +156,13 @@ export default function MetricsPage() { unit="ms" value={average(FCPData?.map(v => v.value) ?? [])} > - @@ -188,15 +172,13 @@ export default function MetricsPage() { unit="ms" value={average(TTFBData?.map(v => v.value) ?? [])} > - diff --git a/packages/web/app/[locale]/[projectId]/profile/profile.tsx b/packages/web/app/[locale]/[projectId]/profile/profile.tsx index 22f146b..aaddf8a 100644 --- a/packages/web/app/[locale]/[projectId]/profile/profile.tsx +++ b/packages/web/app/[locale]/[projectId]/profile/profile.tsx @@ -6,7 +6,8 @@ import { useTranslations } from 'next-intl' import { type Event, type Project } from '@prisma/client' import { type ProjectTrend } from '~/services/projects' -import TrendChart from '~/components/trend-chart' +import VerticalBarChart from '~/components/charts/vertical-bar-chart' +import BarChart from '~/components/charts/bar-chart' import Wrapper from '~/components/wrapper' import EventsList from '~/components/events-list' import Title from '~/components/title' @@ -123,13 +124,14 @@ const View = ({ views }: Props) => { - +
+ +
) @@ -150,13 +152,14 @@ const View = ({ views }: Props) => { - +
+ +
) @@ -191,11 +194,13 @@ const Trend = ({ trends }: Props) => { - +
+ +
diff --git a/packages/web/components/accordion-section.tsx b/packages/web/components/accordion-section.tsx index 6f7fd13..77a007d 100644 --- a/packages/web/components/accordion-section.tsx +++ b/packages/web/components/accordion-section.tsx @@ -1,7 +1,7 @@ 'use client' import { type ReactNode } from 'react' -import { Card, CardHeader, CardTitle } from '~/components/ui/card' +import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' import { Accordion, AccordionContent, @@ -57,7 +57,9 @@ export default function AccordionSection({ title, head, collapse, collapseTitle, ) : null } - {children} + + {children} +
) diff --git a/packages/web/components/charts/bar-chart.tsx b/packages/web/components/charts/bar-chart.tsx new file mode 100644 index 0000000..ead3c75 --- /dev/null +++ b/packages/web/components/charts/bar-chart.tsx @@ -0,0 +1,79 @@ +'use client' + +import { memo, useCallback } from 'react' +import { + Bar, + BarChart, + ResponsiveContainer, + Tooltip, + type TooltipProps, + XAxis, + YAxis, +} from 'recharts' +import { useTheme } from 'next-themes' +import Loading from '../loading' +import { colors } from '~/styles/colors' + +interface Props { + data?: object[] + nameKey: string + valueKey: string + name?: string +} + +const BarChartComponent = memo(({ data, nameKey, valueKey, name = 'Events' }) => { + if (!data) return + + const { resolvedTheme } = useTheme() + const CustomTooltip = useCallback( + ({ active, payload, label }: TooltipProps) => { + if (active && payload && payload.length > 0) { + return ( +
+ {label} +
+ {payload[0].value} {name} +
+ ) + } + + return null + }, + [name], + ) + + return ( + + + + + + + + + ) +}) + +BarChartComponent.displayName = 'BarChart' + +export default BarChartComponent diff --git a/packages/web/components/charts/line-chart.tsx b/packages/web/components/charts/line-chart.tsx new file mode 100644 index 0000000..6c83b69 --- /dev/null +++ b/packages/web/components/charts/line-chart.tsx @@ -0,0 +1,81 @@ +'use client' + +import { memo, useCallback } from 'react' +import { + Area, + AreaChart, + ResponsiveContainer, + Tooltip, + type TooltipProps, + XAxis, +} from 'recharts' +import dayjs from 'dayjs' +import { useTheme } from 'next-themes' +import Loading from '../loading' +import { colors } from '~/styles/colors' + +interface Props { + data?: object[] + nameKey: string + valueKey: string + name?: string + tooltipType?: 'a' | 'b' +} + +const LineChart = memo(({ data, nameKey, valueKey, name = 'Events', tooltipType = 'a' }) => { + if (!data) return + + const { resolvedTheme } = useTheme() + const CustomTooltip = useCallback( + ({ active, payload, label }: TooltipProps) => { + if (active && payload && payload.length > 0) { + return ( +
+ + {label} + { + tooltipType === 'b' && ( + <> +
+ {dayjs(name).format('h:00 A → h:59 A')} + + ) + } +
+
+ {payload[0].value} {name} +
+ ) + } + + return null + }, + [name, tooltipType], + ) + + return ( + + + + + + + + ) +}) + +LineChart.displayName = 'LineChart' + +export default LineChart diff --git a/packages/web/components/charts/reference-line-chart.tsx b/packages/web/components/charts/reference-line-chart.tsx new file mode 100644 index 0000000..8140bc4 --- /dev/null +++ b/packages/web/components/charts/reference-line-chart.tsx @@ -0,0 +1,94 @@ +'use client' + +import { memo, useCallback } from 'react' +import { + Area, + AreaChart, + ReferenceArea, + ResponsiveContainer, + Tooltip, + type TooltipProps, + XAxis, + YAxis, +} from 'recharts' +import { useTheme } from 'next-themes' +import Loading from '../loading' +import { colors } from '~/styles/colors' + +interface Props { + data?: object[] + nameKey: string + valueKey: string + name?: string + plotValue: number[] + unit?: string +} + +const ReferenceLineChart = memo(({ data, nameKey, valueKey, name = 'Events', plotValue, unit = 'ms' }) => { + if (!data) return + + const { resolvedTheme } = useTheme() + const CustomTooltip = useCallback( + ({ active, payload, label }: TooltipProps) => { + if (active && payload && payload.length > 0) { + return ( +
+ {label} +
+ {payload[0].value} {unit} +
+ ) + } + + return null + }, + [name], + ) + + return ( + + + + + + + + + + + + ) +}) + +ReferenceLineChart.displayName = 'ReferenceLineChart' + +export default ReferenceLineChart diff --git a/packages/web/components/charts/vertical-bar-chart.tsx b/packages/web/components/charts/vertical-bar-chart.tsx new file mode 100644 index 0000000..bb6dacc --- /dev/null +++ b/packages/web/components/charts/vertical-bar-chart.tsx @@ -0,0 +1,80 @@ +'use client' + +import { memo, useCallback } from 'react' +import { + Bar, + BarChart, + ResponsiveContainer, + Tooltip, + type TooltipProps, + XAxis, + YAxis, +} from 'recharts' +import { useTheme } from 'next-themes' +import Loading from '../loading' +import { colors } from '~/styles/colors' + +interface Props { + data?: object[] + nameKey: string + valueKey: string + name?: string +} + +const VerticalBarChart = memo(({ data, nameKey, valueKey, name = 'Events' }) => { + if (!data) return + + const { resolvedTheme } = useTheme() + const CustomTooltip = useCallback( + ({ active, payload, label }: TooltipProps) => { + if (active && payload && payload.length > 0) { + return ( +
+ {label} +
+ {payload[0].value} {name} +
+ ) + } + + return null + }, + [name], + ) + + return ( + + + + + + + + + ) +}) + +VerticalBarChart.displayName = 'VerticalBarChart' + +export default VerticalBarChart diff --git a/packages/web/components/event-detail-profile.tsx b/packages/web/components/event-detail-profile.tsx index 9f2bdbb..0b24618 100644 --- a/packages/web/components/event-detail-profile.tsx +++ b/packages/web/components/event-detail-profile.tsx @@ -7,8 +7,9 @@ import { type FC } from 'react' import { type OhbugEventLike } from 'common' import Link from 'next/link' import Wrapper from './wrapper' -import AccordionSection from './accordion-section' +import { Separator } from './ui/separator' import { getDeviceInfo } from '~/libs/utils' +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '~/components/ui/card' import { Badge } from '~/components/ui/badge' import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' @@ -111,78 +112,112 @@ const EventDetailProfile: FC = ({ event }) => { return ( - - JSON Raw {event.id} - - ) - : null - } - > -
- {/* 浏览器 */} - { + + + Event Environment + + { + event.category === 'error' + ? ( + + JSON Raw {event.id} + + ) + : null + } + + + +
+ {/* 浏览器 */} + { deviceInfo?.browser ? ( -
-
{deviceInfo?.browser?.name ?? ''}
-
{deviceInfo?.browser?.version ?? ''}
-
+ <> +
+
{deviceInfo?.browser?.name ?? ''}
+
{deviceInfo?.browser?.version ?? ''}
+
+ + ) : null } - {/* 系统 */} - { + {/* 系统 */} + { deviceInfo?.os ? ( -
-
{deviceInfo?.os?.name ?? ''}
-
{deviceInfo?.os?.version ?? ''}
-
+ <> +
+
{deviceInfo?.os?.name ?? ''}
+
{deviceInfo?.os?.version ?? ''}
+
+ + ) : null - } - {/* App */} - { + } + {/* App */} + { deviceInfo?.app ? ( -
-
{deviceInfo?.app ?? ''}
-
{`${deviceInfo?.version} / ${deviceInfo?.SDKVersion}`}
-
+ <> +
+
{deviceInfo?.app ?? ''}
+
{`${deviceInfo?.version} / ${deviceInfo?.SDKVersion}`}
+
+ + ) : null } - {/* 品牌 */} - { + {/* 品牌 */} + { (deviceInfo?.device && deviceInfo?.device?.brand) ? ( -
-
{deviceInfo?.device?.brand ?? ''}
-
{deviceInfo?.device?.model ?? ''}
-
+ <> +
+
{deviceInfo?.device?.brand ?? ''}
+
{deviceInfo?.device?.model ?? ''}
+
+ + ) : null } - {/* 平台 */} - { + {/* 平台 */} + { deviceInfo?.platform ? ( -
-
{deviceInfo?.platform ?? ''}
-
{deviceInfo?.system ?? ''}
-
+ <> +
+
{deviceInfo?.platform ?? ''}
+
{deviceInfo?.system ?? ''}
+
+ + ) : null } - {/* SDK */} - { + {/* SDK */} + { deviceInfo?.sdk ? (
@@ -192,10 +227,10 @@ const EventDetailProfile: FC = ({ event }) => { ) : null } -
+
-
- { +
+ { tagList.map(tag => ( @@ -210,8 +245,9 @@ const EventDetailProfile: FC = ({ event }) => { )) } -
- +
+
+
) } diff --git a/packages/web/components/event-detail-trend.tsx b/packages/web/components/event-detail-trend.tsx index 1bc6214..1a1d494 100644 --- a/packages/web/components/event-detail-trend.tsx +++ b/packages/web/components/event-detail-trend.tsx @@ -3,9 +3,9 @@ import dayjs from 'dayjs' import { useTranslations } from 'next-intl' import { type Issue } from 'common' -import TrendChart from './trend-chart' import Wrapper from './wrapper' import AccordionSection from './accordion-section' +import BarChart from './charts/bar-chart' import { type IssueTrend } from '~/services/issues' import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' @@ -57,32 +57,26 @@ export default function EventDetailTrend({ issue, trends }: Props) { } >
- { - trends['14d'] - ? ( - - ) - : null - } +

{ct('14d')}

+
+ +
- { - trends['24h'] - ? ( - - ) - : null - } +

{ct('24h')}

+
+ +
diff --git a/packages/web/components/feedbacks-list.tsx b/packages/web/components/feedbacks-list.tsx index 0d10486..eddabe9 100644 --- a/packages/web/components/feedbacks-list.tsx +++ b/packages/web/components/feedbacks-list.tsx @@ -21,11 +21,13 @@ export default function FeedbacksList({ feedbacks }: Props) { { accessorKey: 'detail', header: 'feedback', - cell: ({ row }) => ( - - {(row.getValue('detail') as any)?.feedback} - - ), + cell: ({ row }) => { + return ( + + {(row.getValue('detail') as any)?.feedback} + + ) + }, }, { accessorKey: 'createdAt', diff --git a/packages/web/components/introduce-chart.tsx b/packages/web/components/introduce-chart.tsx index 8dd57ad..a9859be 100644 --- a/packages/web/components/introduce-chart.tsx +++ b/packages/web/components/introduce-chart.tsx @@ -25,7 +25,7 @@ export default function IntroduceChart({ title, value, unit, description, action
{description}
{actions}
-
{children}
+
{children}
) } diff --git a/packages/web/components/issue-detail-tabs.tsx b/packages/web/components/issue-detail-tabs.tsx index e2fa56a..46e3aa7 100644 --- a/packages/web/components/issue-detail-tabs.tsx +++ b/packages/web/components/issue-detail-tabs.tsx @@ -49,7 +49,7 @@ export default function IssueDetailTabs({ event }: Props) { return base }, [event, router, projectId]) const active = useMemo(() => { - const value = list.find(item => item.tab === tab)?.value + const value = (list.find(item => item.tab === tab) || list[0]).value return value }, [list, tab]) const handleTabChange = useCallback((value: string) => { diff --git a/packages/web/components/issue-detail-title.tsx b/packages/web/components/issue-detail-title.tsx index cc51e83..e38bcc3 100644 --- a/packages/web/components/issue-detail-title.tsx +++ b/packages/web/components/issue-detail-title.tsx @@ -18,20 +18,20 @@ export default function IssueDetailTitle({ issue, event }: Props) { const metadata = useMemo(() => JSON.parse(issue.metadata) || {}, [issue]) return ( } rightNodes={ ( - <div className="flex"> + <div className="flex gap-4"> <div className="flex flex-col"> - <div>{t('titleEvents')}</div> - <div>{issue._count?.events}</div> + <h3>{t('titleEvents')}</h3> + <div className="text-center font-bold">{issue._count?.events}</div> </div> <div className="flex flex-col"> - <div>{t('titleUsers')}</div> - <div>{issue._count?.users}</div> + <h3>{t('titleUsers')}</h3> + <div className="text-center font-bold">{issue._count?.users}</div> </div> </div> ) diff --git a/packages/web/components/issue-list.tsx b/packages/web/components/issue-list.tsx index d721e71..e3b3b63 100644 --- a/packages/web/components/issue-list.tsx +++ b/packages/web/components/issue-list.tsx @@ -8,9 +8,9 @@ import { useTranslations } from 'next-intl' import { useDebounce, useSet } from 'react-use' import { useAtom } from 'jotai' import { type ReactNode } from 'react' -import TrendChart from './trend-chart' import Pagination from './pagination' import Spinning from './spinning' +import LineChart from './charts/line-chart' import { type SearchIssuesOrderBy } from '~/services/issues' import { serviceDeleteIssues, @@ -278,10 +278,12 @@ export default function IssueList({ empty }: Props) { ) case 'trends': return ( - <div> - <TrendChart + <div className="h-16"> + <LineChart data={trends?.[issue.id]} - type={chartType} + nameKey="time" + tooltipType={chartType === '14d' ? 'a' : 'b'} + valueKey="count" /> </div> ) diff --git a/packages/web/components/layout.tsx b/packages/web/components/layout.tsx index d974a08..3b68bae 100644 --- a/packages/web/components/layout.tsx +++ b/packages/web/components/layout.tsx @@ -40,7 +40,7 @@ const Layout: FC<Props> = ({ children }) => { <div style={{ height: NavHeight }} className={cn( - 'backdrop-blur shadow-sm w-full', + 'bg-background text-foreground shadow-sm w-full', scrollNavVisible ? 'sticky' : 'relative', scrollNavVisible && 'top-0', scrollNavVisible && 'z-10', diff --git a/packages/web/components/logo.tsx b/packages/web/components/logo.tsx index afa08c3..80e5228 100644 --- a/packages/web/components/logo.tsx +++ b/packages/web/components/logo.tsx @@ -3,9 +3,9 @@ import { forwardRef } from 'react' import Link from 'next/link' import Image from 'next/image' -import { twMerge } from 'tailwind-merge' import { useTheme } from 'next-themes' import { type CSSProperties } from 'react' +import { cn } from '~/libs/utils' interface Props { className?: string @@ -21,7 +21,7 @@ const Logo = forwardRef<HTMLAnchorElement, Props>((props, ref) => { href="/" {...props} ref={ref} - className={twMerge('inline-block cursor-pointer relative w-16 h-16', props.className)} + className={cn('inline-block cursor-pointer relative w-16 h-16', props.className)} > <Image fill diff --git a/packages/web/components/project-card.tsx b/packages/web/components/project-card.tsx index 9ee49d2..eda0236 100644 --- a/packages/web/components/project-card.tsx +++ b/packages/web/components/project-card.tsx @@ -2,13 +2,13 @@ import Link from 'next/link' import { type ProjectWithEventCount } from 'common' -import Loading from './loading' -import TrendChart from './trend-chart' import { type ProjectTrend } from '~/services/projects' import { serviceGetProjectTrends } from '~/services/projects' import { useQuery } from '~/hooks/use-query' +import Loading from '~/components/loading' import { Card, CardContent, CardHeader } from '~/components/ui/card' import { Avatar, AvatarFallback, AvatarImage } from '~/components/ui/avatar' +import LineChart from '~/components/charts/line-chart' interface Props { project: ProjectWithEventCount @@ -47,16 +47,20 @@ export default function ProjectCard({ project }: Props) { </div> </CardHeader> <CardContent> - { - isLoading - ? <Loading /> - : ( - <TrendChart - data={trends} - type="14d" - /> - ) - } + <div className="h-16"> + { + isLoading + ? <Loading /> + : ( + <LineChart + data={trends} + name="Events" + nameKey="time" + valueKey="count" + /> + ) + } + </div> </CardContent> </Card> </Link> diff --git a/packages/web/components/trend-chart.tsx b/packages/web/components/trend-chart.tsx deleted file mode 100644 index 6b43bed..0000000 --- a/packages/web/components/trend-chart.tsx +++ /dev/null @@ -1,209 +0,0 @@ -'use client' - -import { memo, useEffect, useMemo, useRef } from 'react' -import Highcharts from 'highcharts' -import HighchartsExporting from 'highcharts/modules/exporting' -import HighchartsReact from 'highcharts-react-official' -import dayjs from 'dayjs' -import { useTheme } from 'next-themes' -import { type Options } from 'highcharts' -import { type ReactNode } from 'react' -import Loading from './loading' -import { theme as chartTheme } from '~/styles/chart.theme' -import { colors } from '~/styles/colors' - -if (typeof Highcharts === 'object') { - HighchartsExporting(Highcharts) -} - -interface MiniChartProps { - type: '24h' | '14d' - data?: any[] - title?: ReactNode - variant?: 'mini' | 'detail' | 'line' | 'row' - name?: string - timeField?: string - valueField?: string - unit?: string - plotValue?: number[] -} - -const TrendChart = memo<MiniChartProps>(({ type, data, title, variant = 'mini', name = 'Events', timeField = 'time', valueField = 'count', unit = 'events', plotValue }) => { - if (!data) return <Loading /> - - const ref = useRef<any>(null) - const { theme } = useTheme() - - useEffect(() => { - if (typeof Highcharts === 'object') { - Highcharts.setOptions(chartTheme) - } - }, []) - useEffect(() => { - ref.current.chart.showLoading() - if (data) { - ref.current.chart.hideLoading() - } - }, [data]) - - const options = useMemo<Options>( - () => { - if (variant === 'detail') { - return { - accessibility: { enabled: false }, - colors: [theme === 'dark' ? 'white' : 'black'], - chart: { type: 'column' }, - xAxis: { categories: data?.map(v => v[timeField]), crosshair: true }, - yAxis: { - min: 0, - labels: { enabled: true }, - gridLineWidth: 1, - }, - series: [ - { - name, - type: 'column', - data: data?.map(v => v[valueField]), - }, - ], - exporting: { enabled: false }, - } - } - if (variant === 'row') { - return { - accessibility: { enabled: false }, - colors: [theme === 'dark' ? 'white' : 'black'], - chart: { type: 'bar' }, - xAxis: { categories: data?.map(v => v[timeField]), crosshair: true }, - yAxis: { - min: 0, - labels: { enabled: true }, - gridLineWidth: 1, - }, - series: [ - { - name, - type: 'column', - data: data?.map(v => v[valueField]), - }, - ], - exporting: { enabled: false }, - } - } - if (variant === 'line') { - return { - chart: { spacingTop: 15 }, - accessibility: { enabled: false }, - colors: [theme === 'dark' ? 'white' : 'black'], - xAxis: { categories: data?.map(v => v[timeField]) }, - yAxis: { - labels: { enabled: true }, - max: (plotValue?.[1] ?? 0) * 2, - // minRange: plotValue?.[0] ?? 0, - plotLines: plotValue?.map(v => ({ - color: colors.black[500], - dashStyle: 'Dash', - width: 1, - value: v, - })), - plotBands: [ - { - from: 0, - to: plotValue?.[0] ?? 0, - color: colors.green[50], - label: { - text: 'GOOD', - style: { color: colors.green[500] }, - }, - }, - { - from: plotValue?.[0] ?? 0, - to: plotValue?.[1] ?? 0, - color: colors.yellow[50], - label: { - text: 'NEED IMPROVEMENT', - style: { color: colors.yellow[500] }, - }, - }, - { - from: plotValue?.[1] ?? 0, - to: (plotValue?.[1] ?? 0) * 2, - color: colors.red[50], - label: { - text: 'POOR', - style: { color: colors.red[500] }, - }, - }, - ], - }, - series: [ - { - name, - type: 'areaspline', - data: data?.map(v => ({ - name: v[timeField], - y: v[valueField], - })), - lineWidth: 2, - marker: { enabled: false }, - }, - ], - exporting: { enabled: false }, - } - } - return { - accessibility: { enabled: false }, - colors: [theme === 'dark' ? 'white' : 'black'], - chart: { - height: 60, - spacingTop: 5, - spacingBottom: 5, - }, - xAxis: { labels: { enabled: false } }, - series: [ - { - type: 'areaspline', - data: data?.map(v => ({ - name: v[timeField], - y: v[valueField], - })), - lineWidth: 2, - marker: { enabled: false }, - tooltip: { - headerFormat: '', - pointFormatter() { - const { name, y } = this - if (type === '24h') { - return `<div style="text-align: center"><span>${dayjs(name).format('YYYY-MM-DD')}<br />${dayjs(name).format('h:00 A → h:59 A')}</span><br /><b>${y} ${unit}</b></div>` - } - - if (type === '14d') { - return `<div style="text-align: center"><span>${dayjs(name).format('YYYY-MM-DD')}</span><br /><b>${y} ${unit}</b></div>` - } - - return '' - }, - }, - }, - ], - exporting: { enabled: false }, - } - }, - [data, type, variant, theme, name, timeField, valueField, unit], - ) - - return ( - <div> - {title} - <HighchartsReact - ref={ref} - highcharts={Highcharts} - options={options} - /> - </div> - ) -}) - -TrendChart.displayName = 'TrendChart' - -export default TrendChart diff --git a/packages/web/components/ui/snippet.tsx b/packages/web/components/ui/snippet.tsx index fc1356b..c8e9bfe 100644 --- a/packages/web/components/ui/snippet.tsx +++ b/packages/web/components/ui/snippet.tsx @@ -44,7 +44,7 @@ function Snippet({ className, variant, children, ...props }: BadgeProps) { {...props} > {children} - <Tooltip delayDuration={0}> + <Tooltip> <TooltipTrigger> <div className="flex items-center ml-2"> { diff --git a/packages/web/components/ui/tabs.tsx b/packages/web/components/ui/tabs.tsx index 3806472..7692b0d 100644 --- a/packages/web/components/ui/tabs.tsx +++ b/packages/web/components/ui/tabs.tsx @@ -14,7 +14,7 @@ const TabsList = React.forwardRef< <TabsPrimitive.List ref={ref} className={cn( - 'inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground', + 'inline-flex items-center justify-center rounded-md bg-muted p-1 text-muted-foreground', className, )} {...props} @@ -29,7 +29,7 @@ const TabsTrigger = React.forwardRef< <TabsPrimitive.Trigger ref={ref} className={cn( - 'inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm', + 'inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm', className, )} {...props} diff --git a/packages/web/components/ui/tooltip.tsx b/packages/web/components/ui/tooltip.tsx index da8e65b..4e767dd 100644 --- a/packages/web/components/ui/tooltip.tsx +++ b/packages/web/components/ui/tooltip.tsx @@ -7,7 +7,14 @@ import { cn } from '~/libs/utils' const TooltipProvider = TooltipPrimitive.Provider -const Tooltip = TooltipPrimitive.Root +function Tooltip(props: TooltipPrimitive.TooltipProps) { + return ( + <TooltipPrimitive.Root + {...props} + delayDuration={props.delayDuration || 0} + /> + ) +} const TooltipTrigger = TooltipPrimitive.Trigger diff --git a/packages/web/components/wrapper.tsx b/packages/web/components/wrapper.tsx index 8acc949..39c8d67 100644 --- a/packages/web/components/wrapper.tsx +++ b/packages/web/components/wrapper.tsx @@ -1,8 +1,8 @@ 'use client' import { forwardRef } from 'react' -import { twMerge } from 'tailwind-merge' import { type CSSProperties, type ReactNode } from 'react' +import { cn } from '~/libs/utils' interface Props { children: ReactNode @@ -14,7 +14,7 @@ const Wrapper = forwardRef<HTMLDivElement, Props>(({ children, className, style, return ( <div ref={ref} - className={twMerge('container mx-auto py-4', className)} + className={cn('container mx-auto py-4', className)} style={style} {...props} > diff --git a/packages/web/package.json b/packages/web/package.json index 06739f2..2d1a00c 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -47,8 +47,6 @@ "config": "workspace:*", "downshift": "^8.1.0", "framer-motion": "^10.16.3", - "highcharts": "^11.1.0", - "highcharts-react-official": "^3.2.1", "jotai": "^2.4.1", "lucide-react": "^0.274.0", "next": "^13.4.19", @@ -63,6 +61,7 @@ "react-icons": "^4.10.1", "react-json-view": "^1.21.3", "react-use": "^17.4.0", + "recharts": "^2.8.0", "rrweb": "^2.0.0-alpha.4", "rrweb-player": "^1.0.0-alpha.4", "source-map-trace": "^0.2.6", diff --git a/packages/web/styles/chart.theme.ts b/packages/web/styles/chart.theme.ts deleted file mode 100644 index cf165bf..0000000 --- a/packages/web/styles/chart.theme.ts +++ /dev/null @@ -1,32 +0,0 @@ -export const theme = { - accessibility: { enabled: false }, - exporting: { enabled: false }, - credits: { enabled: false }, - colors: ['black'], - title: { text: undefined }, - chart: { - spacingTop: 0, - spacingBottom: 0, - spacingLeft: 0, - spacingRight: 0, - backgroundColor: 'transparent', - }, - legend: { enabled: false }, - xAxis: { - title: { text: null }, - tickWidth: 0, - lineWidth: 0, - }, - yAxis: { - title: { text: null }, - labels: { enabled: false }, - gridLineWidth: 0, - }, - tooltip: { - useHTML: true, - outside: true, - animation: false, - backgroundColor: 'white', - borderWidth: 0, - }, -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e956945..ec4bd77 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -355,12 +355,6 @@ importers: framer-motion: specifier: ^10.16.3 version: 10.16.3(react-dom@18.2.0)(react@18.2.0) - highcharts: - specifier: ^11.1.0 - version: 11.1.0 - highcharts-react-official: - specifier: ^3.2.1 - version: 3.2.1(highcharts@11.1.0)(react@18.2.0) jotai: specifier: ^2.4.1 version: 2.4.1(@types/react@18.2.21)(react@18.2.0) @@ -403,6 +397,9 @@ importers: react-use: specifier: ^17.4.0 version: 17.4.0(react-dom@18.2.0)(react@18.2.0) + recharts: + specifier: ^2.8.0 + version: 2.8.0(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) rrweb: specifier: ^2.0.0-alpha.4 version: 2.0.0-alpha.4 @@ -3659,6 +3656,48 @@ packages: resolution: {integrity: sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q==} dev: false + /@types/d3-array@3.0.7: + resolution: {integrity: sha512-4/Q0FckQ8TBjsB0VdGFemJOG8BLXUB2KKlL0VmZ+eOYeOnTb/wDRQqYWpBmQ6IlvWkXwkYiot+n9Px2aTJ7zGQ==} + dev: false + + /@types/d3-color@3.1.0: + resolution: {integrity: sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==} + dev: false + + /@types/d3-ease@3.0.0: + resolution: {integrity: sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==} + dev: false + + /@types/d3-interpolate@3.0.1: + resolution: {integrity: sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==} + dependencies: + '@types/d3-color': 3.1.0 + dev: false + + /@types/d3-path@3.0.0: + resolution: {integrity: sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==} + dev: false + + /@types/d3-scale@4.0.4: + resolution: {integrity: sha512-eq1ZeTj0yr72L8MQk6N6heP603ubnywSDRfNpi5enouR112HzGLS6RIvExCzZTraFF4HdzNpJMwA/zGiMoHUUw==} + dependencies: + '@types/d3-time': 3.0.0 + dev: false + + /@types/d3-shape@3.1.2: + resolution: {integrity: sha512-NN4CXr3qeOUNyK5WasVUV8NCSAx/CRVcwcb0BuuS1PiTqwIm6ABi1SyasLZ/vsVCFDArF+W4QiGzSry1eKYQ7w==} + dependencies: + '@types/d3-path': 3.0.0 + dev: false + + /@types/d3-time@3.0.0: + resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==} + dev: false + + /@types/d3-timer@3.0.0: + resolution: {integrity: sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==} + dev: false + /@types/eslint-scope@3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: @@ -4963,6 +5002,10 @@ packages: clsx: 2.0.0 dev: false + /classnames@2.3.2: + resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + dev: false + /clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} @@ -5518,6 +5561,10 @@ packages: source-map: 0.6.1 dev: false + /css-unit-converter@1.1.2: + resolution: {integrity: sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==} + dev: false + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -5544,6 +5591,77 @@ packages: - '@swc/wasm' dev: true + /d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + dependencies: + internmap: 2.0.3 + dev: false + + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false + + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false + + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + dev: false + + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + dev: false + + /d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + dev: false + + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + dev: false + + /d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + dev: false + + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + dependencies: + d3-time: 3.1.0 + dev: false + + /d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + dev: false + /dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} @@ -5607,6 +5725,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + dev: false + /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -5752,6 +5874,12 @@ packages: esutils: 2.0.3 dev: true + /dom-helpers@3.4.0: + resolution: {integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==} + dependencies: + '@babel/runtime': 7.22.11 + dev: false + /dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -6372,6 +6500,10 @@ packages: engines: {node: '>=6'} dev: false + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: false + /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} dev: true @@ -6489,6 +6621,11 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + /fast-equals@5.0.1: + resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} + engines: {node: '>=6.0.0'} + dev: false + /fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} @@ -7366,20 +7503,6 @@ packages: readable-stream: 3.6.2 dev: false - /highcharts-react-official@3.2.1(highcharts@11.1.0)(react@18.2.0): - resolution: {integrity: sha512-hyQTX7ezCxl7JqumaWiGsroGWalzh24GedQIgO3vJbkGOZ6ySRAltIYjfxhrq4HszJOySZegotEF7v+haQ75UA==} - peerDependencies: - highcharts: '>=6.0.0' - react: '>=16.8.0' - dependencies: - highcharts: 11.1.0 - react: 18.2.0 - dev: false - - /highcharts@11.1.0: - resolution: {integrity: sha512-vhmqq6/frteWMx0GKYWwEFL25g4OYc7+m+9KQJb/notXbNtIb8KVy+ijOF7XAFqF165cq0pdLIePAmyFY5ph3g==} - dev: false - /hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: @@ -7682,6 +7805,11 @@ packages: side-channel: 1.0.4 dev: true + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + dev: false + /interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} @@ -9923,6 +10051,10 @@ packages: cssesc: 3.0.0 util-deprecate: 1.0.2 + /postcss-value-parser@3.3.1: + resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} + dev: false + /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -10249,6 +10381,31 @@ packages: use-sidecar: 1.1.2(@types/react@18.2.21)(react@18.2.0) dev: false + /react-resize-detector@8.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w==} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + lodash: 4.17.21 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-smooth@2.0.3(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yl4y3XiMorss7ayF5QnBiSprig0+qFHui8uh7Hgg46QX5O+aRMRKlfGGNGLHno35JkQSvSYY8eCWkBfHfrSHfg==} + peerDependencies: + prop-types: ^15.6.0 + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + fast-equals: 5.0.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-transition-group: 2.9.0(react-dom@18.2.0)(react@18.2.0) + dev: false + /react-style-singleton@2.2.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} @@ -10280,6 +10437,20 @@ packages: - '@types/react' dev: false + /react-transition-group@2.9.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==} + peerDependencies: + react: '>=15.0.0' + react-dom: '>=15.0.0' + dependencies: + dom-helpers: 3.4.0 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-lifecycles-compat: 3.0.4 + dev: false + /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.6.2): resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} peerDependencies: @@ -10427,6 +10598,34 @@ packages: engines: {node: '>= 12.13.0'} dev: false + /recharts-scale@0.4.5: + resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + dependencies: + decimal.js-light: 2.5.1 + dev: false + + /recharts@2.8.0(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-nciXqQDh3aW8abhwUlA4EBOBusRHLNiKHfpRZiG/yjups1x+auHb2zWPuEcTn/IMiN47vVMMuF8Sr+vcQJtsmw==} + engines: {node: '>=12'} + peerDependencies: + prop-types: ^15.6.0 + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + classnames: 2.3.2 + eventemitter3: 4.0.7 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 16.13.1 + react-resize-detector: 8.1.0(react-dom@18.2.0)(react@18.2.0) + react-smooth: 2.0.3(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + recharts-scale: 0.4.5 + reduce-css-calc: 2.1.8 + victory-vendor: 36.6.11 + dev: false + /rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} @@ -10453,6 +10652,13 @@ packages: redis-errors: 1.2.0 dev: false + /reduce-css-calc@2.1.8: + resolution: {integrity: sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==} + dependencies: + css-unit-converter: 1.1.2 + postcss-value-parser: 3.3.1 + dev: false + /reflect-metadata@0.1.13: resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} dev: false @@ -12108,6 +12314,25 @@ packages: engines: {node: '>= 0.10'} dev: false + /victory-vendor@36.6.11: + resolution: {integrity: sha512-nT8kCiJp8dQh8g991J/R5w5eE2KnO8EAIP0xocWlh9l2okngMWglOPoMZzJvek8Q1KUc4XE/mJxTZnvOB1sTYg==} + dependencies: + '@types/d3-array': 3.0.7 + '@types/d3-ease': 3.0.0 + '@types/d3-interpolate': 3.0.1 + '@types/d3-scale': 4.0.4 + '@types/d3-shape': 3.1.2 + '@types/d3-time': 3.0.0 + '@types/d3-timer': 3.0.0 + d3-array: 3.2.4 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + dev: false + /vue-eslint-parser@9.3.1(eslint@8.48.0): resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==} engines: {node: ^14.17.0 || >=16.0.0} From 95cabd4f8fee1b0e69d7d6b4b1669fc4fc67e830 Mon Sep 17 00:00:00 2001 From: chenyueban <jasonchan0527@gmail.com> Date: Wed, 13 Sep 2023 20:36:38 +0800 Subject: [PATCH 16/23] chore: update deps --- package.json | 22 +- packages/server/package.json | 12 +- packages/web/package.json | 21 +- pnpm-lock.yaml | 663 +++++++++++++++++------------------ 4 files changed, 356 insertions(+), 362 deletions(-) diff --git a/package.json b/package.json index 64e5c18..ba6dab9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ohbug-dashboard", "version": "0.11.0", - "packageManager": "pnpm@8.7.1", + "packageManager": "pnpm@8.7.5", "type": "module", "license": "Apache-2.0", "homepage": "https://github.com/ohbug-org/ohbug-dashboard#readme", @@ -43,37 +43,37 @@ "@ohbug/react": "^2.0.9", "@ohbug/types": "^2.2.1", "@ohbug/vue": "^2.0.10", - "@prisma/client": "^5.2.0", + "@prisma/client": "^5.3.0", "dayjs": "^1.11.9", "js-yaml": "^4.1.0", - "nodemailer": "^6.9.4", + "nodemailer": "^6.9.5", "ramda": "^0.29.0", "source-map-trace": "^0.2.6" }, "devDependencies": { "@antfu/ni": "^0.21.8", - "@babel/types": "^7.22.15", - "@chenyueban/eslint-config": "^3.0.9", - "@chenyueban/tsconfig": "^3.0.9", + "@babel/types": "^7.22.17", + "@chenyueban/eslint-config": "^3.0.10", + "@chenyueban/tsconfig": "^3.0.10", "@commitlint/cli": "^17.7.1", "@release-it/conventional-changelog": "^7.0.1", "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.82", + "@swc/core": "^1.3.84", "@types/js-yaml": "^4.0.5", - "@types/node": "^20.5.9", + "@types/node": "^20.6.0", "@types/ramda": "^0.29.3", "commitizen": "^4.3.0", "cross-env": "^7.0.3", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "husky": "^8.0.3", "lint-staged": "^14.0.1", - "prisma": "^5.2.0", + "prisma": "^5.3.0", "release-it": "^16.1.5", "rimraf": "^5.0.1", "taze": "^0.11.2", "tsup": "^7.2.0", - "tsx": "^3.12.8", + "tsx": "^3.12.9", "typescript": "^5.2.2" }, "prisma": { diff --git a/packages/server/package.json b/packages/server/package.json index 75daf1b..f383143 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -15,18 +15,18 @@ "@nestjs/axios": "^3.0.0", "@nestjs/bull": "^10.0.1", "@nestjs/cli": "^10.1.17", - "@nestjs/common": "^10.2.4", - "@nestjs/core": "^10.2.4", + "@nestjs/common": "^10.2.5", + "@nestjs/core": "^10.2.5", "@nestjs/mapped-types": "^2.0.2", - "@nestjs/platform-fastify": "^10.2.4", + "@nestjs/platform-fastify": "^10.2.5", "@nestjs/schedule": "^3.0.3", "@nestjs/schematics": "^10.0.2", - "@nestjs/swagger": "^7.1.10", + "@nestjs/swagger": "^7.1.11", "@types/bull": "^4.10.0", "@types/cron": "^2.4.0", "@types/express": "^4.17.17", "@types/markdown-it": "^13.0.1", - "@types/nodemailer": "^6.4.9", + "@types/nodemailer": "^6.4.10", "@webundsoehne/nest-fastify-file-upload": "^2.1.0", "bull": "^4.11.3", "class-transformer": "^0.5.1", @@ -39,7 +39,7 @@ "markdown-it": "^13.0.1", "nanoid": "3.3.6", "nestjs-pino": "^3.4.0", - "pino": "^8.15.0", + "pino": "^8.15.1", "pino-http": "^8.5.0", "pino-pretty": "^10.2.0", "reflect-metadata": "^0.1.13", diff --git a/packages/web/package.json b/packages/web/package.json index 2d1a00c..dd49f32 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -14,11 +14,11 @@ "@hookform/resolvers": "^3.3.1", "@iconify-json/ri": "^1.1.12", "@next-auth/prisma-adapter": "^1.0.7", - "@ohbug/extension-feedback": "^0.7.2", - "@ohbug/extension-rrweb": "^1.10.1", - "@ohbug/extension-uuid": "^2.1.1", - "@ohbug/extension-view": "^0.1.1", - "@ohbug/extension-web-vitals": "^0.2.1", + "@ohbug/extension-feedback": "^0.7.3", + "@ohbug/extension-rrweb": "^1.10.2", + "@ohbug/extension-uuid": "^2.1.2", + "@ohbug/extension-view": "^0.1.2", + "@ohbug/extension-web-vitals": "^0.2.2", "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-avatar": "^1.0.3", "@radix-ui/react-checkbox": "^1.0.4", @@ -34,7 +34,7 @@ "@radix-ui/react-tabs": "^1.0.4", "@radix-ui/react-toast": "^1.1.4", "@radix-ui/react-tooltip": "^1.0.6", - "@tanstack/react-table": "^8.9.3", + "@tanstack/react-table": "^8.9.8", "@types/nprogress": "^0.2.0", "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", @@ -46,9 +46,9 @@ "common": "workspace:*", "config": "workspace:*", "downshift": "^8.1.0", - "framer-motion": "^10.16.3", - "jotai": "^2.4.1", - "lucide-react": "^0.274.0", + "framer-motion": "^10.16.4", + "jotai": "^2.4.2", + "lucide-react": "^0.276.0", "next": "^13.4.19", "next-auth": "^4.23.1", "next-intl": "^2.20.0", @@ -58,7 +58,6 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-hook-form": "^7.46.1", - "react-icons": "^4.10.1", "react-json-view": "^1.21.3", "react-use": "^17.4.0", "recharts": "^2.8.0", @@ -67,7 +66,7 @@ "source-map-trace": "^0.2.6", "tailwind-merge": "^1.14.0", "tailwindcss-animate": "^1.0.7", - "ua-parser-js": "^1.0.35", + "ua-parser-js": "^1.0.36", "web-vitals": "^3.4.0", "zod": "^3.22.2", "zustand": "^4.4.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec4bd77..3b1f792 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: ^2.0.10 version: 2.0.10(vue@3.3.4) '@prisma/client': - specifier: ^5.2.0 - version: 5.2.0(prisma@5.2.0) + specifier: ^5.3.0 + version: 5.3.0(prisma@5.3.0) dayjs: specifier: ^1.11.9 version: 1.11.9 @@ -33,8 +33,8 @@ importers: specifier: ^4.1.0 version: 4.1.0 nodemailer: - specifier: ^6.9.4 - version: 6.9.4 + specifier: ^6.9.5 + version: 6.9.5 ramda: specifier: ^0.29.0 version: 0.29.0 @@ -46,47 +46,47 @@ importers: specifier: ^0.21.8 version: 0.21.8 '@babel/types': - specifier: ^7.22.15 - version: 7.22.15 + specifier: ^7.22.17 + version: 7.22.17 '@chenyueban/eslint-config': - specifier: ^3.0.9 - version: 3.0.9(eslint@8.48.0)(typescript@5.2.2) + specifier: ^3.0.10 + version: 3.0.10(eslint@8.49.0)(typescript@5.2.2) '@chenyueban/tsconfig': - specifier: ^3.0.9 - version: 3.0.9(typescript@5.2.2) + specifier: ^3.0.10 + version: 3.0.10(typescript@5.2.2) '@commitlint/cli': specifier: ^17.7.1 - version: 17.7.1(@swc/core@1.3.82) + version: 17.7.1(@swc/core@1.3.84) '@release-it/conventional-changelog': specifier: ^7.0.1 version: 7.0.1(release-it@16.1.5) '@swc/cli': specifier: ^0.1.62 - version: 0.1.62(@swc/core@1.3.82) + version: 0.1.62(@swc/core@1.3.84) '@swc/core': - specifier: ^1.3.82 - version: 1.3.82 + specifier: ^1.3.84 + version: 1.3.84 '@types/js-yaml': specifier: ^4.0.5 version: 4.0.5 '@types/node': - specifier: ^20.5.9 - version: 20.5.9 + specifier: ^20.6.0 + version: 20.6.0 '@types/ramda': specifier: ^0.29.3 version: 0.29.3 commitizen: specifier: ^4.3.0 - version: 4.3.0(@swc/core@1.3.82) + version: 4.3.0(@swc/core@1.3.84) cross-env: specifier: ^7.0.3 version: 7.0.3 cz-conventional-changelog: specifier: ^3.3.0 - version: 3.3.0(@swc/core@1.3.82) + version: 3.3.0(@swc/core@1.3.84) eslint: - specifier: ^8.48.0 - version: 8.48.0 + specifier: ^8.49.0 + version: 8.49.0 husky: specifier: ^8.0.3 version: 8.0.3 @@ -94,8 +94,8 @@ importers: specifier: ^14.0.1 version: 14.0.1 prisma: - specifier: ^5.2.0 - version: 5.2.0 + specifier: ^5.3.0 + version: 5.3.0 release-it: specifier: ^16.1.5 version: 16.1.5 @@ -107,10 +107,10 @@ importers: version: 0.11.2 tsup: specifier: ^7.2.0 - version: 7.2.0(@swc/core@1.3.82)(ts-node@10.9.1)(typescript@5.2.2) + version: 7.2.0(@swc/core@1.3.84)(ts-node@10.9.1)(typescript@5.2.2) tsx: - specifier: ^3.12.8 - version: 3.12.8 + specifier: ^3.12.9 + version: 3.12.9 typescript: specifier: ^5.2.2 version: 5.2.2 @@ -131,34 +131,34 @@ importers: dependencies: '@nestjs/axios': specifier: ^3.0.0 - version: 3.0.0(@nestjs/common@10.2.4)(axios@1.5.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + version: 3.0.0(@nestjs/common@10.2.5)(axios@1.5.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/bull': specifier: ^10.0.1 - version: 10.0.1(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(bull@4.11.3) + version: 10.0.1(@nestjs/common@10.2.5)(@nestjs/core@10.2.5)(bull@4.11.3) '@nestjs/cli': specifier: ^10.1.17 - version: 10.1.17(@swc/cli@0.1.62)(@swc/core@1.3.82)(esbuild@0.18.20) + version: 10.1.17(@swc/cli@0.1.62)(@swc/core@1.3.84)(esbuild@0.18.20) '@nestjs/common': - specifier: ^10.2.4 - version: 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.2.5 + version: 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': - specifier: ^10.2.4 - version: 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.2.5 + version: 10.2.5(@nestjs/common@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/mapped-types': specifier: ^2.0.2 - version: 2.0.2(@nestjs/common@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + version: 2.0.2(@nestjs/common@10.2.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) '@nestjs/platform-fastify': - specifier: ^10.2.4 - version: 10.2.4(@nestjs/common@10.2.4)(@nestjs/core@10.2.4) + specifier: ^10.2.5 + version: 10.2.5(@nestjs/common@10.2.5)(@nestjs/core@10.2.5) '@nestjs/schedule': specifier: ^3.0.3 - version: 3.0.3(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(reflect-metadata@0.1.13) + version: 3.0.3(@nestjs/common@10.2.5)(@nestjs/core@10.2.5)(reflect-metadata@0.1.13) '@nestjs/schematics': specifier: ^10.0.2 version: 10.0.2(typescript@5.2.2) '@nestjs/swagger': - specifier: ^7.1.10 - version: 7.1.10(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + specifier: ^7.1.11 + version: 7.1.11(@nestjs/common@10.2.5)(@nestjs/core@10.2.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) '@types/bull': specifier: ^4.10.0 version: 4.10.0 @@ -172,11 +172,11 @@ importers: specifier: ^13.0.1 version: 13.0.1 '@types/nodemailer': - specifier: ^6.4.9 - version: 6.4.9 + specifier: ^6.4.10 + version: 6.4.10 '@webundsoehne/nest-fastify-file-upload': specifier: ^2.1.0 - version: 2.1.0(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(@nestjs/platform-fastify@10.2.4) + version: 2.1.0(@nestjs/common@10.2.5)(@nestjs/core@10.2.5)(@nestjs/platform-fastify@10.2.5) bull: specifier: ^4.11.3 version: 4.11.3 @@ -209,10 +209,10 @@ importers: version: 3.3.6 nestjs-pino: specifier: ^3.4.0 - version: 3.4.0(@nestjs/common@10.2.4)(pino-http@8.5.0) + version: 3.4.0(@nestjs/common@10.2.5)(pino-http@8.5.0) pino: - specifier: ^8.15.0 - version: 8.15.0 + specifier: ^8.15.1 + version: 8.15.1 pino-http: specifier: ^8.5.0 version: 8.5.0 @@ -234,7 +234,7 @@ importers: version: 9.4.4(typescript@5.2.2)(webpack@5.88.2) ts-node: specifier: ^10.9.1 - version: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.9)(typescript@5.2.2) + version: 10.9.1(@swc/core@1.3.84)(@types/node@20.6.0)(typescript@5.2.2) packages/web: dependencies: @@ -255,22 +255,22 @@ importers: version: 1.1.12 '@next-auth/prisma-adapter': specifier: ^1.0.7 - version: 1.0.7(@prisma/client@5.2.0)(next-auth@4.23.1) + version: 1.0.7(@prisma/client@5.3.0)(next-auth@4.23.1) '@ohbug/extension-feedback': - specifier: ^0.7.2 - version: 0.7.2 + specifier: ^0.7.3 + version: 0.7.3 '@ohbug/extension-rrweb': - specifier: ^1.10.1 - version: 1.10.1(rrweb@2.0.0-alpha.4) + specifier: ^1.10.2 + version: 1.10.2(rrweb@2.0.0-alpha.4) '@ohbug/extension-uuid': - specifier: ^2.1.1 - version: 2.1.1 + specifier: ^2.1.2 + version: 2.1.2 '@ohbug/extension-view': - specifier: ^0.1.1 - version: 0.1.1 + specifier: ^0.1.2 + version: 0.1.2 '@ohbug/extension-web-vitals': - specifier: ^0.2.1 - version: 0.2.1(web-vitals@3.4.0) + specifier: ^0.2.2 + version: 0.2.2(web-vitals@3.4.0) '@radix-ui/react-accordion': specifier: ^1.1.2 version: 1.1.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) @@ -317,8 +317,8 @@ importers: specifier: ^1.0.6 version: 1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-table': - specifier: ^8.9.3 - version: 8.9.3(react-dom@18.2.0)(react@18.2.0) + specifier: ^8.9.8 + version: 8.9.8(react-dom@18.2.0)(react@18.2.0) '@types/nprogress': specifier: ^0.2.0 version: 0.2.0 @@ -353,20 +353,20 @@ importers: specifier: ^8.1.0 version: 8.1.0(react@18.2.0) framer-motion: - specifier: ^10.16.3 - version: 10.16.3(react-dom@18.2.0)(react@18.2.0) + specifier: ^10.16.4 + version: 10.16.4(react-dom@18.2.0)(react@18.2.0) jotai: - specifier: ^2.4.1 - version: 2.4.1(@types/react@18.2.21)(react@18.2.0) + specifier: ^2.4.2 + version: 2.4.2(@types/react@18.2.21)(react@18.2.0) lucide-react: - specifier: ^0.274.0 - version: 0.274.0(react@18.2.0) + specifier: ^0.276.0 + version: 0.276.0(react@18.2.0) next: specifier: ^13.4.19 version: 13.4.19(react-dom@18.2.0)(react@18.2.0) next-auth: specifier: ^4.23.1 - version: 4.23.1(next@13.4.19)(nodemailer@6.9.4)(react-dom@18.2.0)(react@18.2.0) + version: 4.23.1(next@13.4.19)(nodemailer@6.9.5)(react-dom@18.2.0)(react@18.2.0) next-intl: specifier: ^2.20.0 version: 2.20.0(next@13.4.19)(react@18.2.0) @@ -388,9 +388,6 @@ importers: react-hook-form: specifier: ^7.46.1 version: 7.46.1(react@18.2.0) - react-icons: - specifier: ^4.10.1 - version: 4.10.1(react@18.2.0) react-json-view: specifier: ^1.21.3 version: 1.21.3(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) @@ -416,8 +413,8 @@ importers: specifier: ^1.0.7 version: 1.0.7(tailwindcss@3.3.3) ua-parser-js: - specifier: ^1.0.35 - version: 1.0.35 + specifier: ^1.0.36 + version: 1.0.36 web-vitals: specifier: ^3.4.0 version: 3.4.0 @@ -544,7 +541,7 @@ packages: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.15 + '@babel/types': 7.22.17 dev: false /@babel/helper-string-parser@7.22.5: @@ -572,7 +569,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.15 + '@babel/types': 7.22.17 dev: false /@babel/runtime@7.22.11: @@ -582,40 +579,40 @@ packages: regenerator-runtime: 0.14.0 dev: false - /@babel/types@7.22.15: - resolution: {integrity: sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==} + /@babel/types@7.22.17: + resolution: {integrity: sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.15 to-fast-properties: 2.0.0 - /@chenyueban/eslint-config@3.0.9(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-w8pYDsEEPkXib5bcMts76HkUaD9u6j9QAgOdAXHBOOlYtkarbKe3P+0RJul7APFdTay8MExPWpV73dMyeh7UBA==} + /@chenyueban/eslint-config@3.0.10(eslint@8.49.0)(typescript@5.2.2): + resolution: {integrity: sha512-EVEANCQIuJFl5+ChDu4uXVoakvljS1ZAj80fFP9C5IMr8Cnm//m3nkjQ/1mPQNh8SEtv8w2/zt49shYlEWuNXg==} engines: {node: '>=16', npm: '>=7'} peerDependencies: eslint: ^8.0.0 dependencies: '@eslint/js': 8.48.0 - '@typescript-eslint/eslint-plugin': 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) - eslint: 8.48.0 + '@typescript-eslint/eslint-plugin': 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.49.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.5.0(eslint@8.49.0)(typescript@5.2.2) + eslint: 8.49.0 eslint-define-config: 1.23.0 - eslint-plugin-antfu: 0.41.0(eslint@8.48.0)(typescript@5.2.2) - eslint-plugin-eslint-comments: 3.2.0(eslint@8.48.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint@8.48.0) - eslint-plugin-jsonc: 2.9.0(eslint@8.48.0) - eslint-plugin-markdown: 3.0.1(eslint@8.48.0) - eslint-plugin-react: 7.33.2(eslint@8.48.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.48.0) - eslint-plugin-unicorn: 48.0.1(eslint@8.48.0) - eslint-plugin-unused-imports: 3.0.0(@typescript-eslint/eslint-plugin@6.5.0)(eslint@8.48.0) - eslint-plugin-vue: 9.17.0(eslint@8.48.0) - eslint-plugin-yml: 1.8.0(eslint@8.48.0) + eslint-plugin-antfu: 0.41.0(eslint@8.49.0)(typescript@5.2.2) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.49.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint@8.49.0) + eslint-plugin-jsonc: 2.9.0(eslint@8.49.0) + eslint-plugin-markdown: 3.0.1(eslint@8.49.0) + eslint-plugin-react: 7.33.2(eslint@8.49.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.49.0) + eslint-plugin-unicorn: 48.0.1(eslint@8.49.0) + eslint-plugin-unused-imports: 3.0.0(@typescript-eslint/eslint-plugin@6.5.0)(eslint@8.49.0) + eslint-plugin-vue: 9.17.0(eslint@8.49.0) + eslint-plugin-yml: 1.8.0(eslint@8.49.0) globals: 13.21.0 jsonc-eslint-parser: 2.3.0 local-pkg: 0.4.3 - vue-eslint-parser: 9.3.1(eslint@8.48.0) + vue-eslint-parser: 9.3.1(eslint@8.49.0) yaml-eslint-parser: 1.2.2 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -624,8 +621,8 @@ packages: - typescript dev: true - /@chenyueban/tsconfig@3.0.9(typescript@5.2.2): - resolution: {integrity: sha512-z+GypJPDROP6UGRiZIvR8BhB8/vDQA1D4k7j0DlNhzP1QymX+3H9n/t/mQdtWl7MzAMJaGHxn6L/3WUBVe/w4g==} + /@chenyueban/tsconfig@3.0.10(typescript@5.2.2): + resolution: {integrity: sha512-j8F0vpIFtyd5PAVDkeRF/NzPFd3hXYd+Xsht6llZUXJcilwHx1aYuHtjtq55gjcPaKF2dc64LPBL3MqvHi++Jg==} engines: {node: '>=16', npm: '>=7'} peerDependencies: typescript: ^4.4.2 @@ -640,14 +637,14 @@ packages: dev: false optional: true - /@commitlint/cli@17.7.1(@swc/core@1.3.82): + /@commitlint/cli@17.7.1(@swc/core@1.3.84): resolution: {integrity: sha512-BCm/AT06SNCQtvFv921iNhudOHuY16LswT0R3OeolVGLk8oP+Rk9TfQfgjH7QPMjhvp76bNqGFEcpKojxUNW1g==} engines: {node: '>=v14'} hasBin: true dependencies: '@commitlint/format': 17.4.4 '@commitlint/lint': 17.7.0 - '@commitlint/load': 17.7.1(@swc/core@1.3.82) + '@commitlint/load': 17.7.1(@swc/core@1.3.84) '@commitlint/read': 17.5.1 '@commitlint/types': 17.4.4 execa: 5.1.1 @@ -713,7 +710,7 @@ packages: '@commitlint/types': 17.4.4 dev: true - /@commitlint/load@17.7.1(@swc/core@1.3.82): + /@commitlint/load@17.7.1(@swc/core@1.3.84): resolution: {integrity: sha512-S/QSOjE1ztdogYj61p6n3UbkUvweR17FQ0zDbNtoTLc+Hz7vvfS7ehoTMQ27hPSjVBpp7SzEcOQu081RLjKHJQ==} engines: {node: '>=v14'} dependencies: @@ -729,7 +726,7 @@ packages: lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.9)(typescript@5.2.2) + ts-node: 10.9.1(@swc/core@1.3.84)(@types/node@20.6.0)(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - '@swc/core' @@ -954,21 +951,21 @@ packages: /@esbuild-kit/cjs-loader@2.4.2: resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} dependencies: - '@esbuild-kit/core-utils': 3.2.2 + '@esbuild-kit/core-utils': 3.3.0 get-tsconfig: 4.7.0 dev: true - /@esbuild-kit/core-utils@3.2.2: - resolution: {integrity: sha512-Ub6LaRaAgF80dTSzUdXpFLM1pVDdmEVB9qb5iAzSpyDlX/mfJTFGOnZ516O05p5uWWteNviMKi4PAyEuRxI5gA==} + /@esbuild-kit/core-utils@3.3.0: + resolution: {integrity: sha512-jTtSvVpr5ygNXyPXf9IBbCrKQ0uckq6vWkcGfy1fEr9KjkKdnFn4kFAGjpqZDZim1wsTwh/Be+lhAUemEmxEYA==} dependencies: esbuild: 0.18.20 source-map-support: 0.5.21 dev: true - /@esbuild-kit/esm-loader@2.5.5: - resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} + /@esbuild-kit/esm-loader@2.6.3: + resolution: {integrity: sha512-lUziJdacVDQrg65DwQ+OOQR9B1LQE2/pY77H+oVT0KQDLtsT2XfbHz7O+f0zUvexSWPKxMXa8h4RXT5PFAlv/g==} dependencies: - '@esbuild-kit/core-utils': 3.2.2 + '@esbuild-kit/core-utils': 3.3.0 get-tsconfig: 4.7.0 dev: true @@ -1148,13 +1145,13 @@ packages: requiresBuild: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.49.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.48.0 + eslint: 8.49.0 eslint-visitor-keys: 3.4.3 dev: true @@ -1185,6 +1182,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@eslint/js@8.49.0: + resolution: {integrity: sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@fastify/ajv-compiler@3.5.0: resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} dependencies: @@ -1502,7 +1504,7 @@ packages: dev: false optional: true - /@nestjs/axios@3.0.0(@nestjs/common@10.2.4)(axios@1.5.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + /@nestjs/axios@3.0.0(@nestjs/common@10.2.5)(axios@1.5.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): resolution: {integrity: sha512-ULdH03jDWkS5dy9X69XbUVbhC+0pVnrRcj7bIK/ytTZ76w7CgvTZDJqsIyisg3kNOiljRW/4NIjSf3j6YGvl+g==} peerDependencies: '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -1510,38 +1512,38 @@ packages: reflect-metadata: ^0.1.12 rxjs: ^6.0.0 || ^7.0.0 dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) axios: 1.5.0 reflect-metadata: 0.1.13 rxjs: 7.8.1 dev: false - /@nestjs/bull-shared@10.0.1(@nestjs/common@10.2.4)(@nestjs/core@10.2.4): + /@nestjs/bull-shared@10.0.1(@nestjs/common@10.2.5)(@nestjs/core@10.2.5): resolution: {integrity: sha512-8Td36l2i5x9+iQWjPB5Bd5+6u5Eangb5DclNcwrdwKqvd28xE92MSW97P4JV52C2kxrTjZwx8ck/wObAwtpQPw==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.5(@nestjs/common@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) tslib: 2.6.0 dev: false - /@nestjs/bull@10.0.1(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(bull@4.11.3): + /@nestjs/bull@10.0.1(@nestjs/common@10.2.5)(@nestjs/core@10.2.5)(bull@4.11.3): resolution: {integrity: sha512-1GcJ8BkHDgQdBMZ7SqAqgUHiFnISXmpGvewFeTc8wf87JLk2PweiKv9j9/KQKU+NI237pCe82XB0bXzTnsdxSw==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 bull: ^3.3 || ^4.0.0 dependencies: - '@nestjs/bull-shared': 10.0.1(@nestjs/common@10.2.4)(@nestjs/core@10.2.4) - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/bull-shared': 10.0.1(@nestjs/common@10.2.5)(@nestjs/core@10.2.5) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.5(@nestjs/common@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) bull: 4.11.3 tslib: 2.6.0 dev: false - /@nestjs/cli@10.1.17(@swc/cli@0.1.62)(@swc/core@1.3.82)(esbuild@0.18.20): + /@nestjs/cli@10.1.17(@swc/cli@0.1.62)(@swc/core@1.3.84)(esbuild@0.18.20): resolution: {integrity: sha512-jUEnR2DgC15Op+IhcRWb6cyJrhec9CUQO+GtxCF2Dv9MwLcr4sTDq1UOkfs09HAhpuI8otgF2LoWGTlW3qRuqg==} engines: {node: '>= 16'} hasBin: true @@ -1558,8 +1560,8 @@ packages: '@angular-devkit/schematics': 16.2.0(chokidar@3.5.3) '@angular-devkit/schematics-cli': 16.2.0(chokidar@3.5.3) '@nestjs/schematics': 10.0.2(chokidar@3.5.3)(typescript@5.1.6) - '@swc/cli': 0.1.62(@swc/core@1.3.82) - '@swc/core': 1.3.82 + '@swc/cli': 0.1.62(@swc/core@1.3.84) + '@swc/core': 1.3.84 chalk: 4.1.2 chokidar: 3.5.3 cli-table3: 0.6.3 @@ -1576,7 +1578,7 @@ packages: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.1.6 - webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.20) + webpack: 5.88.2(@swc/core@1.3.84)(esbuild@0.18.20) webpack-node-externals: 3.0.0 transitivePeerDependencies: - esbuild @@ -1584,8 +1586,8 @@ packages: - webpack-cli dev: false - /@nestjs/common@10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-3Lg4PUaSDucf14V8rPCH212NqrK09AJbY0NKqFsb4j5OIE+TuOzVZR/yjaJ8JNxH2hjskJNCZie0D/9tA2lzlA==} + /@nestjs/common@10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-2BfkPZKmTVxflm8bhmClKKcHwhlyweEfbM25g7ldXIK9+utCPVXqBfZGORj2L8QagiT6bei48FJmGc2S1tiFEQ==} peerDependencies: class-transformer: '*' class-validator: '*' @@ -1606,8 +1608,8 @@ packages: uid: 2.0.2 dev: false - /@nestjs/core@10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-aWeii2l+3pNCc9kIRdLbXQMvrgSZD0jZgXOZv7bZwVf9mClMMi7TussLI4On12VbqVE7LE3gsNgRTwgQJlVC8g==} + /@nestjs/core@10.2.5(@nestjs/common@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-O9AycZc4MjzIFrvCxcQVqfSNuN9eHZrfyVcYkp9CMPj6lGd9TQCZX2MmaP1CWs4UJBmTKflPdtPJ0sj9iIuvLQ==} requiresBuild: true peerDependencies: '@nestjs/common': ^10.0.0 @@ -1624,7 +1626,7 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 @@ -1637,7 +1639,7 @@ packages: - encoding dev: false - /@nestjs/mapped-types@2.0.2(@nestjs/common@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): + /@nestjs/mapped-types@2.0.2(@nestjs/common@10.2.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): resolution: {integrity: sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -1650,14 +1652,14 @@ packages: class-validator: optional: true dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) class-transformer: 0.5.1 class-validator: 0.14.0 reflect-metadata: 0.1.13 dev: false - /@nestjs/platform-fastify@10.2.4(@nestjs/common@10.2.4)(@nestjs/core@10.2.4): - resolution: {integrity: sha512-tkFjvAjWzhE0C8GzjESBA7QYeNomCy4F4j3gsfTrLKQVGWBRjAyjzfdV8gWxAz6I1RF7uV7fAQ6tpxepymqEwQ==} + /@nestjs/platform-fastify@10.2.5(@nestjs/common@10.2.5)(@nestjs/core@10.2.5): + resolution: {integrity: sha512-d1C9naNUlMlwFDCqT0PXXsol34GXLn0t+21RfrA4lQCv5ADr7T+TnuSFX5CvF1S2icZ4wvBtD05/iCma+sGKaw==} peerDependencies: '@fastify/static': ^6.0.0 '@fastify/view': ^7.0.0 || ^8.0.0 @@ -1672,9 +1674,9 @@ packages: '@fastify/cors': 8.3.0 '@fastify/formbody': 7.4.0 '@fastify/middie': 8.3.0 - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) - fastify: 4.22.0 + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.5(@nestjs/common@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) + fastify: 4.22.2 light-my-request: 5.10.0 path-to-regexp: 3.2.0 tslib: 2.6.2 @@ -1682,15 +1684,15 @@ packages: - supports-color dev: false - /@nestjs/schedule@3.0.3(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(reflect-metadata@0.1.13): + /@nestjs/schedule@3.0.3(@nestjs/common@10.2.5)(@nestjs/core@10.2.5)(reflect-metadata@0.1.13): resolution: {integrity: sha512-xsMA4dmP3LcW3rt2iMPfm88bDbCj/hLuDsLrKmJQlbnxyCYtBwLtmu/4cSfZELLM7pTDT+E8QDAqGwhYyUUjxg==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 reflect-metadata: ^0.1.12 dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.5(@nestjs/common@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) cron: 2.4.1 reflect-metadata: 0.1.13 uuid: 9.0.0 @@ -1726,8 +1728,8 @@ packages: - chokidar dev: false - /@nestjs/swagger@7.1.10(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): - resolution: {integrity: sha512-qreCcxgHFyFX1mOfK36pxiziy4xoa/XcxC0h4Zr9yH54WuqMqO9aaNFhFyuQ1iyd/3YBVQB21Un4gQnh9iGm0w==} + /@nestjs/swagger@7.1.11(@nestjs/common@10.2.5)(@nestjs/core@10.2.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-EneFcucWC4a0n/FVd1Hg1MRugt65vL/1RDsQMqhMRfVw6IbYWuiKh51TNI4QwOPrRGiR1ry8qHJCBcTX9cl89Q==} peerDependencies: '@fastify/static': ^6.0.0 '@nestjs/common': ^9.0.0 || ^10.0.0 @@ -1743,26 +1745,26 @@ packages: class-validator: optional: true dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/mapped-types': 2.0.2(@nestjs/common@10.2.4)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.5(@nestjs/common@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/mapped-types': 2.0.2(@nestjs/common@10.2.5)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) class-transformer: 0.5.1 class-validator: 0.14.0 js-yaml: 4.1.0 lodash: 4.17.21 path-to-regexp: 3.2.0 reflect-metadata: 0.1.13 - swagger-ui-dist: 5.4.2 + swagger-ui-dist: 5.6.2 dev: false - /@next-auth/prisma-adapter@1.0.7(@prisma/client@5.2.0)(next-auth@4.23.1): + /@next-auth/prisma-adapter@1.0.7(@prisma/client@5.3.0)(next-auth@4.23.1): resolution: {integrity: sha512-Cdko4KfcmKjsyHFrWwZ//lfLUbcLqlyFqjd/nYE2m3aZ7tjMNUjpks47iw7NTCnXf+5UWz5Ypyt1dSs1EP5QJw==} peerDependencies: '@prisma/client': '>=2.26.0 || >=3' next-auth: ^4 dependencies: - '@prisma/client': 5.2.0(prisma@5.2.0) - next-auth: 4.23.1(next@13.4.19)(nodemailer@6.9.4)(react-dom@18.2.0)(react@18.2.0) + '@prisma/client': 5.3.0(prisma@5.3.0) + next-auth: 4.23.1(next@13.4.19)(nodemailer@6.9.5)(react-dom@18.2.0)(react@18.2.0) dev: false /@next/env@13.4.19: @@ -2106,43 +2108,43 @@ packages: '@ohbug/utils': 2.0.8 dev: false - /@ohbug/extension-feedback@0.7.2: - resolution: {integrity: sha512-wSXmeua/rIFON4OhvqFipCVWQAZkdQVJP7muqgGKOvo0pcU6w/ut1dQ6kib1tPyCt16i5ayVC54VJe44NvdMIA==} + /@ohbug/extension-feedback@0.7.3: + resolution: {integrity: sha512-W1PqHZWh4f+aRRvINyAdlKcBJz+juem/MhqKHvPTCzP2HBx5J3LyF/2nBXZlQuhMGQWAANuZAz4uV77GP+1SYQ==} dependencies: '@ohbug/types': 2.2.1 '@ohbug/utils': 2.0.8 solid-js: 1.7.11 dev: false - /@ohbug/extension-rrweb@1.10.1(rrweb@2.0.0-alpha.4): - resolution: {integrity: sha512-KRq/RqgemR+KDlBNP4ojRYhtcfZVolzGaKSLPVJeG/EJCQg9VMvphskHI7BoQyDmOQTm4Nlj5Yg9JS7U9ooksA==} + /@ohbug/extension-rrweb@1.10.2(rrweb@2.0.0-alpha.4): + resolution: {integrity: sha512-h50CZOBZAr9Y4z+C0kABcKqZcZm+kHB3Xe3zcOfEAy98ZVu2noQfS8iXAwShMTTcKcOKhKCi0JYhm+JLtl8WWw==} peerDependencies: rrweb: ^2.0.0 dependencies: '@ohbug/core': 2.2.1 '@ohbug/types': 2.2.1 - '@rrweb/types': 2.0.0-alpha.9 + '@rrweb/types': 2.0.0-alpha.11 rrweb: 2.0.0-alpha.4 dev: false - /@ohbug/extension-uuid@2.1.1: - resolution: {integrity: sha512-dC7khwKnQ8cgpJI62nvF1cBUp0C33ZQp01vizCteG5BIAI2smQL5dWZhd5GZ0DiYxvv1YmZ3I5BVnuFLCWo/gA==} + /@ohbug/extension-uuid@2.1.2: + resolution: {integrity: sha512-LojwzqLl4M89L/KnZU3c/eeiqZFi9HtEzAJ9ihUiPRA9sdobisoYolOSHwMEecDt1AfpAEzyyHw4CoCoYJwCdw==} dependencies: '@ohbug/types': 2.2.1 '@ohbug/utils': 2.0.8 uuid: 9.0.0 dev: false - /@ohbug/extension-view@0.1.1: - resolution: {integrity: sha512-mtEzlD29Mld5sjYjxOfbjKwJNlGpPCImeYgLS/7QzrzS5OydX7fz+fKhHJmfFciVRqdB8Spd2bRJ1KUoHAmtnQ==} + /@ohbug/extension-view@0.1.2: + resolution: {integrity: sha512-CdSLt7F8oJAyoTD3+nf28jUAXCEw+e1YCi+15030Uy2f49LoZXrmoo8vblIkeSqWO8X4IjGscKQxUZIOGq6uvg==} dependencies: '@ohbug/types': 2.2.1 '@ohbug/utils': 2.0.8 dayjs: 1.11.9 dev: false - /@ohbug/extension-web-vitals@0.2.1(web-vitals@3.4.0): - resolution: {integrity: sha512-1b7f0Q7xoTjCk2y0PxEpjvwutMeuH2GcFmTDnifTkOGQCdXFfdvMteL1wZm5MKL6xk1GH9f79megHujuFlUypQ==} + /@ohbug/extension-web-vitals@0.2.2(web-vitals@3.4.0): + resolution: {integrity: sha512-iqROyqTNF/05vz/Txyzt94qVRr36CYBPoG5YezAncspnzKLYyqe74JUuLGoKJKVRczmTMhEKzdeAjQdeBk48Fg==} peerDependencies: web-vitals: ^2.1.4 dependencies: @@ -2168,7 +2170,7 @@ packages: resolution: {integrity: sha512-eAhFr8c+7Q6MtxvkwgEGAg91XZXoZzASIsUzoGQAqt/hlMIPHlsN9CO2Lxr012jBU/I/pnQteopq+sQbZQjKIA==} dependencies: '@ohbug/types': 2.2.1 - '@types/node': 20.5.9 + '@types/node': 20.6.0 dev: false /@ohbug/vue@2.0.10(vue@3.3.4): @@ -2213,8 +2215,8 @@ packages: config-chain: 1.1.13 dev: true - /@prisma/client@5.2.0(prisma@5.2.0): - resolution: {integrity: sha512-AiTjJwR4J5Rh6Z/9ZKrBBLel3/5DzUNntMohOy7yObVnVoTNVFi2kvpLZlFuKO50d7yDspOtW6XBpiAd0BVXbQ==} + /@prisma/client@5.3.0(prisma@5.3.0): + resolution: {integrity: sha512-cduYBlwj6oBfAUx2OI5i7t3NlpVeOtkN7pAqv0cw0B6gs4y8cY1mr8ZYywja0NUCOCqEWDkcZWBTVBwm6mnRIw==} engines: {node: '>=16.13'} requiresBuild: true peerDependencies: @@ -2223,16 +2225,16 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f - prisma: 5.2.0 + '@prisma/engines-version': 5.3.0-36.e90b936d84779543cbe0e494bc8b9d7337fad8e4 + prisma: 5.3.0 dev: false - /@prisma/engines-version@5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f: - resolution: {integrity: sha512-jsnKT5JIDIE01lAeCj2ghY9IwxkedhKNvxQeoyLs6dr4ZXynetD0vTy7u6wMJt8vVPv8I5DPy/I4CFaoXAgbtg==} + /@prisma/engines-version@5.3.0-36.e90b936d84779543cbe0e494bc8b9d7337fad8e4: + resolution: {integrity: sha512-uftIog5FQ/OUR8Vb9TzpNBJ6L+zJnBgmd1A0uPJUzuvGMU32UmeyobpdXVzST5UprKryTdWOYXQFVyiQ2OU4Nw==} dev: false - /@prisma/engines@5.2.0: - resolution: {integrity: sha512-dT7FOLUCdZmq+AunLqB1Iz+ZH/IIS1Fz2THmKZQ6aFONrQD/BQ5ecJ7g2wGS2OgyUFf4OaLam6/bxmgdOBDqig==} + /@prisma/engines@5.3.0: + resolution: {integrity: sha512-3U3u/pa+QYfrV2z2rU6cBmzOZYPVEh1cXvg35PbaYFBQipFep54tp+mD9KJhlouT57pMKPERgjcPFR+UZ/BWjg==} requiresBuild: true /@radix-ui/number@1.0.1: @@ -3361,12 +3363,6 @@ packages: rrweb-snapshot: 2.0.0-alpha.11 dev: false - /@rrweb/types@2.0.0-alpha.9: - resolution: {integrity: sha512-yS2KghLSmSSxo6H7tHrJ6u+nWJA9zCXaKFyc79rUSX8RHHSImRqocTqJ8jz794kCIWA90rvaQayRONdHO+vB0Q==} - dependencies: - rrweb-snapshot: 2.0.0-alpha.11 - dev: false - /@sigstore/bundle@1.1.0: resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -3409,7 +3405,7 @@ packages: engines: {node: '>=14.16'} dev: true - /@swc/cli@0.1.62(@swc/core@1.3.82): + /@swc/cli@0.1.62(@swc/core@1.3.84): resolution: {integrity: sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==} engines: {node: '>= 12.13'} hasBin: true @@ -3421,95 +3417,95 @@ packages: optional: true dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.3.82 + '@swc/core': 1.3.84 commander: 7.2.0 fast-glob: 3.3.1 semver: 7.5.4 slash: 3.0.0 source-map: 0.7.4 - /@swc/core-darwin-arm64@1.3.82: - resolution: {integrity: sha512-JfsyDW34gVKD3uE0OUpUqYvAD3yseEaicnFP6pB292THtLJb0IKBBnK50vV/RzEJtc1bR3g1kNfxo2PeurZTrA==} + /@swc/core-darwin-arm64@1.3.84: + resolution: {integrity: sha512-mqK0buOo+toF2HoJ/gWj2ApZbvbIiNq3mMwSTHCYJHlQFQfoTWnl9aaD5GSO4wfNFVYfEZ1R259o5uv5NlVtoA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@swc/core-darwin-x64@1.3.82: - resolution: {integrity: sha512-ogQWgNMq7qTpITjcP3dnzkFNj7bh6SwMr859GvtOTrE75H7L7jDWxESfH4f8foB/LGxBKiDNmxKhitCuAsZK4A==} + /@swc/core-darwin-x64@1.3.84: + resolution: {integrity: sha512-cyuQZz62C43EDZqtnptUTlfDvAjgG3qu139m5zsfIK6ltXA5inKFbDWV3a/M5c18dFzA2Xh21Q46XZezmtQ9Tg==} engines: {node: '>=10'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.82: - resolution: {integrity: sha512-7TMXG1lXlNhD0kUiEqs+YlGV4irAdBa2quuy+XI3oJf2fBK6dQfEq4xBy65B3khrorzQS3O0oDGQ+cmdpHExHA==} + /@swc/core-linux-arm-gnueabihf@1.3.84: + resolution: {integrity: sha512-dmt/ECQrp3ZPWnK27p4E4xRIRHOoJhgGvxC5t5YaWzN20KcxE9ykEY2oLGSoeceM/A+4D11aRYGwF/EM7yOkvA==} engines: {node: '>=10'} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-gnu@1.3.82: - resolution: {integrity: sha512-26JkOujbzcItPAmIbD5vHJxQVy5ihcSu3YHTKwope1h28sApZdtE7S3e2G3gsZRTIdsCQkXUtAQeqHxGWWR3pw==} + /@swc/core-linux-arm64-gnu@1.3.84: + resolution: {integrity: sha512-PgVfrI3NVg2z/oeg3GWLb9rFLMqidbdPwVH5nRyHVP2RX/BWP6qfnYfG+gJv4qrKzIldb9TyCGH7y8VWctKLxw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-arm64-musl@1.3.82: - resolution: {integrity: sha512-8Izj9tuuMpoc3cqiPBRtwqpO1BZ/+sfZVsEhLxrbOFlcSb8LnKyMle1g3JMMUwI4EU75RGVIzZMn8A6GOKdJbA==} + /@swc/core-linux-arm64-musl@1.3.84: + resolution: {integrity: sha512-hcuEa8/vin4Ns0P+FpcDHQ4f3jmhgGKQhqw0w+TovPSVTIXr+nrFQ2AGhs9nAxS6tSQ77C53Eb5YRpK8ToFo1A==} engines: {node: '>=10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-gnu@1.3.82: - resolution: {integrity: sha512-0GSrIBScQwTaPv46T2qB7XnDYxndRCpwH4HMjh6FN+I+lfPUhTSJKW8AonqrqT1TbpFIgvzQs7EnTsD7AnSCow==} + /@swc/core-linux-x64-gnu@1.3.84: + resolution: {integrity: sha512-IvyimSbwGdu21jBBEqR1Up8Jhvl8kIAf1k3e5Oy8oRfgojdUfmW1EIwgGdoUeyQ1VHlfquiWaRGfsnHQUKl35g==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-linux-x64-musl@1.3.82: - resolution: {integrity: sha512-KJUnaaepDKNzrEbwz4jv0iC3/t9x0NSoe06fnkAlhh2+NFKWKKJhVCOBTrpds8n7eylBDIXUlK34XQafjVMUdg==} + /@swc/core-linux-x64-musl@1.3.84: + resolution: {integrity: sha512-hdgVU/O5ufDCe+p5RtCjU7PRNwd0WM+eWJS+GNY4QWL6O8y2VLM+i4+6YzwSUjeBk0xd+1YElMxbqz7r5tSZhw==} engines: {node: '>=10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@swc/core-win32-arm64-msvc@1.3.82: - resolution: {integrity: sha512-TR3MHKhDYIyGyFcyl2d/p1ftceXcubAhX5wRSOdtOyr5+K/v3jbyCCqN7bbqO5o43wQVCwwR/drHleYyDZvg8Q==} + /@swc/core-win32-arm64-msvc@1.3.84: + resolution: {integrity: sha512-rzH6k2BF0BFOFhUTD+bh0oCiUCZjFfDfoZoYNN/CM0qbtjAcFH21hzMh/EH8ZaXq8k/iQmUNNa5MPNPZ4SOMNw==} engines: {node: '>=10'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-ia32-msvc@1.3.82: - resolution: {integrity: sha512-ZX4HzVVt6hs84YUg70UvyBJnBOIspmQQM0iXSzBvOikk3zRoN7BnDwQH4GScvevCEBuou60+i4I6d5kHLOfh8Q==} + /@swc/core-win32-ia32-msvc@1.3.84: + resolution: {integrity: sha512-Y+Dk7VLLVwwsAzoDmjkNW/sTmSPl9PGr4Mj1nhc5A2NNxZ+hz4SxFMclacDI03SC5ikK8Qh6WOoE/+nwUDa3uA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@swc/core-win32-x64-msvc@1.3.82: - resolution: {integrity: sha512-4mJMnex21kbQoaHeAmHnVwQN9/XAfPszJ6n9HI7SVH+aAHnbBIR0M59/b50/CJMjTj5niUGk7EwQ3nhVNOG32g==} + /@swc/core-win32-x64-msvc@1.3.84: + resolution: {integrity: sha512-WmpaosqCWMX7DArLdU8AJcj96hy0PKlYh1DaMVikSrrDHbJm2dZ8rd27IK3qUB8DgPkrDYHmLAKNZ+z3gWXgRQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@swc/core@1.3.82: - resolution: {integrity: sha512-jpC1a18HMH67018Ij2jh+hT7JBFu7ZKcQVfrZ8K6JuEY+kjXmbea07P9MbQUZbAe0FB+xi3CqEVCP73MebodJQ==} + /@swc/core@1.3.84: + resolution: {integrity: sha512-UPKUiDwG7HOdPfOb1VFeEJ76JDgU2w80JLewzx6tb0fk9TIjhr9yxKBzPbzc/QpjGHDu5iaEuNeZcu27u4j63g==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -3520,16 +3516,16 @@ packages: dependencies: '@swc/types': 0.1.4 optionalDependencies: - '@swc/core-darwin-arm64': 1.3.82 - '@swc/core-darwin-x64': 1.3.82 - '@swc/core-linux-arm-gnueabihf': 1.3.82 - '@swc/core-linux-arm64-gnu': 1.3.82 - '@swc/core-linux-arm64-musl': 1.3.82 - '@swc/core-linux-x64-gnu': 1.3.82 - '@swc/core-linux-x64-musl': 1.3.82 - '@swc/core-win32-arm64-msvc': 1.3.82 - '@swc/core-win32-ia32-msvc': 1.3.82 - '@swc/core-win32-x64-msvc': 1.3.82 + '@swc/core-darwin-arm64': 1.3.84 + '@swc/core-darwin-x64': 1.3.84 + '@swc/core-linux-arm-gnueabihf': 1.3.84 + '@swc/core-linux-arm64-gnu': 1.3.84 + '@swc/core-linux-arm64-musl': 1.3.84 + '@swc/core-linux-x64-gnu': 1.3.84 + '@swc/core-linux-x64-musl': 1.3.84 + '@swc/core-win32-arm64-msvc': 1.3.84 + '@swc/core-win32-ia32-msvc': 1.3.84 + '@swc/core-win32-x64-msvc': 1.3.84 /@swc/helpers@0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} @@ -3553,20 +3549,20 @@ packages: defer-to-connect: 2.0.1 dev: true - /@tanstack/react-table@8.9.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Ng9rdm3JPoSCi6cVZvANsYnF+UoGVRxflMb270tVj0+LjeT/ZtZ9ckxF6oLPLcKesza6VKBqtdF9mQ+vaz24Aw==} + /@tanstack/react-table@8.9.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ZUd+ZydvUP8+XLI+oQ3IcG6Pqq3vw94na3fViD/v0dsIVwgQaWanizeh+si/Pn/8eU0XgbSVU9VpejOJEbp/lg==} engines: {node: '>=12'} peerDependencies: react: '>=16' react-dom: '>=16' dependencies: - '@tanstack/table-core': 8.9.3 + '@tanstack/table-core': 8.9.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@tanstack/table-core@8.9.3: - resolution: {integrity: sha512-NpHZBoHTfqyJk0m/s/+CSuAiwtebhYK90mDuf5eylTvgViNOujiaOaxNDxJkQQAsVvHWZftUGAx1EfO1rkKtLg==} + /@tanstack/table-core@8.9.8: + resolution: {integrity: sha512-f2Y/BcJy3IBkdDxWEk6WX6zJSmCDBI5iS0icr5DyeSbWsbnfaBtOIaeBjfnTEedt9Kk3xPmfciA6uSNOQ1BEXA==} engines: {node: '>=12'} dev: false @@ -3615,7 +3611,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.5.9 + '@types/node': 20.6.0 dev: false /@types/bull@4.10.0: @@ -3632,13 +3628,13 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 20.5.9 + '@types/node': 20.6.0 '@types/responselike': 1.0.0 /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.5.9 + '@types/node': 20.6.0 dev: false /@types/cron@2.4.0: @@ -3716,7 +3712,7 @@ packages: /@types/express-serve-static-core@4.17.36: resolution: {integrity: sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==} dependencies: - '@types/node': 20.5.9 + '@types/node': 20.6.0 '@types/qs': 6.9.8 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -3756,7 +3752,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.5.9 + '@types/node': 20.6.0 /@types/linkify-it@3.0.3: resolution: {integrity: sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g==} @@ -3800,13 +3796,13 @@ packages: requiresBuild: true dev: true - /@types/node@20.5.9: - resolution: {integrity: sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==} + /@types/node@20.6.0: + resolution: {integrity: sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==} - /@types/nodemailer@6.4.9: - resolution: {integrity: sha512-XYG8Gv+sHjaOtUpiuytahMy2mM3rectgroNbs6R3djZEKmPNiIJwe9KqOJBGzKKnNZNKvnuvmugBgpq3w/S0ig==} + /@types/nodemailer@6.4.10: + resolution: {integrity: sha512-oPW/IdhkU3FyZc1dzeqmS+MBjrjZNiiINnrEOrWALzccJlP5xTlbkNr2YnTnnyj9Eqm5ofjRoASEbrCYpA7BrA==} dependencies: - '@types/node': 20.5.9 + '@types/node': 20.6.0 dev: false /@types/normalize-package-data@2.4.1: @@ -3856,7 +3852,7 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.5.9 + '@types/node': 20.6.0 /@types/scheduler@0.16.3: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} @@ -3870,7 +3866,7 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.5.9 + '@types/node': 20.6.0 dev: false /@types/serve-static@1.15.2: @@ -3878,7 +3874,7 @@ packages: dependencies: '@types/http-errors': 2.0.1 '@types/mime': 3.0.1 - '@types/node': 20.5.9 + '@types/node': 20.6.0 dev: false /@types/ua-parser-js@0.7.37: @@ -3893,7 +3889,7 @@ packages: resolution: {integrity: sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==} dev: false - /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.49.0)(typescript@5.2.2): resolution: {integrity: sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -3905,13 +3901,13 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.8.0 - '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.5.0(eslint@8.49.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 6.5.0 - '@typescript-eslint/type-utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/type-utils': 6.5.0(eslint@8.49.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.5.0(eslint@8.49.0)(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 - eslint: 8.48.0 + eslint: 8.49.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 @@ -3922,7 +3918,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.5.0(eslint@8.48.0)(typescript@5.2.2): + /@typescript-eslint/parser@6.5.0(eslint@8.49.0)(typescript@5.2.2): resolution: {integrity: sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -3937,7 +3933,7 @@ packages: '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 - eslint: 8.48.0 + eslint: 8.49.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color @@ -3951,7 +3947,7 @@ packages: '@typescript-eslint/visitor-keys': 6.5.0 dev: true - /@typescript-eslint/type-utils@6.5.0(eslint@8.48.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@6.5.0(eslint@8.49.0)(typescript@5.2.2): resolution: {integrity: sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -3962,9 +3958,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.5.0(eslint@8.49.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.48.0 + eslint: 8.49.0 ts-api-utils: 1.0.2(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: @@ -3997,19 +3993,19 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.5.0(eslint@8.48.0)(typescript@5.2.2): + /@typescript-eslint/utils@6.5.0(eslint@8.49.0)(typescript@5.2.2): resolution: {integrity: sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.1 '@typescript-eslint/scope-manager': 6.5.0 '@typescript-eslint/types': 6.5.0 '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) - eslint: 8.48.0 + eslint: 8.49.0 semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -4198,7 +4194,7 @@ packages: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 - /@webundsoehne/nest-fastify-file-upload@2.1.0(@nestjs/common@10.2.4)(@nestjs/core@10.2.4)(@nestjs/platform-fastify@10.2.4): + /@webundsoehne/nest-fastify-file-upload@2.1.0(@nestjs/common@10.2.5)(@nestjs/core@10.2.5)(@nestjs/platform-fastify@10.2.5): resolution: {integrity: sha512-VtxfqG4WGW3fG1MD///HQRizYQNuY8YByeJdVKroFFZizXmj8XgLNAaTWDO/ff9hx2sPXF3vm6J8erq//DAODg==} engines: {node: '>=12'} peerDependencies: @@ -4206,9 +4202,9 @@ packages: '@nestjs/core': '>= 7 < 10' '@nestjs/platform-fastify': '>= 7 < 10' dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.2.4(@nestjs/common@10.2.4)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/platform-fastify': 10.2.4(@nestjs/common@10.2.4)(@nestjs/core@10.2.4) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.5(@nestjs/common@10.2.5)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/platform-fastify': 10.2.5(@nestjs/common@10.2.5)(@nestjs/core@10.2.5) fastify-multer: 2.0.3 dev: false @@ -5175,13 +5171,13 @@ packages: repeat-string: 1.6.1 dev: false - /commitizen@4.3.0(@swc/core@1.3.82): + /commitizen@4.3.0(@swc/core@1.3.84): resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(@swc/core@1.3.82) + cz-conventional-changelog: 3.3.0(@swc/core@1.3.84) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -5440,7 +5436,7 @@ packages: dependencies: '@types/node': 20.4.7 cosmiconfig: 8.3.2(typescript@5.2.2) - ts-node: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.9)(typescript@5.2.2) + ts-node: 10.9.1(@swc/core@1.3.84)(@types/node@20.6.0)(typescript@5.2.2) typescript: 5.2.2 dev: true @@ -5574,18 +5570,18 @@ packages: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: false - /cz-conventional-changelog@3.3.0(@swc/core@1.3.82): + /cz-conventional-changelog@3.3.0(@swc/core@1.3.84): resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.3.0(@swc/core@1.3.82) + commitizen: 4.3.0(@swc/core@1.3.84) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 17.7.1(@swc/core@1.3.82) + '@commitlint/load': 17.7.1(@swc/core@1.3.84) transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -6165,7 +6161,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint@8.49.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -6186,36 +6182,36 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.5.0(eslint@8.49.0)(typescript@5.2.2) debug: 3.2.7 - eslint: 8.48.0 + eslint: 8.49.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-antfu@0.41.0(eslint@8.48.0)(typescript@5.2.2): + /eslint-plugin-antfu@0.41.0(eslint@8.49.0)(typescript@5.2.2): resolution: {integrity: sha512-JeEeDZgz7oqYPYWYNQHdXrKaW2nhJz/70jeMZUkaNjVp72cpsJPH3idiEhIhGu3wjFdsOMCoEkboT/DQXlCaqA==} dependencies: - '@typescript-eslint/utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.5.0(eslint@8.49.0)(typescript@5.2.2) transitivePeerDependencies: - eslint - supports-color - typescript dev: true - /eslint-plugin-eslint-comments@3.2.0(eslint@8.48.0): + /eslint-plugin-eslint-comments@3.2.0(eslint@8.49.0): resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} peerDependencies: eslint: '>=4.19.1' dependencies: escape-string-regexp: 1.0.5 - eslint: 8.48.0 + eslint: 8.49.0 ignore: 5.2.4 dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.5.0)(eslint@8.48.0): + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.5.0)(eslint@8.49.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: @@ -6225,16 +6221,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.5.0(eslint@8.49.0)(typescript@5.2.2) array-includes: 3.1.6 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.48.0 + eslint: 8.49.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint@8.48.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint@8.49.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -6250,40 +6246,40 @@ packages: - supports-color dev: true - /eslint-plugin-jsonc@2.9.0(eslint@8.48.0): + /eslint-plugin-jsonc@2.9.0(eslint@8.49.0): resolution: {integrity: sha512-RK+LeONVukbLwT2+t7/OY54NJRccTXh/QbnXzPuTLpFMVZhPuq1C9E07+qWenGx7rrQl0kAalAWl7EmB+RjpGA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) - eslint: 8.48.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) + eslint: 8.49.0 jsonc-eslint-parser: 2.3.0 natural-compare: 1.4.0 dev: true - /eslint-plugin-markdown@3.0.1(eslint@8.48.0): + /eslint-plugin-markdown@3.0.1(eslint@8.49.0): resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.48.0 + eslint: 8.49.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.48.0): + /eslint-plugin-react-hooks@4.6.0(eslint@8.49.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.48.0 + eslint: 8.49.0 dev: true - /eslint-plugin-react@7.33.2(eslint@8.48.0): + /eslint-plugin-react@7.33.2(eslint@8.49.0): resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} engines: {node: '>=4'} peerDependencies: @@ -6294,7 +6290,7 @@ packages: array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 es-iterator-helpers: 1.0.14 - eslint: 8.48.0 + eslint: 8.49.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 @@ -6308,17 +6304,17 @@ packages: string.prototype.matchall: 4.0.9 dev: true - /eslint-plugin-unicorn@48.0.1(eslint@8.48.0): + /eslint-plugin-unicorn@48.0.1(eslint@8.49.0): resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} engines: {node: '>=16'} peerDependencies: eslint: '>=8.44.0' dependencies: '@babel/helper-validator-identifier': 7.22.15 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) ci-info: 3.8.0 clean-regexp: 1.0.0 - eslint: 8.48.0 + eslint: 8.49.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -6332,7 +6328,7 @@ packages: strip-indent: 3.0.0 dev: true - /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.5.0)(eslint@8.48.0): + /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.5.0)(eslint@8.49.0): resolution: {integrity: sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -6342,37 +6338,37 @@ packages: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2) - eslint: 8.48.0 + '@typescript-eslint/eslint-plugin': 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.49.0)(typescript@5.2.2) + eslint: 8.49.0 eslint-rule-composer: 0.3.0 dev: true - /eslint-plugin-vue@9.17.0(eslint@8.48.0): + /eslint-plugin-vue@9.17.0(eslint@8.49.0): resolution: {integrity: sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) - eslint: 8.48.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) + eslint: 8.49.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.0.13 semver: 7.5.4 - vue-eslint-parser: 9.3.1(eslint@8.48.0) + vue-eslint-parser: 9.3.1(eslint@8.49.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-yml@1.8.0(eslint@8.48.0): + /eslint-plugin-yml@1.8.0(eslint@8.49.0): resolution: {integrity: sha512-fgBiJvXD0P2IN7SARDJ2J7mx8t0bLdG6Zcig4ufOqW5hOvSiFxeUyc2g5I1uIm8AExbo26NNYCcTGZT0MXTsyg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 - eslint: 8.48.0 + eslint: 8.49.0 lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.2 @@ -6405,15 +6401,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.48.0: - resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} + /eslint@8.49.0: + resolution: {integrity: sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) '@eslint-community/regexpp': 4.8.0 '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.48.0 + '@eslint/js': 8.49.0 '@humanwhocodes/config-array': 0.11.11 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -6709,8 +6705,8 @@ packages: resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} dev: false - /fastify@4.22.0: - resolution: {integrity: sha512-HLoBmetdQ6zaJohKW6jzUww8NnwHzkbIbUEyAzM+Nnf7cZVSXRuUV+6b2/xLmu6GGkruIFJ/bIQoKWYRx4wnAQ==} + /fastify@4.22.2: + resolution: {integrity: sha512-rK8mF/1mZJHH6H/L22OhmilTgrp5XMkk3RHcSy03LC+TJ6+wLhbq+4U62bjns15VzIbBNgxTqAForBqtGAa0NQ==} dependencies: '@fastify/ajv-compiler': 3.5.0 '@fastify/error': 3.3.0 @@ -6721,7 +6717,7 @@ packages: fast-json-stringify: 5.8.0 find-my-way: 7.6.2 light-my-request: 5.10.0 - pino: 8.15.0 + pino: 8.15.1 process-warning: 2.2.0 proxy-addr: 2.0.7 rfdc: 1.3.0 @@ -6758,7 +6754,7 @@ packages: object-assign: 4.1.1 promise: 7.3.1 setimmediate: 1.0.5 - ua-parser-js: 1.0.35 + ua-parser-js: 1.0.36 transitivePeerDependencies: - encoding dev: false @@ -6949,7 +6945,7 @@ packages: semver: 7.5.4 tapable: 2.2.1 typescript: 5.1.6 - webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.20) + webpack: 5.88.2(@swc/core@1.3.84)(esbuild@0.18.20) dev: false /form-data-encoder@2.1.4: @@ -6982,8 +6978,8 @@ packages: resolution: {integrity: sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==} dev: false - /framer-motion@10.16.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1OMs6wY964hX8YjiCeYQlgrZDbkKvZztnynTUgUZjdzq2au6PZUsodmUY6GAudUgImrWqTrtpSwMbi1ETmIx4A==} + /framer-motion@10.16.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 @@ -8251,7 +8247,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.5.9 + '@types/node': 20.6.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -8263,8 +8259,8 @@ packages: resolution: {integrity: sha512-56ns1XlSI8d5V0t7hilPu8dMbE4YIwrTJU6e7bV1Abyu6oel4tSc4YmD742MoWV3U+vn7O0WlKpinzu2DP0HWw==} dev: false - /jotai@2.4.1(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-S4CTLpsZV+LABBXL5PgkMl+5jK3ljfbWmcLqtN7CQ2vio/Hrg3T6IKk/vf2/9hnp1imTPDsaFv7D54de/7Sa+w==} + /jotai@2.4.2(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-90jXVOd9h6gi5JXk558M+wnJfaaVN2WegcNOCfiFbWboNaDl6DkRgiY/K1oeqTfYJmq8yM7XPsL99LAvcOPqhw==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=17.0.0' @@ -8671,8 +8667,8 @@ packages: engines: {node: '>=12'} dev: true - /lucide-react@0.274.0(react@18.2.0): - resolution: {integrity: sha512-qiWcojRXEwDiSimMX1+arnxha+ROJzZjJaVvCC0rsG6a9pUPjZePXSq7em4ZKMp0NDm1hyzPNkM7UaWC3LU2AA==} + /lucide-react@0.276.0(react@18.2.0): + resolution: {integrity: sha512-ubP1Tyj67nsy84/ikelrFcjj7eEkD6hg9H/1Mhk22CGpbvPtEd3r8sMFQQ1YdpePx70Nt4oYIMfTPHZlag+ZLQ==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 dependencies: @@ -9108,7 +9104,7 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - /nestjs-pino@3.4.0(@nestjs/common@10.2.4)(pino-http@8.5.0): + /nestjs-pino@3.4.0(@nestjs/common@10.2.5)(pino-http@8.5.0): resolution: {integrity: sha512-L79tk+WqVJApGxD4K40srSHopwlBX8WVPoIJtVhWaxJUfk9ND6eZp7kmgdgwQw8PpYUeoeOhS1g2j0Ep3c0NJA==} engines: {node: '>= 14'} requiresBuild: true @@ -9116,7 +9112,7 @@ packages: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 dependencies: - '@nestjs/common': 10.2.4(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.5(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) pino-http: 8.5.0 dev: false @@ -9132,7 +9128,7 @@ packages: type-fest: 2.19.0 dev: true - /next-auth@4.23.1(next@13.4.19)(nodemailer@6.9.4)(react-dom@18.2.0)(react@18.2.0): + /next-auth@4.23.1(next@13.4.19)(nodemailer@6.9.5)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-mL083z8KgRtlrIV6CDca2H1kduWJuK/3pTS0Fe2og15KOm4v2kkLGdSDfc2g+019aEBrJUT0pPW2Xx42ImN1WA==} peerDependencies: next: ^12.2.5 || ^13 @@ -9148,7 +9144,7 @@ packages: cookie: 0.5.0 jose: 4.14.5 next: 13.4.19(react-dom@18.2.0)(react@18.2.0) - nodemailer: 6.9.4 + nodemailer: 6.9.5 oauth: 0.9.15 openid-client: 5.4.3 preact: 10.17.1 @@ -9289,8 +9285,8 @@ packages: /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - /nodemailer@6.9.4: - resolution: {integrity: sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==} + /nodemailer@6.9.5: + resolution: {integrity: sha512-/dmdWo62XjumuLc5+AYQZeiRj+PRR8y8qKtFCOyuOl1k/hckZd8durUUHs/ucKx6/8kN+wFxqKJlQ/LK/qR5FA==} engines: {node: '>=6.0.0'} dev: false @@ -9932,11 +9928,18 @@ packages: split2: 4.2.0 dev: false + /pino-abstract-transport@1.1.0: + resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + dependencies: + readable-stream: 4.4.2 + split2: 4.2.0 + dev: false + /pino-http@8.5.0: resolution: {integrity: sha512-kLGKNLyfWfdmrG1Ug0YdYpCTGbNcuD/YGC3g+elRU/Cm44UTs+tj/dZTxDN3bYauekxFxdLZhJuZdKKl0cml9w==} dependencies: get-caller-file: 2.0.5 - pino: 8.15.0 + pino: 8.15.1 pino-std-serializers: 6.2.2 process-warning: 2.2.0 dev: false @@ -9965,14 +9968,14 @@ packages: resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} dev: false - /pino@8.15.0: - resolution: {integrity: sha512-olUADJByk4twxccmAxb1RiGKOSvddHugCV3wkqjyv+3Sooa2KLrmXrKEWOKi0XPCLasRR5jBXxioE1jxUa4KzQ==} + /pino@8.15.1: + resolution: {integrity: sha512-Cp4QzUQrvWCRJaQ8Lzv0mJzXVk4z2jlq8JNKMGaixC2Pz5L4l2p95TkuRvYbrEbe85NQsDKrAd4zalf7Ml6WiA==} hasBin: true dependencies: atomic-sleep: 1.0.0 fast-redact: 3.3.0 on-exit-leak-free: 2.1.0 - pino-abstract-transport: 1.0.0 + pino-abstract-transport: 1.1.0 pino-std-serializers: 6.2.2 process-warning: 2.2.0 quick-format-unescaped: 4.0.4 @@ -10032,7 +10035,7 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.29 - ts-node: 10.9.1(@swc/core@1.3.82)(@types/node@20.5.9)(typescript@5.2.2) + ts-node: 10.9.1(@swc/core@1.3.84)(@types/node@20.6.0)(typescript@5.2.2) yaml: 2.3.2 /postcss-nested@6.0.1(postcss@8.4.29): @@ -10097,13 +10100,13 @@ packages: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} dev: false - /prisma@5.2.0: - resolution: {integrity: sha512-FfFlpjVCkZwrqxDnP4smlNYSH1so+CbfjgdpioFzGGqlQAEm6VHAYSzV7jJgC3ebtY9dNOhDMS2+4/1DDSM7bQ==} + /prisma@5.3.0: + resolution: {integrity: sha512-eLUR2gyKk8iRLAfy1H3Jel4SZQmjauTPTYX4UFFmwrMTrPnQzipspt48s6e45H5PKYq9zT5MQ9qWbkq9Ru4EAg==} engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 5.2.0 + '@prisma/engines': 5.3.0 /proc-log@3.0.0: resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} @@ -10291,14 +10294,6 @@ packages: react: 18.2.0 dev: false - /react-icons@4.10.1(react@18.2.0): - resolution: {integrity: sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==} - peerDependencies: - react: '*' - dependencies: - react: 18.2.0 - dev: false - /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -11553,8 +11548,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /swagger-ui-dist@5.4.2: - resolution: {integrity: sha512-vT5QxP/NOr9m4gLZl+SpavWI3M9Fdh30+Sdw9rEtZbkqNmNNEPhjXas2xTD9rsJYYdLzAiMfwXvtooWH3xbLJA==} + /swagger-ui-dist@5.6.2: + resolution: {integrity: sha512-2LKVuU2m6RHkemJloKiKJOTpN2RPmbsiad0OfSdtmFHOXJKAgYRZMwJcpT96RX6E9HUB5RkVOFC6vWqVjRgSOg==} dev: false /symbol-observable@4.0.0: @@ -11638,7 +11633,7 @@ packages: - supports-color dev: true - /terser-webpack-plugin@5.3.9(@swc/core@1.3.82)(esbuild@0.18.20)(webpack@5.88.2): + /terser-webpack-plugin@5.3.9(@swc/core@1.3.84)(esbuild@0.18.20)(webpack@5.88.2): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -11655,13 +11650,13 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.19 - '@swc/core': 1.3.82 + '@swc/core': 1.3.84 esbuild: 0.18.20 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.19.3 - webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.20) + webpack: 5.88.2(@swc/core@1.3.84)(esbuild@0.18.20) /terser@5.19.3: resolution: {integrity: sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==} @@ -11810,10 +11805,10 @@ packages: micromatch: 4.0.5 semver: 7.5.4 typescript: 5.2.2 - webpack: 5.88.2(@swc/core@1.3.82)(esbuild@0.18.20) + webpack: 5.88.2(@swc/core@1.3.84)(esbuild@0.18.20) dev: true - /ts-node@10.9.1(@swc/core@1.3.82)(@types/node@20.5.9)(typescript@5.2.2): + /ts-node@10.9.1(@swc/core@1.3.84)(@types/node@20.6.0)(typescript@5.2.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -11828,12 +11823,12 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.3.82 + '@swc/core': 1.3.84 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.5.9 + '@types/node': 20.6.0 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -11882,7 +11877,7 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /tsup@7.2.0(@swc/core@1.3.82)(ts-node@10.9.1)(typescript@5.2.2): + /tsup@7.2.0(@swc/core@1.3.84)(ts-node@10.9.1)(typescript@5.2.2): resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} engines: {node: '>=16.14'} hasBin: true @@ -11898,7 +11893,7 @@ packages: typescript: optional: true dependencies: - '@swc/core': 1.3.82 + '@swc/core': 1.3.84 bundle-require: 4.0.1(esbuild@0.18.20) cac: 6.7.14 chokidar: 3.5.3 @@ -11919,13 +11914,13 @@ packages: - ts-node dev: true - /tsx@3.12.8: - resolution: {integrity: sha512-Lt9KYaRGF023tlLInPj8rgHwsZU8qWLBj4iRXNWxTfjIkU7canGL806AqKear1j722plHuiYNcL2ZCo6uS9UJA==} + /tsx@3.12.9: + resolution: {integrity: sha512-N9Cpuiy55IcemQ2kouH1ZqDvjUa31mkhIYmnJKnvDp0sLQrK9MUrRuN/XzW70iTk5a2kX2A63wLYWORwa34vug==} hasBin: true dependencies: '@esbuild-kit/cjs-loader': 2.4.2 - '@esbuild-kit/core-utils': 3.2.2 - '@esbuild-kit/esm-loader': 2.5.5 + '@esbuild-kit/core-utils': 3.3.0 + '@esbuild-kit/esm-loader': 2.6.3 optionalDependencies: fsevents: 2.3.3 dev: true @@ -12064,8 +12059,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - /ua-parser-js@1.0.35: - resolution: {integrity: sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==} + /ua-parser-js@1.0.36: + resolution: {integrity: sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==} dev: false /uc.micro@1.0.6: @@ -12333,14 +12328,14 @@ packages: d3-timer: 3.0.1 dev: false - /vue-eslint-parser@9.3.1(eslint@8.48.0): + /vue-eslint-parser@9.3.1(eslint@8.49.0): resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 - eslint: 8.48.0 + eslint: 8.49.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -12401,7 +12396,7 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack@5.88.2(@swc/core@1.3.82)(esbuild@0.18.20): + /webpack@5.88.2(@swc/core@1.3.84)(esbuild@0.18.20): resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -12432,7 +12427,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(@swc/core@1.3.82)(esbuild@0.18.20)(webpack@5.88.2) + terser-webpack-plugin: 5.3.9(@swc/core@1.3.84)(esbuild@0.18.20)(webpack@5.88.2) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: From 59445401c37995977dbc491c3fd6c89be28ecb2d Mon Sep 17 00:00:00 2001 From: chenyueban <jasonchan0527@gmail.com> Date: Wed, 13 Sep 2023 20:53:08 +0800 Subject: [PATCH 17/23] refactor: code style --- .../app/[locale]/[projectId]/issues/page.tsx | 1 - .../web/app/[locale]/auth/signin/signin.tsx | 18 ++++++++++-------- packages/web/components/empty-issues.tsx | 5 +---- .../web/components/event-detail-action.tsx | 5 +---- .../web/components/event-detail-profile.tsx | 5 +---- packages/web/components/event-detail-stack.tsx | 6 +----- packages/web/components/event-detail-user.tsx | 6 +----- packages/web/components/footer.tsx | 5 +---- packages/web/components/index.ts | 0 .../web/components/issue-related-metadata.tsx | 5 +---- .../web/components/issue-related-rrweb.tsx | 5 +---- packages/web/components/layout.tsx | 6 ++---- packages/web/components/loading.tsx | 5 +---- packages/web/components/login-button.tsx | 5 +---- packages/web/components/project.tsx | 5 +---- packages/web/components/release-list.tsx | 5 +---- packages/web/components/spinning.tsx | 6 +----- packages/web/components/theme.tsx | 5 +---- 18 files changed, 26 insertions(+), 72 deletions(-) delete mode 100644 packages/web/components/index.ts diff --git a/packages/web/app/[locale]/[projectId]/issues/page.tsx b/packages/web/app/[locale]/[projectId]/issues/page.tsx index f655144..8feedcd 100644 --- a/packages/web/app/[locale]/[projectId]/issues/page.tsx +++ b/packages/web/app/[locale]/[projectId]/issues/page.tsx @@ -2,7 +2,6 @@ import EmptyIssues from '~/components/empty-issues' import IssueList from '~/components/issue-list' - import Wrapper from '~/components/wrapper' export default function IssuesPage() { diff --git a/packages/web/app/[locale]/auth/signin/signin.tsx b/packages/web/app/[locale]/auth/signin/signin.tsx index 36b9579..8c4e8a3 100644 --- a/packages/web/app/[locale]/auth/signin/signin.tsx +++ b/packages/web/app/[locale]/auth/signin/signin.tsx @@ -11,7 +11,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { z } from 'zod' import { type SignInResponse } from 'next-auth/react' import { type Project, type User } from '@prisma/client' -import { type Dispatch, type FC, type SetStateAction } from 'react' +import { type Dispatch, type SetStateAction } from 'react' import { inviteAtom } from '~/atoms/invite' import { Button } from '~/components/ui/button' import { Input } from '~/components/ui/input' @@ -41,11 +41,11 @@ interface Props { interface EmailSignInData { email: string } - -const EmailSignIn: FC<{ +interface EmailSignInProps { setStep: Dispatch<SetStateAction<number>> onSignIn: (type: string, options: Record<string, any>) => void -}> = ({ setStep, onSignIn }) => { +} +function EmailSignIn({ setStep, onSignIn }: EmailSignInProps) { const ct = useTranslations('Common') const formSchema = z.object({ email: z.string().email().min(2, { message: ct('mustBeTheCorrectEmailAddress') }) }) const form = useForm<z.infer<typeof formSchema>>({ resolver: zodResolver(formSchema) }) @@ -92,9 +92,10 @@ const EmailSignIn: FC<{ ) } -const GithubSignIn: FC<Props & { +type GithubSignInProps = Props & { onSignIn: (type: string, options: Record<string, any>) => void -}> = ({ providers, onSignIn }) => { +} +function GithubSignIn({ providers, onSignIn }: GithubSignInProps) { const handleSignInGithub = useCallback(() => { onSignIn(providers.github.id, { callbackUrl: '/' }) }, [providers]) @@ -113,9 +114,10 @@ interface AccountSignInData { email: string password: string } -const AccountSignIn: FC<{ +interface AccountSignInProps { onSignIn: (type: string, options: Record<string, any>) => Promise<SignInResponse | undefined> -}> = ({ onSignIn }) => { +} +function AccountSignIn({ onSignIn }: AccountSignInProps) { const ct = useTranslations('Common') const router = useRouter() const formSchema = z.object({ diff --git a/packages/web/components/empty-issues.tsx b/packages/web/components/empty-issues.tsx index d99cfb9..436f5a7 100644 --- a/packages/web/components/empty-issues.tsx +++ b/packages/web/components/empty-issues.tsx @@ -2,11 +2,10 @@ import Link from 'next/link' import { useTranslations } from 'next-intl' -import { type FC } from 'react' import useCurrentProject from '~/hooks/use-current-project' import { Button } from '~/components/ui/button' -const EmptyIssues: FC = () => { +export default function EmptyIssues() { const { projectId } = useCurrentProject() const t = useTranslations('Issues.Empty') return ( @@ -37,5 +36,3 @@ const EmptyIssues: FC = () => { </div> ) } - -export default EmptyIssues diff --git a/packages/web/components/event-detail-action.tsx b/packages/web/components/event-detail-action.tsx index de25064..b82f4ac 100644 --- a/packages/web/components/event-detail-action.tsx +++ b/packages/web/components/event-detail-action.tsx @@ -3,7 +3,6 @@ import dayjs from 'dayjs' import { useMemo } from 'react' import { type OhbugEventLike } from 'common' -import { type FC } from 'react' import { type OhbugAction } from '@ohbug/types' import Wrapper from './wrapper' import AccordionSection from './accordion-section' @@ -15,7 +14,7 @@ interface Props { event: OhbugEventLike } -const EventDetailActions: FC<Props> = ({ event }) => { +export default function EventDetailActions({ event }: Props) { const actions = useMemo<OhbugAction[]>(() => [ ...event?.actions ?? [], { type: 'exception', @@ -71,5 +70,3 @@ const EventDetailActions: FC<Props> = ({ event }) => { </Wrapper> ) } - -export default EventDetailActions diff --git a/packages/web/components/event-detail-profile.tsx b/packages/web/components/event-detail-profile.tsx index 0b24618..0ae9f46 100644 --- a/packages/web/components/event-detail-profile.tsx +++ b/packages/web/components/event-detail-profile.tsx @@ -3,7 +3,6 @@ import dayjs from 'dayjs' import { useMemo } from 'react' import { useTranslations } from 'next-intl' -import { type FC } from 'react' import { type OhbugEventLike } from 'common' import Link from 'next/link' import Wrapper from './wrapper' @@ -17,7 +16,7 @@ interface Props { event: OhbugEventLike | any } -const EventDetailProfile: FC<Props> = ({ event }) => { +export default function EventDetailProfile({ event }: Props) { const t = useTranslations('Event') const deviceInfo = useMemo(() => getDeviceInfo(event), [event]) const tagList = useMemo(() => { @@ -251,5 +250,3 @@ const EventDetailProfile: FC<Props> = ({ event }) => { </Wrapper> ) } - -export default EventDetailProfile diff --git a/packages/web/components/event-detail-stack.tsx b/packages/web/components/event-detail-stack.tsx index db584a9..0fcc5ab 100644 --- a/packages/web/components/event-detail-stack.tsx +++ b/packages/web/components/event-detail-stack.tsx @@ -1,9 +1,7 @@ 'use client' -import { type FC } from 'react' import { type OhbugEventLike } from 'common' import StackInfo from './stack-info' - import Wrapper from './wrapper' import AccordionSection from './accordion-section' import { renderStringOrJson } from '~/libs/utils' @@ -12,7 +10,7 @@ interface Props { event: OhbugEventLike } -const EventDetailStack: FC<Props> = ({ event }) => { +export default function EventDetailStack({ event }: Props) { return ( <Wrapper> <AccordionSection @@ -69,5 +67,3 @@ const EventDetailStack: FC<Props> = ({ event }) => { </Wrapper> ) } - -export default EventDetailStack diff --git a/packages/web/components/event-detail-user.tsx b/packages/web/components/event-detail-user.tsx index 8ea47a1..f245cb0 100644 --- a/packages/web/components/event-detail-user.tsx +++ b/packages/web/components/event-detail-user.tsx @@ -1,9 +1,7 @@ 'use client' import dynamic from 'next/dynamic' -import { type FC } from 'react' import { type OhbugEventLike } from 'common' - import Wrapper from './wrapper' import AccordionSection from './accordion-section' @@ -13,7 +11,7 @@ interface Props { event: OhbugEventLike | any } -const EventDetailUser: FC<Props> = ({ event }) => { +export default function EventDetailUser({ event }: Props) { return ( <Wrapper> <AccordionSection title="Event User"> @@ -22,5 +20,3 @@ const EventDetailUser: FC<Props> = ({ event }) => { </Wrapper> ) } - -export default EventDetailUser diff --git a/packages/web/components/footer.tsx b/packages/web/components/footer.tsx index 2ff53c5..16126e8 100644 --- a/packages/web/components/footer.tsx +++ b/packages/web/components/footer.tsx @@ -1,12 +1,11 @@ 'use client' import Link from 'next/link' -import { type FC } from 'react' import Logo from './logo' import Intl from './intl' import Theme from './theme' -const Footer: FC = () => { +export default function Footer() { return ( <footer className="flex items-center justify-between"> <div className="flex items-center gap-4"> @@ -38,5 +37,3 @@ const Footer: FC = () => { </footer> ) } - -export default Footer diff --git a/packages/web/components/index.ts b/packages/web/components/index.ts deleted file mode 100644 index e69de29..0000000 diff --git a/packages/web/components/issue-related-metadata.tsx b/packages/web/components/issue-related-metadata.tsx index 3cc9b1f..2c4feee 100644 --- a/packages/web/components/issue-related-metadata.tsx +++ b/packages/web/components/issue-related-metadata.tsx @@ -3,7 +3,6 @@ import dynamic from 'next/dynamic' import { useMemo } from 'react' import { type OhbugEventLike } from 'common' -import { type FC } from 'react' import AccordionSection from './accordion-section' import Wrapper from './wrapper' @@ -15,7 +14,7 @@ interface Props { tab: string } -const IssueRelatedMetadata: FC<Props> = ({ event, tab }) => { +export default function IssueRelatedMetadata({ event, tab }: Props) { const metadata = useMemo(() => { if (typeof event.metadata === 'string') { return JSON.parse(event.metadata) @@ -31,5 +30,3 @@ const IssueRelatedMetadata: FC<Props> = ({ event, tab }) => { </Wrapper> ) } - -export default IssueRelatedMetadata diff --git a/packages/web/components/issue-related-rrweb.tsx b/packages/web/components/issue-related-rrweb.tsx index 12e392d..8cbbb54 100644 --- a/packages/web/components/issue-related-rrweb.tsx +++ b/packages/web/components/issue-related-rrweb.tsx @@ -5,7 +5,6 @@ import RrwebPlayer from 'rrweb-player' import { unpack } from 'rrweb' import { useMount } from 'react-use' import { type OhbugEventLike } from 'common' -import { type FC } from 'react' import Wrapper from '~/components/wrapper' import 'rrweb-player/dist/style.css' @@ -14,7 +13,7 @@ interface Props { event: OhbugEventLike } -const IssueRelatedRrweb: FC<Props> = ({ event }) => { +export default function IssueRelatedRrweb({ event }: Props) { const rootRef = useRef<HTMLDivElement>(null) useMount(() => { if (rootRef.current && rootRef.current.children.length === 0) { @@ -34,5 +33,3 @@ const IssueRelatedRrweb: FC<Props> = ({ event }) => { </Wrapper> ) } - -export default IssueRelatedRrweb diff --git a/packages/web/components/layout.tsx b/packages/web/components/layout.tsx index 3b68bae..ea9cdcc 100644 --- a/packages/web/components/layout.tsx +++ b/packages/web/components/layout.tsx @@ -2,7 +2,7 @@ import { useState } from 'react' import { useIsomorphicLayoutEffect, useWindowScroll } from 'react-use' -import { type FC, type ReactNode } from 'react' +import { type ReactNode } from 'react' import Nav from './nav' import NavMenu from './nav-menu' import User from './user' @@ -18,7 +18,7 @@ interface Props { children: ReactNode } -const Layout: FC<Props> = ({ children }) => { +export default function Layout({ children }: Props) { const { y } = useWindowScroll() const [scrollNavVisible, setScrollNavVisible] = useState(false) @@ -103,5 +103,3 @@ const Layout: FC<Props> = ({ children }) => { </> ) } - -export default Layout diff --git a/packages/web/components/loading.tsx b/packages/web/components/loading.tsx index ab29a7b..e6ae337 100644 --- a/packages/web/components/loading.tsx +++ b/packages/web/components/loading.tsx @@ -1,10 +1,7 @@ 'use client' -import { type FC } from 'react' import Spinning from './spinning' -const Loading: FC = () => { +export default function Loading() { return <div className="flex items-center justify-center"><Spinning /></div> } - -export default Loading diff --git a/packages/web/components/login-button.tsx b/packages/web/components/login-button.tsx index 6e61f70..bce07f2 100644 --- a/packages/web/components/login-button.tsx +++ b/packages/web/components/login-button.tsx @@ -1,10 +1,9 @@ 'use client' import { signIn, signOut, useSession } from 'next-auth/react' -import { type FC } from 'react' import { Button } from '~/components/ui/button' -const LoginButton: FC = () => { +export default function LoginButton() { const { data: session } = useSession() if (session) { return ( @@ -29,5 +28,3 @@ const LoginButton: FC = () => { </> ) } - -export default LoginButton diff --git a/packages/web/components/project.tsx b/packages/web/components/project.tsx index 74dc07c..6aad10b 100644 --- a/packages/web/components/project.tsx +++ b/packages/web/components/project.tsx @@ -4,7 +4,6 @@ import { useCallback, useEffect, useMemo, useState } from 'react' import { type User } from '@prisma/client' import { usePathname, useRouter } from 'next-intl/client' import { useSession } from 'next-auth/react' -import { type FC } from 'react' import Loading from './loading' import { useStore } from '~/store' import { serviceGetProjectsWithEventCount } from '~/services/projects' @@ -15,7 +14,7 @@ import { Popover, PopoverContent, PopoverTrigger } from '~/components/ui/popover import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator } from '~/components/ui/command' import { cn } from '~/libs/utils' -const ProjectComponent: FC = () => { +export default function ProjectComponent() { const router = useRouter() const pathname = usePathname() const session = useSession() @@ -122,5 +121,3 @@ const ProjectComponent: FC = () => { </Popover> ) } - -export default ProjectComponent diff --git a/packages/web/components/release-list.tsx b/packages/web/components/release-list.tsx index a912d57..14a4a11 100644 --- a/packages/web/components/release-list.tsx +++ b/packages/web/components/release-list.tsx @@ -4,7 +4,6 @@ import { useCallback } from 'react' import dayjs from 'dayjs' import Link from 'next/link' import { type Release } from '@prisma/client' -import { type FC } from 'react' import useCurrentProject from '~/hooks/use-current-project' import { serviceDeleteRelease } from '~/services/releases' import { useToast } from '~/components/ui/use-toast' @@ -16,7 +15,7 @@ interface Props { releases: Release[] mutate: () => Promise<void> } -const ReleaseList: FC<Props> = ({ releases, mutate }) => { +export default function ReleaseList({ releases, mutate }: Props) { const { toast } = useToast() const { projectId } = useCurrentProject() @@ -97,5 +96,3 @@ const ReleaseList: FC<Props> = ({ releases, mutate }) => { </div> ) } - -export default ReleaseList diff --git a/packages/web/components/spinning.tsx b/packages/web/components/spinning.tsx index 1d64379..22ebc5f 100644 --- a/packages/web/components/spinning.tsx +++ b/packages/web/components/spinning.tsx @@ -1,11 +1,7 @@ 'use client' -import { type FC } from 'react' - -const Spinning: FC = () => { +export default function Spinning() { return ( <i className="i-ri-loader-2-line w-6 h-6 animate-spin" /> ) } - -export default Spinning diff --git a/packages/web/components/theme.tsx b/packages/web/components/theme.tsx index 480c77f..0aa842e 100644 --- a/packages/web/components/theme.tsx +++ b/packages/web/components/theme.tsx @@ -1,6 +1,5 @@ 'use client' -import { type FC } from 'react' import { useTheme } from 'next-themes' import { DropdownMenu, @@ -10,7 +9,7 @@ import { } from '~/components/ui/dropdown-menu' import { Button } from '~/components/ui/button' -const Theme: FC = () => { +export default function Theme() { const { setTheme } = useTheme() return ( @@ -39,5 +38,3 @@ const Theme: FC = () => { </DropdownMenu> ) } - -export default Theme From 187ddcfe77ecc634754420ce318aed944a3a493b Mon Sep 17 00:00:00 2001 From: chenyueban <jasonchan0527@gmail.com> Date: Thu, 14 Sep 2023 08:19:13 +0800 Subject: [PATCH 18/23] refactor: refactor issue-list using data-table --- eslint.config.js | 2 +- packages/web/components.json | 2 +- .../{ => data-table}/data-table.tsx | 38 +- packages/web/components/data-table/index.ts | 1 + .../web/components/data-table/pagination.tsx | 91 ++++ packages/web/components/issue-list.tsx | 428 ++++++++---------- 6 files changed, 306 insertions(+), 256 deletions(-) rename packages/web/components/{ => data-table}/data-table.tsx (67%) create mode 100644 packages/web/components/data-table/index.ts create mode 100644 packages/web/components/data-table/pagination.tsx diff --git a/eslint.config.js b/eslint.config.js index 10703a4..9dd855b 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -6,7 +6,7 @@ export default [ rules: { 'import/no-default-export': 'off', '@typescript-eslint/no-extraneous-class': 'off', - '@typescript-eslint/consistent-type-imports': 'off', + // '@typescript-eslint/consistent-type-imports': 'off', }, }, ] diff --git a/packages/web/components.json b/packages/web/components.json index d5b49a3..5636ebd 100644 --- a/packages/web/components.json +++ b/packages/web/components.json @@ -1,6 +1,6 @@ { "$schema": "https://ui.shadcn.com/schema.json", - "style": "default", + "style": "new-york", "rsc": true, "tsx": true, "tailwind": { diff --git a/packages/web/components/data-table.tsx b/packages/web/components/data-table/data-table.tsx similarity index 67% rename from packages/web/components/data-table.tsx rename to packages/web/components/data-table/data-table.tsx index 878e5b3..813c779 100644 --- a/packages/web/components/data-table.tsx +++ b/packages/web/components/data-table/data-table.tsx @@ -3,10 +3,20 @@ import { flexRender, getCoreRowModel, + getSortedRowModel, useReactTable, } from '@tanstack/react-table' -import { type ColumnDef } from '@tanstack/react-table' +import { + type ColumnDef, + + type PaginationState, + type RowSelectionState, + + type SortingState, +} from '@tanstack/react-table' +import { type ReactNode, useEffect, useState } from 'react' +import { DataTablePagination } from './pagination' import Loading from '~/components/loading' import { Table, @@ -20,24 +30,45 @@ import { interface DataTableProps<TData, TValue> { columns: ColumnDef<TData, TValue>[] data?: TData[] + pageCount?: number + empty?: ReactNode + onPaginationChange?: ({ pageIndex, pageSize }: PaginationState) => void } export default function DataTable<TData, TValue>({ columns, data, + pageCount = -1, + empty = 'No results.', + onPaginationChange, }: DataTableProps<TData, TValue>) { if (!data) { return <Loading /> } + const [rowSelection, setRowSelection] = useState<RowSelectionState>({}) + const [sorting, setSorting] = useState<SortingState>([]) + const [pagination, setPagination] = useState<PaginationState>({ pageIndex: 0, pageSize: 10 }) + const table = useReactTable({ data, columns, + pageCount, getCoreRowModel: getCoreRowModel(), + onRowSelectionChange: setRowSelection, + getSortedRowModel: getSortedRowModel(), + onSortingChange: setSorting, + onPaginationChange: setPagination, + state: { rowSelection, sorting, pagination }, + manualPagination: true, }) + useEffect(() => { + onPaginationChange?.(pagination) + }, [pagination]) + return ( - <div> + <div className="space-y-4"> <div className="rounded-md border"> <Table> <TableHeader> @@ -80,13 +111,14 @@ export default function DataTable<TData, TValue>({ className="h-24 text-center" colSpan={columns.length} > - No results. + {empty} </TableCell> </TableRow> )} </TableBody> </Table> </div> + <DataTablePagination table={table} /> </div> ) } diff --git a/packages/web/components/data-table/index.ts b/packages/web/components/data-table/index.ts new file mode 100644 index 0000000..0a65b12 --- /dev/null +++ b/packages/web/components/data-table/index.ts @@ -0,0 +1 @@ +export { default } from './data-table' diff --git a/packages/web/components/data-table/pagination.tsx b/packages/web/components/data-table/pagination.tsx new file mode 100644 index 0000000..1f3ac4e --- /dev/null +++ b/packages/web/components/data-table/pagination.tsx @@ -0,0 +1,91 @@ +import { type Table } from '@tanstack/react-table' +import { Button } from '~/components/ui/button' +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '~/components/ui/select' + +interface DataTablePaginationProps<TData> { + table: Table<TData> +} + +export function DataTablePagination<TData>({ table }: DataTablePaginationProps<TData>) { + return ( + <div className="flex items-center justify-between px-2"> + <div className="flex-1 text-sm text-muted-foreground"> + {table.getFilteredSelectedRowModel().rows.length} of{' '} + {table.getFilteredRowModel().rows.length} row(s) selected. + </div> + <div className="flex items-center space-x-6 lg:space-x-8"> + <div className="flex items-center space-x-2"> + <p className="text-sm font-medium">Rows per page</p> + <Select + value={`${table.getState().pagination.pageSize}`} + onValueChange={(value) => { + table.setPageSize(Number(value)) + }} + > + <SelectTrigger className="h-8 w-[70px]"> + <SelectValue placeholder={table.getState().pagination.pageSize} /> + </SelectTrigger> + <SelectContent side="top"> + {[10, 20, 30, 40, 50].map(pageSize => ( + <SelectItem + key={pageSize} + value={`${pageSize}`} + > + {pageSize} + </SelectItem> + ))} + </SelectContent> + </Select> + </div> + <div className="flex w-[100px] items-center justify-center text-sm font-medium"> + Page {table.getState().pagination.pageIndex + 1} of{' '} + {table.getPageCount()} + </div> + <div className="flex items-center space-x-2"> + <Button + className="hidden h-8 w-8 p-0 lg:flex" + disabled={!table.getCanPreviousPage()} + variant="outline" + onClick={() => table.setPageIndex(0)} + > + <span className="sr-only">Go to first page</span> + <i className="i-ri-arrow-left-double-line h-4 w-4" /> + </Button> + <Button + className="h-8 w-8 p-0" + disabled={!table.getCanPreviousPage()} + variant="outline" + onClick={() => table.previousPage()} + > + <span className="sr-only">Go to previous page</span> + <i className="i-ri-arrow-left-line h-4 w-4" /> + </Button> + <Button + className="h-8 w-8 p-0" + disabled={!table.getCanNextPage()} + variant="outline" + onClick={() => table.nextPage()} + > + <span className="sr-only">Go to next page</span> + <i className="i-ri-arrow-right-line h-4 w-4" /> + </Button> + <Button + className="hidden h-8 w-8 p-0 lg:flex" + disabled={!table.getCanNextPage()} + variant="outline" + onClick={() => table.setPageIndex(table.getPageCount() - 1)} + > + <span className="sr-only">Go to last page</span> + <i className="i-ri-arrow-right-double-line h-4 w-4" /> + </Button> + </div> + </div> + </div> + ) +} diff --git a/packages/web/components/issue-list.tsx b/packages/web/components/issue-list.tsx index e3b3b63..7e1b611 100644 --- a/packages/web/components/issue-list.tsx +++ b/packages/web/components/issue-list.tsx @@ -5,12 +5,10 @@ import Link from 'next/link' import { type Issue } from 'common' import dayjs from 'dayjs' import { useTranslations } from 'next-intl' -import { useDebounce, useSet } from 'react-use' +import { useDebounce } from 'react-use' import { useAtom } from 'jotai' import { type ReactNode } from 'react' -import Pagination from './pagination' -import Spinning from './spinning' -import LineChart from './charts/line-chart' +import { type ColumnDef, type PaginationState } from '@tanstack/react-table' import { type SearchIssuesOrderBy } from '~/services/issues' import { serviceDeleteIssues, @@ -22,6 +20,8 @@ import useCurrentProject from '~/hooks/use-current-project' import { useQuery } from '~/hooks/use-query' import { useInfinite } from '~/hooks/use-infinite' import { issueSortAtom } from '~/atoms/issue' +import LineChart from '~/components/charts/line-chart' +import DataTable from '~/components/data-table' import { useToast } from '~/components/ui/use-toast' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '~/components/ui/dropdown-menu' import { Button } from '~/components/ui/button' @@ -30,19 +30,10 @@ import { Label } from '~/components/ui/label' import { Badge } from '~/components/ui/badge' import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' import { Input } from '~/components/ui/input' -import { Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow } from '~/components/ui/table' import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '~/components/ui/dialog' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '~/components/ui/select' import { Checkbox } from '~/components/ui/checkbox' -const columns = [ - { name: 'SELECT', key: 'select' }, - { name: 'TITLE', key: 'title' }, - { name: 'TRENDS', key: 'trends' }, - { name: 'EVENTSCOUNT', key: 'eventsCount' }, - { name: 'USERSCOUNT', key: 'usersCount' }, -] - interface Props { empty: ReactNode } @@ -64,7 +55,7 @@ export default function IssueList({ empty }: Props) { 500, [query], ) - const { data, size, setSize, isLoading, isReachingEnd, mutate } + const { data, setSize, mutate } = useInfinite<Issue>( index => serviceGetIssues({ @@ -92,63 +83,55 @@ export default function IssueList({ empty }: Props) { }, ) - // handle selected data - const [checkedItems, checkedItemsActions] = useSet(new Set<string>()) - const allChecked = useMemo( - () => - checkedItems?.size > 0 - && checkedItems?.size === data?.length - && Array.from(checkedItems ?? []).every(v => (data?.findIndex(issue => issue.id === v) ?? -1) > -1), - [checkedItems, data], - ) - const handleDeleteIssue = useCallback(() => { - const issueIds = Array.from(checkedItems) - serviceDeleteIssues(issueIds) - .then(() => { - toast({ - title: 'Issue Deleted!', - description: 'Your issues has been deleted!', - }) - mutate() - }) - .catch((error) => { - toast({ - title: 'Alert Delete Error', - description: error.message, - variant: 'destructive', - }) - }) - .finally(() => setOpen(false)) - }, [checkedItems]) - - const renderTitleCell = useCallback((columnKey: string) => { - switch (columnKey) { - case 'select': - return ( + const columns = useMemo<ColumnDef<Issue>[]>( + () => ([ + { + id: 'select', + header: ({ table }) => ( <Checkbox - checked={allChecked} - className="translate-y-[2px]" - onCheckedChange={(value) => { - if (value) { - data?.forEach(issue => checkedItemsActions.add(issue.id)) - } - else { - checkedItemsActions.reset() - } - }} + aria-label="Select all" + checked={table.getIsAllPageRowsSelected()} + onCheckedChange={value => table.toggleAllPageRowsSelected(!!value)} /> - ) - case 'title': - return ( - <div> + ), + cell: ({ row }) => ( + <Checkbox + aria-label="Select row" + checked={row.getIsSelected()} + onCheckedChange={value => row.toggleSelected(!!value)} + /> + ), + }, + { + id: 'title', + header: ({ table }) => { + const handleDeleteIssue = () => { + const checkedIssues = table.getFilteredSelectedRowModel().rows + serviceDeleteIssues(checkedIssues.map(v => v.id)) + .then(() => { + toast({ + title: 'Issue Deleted!', + description: 'Your issues has been deleted!', + }) + mutate() + }) + .catch((error) => { + toast({ + title: 'Alert Delete Error', + description: error.message, + variant: 'destructive', + }) + }) + .finally(() => setOpen(false)) + } + + return ( <div className="flex gap-2"> <Select value={orderBy} - onValueChange={ - e => setOrderBy(e as SearchIssuesOrderBy) - } + onValueChange={e => setOrderBy(e as SearchIssuesOrderBy)} > - <SelectTrigger className="w-40"> + <SelectTrigger className="w-60"> <SelectValue /> </SelectTrigger> <SelectContent> @@ -162,7 +145,7 @@ export default function IssueList({ empty }: Props) { <DropdownMenu> <DropdownMenuTrigger asChild> <Button - disabled={checkedItems.size <= 0} + disabled={table.getFilteredSelectedRowModel().rows.length <= 0} size="icon" variant="outline" > @@ -178,11 +161,103 @@ export default function IssueList({ empty }: Props) { </DropdownMenuItem> </DropdownMenuContent> </DropdownMenu> + <Dialog + open={open} + onOpenChange={setOpen} + > + <DialogContent> + <DialogHeader className="text-lg font-bold"> + <DialogTitle> + Are you sure you want to delete this {table.getFilteredSelectedRowModel().rows.length} issue? + </DialogTitle> + </DialogHeader> + <div>{t('deleteIssuesConfirm')}</div> + <DialogFooter> + <Button + ref={cancelRef} + variant="outline" + onClick={() => setOpen(false)} + > + Cancel + </Button> + <Button + className="ml-3" + variant="destructive" + onClick={handleDeleteIssue} + > + Delete + </Button> + </DialogFooter> + </DialogContent> + </Dialog> </div> - </div> - ) - case 'trends': - return ( + ) + }, + cell: ({ row }) => { + const metadata = JSON.parse(row.original.metadata) || {} + return ( + <div> + <Link + className="cursor-pointer flex items-center w-full line-clamp-2" + href={`/${projectId}/issues/${row.original.id}`} + > + {/* title */} + <span className="font-semibold mr-2">{row.original.type}</span> + { + row.original.releaseStage === 'mock' && ( + <Badge + className="mr-2" + variant="outline" + > + Mock + </Badge> + ) + } + {/* second description */} + <code className="text-stone-500"> + {renderStringOrJson(metadata.filename ?? metadata.others)} + </code> + </Link> + {/* message */} + <div className="text-stone-500 line-clamp-2"> + { + metadata.message ? <code>{renderStringOrJson(metadata.message)}</code> : null + } + </div> + {/* other message (time/appType/...) */} + <div> + {/* appType */} + {/* time */} + <div className="flex items-center text-xs"> + <i className="i-ri-time-line mr-2" /> + <Tooltip> + <TooltipTrigger asChild> + <span>{dayjs(row.original.updatedAt).fromNow()}</span> + </TooltipTrigger> + <TooltipContent> + <span>{ct('lastSeen')} {dayjs(row.original.updatedAt).format('YYYY-MM-DD HH:mm:ss')}</span> + </TooltipContent> + </Tooltip> + + <div className="mx-1">|</div> + + <Tooltip> + <TooltipTrigger asChild> + <span>{dayjs(row.original.createdAt).fromNow()}</span> + </TooltipTrigger> + <TooltipContent> + <span>{ct('firstSeen')} {dayjs(row.original.createdAt).format('YYYY-MM-DD HH:mm:ss')}</span> + </TooltipContent> + </Tooltip> + </div> + </div> + </div> + ) + }, + }, + { + id: 'trends', + header: () => ( <div className="flex items-center gap-2"> <Switch checked={chartType === '24h'} @@ -192,117 +267,43 @@ export default function IssueList({ empty }: Props) { /> <Label htmlFor="trendsType">{chartType === '24h' ? ct('24h') : ct('14d')}</Label> </div> - ) - case 'eventsCount': - return ( - <div className="flex items-center justify-center">Events</div> - ) - case 'usersCount': - return ( - <div className="flex items-center justify-center">Users</div> - ) - default: - return null - } - }, [data, allChecked, checkedItems, trends, data, chartType]) - const renderCell = useCallback((issue: Issue, columnKey: string) => { - const metadata = JSON.parse(issue.metadata) || {} - - switch (columnKey) { - case 'select': - return ( - <Checkbox - checked={checkedItems.has(issue.id)} - className="translate-y-[2px]" - onCheckedChange={value => checkedItemsActions[value ? 'add' : 'remove'](issue.id)} - /> - ) - case 'title': - return ( - <div> - <Link - className="cursor-pointer flex items-center w-full line-clamp-2" - href={`/${projectId}/issues/${issue.id}`} - > - {/* title */} - <span className="font-semibold mr-2">{issue.type}</span> - { - issue.releaseStage === 'mock' && ( - <Badge - className="mr-2" - variant="outline" - > - Mock - </Badge> - ) - } - {/* second description */} - <code className="text-stone-500"> - {renderStringOrJson(metadata.filename ?? metadata.others)} - </code> - </Link> - {/* message */} - <div className="text-stone-500 line-clamp-2"> - { - metadata.message ? <code>{renderStringOrJson(metadata.message)}</code> : null - } - </div> - {/* other message (time/appType/...) */} - <div> - {/* appType */} - {/* time */} - <div className="flex items-center text-xs"> - <i className="i-ri-time-line mr-2" /> - <Tooltip> - <TooltipTrigger asChild> - <span>{dayjs(issue.updatedAt).fromNow()}</span> - </TooltipTrigger> - <TooltipContent> - <span>{ct('lastSeen')} {dayjs(issue.updatedAt).format('YYYY-MM-DD HH:mm:ss')}</span> - </TooltipContent> - </Tooltip> - - <div className="mx-1">|</div> - - <Tooltip> - <TooltipTrigger asChild> - <span>{dayjs(issue.createdAt).fromNow()}</span> - </TooltipTrigger> - <TooltipContent> - <span>{ct('firstSeen')} {dayjs(issue.createdAt).format('YYYY-MM-DD HH:mm:ss')}</span> - </TooltipContent> - </Tooltip> - </div> - </div> - </div> - ) - case 'trends': - return ( + ), + cell: ({ row }) => ( <div className="h-16"> <LineChart - data={trends?.[issue.id]} + data={trends?.[row.original.id]} nameKey="time" tooltipType={chartType === '14d' ? 'a' : 'b'} valueKey="count" /> </div> - ) - case 'eventsCount': - return ( + ), + }, + { + id: 'eventsCount', + header: 'Events', + cell: ({ row }) => ( <div className="flex items-center justify-center"> - {issue._count?.events} + {row.original._count?.events} </div> - ) - case 'usersCount': - return ( + ), + }, + { + id: 'usersCount', + header: 'Users', + cell: ({ row }) => ( <div className="flex items-center justify-center"> - {issue._count?.users} + {row.original._count?.users} </div> - ) - default: - return null - } - }, [checkedItems, projectId, trends, chartType]) + ), + }, + ]), + [orderBy, chartType, data, trends, open], + ) + + const handlePaginationChange = useCallback(({ pageIndex }: PaginationState) => { + setSize(pageIndex) + }, []) return ( <div className="h-full overflow-x-hidden overflow-y-auto space-y-4"> @@ -312,87 +313,12 @@ export default function IssueList({ empty }: Props) { onChange={e => setQuery(e.target.value)} /> - <Table className="rounded-md border"> - <TableCaption> - { - !!data?.length && ( - <div className="flex items-center justify-between w-full"> - <Link href={`/${projectId}/mock`}>Mock Data</Link> - <Pagination - isReachingEnd={!!isReachingEnd} - page={size + 1} - onChange={page => setSize(page - 1)} - /> - </div> - ) - } - </TableCaption> - <TableHeader> - <TableRow> - { - columns.map(column => ( - <TableHead - key={column.key} - className="text-left" - > - {renderTitleCell(column.key)} - </TableHead> - )) - } - </TableRow> - </TableHeader> - <TableBody> - { - data - ? data.map(issue => ( - <TableRow key={issue.id}> - { - columns.map(column => ( - <TableCell>{renderCell(issue, column.key)}</TableCell> - )) - } - </TableRow> - )) - : ( - <TableRow> - <TableCell colSpan={columns.length}> - {isLoading ? <Spinning /> : empty} - </TableCell> - </TableRow> - ) - } - </TableBody> - </Table> - - <Dialog - open={open} - onOpenChange={setOpen} - > - <DialogContent> - <DialogHeader className="text-lg font-bold"> - <DialogTitle> - Are you sure you want to delete this {checkedItems.size} issue? - </DialogTitle> - </DialogHeader> - <div>{t('deleteIssuesConfirm')}</div> - <DialogFooter> - <Button - ref={cancelRef} - variant="outline" - onClick={() => setOpen(false)} - > - Cancel - </Button> - <Button - className="ml-3" - variant="destructive" - onClick={handleDeleteIssue} - > - Delete - </Button> - </DialogFooter> - </DialogContent> - </Dialog> + <DataTable + columns={columns} + data={data} + empty={empty} + onPaginationChange={handlePaginationChange} + /> </div> ) } From 10b21847b7239bf536eaef4ca3ba0a50bc2f3be0 Mon Sep 17 00:00:00 2001 From: chenyueban <jasonchan0527@gmail.com> Date: Thu, 14 Sep 2023 12:36:23 +0800 Subject: [PATCH 19/23] chore: update deps --- .vscode/settings.json | 5 +- .../[locale]/[projectId]/settings/page.tsx | 2 +- packages/web/components/{ui => }/snippet.tsx | 2 +- packages/web/components/ui/accordion.tsx | 8 +- packages/web/components/ui/avatar.tsx | 2 +- packages/web/components/ui/badge.tsx | 6 +- packages/web/components/ui/button.tsx | 24 +-- packages/web/components/ui/card.tsx | 9 +- packages/web/components/ui/checkbox.tsx | 6 +- packages/web/components/ui/command.tsx | 20 +- packages/web/components/ui/dialog.tsx | 12 +- packages/web/components/ui/dropdown-menu.tsx | 26 ++- packages/web/components/ui/form.tsx | 18 +- packages/web/components/ui/input.tsx | 2 +- .../web/components/ui/navigation-menu.tsx | 10 +- packages/web/components/ui/popover.tsx | 2 +- packages/web/components/ui/select.tsx | 19 +- packages/web/components/ui/separator.tsx | 2 +- packages/web/components/ui/skeleton.tsx | 2 +- packages/web/components/ui/switch.tsx | 4 +- packages/web/components/ui/table.tsx | 13 +- packages/web/components/ui/tabs.tsx | 6 +- packages/web/components/ui/toast.tsx | 16 +- packages/web/components/ui/tooltip.tsx | 11 +- packages/web/package.json | 4 +- pnpm-lock.yaml | 181 ++---------------- 26 files changed, 129 insertions(+), 283 deletions(-) rename packages/web/components/{ui => }/snippet.tsx (96%) diff --git a/.vscode/settings.json b/.vscode/settings.json index fce4d2d..aa1fd60 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,8 @@ "ohbug" ], "typescript.tsdk": "node_modules/typescript/lib", - "eslint.experimental.useFlatConfig": true + "eslint.experimental.useFlatConfig": true, + "i18n-ally.localesPaths": [ + "packages/web/messages" + ] } diff --git a/packages/web/app/[locale]/[projectId]/settings/page.tsx b/packages/web/app/[locale]/[projectId]/settings/page.tsx index e9cb046..95ac1e0 100644 --- a/packages/web/app/[locale]/[projectId]/settings/page.tsx +++ b/packages/web/app/[locale]/[projectId]/settings/page.tsx @@ -17,7 +17,7 @@ import { Input } from '~/components/ui/input' import { Button } from '~/components/ui/button' import { Avatar, AvatarFallback, AvatarImage } from '~/components/ui/avatar' import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '~/components/ui/dialog' -import { Snippet } from '~/components/ui/snippet' +import { Snippet } from '~/components/snippet' interface CommonProps { project?: ProjectWithMembers diff --git a/packages/web/components/ui/snippet.tsx b/packages/web/components/snippet.tsx similarity index 96% rename from packages/web/components/ui/snippet.tsx rename to packages/web/components/snippet.tsx index c8e9bfe..e1036b2 100644 --- a/packages/web/components/ui/snippet.tsx +++ b/packages/web/components/snippet.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { type VariantProps, cva } from 'class-variance-authority' import { useCopyToClipboard } from 'react-use' -import { Tooltip, TooltipContent, TooltipTrigger } from './tooltip' +import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' import { cn } from '~/libs/utils' const snippetVariants = cva( diff --git a/packages/web/components/ui/accordion.tsx b/packages/web/components/ui/accordion.tsx index ba80d7f..3d6584d 100644 --- a/packages/web/components/ui/accordion.tsx +++ b/packages/web/components/ui/accordion.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as AccordionPrimitive from '@radix-ui/react-accordion' -import { ChevronDown } from 'lucide-react' +import { ChevronDownIcon } from '@radix-ui/react-icons' import { cn } from '~/libs/utils' @@ -28,13 +28,13 @@ const AccordionTrigger = React.forwardRef< <AccordionPrimitive.Trigger ref={ref} className={cn( - 'flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180', + 'flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180', className, )} {...props} > {children} - <ChevronDown className="h-4 w-4 shrink-0 transition-transform duration-200" /> + <ChevronDownIcon className="h-4 w-4 shrink-0 text-stone-500 transition-transform duration-200 dark:text-stone-400" /> </AccordionPrimitive.Trigger> </AccordionPrimitive.Header> )) @@ -47,7 +47,7 @@ const AccordionContent = React.forwardRef< <AccordionPrimitive.Content ref={ref} className={cn( - 'overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down', + 'overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down', className, )} {...props} diff --git a/packages/web/components/ui/avatar.tsx b/packages/web/components/ui/avatar.tsx index 73133be..7b14fd4 100644 --- a/packages/web/components/ui/avatar.tsx +++ b/packages/web/components/ui/avatar.tsx @@ -39,7 +39,7 @@ const AvatarFallback = React.forwardRef< <AvatarPrimitive.Fallback ref={ref} className={cn( - 'flex h-full w-full items-center justify-center rounded-full bg-muted', + 'flex h-full w-full items-center justify-center rounded-full bg-stone-100 dark:bg-stone-800', className, )} {...props} diff --git a/packages/web/components/ui/badge.tsx b/packages/web/components/ui/badge.tsx index f47b033..2d6d837 100644 --- a/packages/web/components/ui/badge.tsx +++ b/packages/web/components/ui/badge.tsx @@ -4,16 +4,16 @@ import { type VariantProps, cva } from 'class-variance-authority' import { cn } from '~/libs/utils' const badgeVariants = cva( - 'inline-flex items-center rounded-full border border-stone-200 px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-stone-950 focus:ring-offset-2 dark:border-stone-800 dark:focus:ring-stone-300', + 'inline-flex items-center rounded-md border border-stone-200 px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-stone-950 focus:ring-offset-2 dark:border-stone-800 dark:focus:ring-stone-300', { variants: { variant: { default: - 'border-transparent bg-stone-900 text-stone-50 hover:bg-stone-900/80 dark:bg-stone-50 dark:text-stone-900 dark:hover:bg-stone-50/80', + 'border-transparent bg-stone-900 text-stone-50 shadow hover:bg-stone-900/80 dark:bg-stone-50 dark:text-stone-900 dark:hover:bg-stone-50/80', secondary: 'border-transparent bg-stone-100 text-stone-900 hover:bg-stone-100/80 dark:bg-stone-800 dark:text-stone-50 dark:hover:bg-stone-800/80', destructive: - 'border-transparent bg-red-500 text-stone-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-stone-50 dark:hover:bg-red-900/80', + 'border-transparent bg-red-500 text-stone-50 shadow hover:bg-red-500/80 dark:bg-red-900 dark:text-stone-50 dark:hover:bg-red-900/80', outline: 'text-stone-950 dark:text-stone-50', }, }, diff --git a/packages/web/components/ui/button.tsx b/packages/web/components/ui/button.tsx index f0e0d3a..874dd0c 100644 --- a/packages/web/components/ui/button.tsx +++ b/packages/web/components/ui/button.tsx @@ -1,28 +1,30 @@ import * as React from 'react' import { Slot } from '@radix-ui/react-slot' import { type VariantProps, cva } from 'class-variance-authority' + import { cn } from '~/libs/utils' const buttonVariants = cva( - 'inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50', + 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-stone-950 disabled:pointer-events-none disabled:opacity-50 dark:focus-visible:ring-stone-300', { variants: { variant: { - default: 'bg-primary text-primary-foreground hover:bg-primary/90', + default: + 'bg-stone-900 text-stone-50 shadow hover:bg-stone-900/90 dark:bg-stone-50 dark:text-stone-900 dark:hover:bg-stone-50/90', destructive: - 'bg-destructive text-destructive-foreground hover:bg-destructive/90', + 'bg-red-500 text-stone-50 shadow-sm hover:bg-red-500/90 dark:bg-red-900 dark:text-stone-50 dark:hover:bg-red-900/90', outline: - 'border border-input bg-background hover:bg-accent hover:text-accent-foreground', + 'border border-stone-200 bg-transparent shadow-sm hover:bg-stone-100 hover:text-stone-900 dark:border-stone-800 dark:hover:bg-stone-800 dark:hover:text-stone-50', secondary: - 'bg-secondary text-secondary-foreground hover:bg-secondary/80', - ghost: 'hover:bg-accent hover:text-accent-foreground', - link: 'text-primary underline-offset-4 hover:underline', + 'bg-stone-100 text-stone-900 shadow-sm hover:bg-stone-100/80 dark:bg-stone-800 dark:text-stone-50 dark:hover:bg-stone-800/80', + ghost: 'hover:bg-stone-100 hover:text-stone-900 dark:hover:bg-stone-800 dark:hover:text-stone-50', + link: 'text-stone-900 underline-offset-4 hover:underline dark:text-stone-50', }, size: { - default: 'h-10 px-4 py-2', - sm: 'h-9 rounded-md px-3', - lg: 'h-11 rounded-md px-8', - icon: 'h-10 w-10', + default: 'h-9 px-4 py-2', + sm: 'h-8 rounded-md px-3 text-xs', + lg: 'h-10 rounded-md px-8', + icon: 'h-9 w-9', }, }, defaultVariants: { diff --git a/packages/web/components/ui/card.tsx b/packages/web/components/ui/card.tsx index a22d45f..4c6513d 100644 --- a/packages/web/components/ui/card.tsx +++ b/packages/web/components/ui/card.tsx @@ -9,7 +9,7 @@ const Card = React.forwardRef< <div ref={ref} className={cn( - 'rounded-lg border bg-card text-card-foreground shadow-sm', + 'rounded-xl border border-stone-200 bg-white text-stone-950 shadow dark:border-stone-800 dark:bg-stone-950 dark:text-stone-50', className, )} {...props} @@ -35,10 +35,7 @@ const CardTitle = React.forwardRef< >(({ className, ...props }, ref) => ( <h3 ref={ref} - className={cn( - 'text-2xl font-semibold leading-none tracking-tight', - className, - )} + className={cn('font-semibold leading-none tracking-tight', className)} {...props} /> )) @@ -50,7 +47,7 @@ const CardDescription = React.forwardRef< >(({ className, ...props }, ref) => ( <p ref={ref} - className={cn('text-sm text-muted-foreground', className)} + className={cn('text-sm text-stone-500 dark:text-stone-400', className)} {...props} /> )) diff --git a/packages/web/components/ui/checkbox.tsx b/packages/web/components/ui/checkbox.tsx index 18abc0e..c090b70 100644 --- a/packages/web/components/ui/checkbox.tsx +++ b/packages/web/components/ui/checkbox.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as CheckboxPrimitive from '@radix-ui/react-checkbox' -import { Check } from 'lucide-react' +import { CheckIcon } from '@radix-ui/react-icons' import { cn } from '~/libs/utils' @@ -13,7 +13,7 @@ const Checkbox = React.forwardRef< <CheckboxPrimitive.Root ref={ref} className={cn( - 'peer h-4 w-4 shrink-0 rounded-sm border border-stone-200 border-stone-900 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stone-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-stone-900 data-[state=checked]:text-stone-50 dark:border-stone-800 dark:border-stone-50 dark:ring-offset-stone-950 dark:focus-visible:ring-stone-300 dark:data-[state=checked]:bg-stone-50 dark:data-[state=checked]:text-stone-900', + 'peer h-4 w-4 shrink-0 rounded-sm border border-stone-200 border-stone-900 shadow focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-stone-950 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-stone-900 data-[state=checked]:text-stone-50 dark:border-stone-800 dark:border-stone-50 dark:focus-visible:ring-stone-300 dark:data-[state=checked]:bg-stone-50 dark:data-[state=checked]:text-stone-900', className, )} {...props} @@ -21,7 +21,7 @@ const Checkbox = React.forwardRef< <CheckboxPrimitive.Indicator className={cn('flex items-center justify-center text-current')} > - <Check className="h-4 w-4" /> + <CheckIcon className="h-4 w-4" /> </CheckboxPrimitive.Indicator> </CheckboxPrimitive.Root> )) diff --git a/packages/web/components/ui/command.tsx b/packages/web/components/ui/command.tsx index 30b675c..e309d61 100644 --- a/packages/web/components/ui/command.tsx +++ b/packages/web/components/ui/command.tsx @@ -1,8 +1,8 @@ 'use client' import * as React from 'react' +import { MagnifyingGlassIcon } from '@radix-ui/react-icons' import { Command as CommandPrimitive } from 'cmdk' -import { Search } from 'lucide-react' import { type DialogProps } from '@radix-ui/react-dialog' import { cn } from '~/libs/utils' @@ -15,7 +15,7 @@ const Command = React.forwardRef< <CommandPrimitive ref={ref} className={cn( - 'flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground', + 'flex h-full w-full flex-col overflow-hidden rounded-md bg-white text-stone-950 dark:bg-stone-950 dark:text-stone-50', className, )} {...props} @@ -28,8 +28,8 @@ interface CommandDialogProps extends DialogProps {} const CommandDialog = ({ children, ...props }: CommandDialogProps) => { return ( <Dialog {...props}> - <DialogContent className="overflow-hidden p-0 shadow-lg"> - <Command className="[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5"> + <DialogContent className="overflow-hidden p-0"> + <Command className="[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-stone-500 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5 dark:[&_[cmdk-group-heading]]:text-stone-400"> {children} </Command> </DialogContent> @@ -45,11 +45,11 @@ const CommandInput = React.forwardRef< className="flex items-center border-b px-3" cmdk-input-wrapper="" > - <Search className="mr-2 h-4 w-4 shrink-0 opacity-50" /> + <MagnifyingGlassIcon className="mr-2 h-4 w-4 shrink-0 opacity-50" /> <CommandPrimitive.Input ref={ref} className={cn( - 'flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50', + 'flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-stone-500 disabled:cursor-not-allowed disabled:opacity-50 dark:placeholder:text-stone-400', className, )} {...props} @@ -92,7 +92,7 @@ const CommandGroup = React.forwardRef< <CommandPrimitive.Group ref={ref} className={cn( - 'overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground', + 'overflow-hidden p-1 text-stone-950 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-stone-500 dark:text-stone-50 dark:[&_[cmdk-group-heading]]:text-stone-400', className, )} {...props} @@ -107,7 +107,7 @@ const CommandSeparator = React.forwardRef< >(({ className, ...props }, ref) => ( <CommandPrimitive.Separator ref={ref} - className={cn('-mx-1 h-px bg-border', className)} + className={cn('-mx-1 h-px bg-stone-200 dark:bg-stone-800', className)} {...props} /> )) @@ -120,7 +120,7 @@ const CommandItem = React.forwardRef< <CommandPrimitive.Item ref={ref} className={cn( - 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', + 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none aria-selected:bg-stone-100 aria-selected:text-stone-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:aria-selected:bg-stone-800 dark:aria-selected:text-stone-50', className, )} {...props} @@ -136,7 +136,7 @@ const CommandShortcut = ({ return ( <span className={cn( - 'ml-auto text-xs tracking-widest text-muted-foreground', + 'ml-auto text-xs tracking-widest text-stone-500 dark:text-stone-400', className, )} {...props} diff --git a/packages/web/components/ui/dialog.tsx b/packages/web/components/ui/dialog.tsx index 3e36b6f..75f7c02 100644 --- a/packages/web/components/ui/dialog.tsx +++ b/packages/web/components/ui/dialog.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as DialogPrimitive from '@radix-ui/react-dialog' -import { X } from 'lucide-react' +import { Cross2Icon } from '@radix-ui/react-icons' import { cn } from '~/libs/utils' @@ -28,7 +28,7 @@ const DialogOverlay = React.forwardRef< <DialogPrimitive.Overlay ref={ref} className={cn( - 'fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0', + 'fixed inset-0 z-50 bg-white/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 dark:bg-stone-950/80', className, )} {...props} @@ -45,14 +45,14 @@ const DialogContent = React.forwardRef< <DialogPrimitive.Content ref={ref} className={cn( - 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full', + 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-stone-200 bg-white p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full dark:border-stone-800 dark:bg-stone-950', className, )} {...props} > {children} - <DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground"> - <X className="h-4 w-4" /> + <DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-stone-950 focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-stone-100 data-[state=open]:text-stone-500 dark:ring-offset-stone-950 dark:focus:ring-stone-300 dark:data-[state=open]:bg-stone-800 dark:data-[state=open]:text-stone-400"> + <Cross2Icon className="h-4 w-4" /> <span className="sr-only">Close</span> </DialogPrimitive.Close> </DialogPrimitive.Content> @@ -109,7 +109,7 @@ const DialogDescription = React.forwardRef< >(({ className, ...props }, ref) => ( <DialogPrimitive.Description ref={ref} - className={cn('text-sm text-muted-foreground', className)} + className={cn('text-sm text-stone-500 dark:text-stone-400', className)} {...props} /> )) diff --git a/packages/web/components/ui/dropdown-menu.tsx b/packages/web/components/ui/dropdown-menu.tsx index 3724754..9c1e8e7 100644 --- a/packages/web/components/ui/dropdown-menu.tsx +++ b/packages/web/components/ui/dropdown-menu.tsx @@ -2,6 +2,11 @@ import * as React from 'react' import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' +import { + CheckIcon, + ChevronRightIcon, + DotFilledIcon, +} from '@radix-ui/react-icons' import { cn } from '~/libs/utils' @@ -26,14 +31,14 @@ const DropdownMenuSubTrigger = React.forwardRef< <DropdownMenuPrimitive.SubTrigger ref={ref} className={cn( - 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent', + 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-stone-100 data-[state=open]:bg-stone-100 dark:focus:bg-stone-800 dark:data-[state=open]:bg-stone-800', inset && 'pl-8', className, )} {...props} > {children} - <i className="i-ri-arrow-right-s-line ml-auto h-4 w-4" /> + <ChevronRightIcon className="ml-auto h-4 w-4" /> </DropdownMenuPrimitive.SubTrigger> )) DropdownMenuSubTrigger.displayName @@ -46,7 +51,7 @@ const DropdownMenuSubContent = React.forwardRef< <DropdownMenuPrimitive.SubContent ref={ref} className={cn( - 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', + 'z-50 min-w-[8rem] overflow-hidden rounded-md border border-stone-200 bg-white p-1 text-stone-950 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-stone-800 dark:bg-stone-950 dark:text-stone-50', className, )} {...props} @@ -64,7 +69,8 @@ const DropdownMenuContent = React.forwardRef< ref={ref} sideOffset={sideOffset} className={cn( - 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', + 'z-50 min-w-[8rem] overflow-hidden rounded-md border border-stone-200 bg-white p-1 text-stone-950 shadow-md dark:border-stone-800 dark:bg-stone-950 dark:text-stone-50', + 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', className, )} {...props} @@ -82,7 +88,7 @@ const DropdownMenuItem = React.forwardRef< <DropdownMenuPrimitive.Item ref={ref} className={cn( - 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', + 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-stone-100 focus:text-stone-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-stone-800 dark:focus:text-stone-50', inset && 'pl-8', className, )} @@ -99,14 +105,14 @@ const DropdownMenuCheckboxItem = React.forwardRef< ref={ref} checked={checked} className={cn( - 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', + 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-stone-100 focus:text-stone-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-stone-800 dark:focus:text-stone-50', className, )} {...props} > <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center"> <DropdownMenuPrimitive.ItemIndicator> - <i className="i-ri-check-line h-4 w-4" /> + <CheckIcon className="h-4 w-4" /> </DropdownMenuPrimitive.ItemIndicator> </span> {children} @@ -122,14 +128,14 @@ const DropdownMenuRadioItem = React.forwardRef< <DropdownMenuPrimitive.RadioItem ref={ref} className={cn( - 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', + 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-stone-100 focus:text-stone-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-stone-800 dark:focus:text-stone-50', className, )} {...props} > <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center"> <DropdownMenuPrimitive.ItemIndicator> - <i className="i-ri-checkbox-blank-circle-line h-2 w-2 fill-current" /> + <DotFilledIcon className="h-4 w-4 fill-current" /> </DropdownMenuPrimitive.ItemIndicator> </span> {children} @@ -161,7 +167,7 @@ const DropdownMenuSeparator = React.forwardRef< >(({ className, ...props }, ref) => ( <DropdownMenuPrimitive.Separator ref={ref} - className={cn('-mx-1 my-1 h-px bg-muted', className)} + className={cn('-mx-1 my-1 h-px bg-stone-100 dark:bg-stone-800', className)} {...props} /> )) diff --git a/packages/web/components/ui/form.tsx b/packages/web/components/ui/form.tsx index bdf3840..d0d1b54 100644 --- a/packages/web/components/ui/form.tsx +++ b/packages/web/components/ui/form.tsx @@ -17,6 +17,8 @@ import { Label } from '~/components/ui/label' const Form = FormProvider +const FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue) + interface FormFieldContextValue< TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>, @@ -37,12 +39,6 @@ const FormField = < ) } -interface FormItemContextValue { - id: string -} - -const FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue) - const useFormField = () => { const fieldContext = React.useContext(FormFieldContext) const itemContext = React.useContext(FormItemContext) @@ -66,6 +62,10 @@ const useFormField = () => { } } +interface FormItemContextValue { + id: string +} + const FormItem = React.forwardRef< HTMLDivElement, React.HTMLAttributes<HTMLDivElement> @@ -93,7 +93,7 @@ const FormLabel = React.forwardRef< return ( <Label ref={ref} - className={cn(error && 'text-destructive', className)} + className={cn(error && 'text-red-500 dark:text-red-900', className)} htmlFor={formItemId} {...props} /> @@ -132,7 +132,7 @@ const FormDescription = React.forwardRef< return ( <p ref={ref} - className={cn('text-sm text-muted-foreground', className)} + className={cn('text-[0.8rem] text-stone-500 dark:text-stone-400', className)} id={formDescriptionId} {...props} /> @@ -154,7 +154,7 @@ const FormMessage = React.forwardRef< return ( <p ref={ref} - className={cn('text-sm font-medium text-destructive', className)} + className={cn('text-[0.8rem] font-medium text-red-500 dark:text-red-900', className)} id={formMessageId} {...props} > diff --git a/packages/web/components/ui/input.tsx b/packages/web/components/ui/input.tsx index 64a5c56..fa97406 100644 --- a/packages/web/components/ui/input.tsx +++ b/packages/web/components/ui/input.tsx @@ -11,7 +11,7 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(({ className, type, ref={ref} type={type} className={cn( - 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50', + 'flex h-9 w-full rounded-md border border-stone-200 bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-stone-500 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-stone-950 disabled:cursor-not-allowed disabled:opacity-50 dark:border-stone-800 dark:placeholder:text-stone-400 dark:focus-visible:ring-stone-300', className, )} {...props} diff --git a/packages/web/components/ui/navigation-menu.tsx b/packages/web/components/ui/navigation-menu.tsx index d7b354c..2798732 100644 --- a/packages/web/components/ui/navigation-menu.tsx +++ b/packages/web/components/ui/navigation-menu.tsx @@ -1,7 +1,7 @@ import * as React from 'react' +import { ChevronDownIcon } from '@radix-ui/react-icons' import * as NavigationMenuPrimitive from '@radix-ui/react-navigation-menu' import { cva } from 'class-variance-authority' -import { ChevronDown } from 'lucide-react' import { cn } from '~/libs/utils' @@ -22,7 +22,7 @@ NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName const NavigationMenuItem = NavigationMenuPrimitive.Item -const navigationMenuTriggerStyle = cva('group inline-flex w-max items-center justify-center rounded-md px-3 py-2 text-sm font-medium transition-colors hover:bg-stone-100 hover:text-stone-900 focus:bg-stone-100 focus:text-stone-900 focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-stone-100/50 data-[state=open]:bg-stone-100/50 dark:bg-stone-950 dark:hover:bg-stone-800 dark:hover:text-stone-50 dark:focus:bg-stone-800 dark:focus:text-stone-50 dark:data-[active]:bg-stone-800/50 dark:data-[state=open]:bg-stone-800/50') +const navigationMenuTriggerStyle = cva('group inline-flex h-9 w-max items-center justify-center rounded-md bg-white px-4 py-2 text-sm font-medium transition-colors hover:bg-stone-100 hover:text-stone-900 focus:bg-stone-100 focus:text-stone-900 focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-stone-100/50 data-[state=open]:bg-stone-100/50 dark:bg-stone-950 dark:hover:bg-stone-800 dark:hover:text-stone-50 dark:focus:bg-stone-800 dark:focus:text-stone-50 dark:data-[active]:bg-stone-800/50 dark:data-[state=open]:bg-stone-800/50') const NavigationMenuTrigger = React.forwardRef< React.ElementRef<typeof NavigationMenuPrimitive.Trigger>, @@ -34,9 +34,9 @@ const NavigationMenuTrigger = React.forwardRef< {...props} > {children}{''} - <ChevronDown + <ChevronDownIcon aria-hidden="true" - className="relative top-[1px] ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180" + className="relative top-[1px] ml-1 h-3 w-3 transition duration-300 group-data-[state=open]:rotate-180" /> </NavigationMenuPrimitive.Trigger> )) @@ -67,7 +67,7 @@ const NavigationMenuViewport = React.forwardRef< <NavigationMenuPrimitive.Viewport ref={ref} className={cn( - 'origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border border-stone-200 bg-white text-stone-950 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)] dark:border-stone-800 dark:bg-stone-950 dark:text-stone-50', + 'origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border border-stone-200 bg-white text-stone-950 shadow data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)] dark:border-stone-800 dark:bg-stone-950 dark:text-stone-50', className, )} {...props} diff --git a/packages/web/components/ui/popover.tsx b/packages/web/components/ui/popover.tsx index 9809c4f..ec81366 100644 --- a/packages/web/components/ui/popover.tsx +++ b/packages/web/components/ui/popover.tsx @@ -19,7 +19,7 @@ const PopoverContent = React.forwardRef< align={align} sideOffset={sideOffset} className={cn( - 'z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', + 'z-50 w-72 rounded-md border border-stone-200 bg-white p-4 text-stone-950 shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-stone-800 dark:bg-stone-950 dark:text-stone-50', className, )} {...props} diff --git a/packages/web/components/ui/select.tsx b/packages/web/components/ui/select.tsx index 93a7abb..fe960df 100644 --- a/packages/web/components/ui/select.tsx +++ b/packages/web/components/ui/select.tsx @@ -1,8 +1,8 @@ 'use client' import * as React from 'react' +import { CaretSortIcon, CheckIcon } from '@radix-ui/react-icons' import * as SelectPrimitive from '@radix-ui/react-select' -import { Check, ChevronDown } from 'lucide-react' import { cn } from '~/libs/utils' @@ -19,14 +19,14 @@ const SelectTrigger = React.forwardRef< <SelectPrimitive.Trigger ref={ref} className={cn( - 'flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50', + 'flex h-9 w-full items-center justify-between rounded-md border border-stone-200 bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-white placeholder:text-stone-500 focus:outline-none focus:ring-1 focus:ring-stone-950 disabled:cursor-not-allowed disabled:opacity-50 dark:border-stone-800 dark:ring-offset-stone-950 dark:placeholder:text-stone-400 dark:focus:ring-stone-300', className, )} {...props} > {children} <SelectPrimitive.Icon asChild> - <ChevronDown className="h-4 w-4 opacity-50" /> + <CaretSortIcon className="h-4 w-4 opacity-50" /> </SelectPrimitive.Icon> </SelectPrimitive.Trigger> )) @@ -41,7 +41,7 @@ const SelectContent = React.forwardRef< ref={ref} position={position} className={cn( - 'relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', + 'relative z-50 min-w-[8rem] overflow-hidden rounded-md border border-stone-200 bg-white text-stone-950 shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-stone-800 dark:bg-stone-950 dark:text-stone-50', position === 'popper' && 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1', className, @@ -68,7 +68,7 @@ const SelectLabel = React.forwardRef< >(({ className, ...props }, ref) => ( <SelectPrimitive.Label ref={ref} - className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)} + className={cn('px-2 py-1.5 text-sm font-semibold', className)} {...props} /> )) @@ -81,17 +81,16 @@ const SelectItem = React.forwardRef< <SelectPrimitive.Item ref={ref} className={cn( - 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', + 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-stone-100 focus:text-stone-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-stone-800 dark:focus:text-stone-50', className, )} {...props} > - <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center"> + <span className="absolute right-2 flex h-3.5 w-3.5 items-center justify-center"> <SelectPrimitive.ItemIndicator> - <Check className="h-4 w-4" /> + <CheckIcon className="h-4 w-4" /> </SelectPrimitive.ItemIndicator> </span> - <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText> </SelectPrimitive.Item> )) @@ -103,7 +102,7 @@ const SelectSeparator = React.forwardRef< >(({ className, ...props }, ref) => ( <SelectPrimitive.Separator ref={ref} - className={cn('-mx-1 my-1 h-px bg-muted', className)} + className={cn('-mx-1 my-1 h-px bg-stone-100 dark:bg-stone-800', className)} {...props} /> )) diff --git a/packages/web/components/ui/separator.tsx b/packages/web/components/ui/separator.tsx index 74b3931..917ca93 100644 --- a/packages/web/components/ui/separator.tsx +++ b/packages/web/components/ui/separator.tsx @@ -17,7 +17,7 @@ const Separator = React.forwardRef< decorative={decorative} orientation={orientation} className={cn( - 'shrink-0 bg-border', + 'shrink-0 bg-stone-200 dark:bg-stone-800', orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]', className, )} diff --git a/packages/web/components/ui/skeleton.tsx b/packages/web/components/ui/skeleton.tsx index db8b1c5..57a4e36 100644 --- a/packages/web/components/ui/skeleton.tsx +++ b/packages/web/components/ui/skeleton.tsx @@ -6,7 +6,7 @@ function Skeleton({ }: React.HTMLAttributes<HTMLDivElement>) { return ( <div - className={cn('animate-pulse rounded-md bg-stone-100 dark:bg-stone-800', className)} + className={cn('animate-pulse rounded-md bg-stone-900/10 dark:bg-stone-50/10', className)} {...props} /> ) diff --git a/packages/web/components/ui/switch.tsx b/packages/web/components/ui/switch.tsx index d86979f..391d162 100644 --- a/packages/web/components/ui/switch.tsx +++ b/packages/web/components/ui/switch.tsx @@ -11,14 +11,14 @@ const Switch = React.forwardRef< >(({ className, ...props }, ref) => ( <SwitchPrimitives.Root className={cn( - 'peer inline-flex h-[24px] w-[44px] shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2 focus-visible:ring-offset-white disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-slate-900 data-[state=unchecked]:bg-slate-200 dark:focus-visible:ring-slate-300 dark:focus-visible:ring-offset-slate-950 dark:data-[state=checked]:bg-slate-50 dark:data-[state=unchecked]:bg-slate-800', + 'peer inline-flex h-[20px] w-[36px] shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stone-950 focus-visible:ring-offset-2 focus-visible:ring-offset-white disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-stone-900 data-[state=unchecked]:bg-stone-200 dark:focus-visible:ring-stone-300 dark:focus-visible:ring-offset-stone-950 dark:data-[state=checked]:bg-stone-50 dark:data-[state=unchecked]:bg-stone-800', className, )} {...props} ref={ref} > <SwitchPrimitives.Thumb - className={cn('pointer-events-none block h-5 w-5 rounded-full bg-white shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0 dark:bg-slate-950')} + className={cn('pointer-events-none block h-4 w-4 rounded-full bg-white shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0 dark:bg-stone-950')} /> </SwitchPrimitives.Root> )) diff --git a/packages/web/components/ui/table.tsx b/packages/web/components/ui/table.tsx index f14b016..df14b0d 100644 --- a/packages/web/components/ui/table.tsx +++ b/packages/web/components/ui/table.tsx @@ -46,7 +46,7 @@ const TableFooter = React.forwardRef< >(({ className, ...props }, ref) => ( <tfoot ref={ref} - className={cn('bg-primary font-medium text-primary-foreground', className)} + className={cn('bg-stone-900 font-medium text-stone-50 dark:bg-stone-50 dark:text-stone-900', className)} {...props} /> )) @@ -59,7 +59,7 @@ const TableRow = React.forwardRef< <tr ref={ref} className={cn( - 'border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted', + 'border-b transition-colors hover:bg-stone-100/50 data-[state=selected]:bg-stone-100 dark:hover:bg-stone-800/50 dark:data-[state=selected]:bg-stone-800', className, )} {...props} @@ -74,7 +74,7 @@ const TableHead = React.forwardRef< <th ref={ref} className={cn( - 'h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0', + 'h-10 px-2 text-left align-middle font-medium text-stone-500 [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px] dark:text-stone-400', className, )} {...props} @@ -88,7 +88,10 @@ const TableCell = React.forwardRef< >(({ className, ...props }, ref) => ( <td ref={ref} - className={cn('p-4 align-middle [&:has([role=checkbox])]:pr-0', className)} + className={cn( + 'p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]', + className, + )} {...props} /> )) @@ -100,7 +103,7 @@ const TableCaption = React.forwardRef< >(({ className, ...props }, ref) => ( <caption ref={ref} - className={cn('mt-4 text-sm text-muted-foreground', className)} + className={cn('mt-4 text-sm text-stone-500 dark:text-stone-400', className)} {...props} /> )) diff --git a/packages/web/components/ui/tabs.tsx b/packages/web/components/ui/tabs.tsx index 7692b0d..6787cfa 100644 --- a/packages/web/components/ui/tabs.tsx +++ b/packages/web/components/ui/tabs.tsx @@ -14,7 +14,7 @@ const TabsList = React.forwardRef< <TabsPrimitive.List ref={ref} className={cn( - 'inline-flex items-center justify-center rounded-md bg-muted p-1 text-muted-foreground', + 'inline-flex h-9 items-center justify-center rounded-lg bg-stone-100 p-1 text-stone-500 dark:bg-stone-800 dark:text-stone-400', className, )} {...props} @@ -29,7 +29,7 @@ const TabsTrigger = React.forwardRef< <TabsPrimitive.Trigger ref={ref} className={cn( - 'inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm', + 'inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-white transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stone-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-white data-[state=active]:text-stone-950 data-[state=active]:shadow dark:ring-offset-stone-950 dark:focus-visible:ring-stone-300 dark:data-[state=active]:bg-stone-950 dark:data-[state=active]:text-stone-50', className, )} {...props} @@ -44,7 +44,7 @@ const TabsContent = React.forwardRef< <TabsPrimitive.Content ref={ref} className={cn( - 'mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', + 'mt-2 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-stone-950 focus-visible:ring-offset-2 dark:ring-offset-stone-950 dark:focus-visible:ring-stone-300', className, )} {...props} diff --git a/packages/web/components/ui/toast.tsx b/packages/web/components/ui/toast.tsx index fb7fc7b..e1c01a8 100644 --- a/packages/web/components/ui/toast.tsx +++ b/packages/web/components/ui/toast.tsx @@ -1,7 +1,7 @@ import * as React from 'react' +import { Cross2Icon } from '@radix-ui/react-icons' import * as ToastPrimitives from '@radix-ui/react-toast' import { type VariantProps, cva } from 'class-variance-authority' -import { X } from 'lucide-react' import { cn } from '~/libs/utils' @@ -23,13 +23,13 @@ const ToastViewport = React.forwardRef< ToastViewport.displayName = ToastPrimitives.Viewport.displayName const toastVariants = cva( - 'group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full', + 'group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border border-stone-200 p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full dark:border-stone-800', { variants: { variant: { - default: 'border bg-background text-foreground', + default: 'border bg-white text-stone-950 dark:bg-stone-950 dark:text-stone-50', destructive: - 'destructive group border-destructive bg-destructive text-destructive-foreground', + 'destructive group border-red-500 bg-red-500 text-stone-50 dark:border-red-900 dark:bg-red-900 dark:text-stone-50', }, }, defaultVariants: { variant: 'default' }, @@ -58,7 +58,7 @@ const ToastAction = React.forwardRef< <ToastPrimitives.Action ref={ref} className={cn( - 'inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive', + 'inline-flex h-8 shrink-0 items-center justify-center rounded-md border border-stone-200 bg-transparent px-3 text-sm font-medium transition-colors hover:bg-stone-100 focus:outline-none focus:ring-1 focus:ring-stone-950 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-stone-100/40 group-[.destructive]:hover:border-red-500/30 group-[.destructive]:hover:bg-red-500 group-[.destructive]:hover:text-stone-50 group-[.destructive]:focus:ring-red-500 dark:border-stone-800 dark:hover:bg-stone-800 dark:focus:ring-stone-300 dark:group-[.destructive]:border-stone-800/40 dark:group-[.destructive]:hover:border-red-900/30 dark:group-[.destructive]:hover:bg-red-900 dark:group-[.destructive]:hover:text-stone-50 dark:group-[.destructive]:focus:ring-red-900', className, )} {...props} @@ -74,12 +74,12 @@ const ToastClose = React.forwardRef< ref={ref} toast-close="" className={cn( - 'absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600', + 'absolute right-1 top-1 rounded-md p-1 text-stone-950/50 opacity-0 transition-opacity hover:text-stone-950 focus:opacity-100 focus:outline-none focus:ring-1 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600 dark:text-stone-50/50 dark:hover:text-stone-50', className, )} {...props} > - <X className="h-4 w-4" /> + <Cross2Icon className="h-4 w-4" /> </ToastPrimitives.Close> )) ToastClose.displayName = ToastPrimitives.Close.displayName @@ -90,7 +90,7 @@ const ToastTitle = React.forwardRef< >(({ className, ...props }, ref) => ( <ToastPrimitives.Title ref={ref} - className={cn('text-sm font-semibold', className)} + className={cn('text-sm font-semibold [&+div]:text-xs', className)} {...props} /> )) diff --git a/packages/web/components/ui/tooltip.tsx b/packages/web/components/ui/tooltip.tsx index 4e767dd..671d495 100644 --- a/packages/web/components/ui/tooltip.tsx +++ b/packages/web/components/ui/tooltip.tsx @@ -7,14 +7,7 @@ import { cn } from '~/libs/utils' const TooltipProvider = TooltipPrimitive.Provider -function Tooltip(props: TooltipPrimitive.TooltipProps) { - return ( - <TooltipPrimitive.Root - {...props} - delayDuration={props.delayDuration || 0} - /> - ) -} +const Tooltip = TooltipPrimitive.Root const TooltipTrigger = TooltipPrimitive.Trigger @@ -26,7 +19,7 @@ const TooltipContent = React.forwardRef< ref={ref} sideOffset={sideOffset} className={cn( - 'z-50 overflow-hidden rounded-md border border-slate-200 bg-white px-3 py-1.5 text-sm text-slate-950 shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-slate-800 dark:bg-slate-950 dark:text-slate-50', + 'z-50 overflow-hidden rounded-md bg-stone-900 px-3 py-1.5 text-xs text-stone-50 animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:bg-stone-50 dark:text-stone-900', className, )} {...props} diff --git a/packages/web/package.json b/packages/web/package.json index dd49f32..c211be7 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -9,8 +9,6 @@ }, "dependencies": { "@egoist/tailwindcss-icons": "^1.1.0", - "@emotion/react": "^11.11.1", - "@emotion/styled": "^11.11.0", "@hookform/resolvers": "^3.3.1", "@iconify-json/ri": "^1.1.12", "@next-auth/prisma-adapter": "^1.0.7", @@ -24,6 +22,7 @@ "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-dialog": "^1.0.4", "@radix-ui/react-dropdown-menu": "^2.0.5", + "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-navigation-menu": "^1.1.3", "@radix-ui/react-popover": "^1.0.6", @@ -48,7 +47,6 @@ "downshift": "^8.1.0", "framer-motion": "^10.16.4", "jotai": "^2.4.2", - "lucide-react": "^0.276.0", "next": "^13.4.19", "next-auth": "^4.23.1", "next-intl": "^2.20.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b1f792..5c8629a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -241,12 +241,6 @@ importers: '@egoist/tailwindcss-icons': specifier: ^1.1.0 version: 1.1.0(tailwindcss@3.3.3) - '@emotion/react': - specifier: ^11.11.1 - version: 11.11.1(@types/react@18.2.21)(react@18.2.0) - '@emotion/styled': - specifier: ^11.11.0 - version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.21)(react@18.2.0) '@hookform/resolvers': specifier: ^3.3.1 version: 3.3.1(react-hook-form@7.46.1) @@ -286,6 +280,9 @@ importers: '@radix-ui/react-dropdown-menu': specifier: ^2.0.5 version: 2.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-icons': + specifier: ^1.3.0 + version: 1.3.0(react@18.2.0) '@radix-ui/react-label': specifier: ^2.0.2 version: 2.0.2(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) @@ -358,9 +355,6 @@ importers: jotai: specifier: ^2.4.2 version: 2.4.2(@types/react@18.2.21)(react@18.2.0) - lucide-react: - specifier: ^0.276.0 - version: 0.276.0(react@18.2.0) next: specifier: ^13.4.19 version: 13.4.19(react-dom@18.2.0)(react@18.2.0) @@ -537,13 +531,6 @@ packages: '@babel/highlight': 7.22.13 chalk: 2.4.2 - /@babel/helper-module-imports@7.22.5: - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.17 - dev: false - /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} @@ -818,36 +805,6 @@ packages: - supports-color dev: false - /@emotion/babel-plugin@11.11.0: - resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} - dependencies: - '@babel/helper-module-imports': 7.22.5 - '@babel/runtime': 7.22.11 - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/serialize': 1.1.2 - babel-plugin-macros: 3.1.0 - convert-source-map: 1.9.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.2.0 - dev: false - - /@emotion/cache@11.11.0: - resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} - dependencies: - '@emotion/memoize': 0.8.1 - '@emotion/sheet': 1.2.2 - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 - stylis: 4.2.0 - dev: false - - /@emotion/hash@0.9.1: - resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} - dev: false - /@emotion/is-prop-valid@0.8.8: resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} requiresBuild: true @@ -856,98 +813,12 @@ packages: dev: false optional: true - /@emotion/is-prop-valid@1.2.1: - resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} - dependencies: - '@emotion/memoize': 0.8.1 - dev: false - /@emotion/memoize@0.7.4: resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} requiresBuild: true dev: false optional: true - /@emotion/memoize@0.8.1: - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - dev: false - - /@emotion/react@11.11.1(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==} - peerDependencies: - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.11 - '@emotion/babel-plugin': 11.11.0 - '@emotion/cache': 11.11.0 - '@emotion/serialize': 1.1.2 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 - '@types/react': 18.2.21 - hoist-non-react-statics: 3.3.2 - react: 18.2.0 - dev: false - - /@emotion/serialize@1.1.2: - resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==} - dependencies: - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/unitless': 0.8.1 - '@emotion/utils': 1.2.1 - csstype: 3.1.2 - dev: false - - /@emotion/sheet@1.2.2: - resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} - dev: false - - /@emotion/styled@11.11.0(@emotion/react@11.11.1)(@types/react@18.2.21)(react@18.2.0): - resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} - peerDependencies: - '@emotion/react': ^11.0.0-rc.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.22.11 - '@emotion/babel-plugin': 11.11.0 - '@emotion/is-prop-valid': 1.2.1 - '@emotion/react': 11.11.1(@types/react@18.2.21)(react@18.2.0) - '@emotion/serialize': 1.1.2 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) - '@emotion/utils': 1.2.1 - '@types/react': 18.2.21 - react: 18.2.0 - dev: false - - /@emotion/unitless@0.8.1: - resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - dev: false - - /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): - resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} - peerDependencies: - react: '>=16.8.0' - dependencies: - react: 18.2.0 - dev: false - - /@emotion/utils@1.2.1: - resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} - dev: false - - /@emotion/weak-memoize@0.3.1: - resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} - dev: false - /@esbuild-kit/cjs-loader@2.4.2: resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} dependencies: @@ -2658,6 +2529,14 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /@radix-ui/react-icons@1.3.0(react@18.2.0): + resolution: {integrity: sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==} + peerDependencies: + react: ^16.x || ^17.x || ^18.x + dependencies: + react: 18.2.0 + dev: false + /@radix-ui/react-id@1.0.0(react@18.2.0): resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==} peerDependencies: @@ -4622,15 +4501,6 @@ packages: - debug dev: false - /babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - dependencies: - '@babel/runtime': 7.22.11 - cosmiconfig: 7.1.0 - resolve: 1.22.4 - dev: false - /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -5405,10 +5275,6 @@ packages: meow: 12.1.1 dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: false - /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} @@ -6129,6 +5995,7 @@ packages: /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + dev: true /escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} @@ -6836,6 +6703,7 @@ packages: /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: true /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} @@ -7499,12 +7367,6 @@ packages: readable-stream: 3.6.2 dev: false - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - dependencies: - react-is: 16.13.1 - dev: false - /homedir-polyfill@1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} @@ -8667,14 +8529,6 @@ packages: engines: {node: '>=12'} dev: true - /lucide-react@0.276.0(react@18.2.0): - resolution: {integrity: sha512-ubP1Tyj67nsy84/ikelrFcjj7eEkD6hg9H/1Mhk22CGpbvPtEd3r8sMFQQ1YdpePx70Nt4oYIMfTPHZlag+ZLQ==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.2.0 - dev: false - /luxon@3.3.0: resolution: {integrity: sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==} engines: {node: '>=12'} @@ -11241,11 +11095,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: false - /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -11505,10 +11354,6 @@ packages: react: 18.2.0 dev: false - /stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - dev: false - /stylis@4.3.0: resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} dev: false From 03948641fa7a97d562942ff5929c65a223625779 Mon Sep 17 00:00:00 2001 From: Xinyao <hi@xinyao.me> Date: Sat, 28 Mar 2026 17:30:46 +0800 Subject: [PATCH 20/23] feat: viteplus! --- .commitlintrc | 3 - .czrc | 3 - .github/FUNDING.yml | 2 +- .github/workflows/deploy.yml | 2 +- .github/workflows/lint.yml | 17 +- .github/workflows/test.yml | 17 +- .husky/pre-commit | 4 - .lintstagedrc | 6 - .npmrc | 1 - .release-it.json | 2 +- .vite-hooks/pre-commit | 1 + .vscode/extensions.json | 3 + .vscode/settings.json | 16 +- CHANGELOG.md | 394 +- README.md | 1 + docker-compose.development.yml | 6 +- docker-compose.yml | 10 +- eslint.config.js | 12 - package.json | 58 +- packages/common/package.json | 9 +- packages/common/src/index.ts | 8 +- packages/common/src/interfaces/alert.ts | 41 +- packages/common/src/interfaces/event.ts | 18 +- packages/common/src/interfaces/index.ts | 12 +- packages/common/src/interfaces/issue.ts | 41 +- packages/common/src/interfaces/metric.ts | 2 +- packages/common/src/interfaces/project.ts | 6 +- packages/common/src/interfaces/source-map.ts | 32 +- packages/common/src/lib.ts | 36 +- packages/common/src/response.ts | 14 +- packages/common/src/topic.ts | 26 +- packages/config/package.json | 9 +- packages/config/src/index.ts | 91 +- packages/server/package.json | 2 +- packages/server/src/api/alert/alert.core.ts | 340 +- packages/server/src/api/alert/alert.module.ts | 10 +- .../server/src/api/alert/alert.processor.ts | 72 +- packages/server/src/api/alert/email.ts | 28 +- packages/server/src/api/alert/webhook.ts | 70 +- packages/server/src/api/api.module.ts | 9 +- .../src/api/report/report.controller.ts | 18 +- packages/server/src/api/report/report.core.ts | 77 +- .../server/src/api/report/report.interface.ts | 68 +- .../server/src/api/report/report.module.ts | 18 +- .../server/src/api/report/report.processor.ts | 206 +- .../server/src/api/report/report.service.ts | 194 +- .../src/api/source-map/source-map.constant.ts | 8 +- .../api/source-map/source-map.controller.ts | 27 +- .../src/api/source-map/source-map.dto.ts | 8 +- .../src/api/source-map/source-map.module.ts | 16 +- .../api/source-map/source-map.processor.ts | 61 +- .../src/api/source-map/source-map.service.ts | 22 +- packages/server/src/app.module.ts | 15 +- packages/server/src/common/constants/index.ts | 4 +- .../server/src/common/constants/status.ts | 22 +- .../server/src/common/database/bull.module.ts | 6 +- packages/server/src/common/database/index.ts | 4 +- .../src/common/database/prisma.service.ts | 14 +- .../common/exceptions/forbidden.exception.ts | 31 +- .../server/src/common/exceptions/index.ts | 2 +- .../common/filters/all-exceptions.filter.ts | 32 +- .../filters/forbidden-exception.filter.ts | 29 +- packages/server/src/common/filters/index.ts | 4 +- packages/server/src/common/index.ts | 12 +- .../server/src/common/interceptors/index.ts | 2 +- .../interceptors/transform.interceptor.ts | 23 +- packages/server/src/common/logger/index.ts | 2 +- .../server/src/common/logger/logger.module.ts | 8 +- packages/server/src/main.ts | 67 +- packages/server/src/shared.module.ts | 13 +- packages/server/src/tasks/tasks.module.ts | 8 +- packages/server/src/tasks/tasks.service.ts | 54 +- packages/server/tsconfig.json | 2 +- .../[projectId]/alerts/[alertId]/alert-id.tsx | 173 +- .../alerts/[alertId]/edit/edit.tsx | 78 +- .../alerts/[alertId]/edit/page.tsx | 16 +- .../[projectId]/alerts/[alertId]/page.tsx | 25 +- .../[projectId]/alerts/create/page.tsx | 73 +- .../[projectId]/alerts/edit-alert.tsx | 937 +- .../app/[locale]/[projectId]/alerts/page.tsx | 64 +- .../feedbacks/[feedbackId]/feedback-id.tsx | 46 +- .../feedbacks/[feedbackId]/page.tsx | 13 +- .../[locale]/[projectId]/feedbacks/page.tsx | 66 +- .../[projectId]/issues/[issueId]/issue-id.tsx | 86 +- .../[projectId]/issues/[issueId]/page.tsx | 34 +- .../app/[locale]/[projectId]/issues/page.tsx | 14 +- .../web/app/[locale]/[projectId]/layout.tsx | 9 +- .../app/[locale]/[projectId]/metrics/page.tsx | 159 +- .../[locale]/[projectId]/mock/frame/Ajax.tsx | 36 +- .../[projectId]/mock/frame/Config.tsx | 81 +- .../[projectId]/mock/frame/CustomReport.tsx | 32 +- .../[locale]/[projectId]/mock/frame/Error.tsx | 34 +- .../[projectId]/mock/frame/HashChange.tsx | 15 +- .../[projectId]/mock/frame/History.tsx | 22 +- .../[projectId]/mock/frame/InsertRes.tsx | 24 +- .../[projectId]/mock/frame/PromiseError.tsx | 18 +- .../[locale]/[projectId]/mock/frame/index.tsx | 74 +- .../app/[locale]/[projectId]/mock/mock.tsx | 16 +- .../app/[locale]/[projectId]/mock/page.tsx | 16 +- .../app/[locale]/[projectId]/profile/page.tsx | 57 +- .../[locale]/[projectId]/profile/profile.tsx | 280 +- .../releases/[releaseId]/sourceMaps/page.tsx | 13 +- .../[releaseId]/sourceMaps/source-maps.tsx | 67 +- .../[locale]/[projectId]/releases/page.tsx | 68 +- .../[locale]/[projectId]/settings/page.tsx | 246 +- .../[projectId]/users/[userId]/page.tsx | 13 +- .../[projectId]/users/[userId]/user-id.tsx | 67 +- .../app/[locale]/[projectId]/users/page.tsx | 83 +- .../web/app/[locale]/auth/signin/page.tsx | 51 +- .../web/app/[locale]/auth/signin/signin.tsx | 312 +- .../web/app/[locale]/create-project/action.ts | 37 +- .../create-project/create-project.tsx | 95 +- .../web/app/[locale]/create-project/page.tsx | 11 +- .../web/app/[locale]/create-project/schema.ts | 8 +- packages/web/app/[locale]/home.tsx | 48 +- packages/web/app/[locale]/layout.tsx | 69 +- packages/web/app/[locale]/page.tsx | 11 +- packages/web/app/[locale]/providers.tsx | 87 +- .../web/app/api/auth/[...nextauth]/route.ts | 11 +- packages/web/app/api/events/[id]/route.ts | 11 +- packages/web/app/api/fs/[name]/route.ts | 32 +- packages/web/app/api/prisma/[name]/route.ts | 53 +- .../[id]/sourceMaps/[sourceMapId]/route.ts | 40 +- packages/web/app/layout.tsx | 6 +- packages/web/app/not-found.tsx | 6 +- packages/web/app/page.tsx | 7 +- packages/web/atoms/invite.ts | 10 +- packages/web/atoms/issue.ts | 11 +- packages/web/auth.ts | 81 +- packages/web/components/accordion-section.tsx | 87 +- packages/web/components/alert-list.tsx | 179 +- packages/web/components/breadcrumbs.tsx | 57 +- packages/web/components/charts/bar-chart.tsx | 72 +- packages/web/components/charts/line-chart.tsx | 85 +- .../charts/reference-line-chart.tsx | 148 +- .../components/charts/vertical-bar-chart.tsx | 72 +- .../web/components/data-table/data-table.tsx | 94 +- packages/web/components/data-table/index.ts | 2 +- .../web/components/data-table/pagination.tsx | 25 +- packages/web/components/empty-issues.tsx | 40 +- .../web/components/event-detail-action.tsx | 114 +- .../web/components/event-detail-profile.tsx | 277 +- .../web/components/event-detail-stack.tsx | 74 +- .../web/components/event-detail-trend.tsx | 102 +- packages/web/components/event-detail-user.tsx | 17 +- packages/web/components/events-list.tsx | 94 +- packages/web/components/feedbacks-list.tsx | 52 +- packages/web/components/footer.tsx | 27 +- packages/web/components/intl.tsx | 74 +- packages/web/components/introduce-chart.tsx | 31 +- packages/web/components/issue-detail-tabs.tsx | 103 +- .../web/components/issue-detail-title.tsx | 81 +- packages/web/components/issue-list.tsx | 288 +- .../web/components/issue-related-events.tsx | 47 +- .../web/components/issue-related-metadata.tsx | 28 +- .../web/components/issue-related-rrweb.tsx | 31 +- packages/web/components/layout.tsx | 95 +- packages/web/components/load-more-button.tsx | 23 +- packages/web/components/loading.tsx | 10 +- packages/web/components/login-button.tsx | 25 +- packages/web/components/logo.tsx | 35 +- packages/web/components/nav-container.tsx | 45 +- packages/web/components/nav-menu.tsx | 142 +- packages/web/components/nav.tsx | 20 +- packages/web/components/pagination.tsx | 43 +- packages/web/components/project-card.tsx | 66 +- packages/web/components/project.tsx | 123 +- packages/web/components/release-list.tsx | 169 +- packages/web/components/snippet.tsx | 80 +- packages/web/components/spinning.tsx | 6 +- packages/web/components/stack-info.tsx | 72 +- packages/web/components/theme.tsx | 30 +- packages/web/components/title.tsx | 44 +- packages/web/components/top-progress-bar.tsx | 38 +- packages/web/components/ui/accordion.tsx | 36 +- packages/web/components/ui/avatar.tsx | 31 +- packages/web/components/ui/badge.tsx | 32 +- packages/web/components/ui/button.tsx | 64 +- packages/web/components/ui/card.tsx | 129 +- packages/web/components/ui/checkbox.tsx | 22 +- packages/web/components/ui/command.tsx | 84 +- packages/web/components/ui/dialog.tsx | 88 +- packages/web/components/ui/dropdown-menu.tsx | 111 +- packages/web/components/ui/form.tsx | 139 +- packages/web/components/ui/input.tsx | 39 +- packages/web/components/ui/label.tsx | 29 +- .../web/components/ui/navigation-menu.tsx | 69 +- packages/web/components/ui/popover.tsx | 22 +- packages/web/components/ui/select.tsx | 60 +- packages/web/components/ui/separator.tsx | 23 +- packages/web/components/ui/skeleton.tsx | 13 +- packages/web/components/ui/switch.tsx | 20 +- packages/web/components/ui/table.tsx | 106 +- packages/web/components/ui/tabs.tsx | 30 +- packages/web/components/ui/theme-provider.tsx | 10 +- packages/web/components/ui/toast.tsx | 67 +- packages/web/components/ui/toaster.tsx | 17 +- packages/web/components/ui/tooltip.tsx | 22 +- packages/web/components/ui/use-toast.ts | 168 +- packages/web/components/user.tsx | 75 +- packages/web/components/users-list.tsx | 82 +- packages/web/components/wrapper.tsx | 40 +- packages/web/db.ts | 175 +- packages/web/environment.d.ts | 16 +- packages/web/fs.ts | 104 +- packages/web/hooks/use-breadcrumb.ts | 37 +- packages/web/hooks/use-current-project.ts | 13 +- packages/web/hooks/use-infinite.ts | 102 +- packages/web/hooks/use-invite-member.ts | 25 +- packages/web/hooks/use-query.ts | 62 +- packages/web/libs/middleware.ts | 17 +- packages/web/libs/utils.tsx | 108 +- packages/web/middleware.ts | 47 +- packages/web/next.config.js | 14 +- packages/web/package.json | 2 +- packages/web/postcss.config.js | 2 +- packages/web/services/alerts.ts | 69 +- packages/web/services/event-users.ts | 21 +- packages/web/services/events.ts | 73 +- packages/web/services/feedbacks.ts | 22 +- packages/web/services/issues.ts | 106 +- packages/web/services/metrics.ts | 57 +- packages/web/services/projects.ts | 107 +- packages/web/services/releases.ts | 34 +- packages/web/services/users.ts | 33 +- packages/web/services/views.ts | 51 +- packages/web/store/index.ts | 11 +- packages/web/store/project.ts | 14 +- packages/web/styles/colors.ts | 552 +- packages/web/styles/globals.css | 4 +- packages/web/styles/nprogress.css | 29 +- packages/web/tailwind.config.js | 76 +- packages/web/tsconfig.json | 15 +- pnpm-lock.yaml | 18875 ++++++++-------- pnpm-workspace.yaml | 2 +- prisma/migrations/migration_lock.toml | 2 +- prisma/seed.ts | 16 +- scripts/createEnv.ts | 43 +- tsconfig.json | 34 +- tsconfig.node.json | 3 - vite.config.ts | 17 + 241 files changed, 16061 insertions(+), 16487 deletions(-) delete mode 100644 .commitlintrc delete mode 100644 .czrc delete mode 100755 .husky/pre-commit delete mode 100644 .lintstagedrc create mode 100755 .vite-hooks/pre-commit create mode 100644 .vscode/extensions.json delete mode 100644 eslint.config.js delete mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.commitlintrc b/.commitlintrc deleted file mode 100644 index c30e5a9..0000000 --- a/.commitlintrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["@commitlint/config-conventional"] -} diff --git a/.czrc b/.czrc deleted file mode 100644 index d1bcc20..0000000 --- a/.czrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "path": "cz-conventional-changelog" -} diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index d606d33..0166703 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1 @@ -github: [chenyueban] +github: [xinyao27] diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 6fef93b..aaaefc0 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -3,7 +3,7 @@ name: Deploy on: push: tags: - - '*' + - "*" jobs: docker: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 6f98918..429b282 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -14,25 +14,22 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Install pnpm - uses: pnpm/action-setup@v2.2.1 + uses: pnpm/action-setup@v4 - name: Set node - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: - node-version: 16.x + node-version: 20.x cache: pnpm - - name: Setup - run: npm i -g @antfu/ni - - name: Install - run: nci + run: pnpm install - name: Build - run: nr build + run: pnpm run build - name: Lint - run: nr lint + run: pnpm run lint diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3d69d7a..482df37 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,30 +15,27 @@ jobs: strategy: matrix: - node: [16.x] + node: [20.x] os: [ubuntu-latest, macos-latest] fail-fast: false steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Install pnpm - uses: pnpm/action-setup@v2.2.1 + uses: pnpm/action-setup@v4 - name: Set node version to ${{ matrix.node }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} cache: pnpm - - name: Setup - run: npm i -g @antfu/ni - - name: Install - run: nci + run: pnpm install - name: Build - run: nr build + run: pnpm run build - name: Test - run: nr test --if-present + run: pnpm test --if-present diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index 36af219..0000000 --- a/.husky/pre-commit +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx lint-staged diff --git a/.lintstagedrc b/.lintstagedrc deleted file mode 100644 index fd8d9ec..0000000 --- a/.lintstagedrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "*.{js?(x),ts?(x),vue,html,md,json,yml}": [ - "eslint --fix", - "git add" - ] -} diff --git a/.npmrc b/.npmrc index 6c59086..e69de29 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +0,0 @@ -enable-pre-post-scripts=true diff --git a/.release-it.json b/.release-it.json index ba60f77..e5230cd 100644 --- a/.release-it.json +++ b/.release-it.json @@ -12,6 +12,6 @@ } }, "hooks": { - "before:init": ["npm run lint", "npm test"] + "before:init": ["pnpm run lint", "pnpm test"] } } diff --git a/.vite-hooks/pre-commit b/.vite-hooks/pre-commit new file mode 100755 index 0000000..85fb65b --- /dev/null +++ b/.vite-hooks/pre-commit @@ -0,0 +1 @@ +vp staged diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..99e2f7d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["oxc.oxc-vscode"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index aa1fd60..bbbdbe0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,10 +1,12 @@ { - "cSpell.words": [ - "ohbug" - ], + "cSpell.words": ["ohbug"], "typescript.tsdk": "node_modules/typescript/lib", - "eslint.experimental.useFlatConfig": true, - "i18n-ally.localesPaths": [ - "packages/web/messages" - ] + "editor.defaultFormatter": "oxc.oxc-vscode", + "oxc.fmt.configPath": "./vite.config.ts", + "editor.formatOnSave": true, + "editor.formatOnSaveMode": "file", + "editor.codeActionsOnSave": { + "source.fixAll.oxc": "explicit" + }, + "i18n-ally.localesPaths": ["packages/web/messages"] } diff --git a/CHANGELOG.md b/CHANGELOG.md index 8758a22..064deb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,357 +1,323 @@ - - # [0.11.0](https://github.com/ohbug-org/ohbug-dashboard/compare/0.10.1...0.11.0) (2023-07-05) - ### Bug Fixes -* fix eslint error ([9ae5eb8](https://github.com/ohbug-org/ohbug-dashboard/commit/9ae5eb805247766dcf096e31cae649de9047b8a7)) -* Update endpoint in defaultConfig to use current location ([e101cfc](https://github.com/ohbug-org/ohbug-dashboard/commit/e101cfc912ad5cfae35b882efff139580731f953)) -* use new link ([baa6c93](https://github.com/ohbug-org/ohbug-dashboard/commit/baa6c93cc84b737ca15ec81dcb1bf216a3395caa)) -* **web:** fix nextjs dayjs utc call exception ([a8c422d](https://github.com/ohbug-org/ohbug-dashboard/commit/a8c422d43cd5da85e1f1aa2586f10a535cc7952f)) - +- fix eslint error ([9ae5eb8](https://github.com/ohbug-org/ohbug-dashboard/commit/9ae5eb805247766dcf096e31cae649de9047b8a7)) +- Update endpoint in defaultConfig to use current location ([e101cfc](https://github.com/ohbug-org/ohbug-dashboard/commit/e101cfc912ad5cfae35b882efff139580731f953)) +- use new link ([baa6c93](https://github.com/ohbug-org/ohbug-dashboard/commit/baa6c93cc84b737ca15ec81dcb1bf216a3395caa)) +- **web:** fix nextjs dayjs utc call exception ([a8c422d](https://github.com/ohbug-org/ohbug-dashboard/commit/a8c422d43cd5da85e1f1aa2586f10a535cc7952f)) ### Features -* **server:** 数据过期时间修改为默认7天并且支持通过配置文件修改 ([14ea185](https://github.com/ohbug-org/ohbug-dashboard/commit/14ea1851d9eef0ba9bc7a81a52c8227d22358983)) -* web migration to app dir ([e282720](https://github.com/ohbug-org/ohbug-dashboard/commit/e2827200db10b3ca437053930c286868ebd8e089)) -* **web:** add mock page ([e82cca2](https://github.com/ohbug-org/ohbug-dashboard/commit/e82cca238f92bb7da51b027853778a438f16ae93)) +- **server:** 数据过期时间修改为默认7天并且支持通过配置文件修改 ([14ea185](https://github.com/ohbug-org/ohbug-dashboard/commit/14ea1851d9eef0ba9bc7a81a52c8227d22358983)) +- web migration to app dir ([e282720](https://github.com/ohbug-org/ohbug-dashboard/commit/e2827200db10b3ca437053930c286868ebd8e089)) +- **web:** add mock page ([e82cca2](https://github.com/ohbug-org/ohbug-dashboard/commit/e82cca238f92bb7da51b027853778a438f16ae93)) ## [0.10.1](https://github.com/ohbug-org/ohbug-dashboard/compare/0.10.0...0.10.1) (2022-09-29) - ### Bug Fixes -* fixed eslint error ([0fe1baa](https://github.com/ohbug-org/ohbug-dashboard/commit/0fe1baa3b92b3b0593f57c66465c21e0eb2088cd)) -* **web:** 修复 relatedMetadata 显示数据异常 ([4fa0728](https://github.com/ohbug-org/ohbug-dashboard/commit/4fa072846c04a8f029f48512169b9a55d1d49a79)) -* **web:** 修复 useInfinite ([096b9f5](https://github.com/ohbug-org/ohbug-dashboard/commit/096b9f50dc33e96ad3d4b656ba849ff3f99fa511)) -* **web:** 修复趋势图时区问题 ([28814ce](https://github.com/ohbug-org/ohbug-dashboard/commit/28814cea57f8b91c568373e1218862168b401ba0)) -* **web:** 登录时数据校验 ([dc20853](https://github.com/ohbug-org/ohbug-dashboard/commit/dc2085394a457f1c48b5f772db56e673f6a09eb0)) +- fixed eslint error ([0fe1baa](https://github.com/ohbug-org/ohbug-dashboard/commit/0fe1baa3b92b3b0593f57c66465c21e0eb2088cd)) +- **web:** 修复 relatedMetadata 显示数据异常 ([4fa0728](https://github.com/ohbug-org/ohbug-dashboard/commit/4fa072846c04a8f029f48512169b9a55d1d49a79)) +- **web:** 修复 useInfinite ([096b9f5](https://github.com/ohbug-org/ohbug-dashboard/commit/096b9f50dc33e96ad3d4b656ba849ff3f99fa511)) +- **web:** 修复趋势图时区问题 ([28814ce](https://github.com/ohbug-org/ohbug-dashboard/commit/28814cea57f8b91c568373e1218862168b401ba0)) +- **web:** 登录时数据校验 ([dc20853](https://github.com/ohbug-org/ohbug-dashboard/commit/dc2085394a457f1c48b5f772db56e673f6a09eb0)) # [0.10.0](https://github.com/ohbug-org/ohbug-dashboard/compare/0.9.2...0.10.0) (2022-09-15) - ### Bug Fixes -* **web:** 修复 app 类型 ([561591c](https://github.com/ohbug-org/ohbug-dashboard/commit/561591ccb883fab65a6c18b10e7f361cbfe235ec)) -* **web:** 调整 checkbox 边框色 ([1f2fed2](https://github.com/ohbug-org/ohbug-dashboard/commit/1f2fed29b009f1c8c66368b995971e7c2b0948ee)) - +- **web:** 修复 app 类型 ([561591c](https://github.com/ohbug-org/ohbug-dashboard/commit/561591ccb883fab65a6c18b10e7f361cbfe235ec)) +- **web:** 调整 checkbox 边框色 ([1f2fed2](https://github.com/ohbug-org/ohbug-dashboard/commit/1f2fed29b009f1c8c66368b995971e7c2b0948ee)) ### Features -* **web:** issue 排序选择状态记入缓存 ([2e4d4f6](https://github.com/ohbug-org/ohbug-dashboard/commit/2e4d4f6276198033042db171c5c7095b5758774f)) -* **web:** issue 支持搜索 ([3f1ce81](https://github.com/ohbug-org/ohbug-dashboard/commit/3f1ce813df9d5643c113cae69b1e6bcdad3724ff)) -* **web:** user 支持搜索 ([14bd30f](https://github.com/ohbug-org/ohbug-dashboard/commit/14bd30f457e128127a29ffa70683fcd2fe1e4c4d)) -* **web:** 优化 footer ([72cea37](https://github.com/ohbug-org/ohbug-dashboard/commit/72cea372ab90302fb0d676cbcb90d2b04afaab0f)) +- **web:** issue 排序选择状态记入缓存 ([2e4d4f6](https://github.com/ohbug-org/ohbug-dashboard/commit/2e4d4f6276198033042db171c5c7095b5758774f)) +- **web:** issue 支持搜索 ([3f1ce81](https://github.com/ohbug-org/ohbug-dashboard/commit/3f1ce813df9d5643c113cae69b1e6bcdad3724ff)) +- **web:** user 支持搜索 ([14bd30f](https://github.com/ohbug-org/ohbug-dashboard/commit/14bd30f457e128127a29ffa70683fcd2fe1e4c4d)) +- **web:** 优化 footer ([72cea37](https://github.com/ohbug-org/ohbug-dashboard/commit/72cea372ab90302fb0d676cbcb90d2b04afaab0f)) ## [0.9.2](https://github.com/ohbug-org/ohbug-dashboard/compare/0.9.1...0.9.2) (2022-09-14) - ### Bug Fixes -* **server:** event 上报修复 user 创建问题 ([d778890](https://github.com/ohbug-org/ohbug-dashboard/commit/d778890b361d9c4e92f5e2de1adea90292516b67)) +- **server:** event 上报修复 user 创建问题 ([d778890](https://github.com/ohbug-org/ohbug-dashboard/commit/d778890b361d9c4e92f5e2de1adea90292516b67)) ## [0.9.1](https://github.com/ohbug-org/ohbug-dashboard/compare/0.9.0...0.9.1) (2022-09-14) - ### Bug Fixes -* **nginx:** 修复 nginx 反代导致无法获取真实 IP ([1d1e471](https://github.com/ohbug-org/ohbug-dashboard/commit/1d1e471b5d39851c9dfc6163bd24da3fd9aa523e)) -* project name 修改为可重复字段 ([4a2d1be](https://github.com/ohbug-org/ohbug-dashboard/commit/4a2d1be2f58768d4f67f00f4a8ded51bb43b3a11)) -* **web:** 修复 issue detail 页 active tab 状态问题 ([408d218](https://github.com/ohbug-org/ohbug-dashboard/commit/408d2184cf21e60bc1559da25b104b899e5534d4)) -* **web:** 新增页面标题 ([6983caf](https://github.com/ohbug-org/ohbug-dashboard/commit/6983cafc2725a5d46cf12c2110efda8a0b7347dc)) +- **nginx:** 修复 nginx 反代导致无法获取真实 IP ([1d1e471](https://github.com/ohbug-org/ohbug-dashboard/commit/1d1e471b5d39851c9dfc6163bd24da3fd9aa523e)) +- project name 修改为可重复字段 ([4a2d1be](https://github.com/ohbug-org/ohbug-dashboard/commit/4a2d1be2f58768d4f67f00f4a8ded51bb43b3a11)) +- **web:** 修复 issue detail 页 active tab 状态问题 ([408d218](https://github.com/ohbug-org/ohbug-dashboard/commit/408d2184cf21e60bc1559da25b104b899e5534d4)) +- **web:** 新增页面标题 ([6983caf](https://github.com/ohbug-org/ohbug-dashboard/commit/6983cafc2725a5d46cf12c2110efda8a0b7347dc)) # [0.9.0](https://github.com/ohbug-org/ohbug-dashboard/compare/0.8.2...0.9.0) (2022-09-09) - ### Bug Fixes -* **server:** 修复 alert UserFrequencyCondition 异常 ([7f85060](https://github.com/ohbug-org/ohbug-dashboard/commit/7f85060cc2ba3b337e41ebb9a17694e72908030c)) -* **web:** 修复 issues tab 栏异常 ([d4dff96](https://github.com/ohbug-org/ohbug-dashboard/commit/d4dff96d2a3ed4070e7195308dfecc032c52b4fc)) - +- **server:** 修复 alert UserFrequencyCondition 异常 ([7f85060](https://github.com/ohbug-org/ohbug-dashboard/commit/7f85060cc2ba3b337e41ebb9a17694e72908030c)) +- **web:** 修复 issues tab 栏异常 ([d4dff96](https://github.com/ohbug-org/ohbug-dashboard/commit/d4dff96d2a3ed4070e7195308dfecc032c52b4fc)) ### Features -* event metadata 使用 string 类型存储 ([1098116](https://github.com/ohbug-org/ohbug-dashboard/commit/109811683dd33de90e32fed2a7a6b87c06e2980a)) -* **web:** feedback 新增详细信息展示 ([b776057](https://github.com/ohbug-org/ohbug-dashboard/commit/b77605724b130240011e272c870be1b65ca5e7ae)) +- event metadata 使用 string 类型存储 ([1098116](https://github.com/ohbug-org/ohbug-dashboard/commit/109811683dd33de90e32fed2a7a6b87c06e2980a)) +- **web:** feedback 新增详细信息展示 ([b776057](https://github.com/ohbug-org/ohbug-dashboard/commit/b77605724b130240011e272c870be1b65ca5e7ae)) ## [0.8.2](https://github.com/ohbug-org/ohbug-dashboard/compare/0.8.1...0.8.2) (2022-09-09) - ### Bug Fixes -* **server:** 修复 alert message 为空 ([9ef7094](https://github.com/ohbug-org/ohbug-dashboard/commit/9ef7094e55a0c5e2fc26bbc55d34fb7f4f973da0)) -* **server:** 修复 alert 通知 @ 人不生效 ([67bb1f0](https://github.com/ohbug-org/ohbug-dashboard/commit/67bb1f034808662c25cceba7618b2d60c7076352)) -* **server:** 修复 conditionMatch filterMatch 不生效 ([f625ee7](https://github.com/ohbug-org/ohbug-dashboard/commit/f625ee709b199efcc729fb33f0dda73096f595d6)) -* **server:** 修复聚合生成 md5 Object 导致的一致性问题 ([c5ce04b](https://github.com/ohbug-org/ohbug-dashboard/commit/c5ce04becd4ec47c6e22b1cd8b9814e8f9febbae)) -* **web:** issues 页面默认查询最近的 event 记录 ([67282fd](https://github.com/ohbug-org/ohbug-dashboard/commit/67282fd1301eff50cdb0de670da390e5d13acb8d)) -* **web:** 修复 alert 列表编辑没有反应 ([1da7e7b](https://github.com/ohbug-org/ohbug-dashboard/commit/1da7e7b0582eec7de13ec35d38e70be01d759865)) +- **server:** 修复 alert message 为空 ([9ef7094](https://github.com/ohbug-org/ohbug-dashboard/commit/9ef7094e55a0c5e2fc26bbc55d34fb7f4f973da0)) +- **server:** 修复 alert 通知 @ 人不生效 ([67bb1f0](https://github.com/ohbug-org/ohbug-dashboard/commit/67bb1f034808662c25cceba7618b2d60c7076352)) +- **server:** 修复 conditionMatch filterMatch 不生效 ([f625ee7](https://github.com/ohbug-org/ohbug-dashboard/commit/f625ee709b199efcc729fb33f0dda73096f595d6)) +- **server:** 修复聚合生成 md5 Object 导致的一致性问题 ([c5ce04b](https://github.com/ohbug-org/ohbug-dashboard/commit/c5ce04becd4ec47c6e22b1cd8b9814e8f9febbae)) +- **web:** issues 页面默认查询最近的 event 记录 ([67282fd](https://github.com/ohbug-org/ohbug-dashboard/commit/67282fd1301eff50cdb0de670da390e5d13acb8d)) +- **web:** 修复 alert 列表编辑没有反应 ([1da7e7b](https://github.com/ohbug-org/ohbug-dashboard/commit/1da7e7b0582eec7de13ec35d38e70be01d759865)) ## [0.8.1](https://github.com/ohbug-org/ohbug-dashboard/compare/0.8.0...0.8.1) (2022-09-08) - ### Bug Fixes -* 修复 nextAuth 回调地址设置错误 ([0b4935d](https://github.com/ohbug-org/ohbug-dashboard/commit/0b4935d6cbc6952ba52d331f3860952da91e3a03)) +- 修复 nextAuth 回调地址设置错误 ([0b4935d](https://github.com/ohbug-org/ohbug-dashboard/commit/0b4935d6cbc6952ba52d331f3860952da91e3a03)) # [0.8.0](https://github.com/ohbug-org/ohbug-dashboard/compare/0.7.2...0.8.0) (2022-09-07) - ### Bug Fixes -* 完善 https 配置 ([3e985b8](https://github.com/ohbug-org/ohbug-dashboard/commit/3e985b883cb8193ff0394abe1cb236dffe1c6a5e)) - +- 完善 https 配置 ([3e985b8](https://github.com/ohbug-org/ohbug-dashboard/commit/3e985b883cb8193ff0394abe1cb236dffe1c6a5e)) ### Features -* 支持 https ([a2f2bfa](https://github.com/ohbug-org/ohbug-dashboard/commit/a2f2bfae0dd9f46c8dcb7aa9558346e3bcee0f14)) +- 支持 https ([a2f2bfa](https://github.com/ohbug-org/ohbug-dashboard/commit/a2f2bfae0dd9f46c8dcb7aa9558346e3bcee0f14)) ## [0.7.2](https://github.com/ohbug-org/ohbug-dashboard/compare/0.7.1...0.7.2) (2022-09-05) - ### Bug Fixes -* adapter sdk ([4b6554d](https://github.com/ohbug-org/ohbug-dashboard/commit/4b6554d71fbbfac9dea7ec44aa9b411da64faf44)) -* **server:** sourceMap 上传使用队列 解决 release 重复创建 ([645cbec](https://github.com/ohbug-org/ohbug-dashboard/commit/645cbec99c1488001cda11f9511d217602a2a430)) -* **server:** 优化 webhook 内容展示 ([31c44be](https://github.com/ohbug-org/ohbug-dashboard/commit/31c44be45f0bca99fea0dbe1f17e4ccfec82d375)) -* **web:** fix issueList link error ([cefdeff](https://github.com/ohbug-org/ohbug-dashboard/commit/cefdeff79f6bf551664d88f649adaac4a6ad24f2)) +- adapter sdk ([4b6554d](https://github.com/ohbug-org/ohbug-dashboard/commit/4b6554d71fbbfac9dea7ec44aa9b411da64faf44)) +- **server:** sourceMap 上传使用队列 解决 release 重复创建 ([645cbec](https://github.com/ohbug-org/ohbug-dashboard/commit/645cbec99c1488001cda11f9511d217602a2a430)) +- **server:** 优化 webhook 内容展示 ([31c44be](https://github.com/ohbug-org/ohbug-dashboard/commit/31c44be45f0bca99fea0dbe1f17e4ccfec82d375)) +- **web:** fix issueList link error ([cefdeff](https://github.com/ohbug-org/ohbug-dashboard/commit/cefdeff79f6bf551664d88f649adaac4a6ad24f2)) ## [0.7.1](https://github.com/ohbug-org/ohbug-dashboard/compare/0.7.0...0.7.1) (2022-09-02) # [0.7.0](https://github.com/ohbug-org/ohbug-dashboard/compare/0.6.0...0.7.0) (2022-09-01) - ### Features -* **web:** support delete issues ([b713c46](https://github.com/ohbug-org/ohbug-dashboard/commit/b713c46c26d03d04ce112e23fe5b89ce743c0e93)) -* **web:** support delete release and sourceMaps ([4a42c66](https://github.com/ohbug-org/ohbug-dashboard/commit/4a42c66e6e85c51c907736eda9690d0cbaa77e2f)) +- **web:** support delete issues ([b713c46](https://github.com/ohbug-org/ohbug-dashboard/commit/b713c46c26d03d04ce112e23fe5b89ce743c0e93)) +- **web:** support delete release and sourceMaps ([4a42c66](https://github.com/ohbug-org/ohbug-dashboard/commit/4a42c66e6e85c51c907736eda9690d0cbaa77e2f)) # [0.6.0](https://github.com/ohbug-org/ohbug-dashboard/compare/0.5.0...0.6.0) (2022-08-31) - ### Bug Fixes -* **server:** fixed logger problem ([48fadbe](https://github.com/ohbug-org/ohbug-dashboard/commit/48fadbe6f7b3db62eb07e955df2d454820bdb47d)) - +- **server:** fixed logger problem ([48fadbe](https://github.com/ohbug-org/ohbug-dashboard/commit/48fadbe6f7b3db62eb07e955df2d454820bdb47d)) ### Features -* add user page ([573ea2d](https://github.com/ohbug-org/ohbug-dashboard/commit/573ea2d96e5e0a276ab4a77e325279e50c8e02b9)) +- add user page ([573ea2d](https://github.com/ohbug-org/ohbug-dashboard/commit/573ea2d96e5e0a276ab4a77e325279e50c8e02b9)) # [0.5.0](https://github.com/ohbug-org/ohbug-dashboard/compare/0.4.1...0.5.0) (2022-08-30) - ### Bug Fixes -* **server:** remove cluster mode ([79ee80e](https://github.com/ohbug-org/ohbug-dashboard/commit/79ee80e153396fadf47817fe7c6270f6d14e25de)) -* **web:** error stack visible problem ([f820135](https://github.com/ohbug-org/ohbug-dashboard/commit/f820135533c00dcd93976451611b808f020923cd)) -* **web:** fix copy error ([c5d1340](https://github.com/ohbug-org/ohbug-dashboard/commit/c5d1340dbb7368cfaa639a193de8e7df52e2b0ce)) - +- **server:** remove cluster mode ([79ee80e](https://github.com/ohbug-org/ohbug-dashboard/commit/79ee80e153396fadf47817fe7c6270f6d14e25de)) +- **web:** error stack visible problem ([f820135](https://github.com/ohbug-org/ohbug-dashboard/commit/f820135533c00dcd93976451611b808f020923cd)) +- **web:** fix copy error ([c5d1340](https://github.com/ohbug-org/ohbug-dashboard/commit/c5d1340dbb7368cfaa639a193de8e7df52e2b0ce)) ### Features -* **server:** delete expiration data regularly every day ([ffc77e6](https://github.com/ohbug-org/ohbug-dashboard/commit/ffc77e68a3079574181132f57e334c6bb466207b)) -* **server:** update http error group fields ([e324e5c](https://github.com/ohbug-org/ohbug-dashboard/commit/e324e5cd23146f3890e79cb653142e04cf3d3d66)) -* **server:** use nestjs-pino ([f8d8fb9](https://github.com/ohbug-org/ohbug-dashboard/commit/f8d8fb9e9624036b23a77659d81409ffec9fb6ae)) -* **web:** issue support order ([e452838](https://github.com/ohbug-org/ohbug-dashboard/commit/e452838e68ef9fc1f2ed9b97513cdd030d808da5)) -* **web:** nextLink passHref ([8666d51](https://github.com/ohbug-org/ohbug-dashboard/commit/8666d5187b75d23b21a66031e4c1032156f75a79)) -* **web:** order findMany results ([562a040](https://github.com/ohbug-org/ohbug-dashboard/commit/562a040107fd5107d5b038ba1f346d8a1ae85aea)) +- **server:** delete expiration data regularly every day ([ffc77e6](https://github.com/ohbug-org/ohbug-dashboard/commit/ffc77e68a3079574181132f57e334c6bb466207b)) +- **server:** update http error group fields ([e324e5c](https://github.com/ohbug-org/ohbug-dashboard/commit/e324e5cd23146f3890e79cb653142e04cf3d3d66)) +- **server:** use nestjs-pino ([f8d8fb9](https://github.com/ohbug-org/ohbug-dashboard/commit/f8d8fb9e9624036b23a77659d81409ffec9fb6ae)) +- **web:** issue support order ([e452838](https://github.com/ohbug-org/ohbug-dashboard/commit/e452838e68ef9fc1f2ed9b97513cdd030d808da5)) +- **web:** nextLink passHref ([8666d51](https://github.com/ohbug-org/ohbug-dashboard/commit/8666d5187b75d23b21a66031e4c1032156f75a79)) +- **web:** order findMany results ([562a040](https://github.com/ohbug-org/ohbug-dashboard/commit/562a040107fd5107d5b038ba1f346d8a1ae85aea)) ## [0.4.1](https://github.com/ohbug-org/ohbug-dashboard/compare/0.4.0...0.4.1) (2022-08-26) - ### Bug Fixes -* **server:** fix server too large body error ([835d493](https://github.com/ohbug-org/ohbug-dashboard/commit/835d49396298494209f8ecd22aa34078103f5c44)) +- **server:** fix server too large body error ([835d493](https://github.com/ohbug-org/ohbug-dashboard/commit/835d49396298494209f8ecd22aa34078103f5c44)) # [0.4.0](https://github.com/ohbug-org/ohbug-dashboard/compare/0.3.2...0.4.0) (2022-08-24) - ### Features -* **server:** report api return httpCode 204 ([cdd7b66](https://github.com/ohbug-org/ohbug-dashboard/commit/cdd7b662e2ca940041d7595fa66bae38d95d9de9)) -* **server:** support cluster mode ([cb06054](https://github.com/ohbug-org/ohbug-dashboard/commit/cb06054e835b0641fed967b11e99edaafafc966d)) -* **web:** hide project profile pv data ([e916e49](https://github.com/ohbug-org/ohbug-dashboard/commit/e916e49ea3c47224b7849a2856e0a4ee4b1ddced)) -* **web:** project profile complete i18n ([b162f09](https://github.com/ohbug-org/ohbug-dashboard/commit/b162f09a68525c7a674d9e213ff064386d23b445)) -* **web:** project profile support view path and referrer group data ([bac11ff](https://github.com/ohbug-org/ohbug-dashboard/commit/bac11ff177273b30237d44852f7b44253e2f5569)) -* **web:** support credentials signin ([c2465c8](https://github.com/ohbug-org/ohbug-dashboard/commit/c2465c88e3b8bb36c3d3ae5c9a5ba2ae259eb9ce)) +- **server:** report api return httpCode 204 ([cdd7b66](https://github.com/ohbug-org/ohbug-dashboard/commit/cdd7b662e2ca940041d7595fa66bae38d95d9de9)) +- **server:** support cluster mode ([cb06054](https://github.com/ohbug-org/ohbug-dashboard/commit/cb06054e835b0641fed967b11e99edaafafc966d)) +- **web:** hide project profile pv data ([e916e49](https://github.com/ohbug-org/ohbug-dashboard/commit/e916e49ea3c47224b7849a2856e0a4ee4b1ddced)) +- **web:** project profile complete i18n ([b162f09](https://github.com/ohbug-org/ohbug-dashboard/commit/b162f09a68525c7a674d9e213ff064386d23b445)) +- **web:** project profile support view path and referrer group data ([bac11ff](https://github.com/ohbug-org/ohbug-dashboard/commit/bac11ff177273b30237d44852f7b44253e2f5569)) +- **web:** support credentials signin ([c2465c8](https://github.com/ohbug-org/ohbug-dashboard/commit/c2465c88e3b8bb36c3d3ae5c9a5ba2ae259eb9ce)) ## [0.3.2](https://github.com/ohbug-org/ohbug-dashboard/compare/0.3.1...0.3.2) (2022-08-19) ## [0.3.1](https://github.com/ohbug-org/ohbug-dashboard/compare/0.3.0...0.3.1) (2022-08-18) - ### Bug Fixes -* **web:** user error ([86409f0](https://github.com/ohbug-org/ohbug-dashboard/commit/86409f0d81eefbee15b2c440f5f133b230eaf35e)) +- **web:** user error ([86409f0](https://github.com/ohbug-org/ohbug-dashboard/commit/86409f0d81eefbee15b2c440f5f133b230eaf35e)) # [0.3.0](https://github.com/ohbug-org/ohbug-dashboard/compare/0.2.0...0.3.0) (2022-08-18) - ### Features -* **prisma:** drop useless column ([49e586c](https://github.com/ohbug-org/ohbug-dashboard/commit/49e586cf42236a565cfc339effc1d5f20d971c5b)) - +- **prisma:** drop useless column ([49e586c](https://github.com/ohbug-org/ohbug-dashboard/commit/49e586cf42236a565cfc339effc1d5f20d971c5b)) ### Performance Improvements -* change user table ([c697710](https://github.com/ohbug-org/ohbug-dashboard/commit/c6977101e699aadf0d25a69ace339a577cb28b7a)) +- change user table ([c697710](https://github.com/ohbug-org/ohbug-dashboard/commit/c6977101e699aadf0d25a69ace339a577cb28b7a)) # [0.2.0](https://github.com/ohbug-org/ohbug-dashboard/compare/0.1.3...0.2.0) (2022-08-17) - ### Bug Fixes -* **web:** eslint warning ([64881ef](https://github.com/ohbug-org/ohbug-dashboard/commit/64881ef14ba659cdc4262b9dc35dd63f4b14be3f)) -* **web:** reload data after deps changed ([f4d7422](https://github.com/ohbug-org/ohbug-dashboard/commit/f4d742207f4918bc72bcc3b2d6dc313cdfc14b22)) -* **web:** trendChart render ([f8a6c78](https://github.com/ohbug-org/ohbug-dashboard/commit/f8a6c785a0068b1242fb7cd87138f297ebfd2c72)) - +- **web:** eslint warning ([64881ef](https://github.com/ohbug-org/ohbug-dashboard/commit/64881ef14ba659cdc4262b9dc35dd63f4b14be3f)) +- **web:** reload data after deps changed ([f4d7422](https://github.com/ohbug-org/ohbug-dashboard/commit/f4d742207f4918bc72bcc3b2d6dc313cdfc14b22)) +- **web:** trendChart render ([f8a6c78](https://github.com/ohbug-org/ohbug-dashboard/commit/f8a6c785a0068b1242fb7cd87138f297ebfd2c72)) ### Features -* **server:** store view data ([5a44d56](https://github.com/ohbug-org/ohbug-dashboard/commit/5a44d56a039b55255bb499626927d47bfcc0df32)) -* **web:** add integration button ([76d54a6](https://github.com/ohbug-org/ohbug-dashboard/commit/76d54a60c2c612201ceefb81c0e4257cc9e8c87e)) -* **web:** only error event support check raw json data ([12bad61](https://github.com/ohbug-org/ohbug-dashboard/commit/12bad61446fe782e8f0a2529a1d0cd1fa1779db3)) -* **web:** simplify API Route ([82994d5](https://github.com/ohbug-org/ohbug-dashboard/commit/82994d5f29dd2fb9b837bd3d558429e1f7eaaecc)) -* **web:** simplify trends api ([b646a75](https://github.com/ohbug-org/ohbug-dashboard/commit/b646a754ee0bd19d85851fd761e50f2f3bac9894)) -* **web:** support check feedback detail ([de13466](https://github.com/ohbug-org/ohbug-dashboard/commit/de13466c94e6d75a60eea281d2bd68efdff34607)) -* **web:** use nprogress ([3e63544](https://github.com/ohbug-org/ohbug-dashboard/commit/3e635445c8177b933f83003f29448526f943a924)) +- **server:** store view data ([5a44d56](https://github.com/ohbug-org/ohbug-dashboard/commit/5a44d56a039b55255bb499626927d47bfcc0df32)) +- **web:** add integration button ([76d54a6](https://github.com/ohbug-org/ohbug-dashboard/commit/76d54a60c2c612201ceefb81c0e4257cc9e8c87e)) +- **web:** only error event support check raw json data ([12bad61](https://github.com/ohbug-org/ohbug-dashboard/commit/12bad61446fe782e8f0a2529a1d0cd1fa1779db3)) +- **web:** simplify API Route ([82994d5](https://github.com/ohbug-org/ohbug-dashboard/commit/82994d5f29dd2fb9b837bd3d558429e1f7eaaecc)) +- **web:** simplify trends api ([b646a75](https://github.com/ohbug-org/ohbug-dashboard/commit/b646a754ee0bd19d85851fd761e50f2f3bac9894)) +- **web:** support check feedback detail ([de13466](https://github.com/ohbug-org/ohbug-dashboard/commit/de13466c94e6d75a60eea281d2bd68efdff34607)) +- **web:** use nprogress ([3e63544](https://github.com/ohbug-org/ohbug-dashboard/commit/3e635445c8177b933f83003f29448526f943a924)) ## [0.1.3](https://github.com/ohbug-org/ohbug-dashboard/compare/0.1.2...0.1.3) (2022-08-09) - ### Bug Fixes -* **web:** next-auth warning ([cb721d2](https://github.com/ohbug-org/ohbug-dashboard/commit/cb721d20ede836a2b7952e3fff4d5d28a23f1ca9)) +- **web:** next-auth warning ([cb721d2](https://github.com/ohbug-org/ohbug-dashboard/commit/cb721d20ede836a2b7952e3fff4d5d28a23f1ca9)) ## [0.1.2](https://github.com/ohbug-org/ohbug-dashboard/compare/0.1.1...0.1.2) (2022-08-09) - ### Bug Fixes -* **web:** nextjs middleware position error ([74f3bbf](https://github.com/ohbug-org/ohbug-dashboard/commit/74f3bbf219ca9927b37947608bab2d5cded39bb9)) +- **web:** nextjs middleware position error ([74f3bbf](https://github.com/ohbug-org/ohbug-dashboard/commit/74f3bbf219ca9927b37947608bab2d5cded39bb9)) ## [0.1.1](https://github.com/ohbug-org/ohbug-dashboard/compare/0.1.0...0.1.1) (2022-08-09) - ### Bug Fixes -* **web:** ts error ([46e6ed4](https://github.com/ohbug-org/ohbug-dashboard/commit/46e6ed474338805dcb542a355112a49b2ec6e1f6)) +- **web:** ts error ([46e6ed4](https://github.com/ohbug-org/ohbug-dashboard/commit/46e6ed474338805dcb542a355112a49b2ec6e1f6)) # 0.1.0 (2022-08-09) - ### Bug Fixes -* **docker:** docker-compose 环境变量从 .env 读取 ([c2a312b](https://github.com/ohbug-org/ohbug-dashboard/commit/c2a312b8deb9e7057abc774ebeaa8436485b3441)) -* **docker:** 修复 docker arm 架构构建报错 ([d6e7aea](https://github.com/ohbug-org/ohbug-dashboard/commit/d6e7aea47597a3364163e764041aff1eb4ed2447)) -* **docker:** 调整 dockerfile ([6ac4ca8](https://github.com/ohbug-org/ohbug-dashboard/commit/6ac4ca8d7fbf39481b52e58042416810a8ec5320)) -* fixed dockerfile ([7d42019](https://github.com/ohbug-org/ohbug-dashboard/commit/7d4201956825f35806e36a195e46314f8a02266e)) -* **prisma:** 修复 createdAt 数据类型 ([bb7249e](https://github.com/ohbug-org/ohbug-dashboard/commit/bb7249efd002aa2127fdc7081df85b1208e980e9)) -* **server:** 修复 alert interval 生效逻辑问题 ([7e2036a](https://github.com/ohbug-org/ohbug-dashboard/commit/7e2036a64c08a29eff1f6d1f759207a426118258)) -* **web:** get issues trends error ([c995642](https://github.com/ohbug-org/ohbug-dashboard/commit/c995642d8396fc035db19ba3d0bc6583e61cf4fb)) -* **web:** menu list zindex 调整 ([65883f3](https://github.com/ohbug-org/ohbug-dashboard/commit/65883f3f8fe8e828a64fe25f1782d33f25837141)) -* **web:** ohbug.config 加入 url 配置 ([d5cc2e2](https://github.com/ohbug-org/ohbug-dashboard/commit/d5cc2e2531e622fa5da475058889b90487839425)) -* **web:** project profile 默认跳转 ([9912b82](https://github.com/ohbug-org/ohbug-dashboard/commit/9912b822e2eb091273a42cdfb774bd8b97bfa224)) -* **web:** 修复 event 创建 issue updatedAt 不更新 ([cf3b003](https://github.com/ohbug-org/ohbug-dashboard/commit/cf3b00380258761e147d68cb83cb63b17a33f72a)) -* **web:** 修复 nextjs warning ([3d9fa88](https://github.com/ohbug-org/ohbug-dashboard/commit/3d9fa8833b048ec4f77413bb9101d7e434c98196)) -* **web:** 修正 ip 地址显示 ([3308ce8](https://github.com/ohbug-org/ohbug-dashboard/commit/3308ce841b209329c305fe8937e48adc2385a8f6)) - +- **docker:** docker-compose 环境变量从 .env 读取 ([c2a312b](https://github.com/ohbug-org/ohbug-dashboard/commit/c2a312b8deb9e7057abc774ebeaa8436485b3441)) +- **docker:** 修复 docker arm 架构构建报错 ([d6e7aea](https://github.com/ohbug-org/ohbug-dashboard/commit/d6e7aea47597a3364163e764041aff1eb4ed2447)) +- **docker:** 调整 dockerfile ([6ac4ca8](https://github.com/ohbug-org/ohbug-dashboard/commit/6ac4ca8d7fbf39481b52e58042416810a8ec5320)) +- fixed dockerfile ([7d42019](https://github.com/ohbug-org/ohbug-dashboard/commit/7d4201956825f35806e36a195e46314f8a02266e)) +- **prisma:** 修复 createdAt 数据类型 ([bb7249e](https://github.com/ohbug-org/ohbug-dashboard/commit/bb7249efd002aa2127fdc7081df85b1208e980e9)) +- **server:** 修复 alert interval 生效逻辑问题 ([7e2036a](https://github.com/ohbug-org/ohbug-dashboard/commit/7e2036a64c08a29eff1f6d1f759207a426118258)) +- **web:** get issues trends error ([c995642](https://github.com/ohbug-org/ohbug-dashboard/commit/c995642d8396fc035db19ba3d0bc6583e61cf4fb)) +- **web:** menu list zindex 调整 ([65883f3](https://github.com/ohbug-org/ohbug-dashboard/commit/65883f3f8fe8e828a64fe25f1782d33f25837141)) +- **web:** ohbug.config 加入 url 配置 ([d5cc2e2](https://github.com/ohbug-org/ohbug-dashboard/commit/d5cc2e2531e622fa5da475058889b90487839425)) +- **web:** project profile 默认跳转 ([9912b82](https://github.com/ohbug-org/ohbug-dashboard/commit/9912b822e2eb091273a42cdfb774bd8b97bfa224)) +- **web:** 修复 event 创建 issue updatedAt 不更新 ([cf3b003](https://github.com/ohbug-org/ohbug-dashboard/commit/cf3b00380258761e147d68cb83cb63b17a33f72a)) +- **web:** 修复 nextjs warning ([3d9fa88](https://github.com/ohbug-org/ohbug-dashboard/commit/3d9fa8833b048ec4f77413bb9101d7e434c98196)) +- **web:** 修正 ip 地址显示 ([3308ce8](https://github.com/ohbug-org/ohbug-dashboard/commit/3308ce841b209329c305fe8937e48adc2385a8f6)) ### Features -* add package server ([9cd7e14](https://github.com/ohbug-org/ohbug-dashboard/commit/9cd7e14b940016f2058f3145cf3c1c671b3a87e2)) -* **docker:** complete docker deployment ([4752bbe](https://github.com/ohbug-org/ohbug-dashboard/commit/4752bbe365a4cafa022ee0a4f325e37e2c6ead17)) -* **docker:** use default node image ([c41c960](https://github.com/ohbug-org/ohbug-dashboard/commit/c41c960db1fffb091fc034b3e2bb478d19a68b3f)) -* **docker:** 调整启动方式 使用 yml 配置文件 ([1122cb8](https://github.com/ohbug-org/ohbug-dashboard/commit/1122cb874c0acfc1bd4427077c20b0992d70a778)) -* init ([ceaad0b](https://github.com/ohbug-org/ohbug-dashboard/commit/ceaad0b0d6d64edf06dff583cdd63fc44b57805a)) -* **prisma:** create index ([fb75c8d](https://github.com/ohbug-org/ohbug-dashboard/commit/fb75c8d779cd9614b5db84a69a0c8e013ecea8c6)) -* remix 迁移至 next ([3fcf53a](https://github.com/ohbug-org/ohbug-dashboard/commit/3fcf53acfd37faf899b5efb6245f56da92cdb873)) -* **server:** 完成sourceMap上传 ([a0b6f83](https://github.com/ohbug-org/ohbug-dashboard/commit/a0b6f83338bd41fcbc5f76b87ba8322762e261da)) -* **server:** event 上报加入 apiKey 校验 ([223d50b](https://github.com/ohbug-org/ohbug-dashboard/commit/223d50bbfdd1fa4a934d78a7cc0a7c4b3818a5d6)) -* **server:** store metric data ([9a73089](https://github.com/ohbug-org/ohbug-dashboard/commit/9a73089c100a041047b4bc017477e25cb08637d5)) -* **server:** 使用 postgresql 存储 event ([93cd770](https://github.com/ohbug-org/ohbug-dashboard/commit/93cd77068404540167664a82949f14b749f347d5)) -* **server:** 完成 event/issue 存储 ([b856d6d](https://github.com/ohbug-org/ohbug-dashboard/commit/b856d6d9bc7ab9c1ec8b5c982b0a1a1707f92346)) -* **server:** 完成 event/issue/user 表 ([7fe6b2a](https://github.com/ohbug-org/ohbug-dashboard/commit/7fe6b2a22ac4e3824b2ad91cd2148714e7792c40)) -* **server:** 对接 clickhouse ([da409af](https://github.com/ohbug-org/ohbug-dashboard/commit/da409afd985c3346c2c17d696b6e73da9583092f)) -* **server:** 简化 config 获取流程 ([8b568cd](https://github.com/ohbug-org/ohbug-dashboard/commit/8b568cdd758bb120fb89b79d5bf76d434e7d8789)) -* support report and preview feedback ([a8e5114](https://github.com/ohbug-org/ohbug-dashboard/commit/a8e511483b6c740b639981e4596372b2867da845)) -* update deps and adapter prisma4 ([c670382](https://github.com/ohbug-org/ohbug-dashboard/commit/c670382820740ccb9b2b3dc7bf049c34f4c96e09)) -* **web:** add empty issues view ([6e1bfd7](https://github.com/ohbug-org/ohbug-dashboard/commit/6e1bfd76c2e5705c7e4e4cca6dddbfe110fd70df)) -* **web:** add get apikey tips ([b058670](https://github.com/ohbug-org/ohbug-dashboard/commit/b058670994354aaeae0045d00cb4963d98288428)) -* **web:** add metrics integration guide ([a6ba9f2](https://github.com/ohbug-org/ohbug-dashboard/commit/a6ba9f2d5c9e98a862e8c1eb610ef554d1f81515)) -* **web:** add nextauth middleware ([c5bef8d](https://github.com/ohbug-org/ohbug-dashboard/commit/c5bef8d7e2db30db73efab954214d2b27a83296b)) -* **web:** add title to metric page ([2e3ab1c](https://github.com/ohbug-org/ohbug-dashboard/commit/2e3ab1c0882340745516ecb4005ebf7e8c3fdc88)) -* **web:** card 组件 hover default false ([a364944](https://github.com/ohbug-org/ohbug-dashboard/commit/a364944ff7b323599df6c69674bffdb2d1d8f2da)) -* **web:** dashboard support metrics ([a30953e](https://github.com/ohbug-org/ohbug-dashboard/commit/a30953e85f0150b4ba28788fdae57dc2b1d4f249)) -* **web:** finish dark mode ([55186c4](https://github.com/ohbug-org/ohbug-dashboard/commit/55186c4321f80db13214b302f5917d5defe7f966)) -* **web:** finish invite members ([9442246](https://github.com/ohbug-org/ohbug-dashboard/commit/94422469b8ad67bb1c29374b6c458dae0a509f4e)) -* **web:** finish issues search ([bffc457](https://github.com/ohbug-org/ohbug-dashboard/commit/bffc45774ffb8278c25a27d780c9fbdf5a054070)) -* **web:** index 增加 create project 按钮 ([c762ab3](https://github.com/ohbug-org/ohbug-dashboard/commit/c762ab3e31f717ba4ef9be528388d0d16e608b2c)) -* **web:** issue detail trends 样式调整 ([c3a6c69](https://github.com/ohbug-org/ohbug-dashboard/commit/c3a6c697942c9ec799992d109d3ec9ed42d19d75)) -* **web:** issue detail 页面加入 breadcrumb ([22e061e](https://github.com/ohbug-org/ohbug-dashboard/commit/22e061ec318e7d3d2d9ad550ec0fb53578c4ab2e)) -* **web:** issue detail 页面样式调整 ([f934f78](https://github.com/ohbug-org/ohbug-dashboard/commit/f934f7839c9358acd8af4402b3b355fffb0885f9)) -* **web:** issue events 页面样式调整 ([8a35b52](https://github.com/ohbug-org/ohbug-dashboard/commit/8a35b5220f9f9317bf68ab8dd06f48d8ddd83f78)) -* **web:** issues 列表展示 events users 数量 ([0bfd469](https://github.com/ohbug-org/ohbug-dashboard/commit/0bfd469cbf56a5623d38b425ec882285e2cae46b)) -* **web:** navMenu 加入 settings 路由 ([590fed3](https://github.com/ohbug-org/ohbug-dashboard/commit/590fed38e6d1fdea142767bde6bf56d970c39be3)) -* **web:** project 切换同时切换当前路由 ([851ef66](https://github.com/ohbug-org/ohbug-dashboard/commit/851ef66ed5eaefc59358fcc771f4f85907b8105d)) -* **web:** projects 根据 用户查询 ([9700c35](https://github.com/ohbug-org/ohbug-dashboard/commit/9700c357effd58afa766edf59b97840dccf43140)) -* **web:** projects 页面查询 project trends ([6574676](https://github.com/ohbug-org/ohbug-dashboard/commit/6574676c8ac81dbdc4c80072269f1f3da5a64593)) -* **web:** read config from ohbug.config.yml ([dc1610f](https://github.com/ohbug-org/ohbug-dashboard/commit/dc1610f5aa2bf203311fb87b51671d83c356e293)) -* **web:** redirect create-project if user not has project ([e594318](https://github.com/ohbug-org/ohbug-dashboard/commit/e5943189642078f1eb1f50b798c16122d842e7ee)) -* **web:** redirect index if already signin ([0fd6708](https://github.com/ohbug-org/ohbug-dashboard/commit/0fd670839df0fbf857fb8fababf35d8c39d72a46)) -* **web:** redirect to signin when not have authorization ([e7a770d](https://github.com/ohbug-org/ohbug-dashboard/commit/e7a770dc4416e7f55068f27aa36334dbcda9e4be)) -* **web:** scroll navmenu logo click scroll to top ([1997561](https://github.com/ohbug-org/ohbug-dashboard/commit/19975611ffc5552032b84bf9a61e2928836e9e72)) -* **web:** support delete alert ([67d897a](https://github.com/ohbug-org/ohbug-dashboard/commit/67d897a02130c97c3ba258eb64c7c17340ac2a67)) -* **web:** support i18n ([01cde98](https://github.com/ohbug-org/ohbug-dashboard/commit/01cde984a573a7b6c9255fd88f265aa25916ca89)) -* **web:** support preview custom metadata ([ba4249e](https://github.com/ohbug-org/ohbug-dashboard/commit/ba4249e0d3de6188e656b14af6436cbb81771d9d)) -* **web:** support version detection and upgrade prompt ([d31b56e](https://github.com/ohbug-org/ohbug-dashboard/commit/d31b56ee85a9122893a4f5a2bd27077a38cd7268)) -* **web:** themeBox 加入 acrylic props ([5f68b96](https://github.com/ohbug-org/ohbug-dashboard/commit/5f68b967006d26f5a1200f0c05761999f59d2c09)) -* **web:** trendChart 展示 loading 状态 ([bbc1de5](https://github.com/ohbug-org/ohbug-dashboard/commit/bbc1de525a02f1073628144f7f2c3d57eff59425)) -* **web:** 主题样式微调 ([40fa5df](https://github.com/ohbug-org/ohbug-dashboard/commit/40fa5dfb4b9ad529e0719cacdf2a3792bf49b270)) -* **web:** 优化 issue detail 页面 减少非必要查询 ([786532e](https://github.com/ohbug-org/ohbug-dashboard/commit/786532e810f28309d4ba38a565eacd0b9de8ecfe)) -* **web:** 优化 issueList 样式 ([ae787c6](https://github.com/ohbug-org/ohbug-dashboard/commit/ae787c6af3111f15b12635f9636c0da138c60945)) -* **web:** 使用 next auth 登录页面 ([9e0ce8c](https://github.com/ohbug-org/ohbug-dashboard/commit/9e0ce8c2bb6a52bd6a99bb0705ecc99e8b6a5961)) -* **web:** 使用 react-icons 作为图标库 ([a613654](https://github.com/ohbug-org/ohbug-dashboard/commit/a613654b0a0949f25ecb36d800de69a77ec1b08b)) -* **web:** 加入 projects 页面 ([9cc87ea](https://github.com/ohbug-org/ohbug-dashboard/commit/9cc87ead269a080e6140761732a1e0bdad6aab4e)) -* **web:** 加入 searchBar 组件 ([df71220](https://github.com/ohbug-org/ohbug-dashboard/commit/df712201072141ab55a98761a3891ebbbca1d7b7)) -* **web:** 加入权限验证 ([fd62e15](https://github.com/ohbug-org/ohbug-dashboard/commit/fd62e1559e703cc26dd3adbb74e54e7d5f9af828)) -* **web:** 完善 project card 数据展示 ([032d2bc](https://github.com/ohbug-org/ohbug-dashboard/commit/032d2bc7440485c7783367d46ad31a78cf1d8823)) -* **web:** 完成 footer ([0abe255](https://github.com/ohbug-org/ohbug-dashboard/commit/0abe255de49046cbf023fae0c1a9229e8995721f)) -* **web:** 完成 issue detail 更多事件页面 ([e248a90](https://github.com/ohbug-org/ohbug-dashboard/commit/e248a90b02326da7d1b91f0db09fa32331243442)) -* **web:** 完成 issue detail 页面 堆栈信息展示 ([666a341](https://github.com/ohbug-org/ohbug-dashboard/commit/666a34157eb88c26800b068af8e9011867cde425)) -* **web:** 完成 issue detail 页面标签列展示 ([534d0f0](https://github.com/ohbug-org/ohbug-dashboard/commit/534d0f0f6c9c1d4e1a7d541c3da6d5d61fe004c2)) -* **web:** 完成 issue detail 页面趋势信息展示 ([d913d3e](https://github.com/ohbug-org/ohbug-dashboard/commit/d913d3e175441d7ffbef858470f34dd3e99b744b)) -* **web:** 完成 issue list 分页 ([fb502de](https://github.com/ohbug-org/ohbug-dashboard/commit/fb502de812eed29a84fe1b34e7648e1391f17dbd)) -* **web:** 完成 issue trends 数据查询与展示 ([42d55e9](https://github.com/ohbug-org/ohbug-dashboard/commit/42d55e9a40cb8b1276d3bd338ace8cf66a213149)) -* **web:** 完成 navMenu 部分 ([779399d](https://github.com/ohbug-org/ohbug-dashboard/commit/779399d5348b3308559e1f876c7c6c6fbbd750a4)) -* **web:** 完成 project setting apiKey 展示 ([a5e2cf8](https://github.com/ohbug-org/ohbug-dashboard/commit/a5e2cf8f5137769238e3493f1933b16f6b277c99)) -* **web:** 完成 project setting update name ([cdad8bc](https://github.com/ohbug-org/ohbug-dashboard/commit/cdad8bcb688f8b02b8c9c6c05816df0aaa3331bd)) -* **web:** 完成 project trends chart 显示 ([73c263f](https://github.com/ohbug-org/ohbug-dashboard/commit/73c263f6c3c7aedda41ee4f32332a38bb14b8217)) -* **web:** 完成 project 的创建 ([9765988](https://github.com/ohbug-org/ohbug-dashboard/commit/9765988b2a068ed03fa6470f4977c0df5b28baa5)) -* **web:** 完成 project 预览页面 ([ca5900f](https://github.com/ohbug-org/ohbug-dashboard/commit/ca5900f6f3b908d02cc9a1a15bb00ef60161ff7b)) -* **web:** 完成 release list 和 sourceMaps 页面 ([ad881e0](https://github.com/ohbug-org/ohbug-dashboard/commit/ad881e0a82f6ea653e6c117c5c3acdcc9ce410c5)) -* **web:** 完成 user 组件以及 nav 基本布局 ([93f066f](https://github.com/ohbug-org/ohbug-dashboard/commit/93f066f32f7a78471c79b94bb7a879ee341bb9a4)) -* **web:** 完成layout布局 包含 nav navMenu user 等组件 ([353466a](https://github.com/ohbug-org/ohbug-dashboard/commit/353466a7b344edd03f02c9d72985e0c79d9503e1)) -* **web:** 完成授权登录流程 ([d26286d](https://github.com/ohbug-org/ohbug-dashboard/commit/d26286d575a93469ccd6e3cb6327590d95b5a5a0)) -* **web:** 对接 ohbug-extension-rrweb ([6a63f7f](https://github.com/ohbug-org/ohbug-dashboard/commit/6a63f7f56463765cf5e31d2e1fd2fd17cf998bca)) -* **web:** 整体迁移至 chakra-ui ([8a2ff2c](https://github.com/ohbug-org/ohbug-dashboard/commit/8a2ff2c2e5b7a0302713d98c2963b47c4ae5c154)) -* **web:** 新增 alert detail 页面 ([036eff0](https://github.com/ohbug-org/ohbug-dashboard/commit/036eff01b39942b7bec74578641eb86ef0a2be79)) -* **web:** 新增 issues 页面 ([4c4c157](https://github.com/ohbug-org/ohbug-dashboard/commit/4c4c157adf71082ad9786c9f9285a37a5c28e174)) -* **web:** 暂时删除 release detail 页 ([60079f4](https://github.com/ohbug-org/ohbug-dashboard/commit/60079f41d4ad160b0547872174a3b7f4553fced1)) -* **web:** 调整 issue tabs 样式 ([52fc349](https://github.com/ohbug-org/ohbug-dashboard/commit/52fc3499e03b4752d566da4d12b0c5f5c81bcf8f)) -* **web:** 调整 prisma client 获取方式 ([5d7f293](https://github.com/ohbug-org/ohbug-dashboard/commit/5d7f293a99da8ec9df780675858a9a81f057ca41)) -* **web:** 部分页面布局更新 使用 wrapper ([c295cf6](https://github.com/ohbug-org/ohbug-dashboard/commit/c295cf6baaf10f5f6eee28b3e8f1b300f877252e)) -* 准备 issue 趋势图数据 ([d0f8c35](https://github.com/ohbug-org/ohbug-dashboard/commit/d0f8c35f5231f96dd41f73c659b219b7139548ad)) -* 加入 issue 详情页 ([326939a](https://github.com/ohbug-org/ohbug-dashboard/commit/326939ad6f5675d3dedd6e42772afb9368377da0)) -* 完成 issues 列表基本展示 ([b5dc389](https://github.com/ohbug-org/ohbug-dashboard/commit/b5dc389470e9b92dc77ee02c618feb04ab29b9c4)) -* 完成 sourceMap 还原代码 ([8c4bbbd](https://github.com/ohbug-org/ohbug-dashboard/commit/8c4bbbd43fa3009b733043cb2c4c3a508d88681a)) -* 完成基本环境配置、环境变量配置 ([3e36937](https://github.com/ohbug-org/ohbug-dashboard/commit/3e369373fde805ce760ff8837de63f81a402fc37)) -* 完成通知逻辑 ([d4f5a93](https://github.com/ohbug-org/ohbug-dashboard/commit/d4f5a9309d821b7edf83981ae525f2ca7ddc1d80)) -* 新增 email 登录方式 ([e713ca9](https://github.com/ohbug-org/ohbug-dashboard/commit/e713ca9c51d7e607b30ccd8fec15bb2bcb7ead68)) -* 路由调整为以 project 为基础 ([db3d9f2](https://github.com/ohbug-org/ohbug-dashboard/commit/db3d9f28ecf518496ba532d76c33a67821f98be1)) - +- add package server ([9cd7e14](https://github.com/ohbug-org/ohbug-dashboard/commit/9cd7e14b940016f2058f3145cf3c1c671b3a87e2)) +- **docker:** complete docker deployment ([4752bbe](https://github.com/ohbug-org/ohbug-dashboard/commit/4752bbe365a4cafa022ee0a4f325e37e2c6ead17)) +- **docker:** use default node image ([c41c960](https://github.com/ohbug-org/ohbug-dashboard/commit/c41c960db1fffb091fc034b3e2bb478d19a68b3f)) +- **docker:** 调整启动方式 使用 yml 配置文件 ([1122cb8](https://github.com/ohbug-org/ohbug-dashboard/commit/1122cb874c0acfc1bd4427077c20b0992d70a778)) +- init ([ceaad0b](https://github.com/ohbug-org/ohbug-dashboard/commit/ceaad0b0d6d64edf06dff583cdd63fc44b57805a)) +- **prisma:** create index ([fb75c8d](https://github.com/ohbug-org/ohbug-dashboard/commit/fb75c8d779cd9614b5db84a69a0c8e013ecea8c6)) +- remix 迁移至 next ([3fcf53a](https://github.com/ohbug-org/ohbug-dashboard/commit/3fcf53acfd37faf899b5efb6245f56da92cdb873)) +- **server:** 完成sourceMap上传 ([a0b6f83](https://github.com/ohbug-org/ohbug-dashboard/commit/a0b6f83338bd41fcbc5f76b87ba8322762e261da)) +- **server:** event 上报加入 apiKey 校验 ([223d50b](https://github.com/ohbug-org/ohbug-dashboard/commit/223d50bbfdd1fa4a934d78a7cc0a7c4b3818a5d6)) +- **server:** store metric data ([9a73089](https://github.com/ohbug-org/ohbug-dashboard/commit/9a73089c100a041047b4bc017477e25cb08637d5)) +- **server:** 使用 postgresql 存储 event ([93cd770](https://github.com/ohbug-org/ohbug-dashboard/commit/93cd77068404540167664a82949f14b749f347d5)) +- **server:** 完成 event/issue 存储 ([b856d6d](https://github.com/ohbug-org/ohbug-dashboard/commit/b856d6d9bc7ab9c1ec8b5c982b0a1a1707f92346)) +- **server:** 完成 event/issue/user 表 ([7fe6b2a](https://github.com/ohbug-org/ohbug-dashboard/commit/7fe6b2a22ac4e3824b2ad91cd2148714e7792c40)) +- **server:** 对接 clickhouse ([da409af](https://github.com/ohbug-org/ohbug-dashboard/commit/da409afd985c3346c2c17d696b6e73da9583092f)) +- **server:** 简化 config 获取流程 ([8b568cd](https://github.com/ohbug-org/ohbug-dashboard/commit/8b568cdd758bb120fb89b79d5bf76d434e7d8789)) +- support report and preview feedback ([a8e5114](https://github.com/ohbug-org/ohbug-dashboard/commit/a8e511483b6c740b639981e4596372b2867da845)) +- update deps and adapter prisma4 ([c670382](https://github.com/ohbug-org/ohbug-dashboard/commit/c670382820740ccb9b2b3dc7bf049c34f4c96e09)) +- **web:** add empty issues view ([6e1bfd7](https://github.com/ohbug-org/ohbug-dashboard/commit/6e1bfd76c2e5705c7e4e4cca6dddbfe110fd70df)) +- **web:** add get apikey tips ([b058670](https://github.com/ohbug-org/ohbug-dashboard/commit/b058670994354aaeae0045d00cb4963d98288428)) +- **web:** add metrics integration guide ([a6ba9f2](https://github.com/ohbug-org/ohbug-dashboard/commit/a6ba9f2d5c9e98a862e8c1eb610ef554d1f81515)) +- **web:** add nextauth middleware ([c5bef8d](https://github.com/ohbug-org/ohbug-dashboard/commit/c5bef8d7e2db30db73efab954214d2b27a83296b)) +- **web:** add title to metric page ([2e3ab1c](https://github.com/ohbug-org/ohbug-dashboard/commit/2e3ab1c0882340745516ecb4005ebf7e8c3fdc88)) +- **web:** card 组件 hover default false ([a364944](https://github.com/ohbug-org/ohbug-dashboard/commit/a364944ff7b323599df6c69674bffdb2d1d8f2da)) +- **web:** dashboard support metrics ([a30953e](https://github.com/ohbug-org/ohbug-dashboard/commit/a30953e85f0150b4ba28788fdae57dc2b1d4f249)) +- **web:** finish dark mode ([55186c4](https://github.com/ohbug-org/ohbug-dashboard/commit/55186c4321f80db13214b302f5917d5defe7f966)) +- **web:** finish invite members ([9442246](https://github.com/ohbug-org/ohbug-dashboard/commit/94422469b8ad67bb1c29374b6c458dae0a509f4e)) +- **web:** finish issues search ([bffc457](https://github.com/ohbug-org/ohbug-dashboard/commit/bffc45774ffb8278c25a27d780c9fbdf5a054070)) +- **web:** index 增加 create project 按钮 ([c762ab3](https://github.com/ohbug-org/ohbug-dashboard/commit/c762ab3e31f717ba4ef9be528388d0d16e608b2c)) +- **web:** issue detail trends 样式调整 ([c3a6c69](https://github.com/ohbug-org/ohbug-dashboard/commit/c3a6c697942c9ec799992d109d3ec9ed42d19d75)) +- **web:** issue detail 页面加入 breadcrumb ([22e061e](https://github.com/ohbug-org/ohbug-dashboard/commit/22e061ec318e7d3d2d9ad550ec0fb53578c4ab2e)) +- **web:** issue detail 页面样式调整 ([f934f78](https://github.com/ohbug-org/ohbug-dashboard/commit/f934f7839c9358acd8af4402b3b355fffb0885f9)) +- **web:** issue events 页面样式调整 ([8a35b52](https://github.com/ohbug-org/ohbug-dashboard/commit/8a35b5220f9f9317bf68ab8dd06f48d8ddd83f78)) +- **web:** issues 列表展示 events users 数量 ([0bfd469](https://github.com/ohbug-org/ohbug-dashboard/commit/0bfd469cbf56a5623d38b425ec882285e2cae46b)) +- **web:** navMenu 加入 settings 路由 ([590fed3](https://github.com/ohbug-org/ohbug-dashboard/commit/590fed38e6d1fdea142767bde6bf56d970c39be3)) +- **web:** project 切换同时切换当前路由 ([851ef66](https://github.com/ohbug-org/ohbug-dashboard/commit/851ef66ed5eaefc59358fcc771f4f85907b8105d)) +- **web:** projects 根据 用户查询 ([9700c35](https://github.com/ohbug-org/ohbug-dashboard/commit/9700c357effd58afa766edf59b97840dccf43140)) +- **web:** projects 页面查询 project trends ([6574676](https://github.com/ohbug-org/ohbug-dashboard/commit/6574676c8ac81dbdc4c80072269f1f3da5a64593)) +- **web:** read config from ohbug.config.yml ([dc1610f](https://github.com/ohbug-org/ohbug-dashboard/commit/dc1610f5aa2bf203311fb87b51671d83c356e293)) +- **web:** redirect create-project if user not has project ([e594318](https://github.com/ohbug-org/ohbug-dashboard/commit/e5943189642078f1eb1f50b798c16122d842e7ee)) +- **web:** redirect index if already signin ([0fd6708](https://github.com/ohbug-org/ohbug-dashboard/commit/0fd670839df0fbf857fb8fababf35d8c39d72a46)) +- **web:** redirect to signin when not have authorization ([e7a770d](https://github.com/ohbug-org/ohbug-dashboard/commit/e7a770dc4416e7f55068f27aa36334dbcda9e4be)) +- **web:** scroll navmenu logo click scroll to top ([1997561](https://github.com/ohbug-org/ohbug-dashboard/commit/19975611ffc5552032b84bf9a61e2928836e9e72)) +- **web:** support delete alert ([67d897a](https://github.com/ohbug-org/ohbug-dashboard/commit/67d897a02130c97c3ba258eb64c7c17340ac2a67)) +- **web:** support i18n ([01cde98](https://github.com/ohbug-org/ohbug-dashboard/commit/01cde984a573a7b6c9255fd88f265aa25916ca89)) +- **web:** support preview custom metadata ([ba4249e](https://github.com/ohbug-org/ohbug-dashboard/commit/ba4249e0d3de6188e656b14af6436cbb81771d9d)) +- **web:** support version detection and upgrade prompt ([d31b56e](https://github.com/ohbug-org/ohbug-dashboard/commit/d31b56ee85a9122893a4f5a2bd27077a38cd7268)) +- **web:** themeBox 加入 acrylic props ([5f68b96](https://github.com/ohbug-org/ohbug-dashboard/commit/5f68b967006d26f5a1200f0c05761999f59d2c09)) +- **web:** trendChart 展示 loading 状态 ([bbc1de5](https://github.com/ohbug-org/ohbug-dashboard/commit/bbc1de525a02f1073628144f7f2c3d57eff59425)) +- **web:** 主题样式微调 ([40fa5df](https://github.com/ohbug-org/ohbug-dashboard/commit/40fa5dfb4b9ad529e0719cacdf2a3792bf49b270)) +- **web:** 优化 issue detail 页面 减少非必要查询 ([786532e](https://github.com/ohbug-org/ohbug-dashboard/commit/786532e810f28309d4ba38a565eacd0b9de8ecfe)) +- **web:** 优化 issueList 样式 ([ae787c6](https://github.com/ohbug-org/ohbug-dashboard/commit/ae787c6af3111f15b12635f9636c0da138c60945)) +- **web:** 使用 next auth 登录页面 ([9e0ce8c](https://github.com/ohbug-org/ohbug-dashboard/commit/9e0ce8c2bb6a52bd6a99bb0705ecc99e8b6a5961)) +- **web:** 使用 react-icons 作为图标库 ([a613654](https://github.com/ohbug-org/ohbug-dashboard/commit/a613654b0a0949f25ecb36d800de69a77ec1b08b)) +- **web:** 加入 projects 页面 ([9cc87ea](https://github.com/ohbug-org/ohbug-dashboard/commit/9cc87ead269a080e6140761732a1e0bdad6aab4e)) +- **web:** 加入 searchBar 组件 ([df71220](https://github.com/ohbug-org/ohbug-dashboard/commit/df712201072141ab55a98761a3891ebbbca1d7b7)) +- **web:** 加入权限验证 ([fd62e15](https://github.com/ohbug-org/ohbug-dashboard/commit/fd62e1559e703cc26dd3adbb74e54e7d5f9af828)) +- **web:** 完善 project card 数据展示 ([032d2bc](https://github.com/ohbug-org/ohbug-dashboard/commit/032d2bc7440485c7783367d46ad31a78cf1d8823)) +- **web:** 完成 footer ([0abe255](https://github.com/ohbug-org/ohbug-dashboard/commit/0abe255de49046cbf023fae0c1a9229e8995721f)) +- **web:** 完成 issue detail 更多事件页面 ([e248a90](https://github.com/ohbug-org/ohbug-dashboard/commit/e248a90b02326da7d1b91f0db09fa32331243442)) +- **web:** 完成 issue detail 页面 堆栈信息展示 ([666a341](https://github.com/ohbug-org/ohbug-dashboard/commit/666a34157eb88c26800b068af8e9011867cde425)) +- **web:** 完成 issue detail 页面标签列展示 ([534d0f0](https://github.com/ohbug-org/ohbug-dashboard/commit/534d0f0f6c9c1d4e1a7d541c3da6d5d61fe004c2)) +- **web:** 完成 issue detail 页面趋势信息展示 ([d913d3e](https://github.com/ohbug-org/ohbug-dashboard/commit/d913d3e175441d7ffbef858470f34dd3e99b744b)) +- **web:** 完成 issue list 分页 ([fb502de](https://github.com/ohbug-org/ohbug-dashboard/commit/fb502de812eed29a84fe1b34e7648e1391f17dbd)) +- **web:** 完成 issue trends 数据查询与展示 ([42d55e9](https://github.com/ohbug-org/ohbug-dashboard/commit/42d55e9a40cb8b1276d3bd338ace8cf66a213149)) +- **web:** 完成 navMenu 部分 ([779399d](https://github.com/ohbug-org/ohbug-dashboard/commit/779399d5348b3308559e1f876c7c6c6fbbd750a4)) +- **web:** 完成 project setting apiKey 展示 ([a5e2cf8](https://github.com/ohbug-org/ohbug-dashboard/commit/a5e2cf8f5137769238e3493f1933b16f6b277c99)) +- **web:** 完成 project setting update name ([cdad8bc](https://github.com/ohbug-org/ohbug-dashboard/commit/cdad8bcb688f8b02b8c9c6c05816df0aaa3331bd)) +- **web:** 完成 project trends chart 显示 ([73c263f](https://github.com/ohbug-org/ohbug-dashboard/commit/73c263f6c3c7aedda41ee4f32332a38bb14b8217)) +- **web:** 完成 project 的创建 ([9765988](https://github.com/ohbug-org/ohbug-dashboard/commit/9765988b2a068ed03fa6470f4977c0df5b28baa5)) +- **web:** 完成 project 预览页面 ([ca5900f](https://github.com/ohbug-org/ohbug-dashboard/commit/ca5900f6f3b908d02cc9a1a15bb00ef60161ff7b)) +- **web:** 完成 release list 和 sourceMaps 页面 ([ad881e0](https://github.com/ohbug-org/ohbug-dashboard/commit/ad881e0a82f6ea653e6c117c5c3acdcc9ce410c5)) +- **web:** 完成 user 组件以及 nav 基本布局 ([93f066f](https://github.com/ohbug-org/ohbug-dashboard/commit/93f066f32f7a78471c79b94bb7a879ee341bb9a4)) +- **web:** 完成layout布局 包含 nav navMenu user 等组件 ([353466a](https://github.com/ohbug-org/ohbug-dashboard/commit/353466a7b344edd03f02c9d72985e0c79d9503e1)) +- **web:** 完成授权登录流程 ([d26286d](https://github.com/ohbug-org/ohbug-dashboard/commit/d26286d575a93469ccd6e3cb6327590d95b5a5a0)) +- **web:** 对接 ohbug-extension-rrweb ([6a63f7f](https://github.com/ohbug-org/ohbug-dashboard/commit/6a63f7f56463765cf5e31d2e1fd2fd17cf998bca)) +- **web:** 整体迁移至 chakra-ui ([8a2ff2c](https://github.com/ohbug-org/ohbug-dashboard/commit/8a2ff2c2e5b7a0302713d98c2963b47c4ae5c154)) +- **web:** 新增 alert detail 页面 ([036eff0](https://github.com/ohbug-org/ohbug-dashboard/commit/036eff01b39942b7bec74578641eb86ef0a2be79)) +- **web:** 新增 issues 页面 ([4c4c157](https://github.com/ohbug-org/ohbug-dashboard/commit/4c4c157adf71082ad9786c9f9285a37a5c28e174)) +- **web:** 暂时删除 release detail 页 ([60079f4](https://github.com/ohbug-org/ohbug-dashboard/commit/60079f41d4ad160b0547872174a3b7f4553fced1)) +- **web:** 调整 issue tabs 样式 ([52fc349](https://github.com/ohbug-org/ohbug-dashboard/commit/52fc3499e03b4752d566da4d12b0c5f5c81bcf8f)) +- **web:** 调整 prisma client 获取方式 ([5d7f293](https://github.com/ohbug-org/ohbug-dashboard/commit/5d7f293a99da8ec9df780675858a9a81f057ca41)) +- **web:** 部分页面布局更新 使用 wrapper ([c295cf6](https://github.com/ohbug-org/ohbug-dashboard/commit/c295cf6baaf10f5f6eee28b3e8f1b300f877252e)) +- 准备 issue 趋势图数据 ([d0f8c35](https://github.com/ohbug-org/ohbug-dashboard/commit/d0f8c35f5231f96dd41f73c659b219b7139548ad)) +- 加入 issue 详情页 ([326939a](https://github.com/ohbug-org/ohbug-dashboard/commit/326939ad6f5675d3dedd6e42772afb9368377da0)) +- 完成 issues 列表基本展示 ([b5dc389](https://github.com/ohbug-org/ohbug-dashboard/commit/b5dc389470e9b92dc77ee02c618feb04ab29b9c4)) +- 完成 sourceMap 还原代码 ([8c4bbbd](https://github.com/ohbug-org/ohbug-dashboard/commit/8c4bbbd43fa3009b733043cb2c4c3a508d88681a)) +- 完成基本环境配置、环境变量配置 ([3e36937](https://github.com/ohbug-org/ohbug-dashboard/commit/3e369373fde805ce760ff8837de63f81a402fc37)) +- 完成通知逻辑 ([d4f5a93](https://github.com/ohbug-org/ohbug-dashboard/commit/d4f5a9309d821b7edf83981ae525f2ca7ddc1d80)) +- 新增 email 登录方式 ([e713ca9](https://github.com/ohbug-org/ohbug-dashboard/commit/e713ca9c51d7e607b30ccd8fec15bb2bcb7ead68)) +- 路由调整为以 project 为基础 ([db3d9f2](https://github.com/ohbug-org/ohbug-dashboard/commit/db3d9f28ecf518496ba532d76c33a67821f98be1)) ### Performance Improvements -* **server:** 优化 report 接口资源占用 ([f84667b](https://github.com/ohbug-org/ohbug-dashboard/commit/f84667b065f229bfefde3fb661c370d15a36058f)) \ No newline at end of file +- **server:** 优化 report 接口资源占用 ([f84667b](https://github.com/ohbug-org/ohbug-dashboard/commit/f84667b065f229bfefde3fb661c370d15a36058f)) diff --git a/README.md b/README.md index 0dc177a..973fc69 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ This project exists thanks to all the people who contribute. | Github Issue | 微信群 | | ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | [ohbug-org/ohbug/issues](https://github.com/ohbug-org/ohbug/issues) | <img src="https://github.com/ohbug-org/blog/blob/master/images/qrcode.jpg?raw=true" width="200" /> 关注后回复「ohbug」 | + ## License [Apache-2.0](./LICENSE) License © 2022 [chenyueban](https://github.com/chenyueban) diff --git a/docker-compose.development.yml b/docker-compose.development.yml index 6d9c3a5..9c63a78 100644 --- a/docker-compose.development.yml +++ b/docker-compose.development.yml @@ -1,4 +1,4 @@ -version: '3.7' +version: "3.7" services: postgres: @@ -9,7 +9,7 @@ services: - POSTGRES_PASSWORD=ohbug - POSTGRES_DB=ohbug ports: - - '5432:5432' + - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data @@ -17,7 +17,7 @@ services: image: redis:alpine restart: always ports: - - '6379:6379' + - "6379:6379" volumes: pgdata: {} diff --git a/docker-compose.yml b/docker-compose.yml index 8a9f75e..559f1f4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -version: '3.7' +version: "3.7" services: postgres: @@ -10,7 +10,7 @@ services: - POSTGRES_DB=ohbug hostname: postgres ports: - - '5432:5432' + - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data @@ -19,14 +19,14 @@ services: restart: always hostname: redis ports: - - '6379:6379' + - "6379:6379" app: image: ohbug/ohbug-ce:latest restart: always ports: - - '3000:3000' - - '6660:6660' + - "3000:3000" + - "6660:6660" volumes: - ./ohbug.config.yml:/app/ohbug.config.yml depends_on: diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index 9dd855b..0000000 --- a/eslint.config.js +++ /dev/null @@ -1,12 +0,0 @@ -import { all } from '@chenyueban/eslint-config' - -export default [ - ...all, - { - rules: { - 'import/no-default-export': 'off', - '@typescript-eslint/no-extraneous-class': 'off', - // '@typescript-eslint/consistent-type-imports': 'off', - }, - }, -] diff --git a/package.json b/package.json index ba6dab9..accab2d 100644 --- a/package.json +++ b/package.json @@ -1,27 +1,25 @@ { "name": "ohbug-dashboard", "version": "0.11.0", - "packageManager": "pnpm@8.7.5", - "type": "module", - "license": "Apache-2.0", "homepage": "https://github.com/ohbug-org/ohbug-dashboard#readme", "bugs": { "url": "https://github.com/ohbug-org/ohbug-dashboard/issues" }, + "license": "Apache-2.0", + "author": { + "name": "xinyao", + "email": "hi@xinyao.me" + }, "repository": { "type": "git", "url": "git+https://github.com/ohbug-org/ohbug-dashboard.git" }, - "author": { - "name": "chenyueban", - "email": "jasonchan0527@gmail.com" - }, - "funding": "https://github.com/sponsors/chenyueban", + "funding": "https://github.com/sponsors/xinyao27", + "type": "module", "sideEffects": false, "scripts": { - "preinstall": "npx only-allow pnpm", "up": "taze major -Ir", - "prepare": "husky install", + "prepare": "vp config", "prebuild": "npx prisma generate && tsx scripts/createEnv.ts", "build": "cross-env NODE_ENV=production pnpm -r run build", "docker": "docker-compose -f ./docker-compose.development.yml up -d", @@ -33,7 +31,9 @@ "setup": "cross-env NODE_ENV=production pnpm run prebuild && npx prisma migrate deploy && npx prisma db seed", "studio": "npx prisma studio", "prepublishOnly": "pnpm run build", - "lint": "pnpm -r run lint", + "lint": "vp lint --fix", + "fmt": "vp fmt", + "check": "vp check --fix", "test": "pnpm -r run test", "release": "release-it" }, @@ -51,30 +51,36 @@ "source-map-trace": "^0.2.6" }, "devDependencies": { - "@antfu/ni": "^0.21.8", - "@babel/types": "^7.22.17", - "@chenyueban/eslint-config": "^3.0.10", - "@chenyueban/tsconfig": "^3.0.10", - "@commitlint/cli": "^17.7.1", "@release-it/conventional-changelog": "^7.0.1", - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.84", "@types/js-yaml": "^4.0.5", "@types/node": "^20.6.0", "@types/ramda": "^0.29.3", - "commitizen": "^4.3.0", "cross-env": "^7.0.3", - "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.49.0", - "husky": "^8.0.3", - "lint-staged": "^14.0.1", "prisma": "^5.3.0", "release-it": "^16.1.5", "rimraf": "^5.0.1", - "taze": "^0.11.2", - "tsup": "^7.2.0", + "taze": "latest", "tsx": "^3.12.9", - "typescript": "^5.2.2" + "typescript": "~5.9.3", + "vite": "npm:@voidzero-dev/vite-plus-core@latest", + "vite-plus": "latest" + }, + "packageManager": "pnpm@10.32.1", + "pnpm": { + "overrides": { + "vite": "npm:@voidzero-dev/vite-plus-core@latest", + "vitest": "npm:@voidzero-dev/vite-plus-test@latest" + }, + "onlyBuiltDependencies": [ + "@prisma/client", + "@prisma/engines", + "prisma", + "esbuild", + "@nestjs/core", + "source-map-trace", + "nestjs-pino", + "msgpackr-extract" + ] }, "prisma": { "seed": "npx tsx prisma/seed.ts" diff --git a/packages/common/package.json b/packages/common/package.json index e34d1d7..3fff6a1 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -4,6 +4,7 @@ "files": [ "dist" ], + "sideEffects": false, "main": "./dist/index.js", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", @@ -13,12 +14,10 @@ "import": "./dist/index.mjs" } }, - "sideEffects": false, "scripts": { - "prebuild": "rimraf dist", - "dev": "tsup src/index.ts --dts --format esm,cjs --watch --env.NODE_ENV development", - "build": "tsup src/index.ts --dts --format esm,cjs --env.NODE_ENV production", - "lint": "tsc && eslint . --fix" + "dev": "vp dev", + "build": "vp build", + "lint": "vp lint --fix" }, "dependencies": { "crypto-js": "^4.1.1" diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index 9936159..9bff1ce 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -1,4 +1,4 @@ -export * from './interfaces' -export * from './response' -export * from './lib' -export * from './topic' +export * from "./interfaces"; +export * from "./response"; +export * from "./lib"; +export * from "./topic"; diff --git a/packages/common/src/interfaces/alert.ts b/packages/common/src/interfaces/alert.ts index 6528b1e..b75e0d5 100644 --- a/packages/common/src/interfaces/alert.ts +++ b/packages/common/src/interfaces/alert.ts @@ -1,30 +1,31 @@ -import { type Alert } from '@prisma/client' -import { type AlertConditionTopic, type AlertFilterTopic, type FilterMatch } from '../topic' +import { type Alert } from "@prisma/client"; + +import { type AlertConditionTopic, type AlertFilterTopic, type FilterMatch } from "../topic"; export interface Action { - type: 'email' | 'webhook' - uri: string - at?: string - webhookType?: 'dingtalk' | 'wechatWork' | 'others' + type: "email" | "webhook"; + uri: string; + at?: string; + webhookType?: "dingtalk" | "wechatWork" | "others"; } export interface ConditionOption { - topic: AlertConditionTopic - name: string - value?: string | number - interval?: string + topic: AlertConditionTopic; + name: string; + value?: string | number; + interval?: string; } export interface FilterOption { - topic: AlertFilterTopic - name: string - value?: string | number - attribute?: string - match?: FilterMatch + topic: AlertFilterTopic; + name: string; + value?: string | number; + attribute?: string; + match?: FilterMatch; } -export type OmitAlert = Omit<Alert, 'id' | 'createdAt' | 'updatedAt' | 'actions'> & { - actions: Action[] - conditions: ConditionOption[] - filters: FilterOption[] -} +export type OmitAlert = Omit<Alert, "id" | "createdAt" | "updatedAt" | "actions"> & { + actions: Action[]; + conditions: ConditionOption[]; + filters: FilterOption[]; +}; diff --git a/packages/common/src/interfaces/event.ts b/packages/common/src/interfaces/event.ts index 74f1f68..12349ac 100644 --- a/packages/common/src/interfaces/event.ts +++ b/packages/common/src/interfaces/event.ts @@ -1,12 +1,12 @@ -import { type OhbugEvent, type OhbugUser } from '@ohbug/types' -import { type Result } from 'source-map-trace' +import { type OhbugEvent, type OhbugUser } from "@ohbug/types"; +import { type Result } from "source-map-trace"; -export interface OhbugEventLike extends Omit<OhbugEvent<any>, 'user'> { - id?: string - user: OhbugUser - createdAt?: Date - issueId?: string - source?: Result +export interface OhbugEventLike extends Omit<OhbugEvent<any>, "user"> { + id?: string; + user: OhbugUser; + createdAt?: Date; + issueId?: string; + source?: Result; } -export type { OhbugUser } +export type { OhbugUser }; diff --git a/packages/common/src/interfaces/index.ts b/packages/common/src/interfaces/index.ts index 3dfb37d..06a0aef 100644 --- a/packages/common/src/interfaces/index.ts +++ b/packages/common/src/interfaces/index.ts @@ -1,6 +1,6 @@ -export * from './event' -export * from './issue' -export * from './project' -export * from './source-map' -export * from './alert' -export * from './metric' +export * from "./event"; +export * from "./issue"; +export * from "./project"; +export * from "./source-map"; +export * from "./alert"; +export * from "./metric"; diff --git a/packages/common/src/interfaces/issue.ts b/packages/common/src/interfaces/issue.ts index a03a42c..99509b6 100644 --- a/packages/common/src/interfaces/issue.ts +++ b/packages/common/src/interfaces/issue.ts @@ -1,27 +1,28 @@ -import { type OhbugReleaseStage } from '@ohbug/types' -import { type OhbugEventLike } from './event' +import { type OhbugReleaseStage } from "@ohbug/types"; + +import { type OhbugEventLike } from "./event"; export interface MetaData { - type: string - message: string - filename?: string - stack?: string - others?: string + type: string; + message: string; + filename?: string; + stack?: string; + others?: string; } export interface Issue { - id: string - apiKey: string - appVersion?: string | null - appType?: string | null - releaseStage?: OhbugReleaseStage | null - type: string - metadata: string - createdAt: Date - updatedAt: Date + id: string; + apiKey: string; + appVersion?: string | null; + appType?: string | null; + releaseStage?: OhbugReleaseStage | null; + type: string; + metadata: string; + createdAt: Date; + updatedAt: Date; _count?: { - events: number - users: number - } - events?: OhbugEventLike[] + events: number; + users: number; + }; + events?: OhbugEventLike[]; } diff --git a/packages/common/src/interfaces/metric.ts b/packages/common/src/interfaces/metric.ts index b81e647..286eede 100644 --- a/packages/common/src/interfaces/metric.ts +++ b/packages/common/src/interfaces/metric.ts @@ -1 +1 @@ -export type MetricType = 'CLS' | 'FCP' | 'FID' | 'LCP' | 'TTFB' | 'INP' +export type MetricType = "CLS" | "FCP" | "FID" | "LCP" | "TTFB" | "INP"; diff --git a/packages/common/src/interfaces/project.ts b/packages/common/src/interfaces/project.ts index 658779a..e26217e 100644 --- a/packages/common/src/interfaces/project.ts +++ b/packages/common/src/interfaces/project.ts @@ -1,9 +1,9 @@ -import { type Project, type User } from '@prisma/client' +import { type Project, type User } from "@prisma/client"; export interface ProjectWithEventCount extends Project { - eventCount: number + eventCount: number; } export interface ProjectWithMembers extends Project { - members?: User[] + members?: User[]; } diff --git a/packages/common/src/interfaces/source-map.ts b/packages/common/src/interfaces/source-map.ts index a9a3493..f1b6573 100644 --- a/packages/common/src/interfaces/source-map.ts +++ b/packages/common/src/interfaces/source-map.ts @@ -1,22 +1,22 @@ export interface ReceiveSourceMapFile { - fieldname: string - originalname: string - encoding: string - mimetype: string - destination: string - filename: string - path: string - size: number + fieldname: string; + originalname: string; + encoding: string; + mimetype: string; + destination: string; + filename: string; + path: string; + size: number; } -export type SourceMapData = ReceiveSourceMapFile[] +export type SourceMapData = ReceiveSourceMapFile[]; export interface SourceMap { - id?: number - apiKey: string - appVersion: string - appType?: string - data: SourceMapData - createdAt: Date - updatedAt: Date + id?: number; + apiKey: string; + appVersion: string; + appType?: string; + data: SourceMapData; + createdAt: Date; + updatedAt: Date; } diff --git a/packages/common/src/lib.ts b/packages/common/src/lib.ts index 7f4bf26..d67a450 100644 --- a/packages/common/src/lib.ts +++ b/packages/common/src/lib.ts @@ -1,39 +1,39 @@ -import crypto from 'crypto-js/md5' +import crypto from "crypto-js/md5"; -export const PAGE_SIZE = 10 +export const PAGE_SIZE = 10; export interface Pagination { - page: number - pageSize?: number - perPage?: number + page: number; + pageSize?: number; + perPage?: number; } interface PrismaPagination { - skip: number - take: number + skip: number; + take: number; } export function pagination(value: Pagination, defaultPageSize = 10): PrismaPagination { - const { page = 1, pageSize } = value - const skip = (page - 1) * (pageSize ?? defaultPageSize) - const take = pageSize ?? defaultPageSize + const { page = 1, pageSize } = value; + const skip = (page - 1) * (pageSize ?? defaultPageSize); + const take = pageSize ?? defaultPageSize; return { skip, take, - } + }; } export function formatBytes(bytes: number, decimals = 2) { - if (bytes === 0) return '0 Bytes' + if (bytes === 0) return "0 Bytes"; - const k = 1024 - const dm = decimals < 0 ? 0 : decimals - const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] + const k = 1024; + const dm = decimals < 0 ? 0 : decimals; + const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; - const i = Math.floor(Math.log(bytes) / Math.log(k)) + const i = Math.floor(Math.log(bytes) / Math.log(k)); - return `${Number.parseFloat((bytes / k ** i).toFixed(dm))} ${sizes[i]}` + return `${Number.parseFloat((bytes / k ** i).toFixed(dm))} ${sizes[i]}`; } export function md5(data: string) { - return crypto(data).toString() + return crypto(data).toString(); } diff --git a/packages/common/src/response.ts b/packages/common/src/response.ts index 16d380a..0149923 100644 --- a/packages/common/src/response.ts +++ b/packages/common/src/response.ts @@ -8,11 +8,11 @@ export enum ErrorShowType { } export interface ResponseStructure<R = unknown> { - success: boolean // if request is success - data?: R // response data - errorCode?: number // code for errorType - errorMessage?: string // message display to user - showType?: ErrorShowType // error display type: 0 silent; 1 message.warn; 2 message.error; 4 notification; 9 page - traceId?: string // Convenient for back-end Troubleshooting: unique request ID - host?: string // Convenient for backend Troubleshooting: host of current access server + success: boolean; // if request is success + data?: R; // response data + errorCode?: number; // code for errorType + errorMessage?: string; // message display to user + showType?: ErrorShowType; // error display type: 0 silent; 1 message.warn; 2 message.error; 4 notification; 9 page + traceId?: string; // Convenient for back-end Troubleshooting: unique request ID + host?: string; // Convenient for backend Troubleshooting: host of current access server } diff --git a/packages/common/src/topic.ts b/packages/common/src/topic.ts index 169aefd..a4a41d6 100644 --- a/packages/common/src/topic.ts +++ b/packages/common/src/topic.ts @@ -3,23 +3,23 @@ export enum AlertConditionTopic { * An event is captured * @default */ - EventCapturedCondition = 'ohbug.alert.condition.eventCaptured', + EventCapturedCondition = "ohbug.alert.condition.eventCaptured", /** * A new issue is created */ - FirstSeenEventCondition = 'ohbug.alert.condition.firstSeenEvent', + FirstSeenEventCondition = "ohbug.alert.condition.firstSeenEvent", /** * The issue is seen more than {value} times in {interval} * @params {number} value * @params {number} interval */ - EventFrequencyCondition = 'ohbug.alert.condition.eventFrequency', + EventFrequencyCondition = "ohbug.alert.condition.eventFrequency", /** * The issue is seen by more than {value} users in {interval} * @params {number} value * @params {number} interval */ - UserFrequencyCondition = 'ohbug.alert.condition.userFrequency', + UserFrequencyCondition = "ohbug.alert.condition.userFrequency", } export enum AlertFilterTopic { @@ -27,19 +27,27 @@ export enum AlertFilterTopic { * The issue has happened at least {value} times * @params {number} value */ - IssueOccurrencesFilter = 'ohbug.alert.filter.issueOccurrences', + IssueOccurrencesFilter = "ohbug.alert.filter.issueOccurrences", /** * The event's {attribute} value {match} {value} * @params {Event} attribute * @params {'contains' | 'starts with' | 'ends with' | 'equals' | 'does not contain' | 'does not start with' | 'does not end with' | 'does not equal'} match * @params {string} value */ - EventAttributeFilter = 'ohbug.alert.filter.eventAttribute', + EventAttributeFilter = "ohbug.alert.filter.eventAttribute", /** * The event is from the latest release */ - LatestReleaseFilter = 'ohbug.alert.filter.latestRelease', + LatestReleaseFilter = "ohbug.alert.filter.latestRelease", } -export type Interval = '1m' | '5m' | '15m' | '1h' | '1d' | '7d' | '30d' -export type FilterMatch = 'contains' | 'starts with' | 'ends with' | 'equals' | 'does not contain' | 'does not start with' | 'does not end with' | 'does not equal' +export type Interval = "1m" | "5m" | "15m" | "1h" | "1d" | "7d" | "30d"; +export type FilterMatch = + | "contains" + | "starts with" + | "ends with" + | "equals" + | "does not contain" + | "does not start with" + | "does not end with" + | "does not equal"; diff --git a/packages/config/package.json b/packages/config/package.json index c2125e2..7ae2463 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -4,6 +4,7 @@ "files": [ "dist" ], + "sideEffects": false, "main": "./dist/index.js", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", @@ -13,11 +14,9 @@ "import": "./dist/index.mjs" } }, - "sideEffects": false, "scripts": { - "prebuild": "rimraf dist", - "dev": "tsup src/index.ts --dts --format esm,cjs --watch --env.NODE_ENV development", - "build": "tsup src/index.ts --dts --format esm,cjs --env.NODE_ENV production", - "lint": "tsc && eslint . --fix" + "dev": "vp dev", + "build": "vp build", + "lint": "vp lint --fix" } } diff --git a/packages/config/src/index.ts b/packages/config/src/index.ts index 62f0d89..fb7d8c9 100644 --- a/packages/config/src/index.ts +++ b/packages/config/src/index.ts @@ -1,66 +1,69 @@ -import { readFileSync } from 'node:fs' -import { join } from 'node:path' -import { cwd } from 'node:process' -import * as yaml from 'js-yaml' +import { readFileSync } from "node:fs"; +import { join } from "node:path"; +import { cwd } from "node:process"; + +import * as yaml from "js-yaml"; declare global { // eslint-disable-next-line vars-on-top,no-var - var __config__: Config + var __config__: Config; } export interface Config { http: { - url: string - } + url: string; + }; db: { postgres: { - host: string - port: number - database: string - user: string - password: string - url: string - } + host: string; + port: number; + database: string; + user: string; + password: string; + url: string; + }; redis: { - host: string - port: number - } - } + host: string; + port: number; + }; + }; secret?: { - apikey?: string - session?: string - } + apikey?: string; + session?: string; + }; oauth?: { github: { - clientId: string - clientSecret: string - } - } + clientId: string; + clientSecret: string; + }; + }; email?: { server: { - host: string - port: number + host: string; + port: number; auth: { - - user: string - pass: string - } - } - from: string - } + user: string; + pass: string; + }; + }; + from: string; + }; options?: { - dataExpirationTime?: number - } + dataExpirationTime?: number; + }; } -const YAML_CONFIG_FILENAME = 'ohbug.config.yml' -const DEVELOP_YAML_CONFIG_FILENAME = 'ohbug.config.development.yml' +const YAML_CONFIG_FILENAME = "ohbug.config.yml"; +const DEVELOP_YAML_CONFIG_FILENAME = "ohbug.config.development.yml"; export function getConfig(rootPath?: string): Config { if (!globalThis.__config__) { - const configPath = join(rootPath ?? join(cwd(), '../../'), process.env.NODE_ENV === 'development' ? DEVELOP_YAML_CONFIG_FILENAME : YAML_CONFIG_FILENAME) - const config = yaml.load(readFileSync(configPath, 'utf8')) as Config - const postgresUrl = `postgresql://${config.db.postgres.user}:${config.db.postgres.password}@${config.db.postgres.host}:${config.db.postgres.port}/${config.db.postgres.database}` - config.db.postgres.url = postgresUrl - globalThis.__config__ = config + const configPath = join( + rootPath ?? join(cwd(), "../../"), + process.env.NODE_ENV === "development" ? DEVELOP_YAML_CONFIG_FILENAME : YAML_CONFIG_FILENAME, + ); + const config = yaml.load(readFileSync(configPath, "utf8")) as Config; + const postgresUrl = `postgresql://${config.db.postgres.user}:${config.db.postgres.password}@${config.db.postgres.host}:${config.db.postgres.port}/${config.db.postgres.database}`; + config.db.postgres.url = postgresUrl; + globalThis.__config__ = config; } - return globalThis.__config__ + return globalThis.__config__; } diff --git a/packages/server/package.json b/packages/server/package.json index f383143..9ef114d 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -9,7 +9,7 @@ "dev": "nest start --watch", "dev:debug": "nest start --debug --watch", "dev:prod": "node dist/main", - "lint": "tsc && eslint . --fix" + "lint": "tsc && vp lint --fix" }, "dependencies": { "@nestjs/axios": "^3.0.0", diff --git a/packages/server/src/api/alert/alert.core.ts b/packages/server/src/api/alert/alert.core.ts index ff34cd3..132c602 100644 --- a/packages/server/src/api/alert/alert.core.ts +++ b/packages/server/src/api/alert/alert.core.ts @@ -1,42 +1,50 @@ -import { AlertConditionTopic, AlertFilterTopic, ConditionOption, FilterOption, Interval } from 'common' -import dayjs from 'dayjs' -import markdownIt from 'markdown-it' -import { Alert, AlertLevel, Event, Issue } from '@prisma/client' -import { GetAlertStatusParams } from '../report/report.interface' -import { PrismaService } from '~/common' +import { Alert, AlertLevel, Event, Issue } from "@prisma/client"; +import { + AlertConditionTopic, + AlertFilterTopic, + ConditionOption, + FilterOption, + Interval, +} from "common"; +import dayjs from "dayjs"; +import markdownIt from "markdown-it"; + +import { PrismaService } from "~/common"; + +import { GetAlertStatusParams } from "../report/report.interface"; function getIntervalMs(interval: Interval) { - switch ((interval)) { - case '1m': { - const intervalMs = 60 * 1000 - return intervalMs + switch (interval) { + case "1m": { + const intervalMs = 60 * 1000; + return intervalMs; } - case '5m': { - const intervalMs = 5 * 60 * 1000 - return intervalMs + case "5m": { + const intervalMs = 5 * 60 * 1000; + return intervalMs; } - case '15m': { - const intervalMs = 15 * 60 * 1000 - return intervalMs + case "15m": { + const intervalMs = 15 * 60 * 1000; + return intervalMs; } - case '1h': { - const intervalMs = 60 * 60 * 1000 - return intervalMs + case "1h": { + const intervalMs = 60 * 60 * 1000; + return intervalMs; } - case '1d': { - const intervalMs = 24 * 60 * 60 * 1000 - return intervalMs + case "1d": { + const intervalMs = 24 * 60 * 60 * 1000; + return intervalMs; } - case '7d': { - const intervalMs = 7 * 24 * 60 * 60 * 1000 - return intervalMs + case "7d": { + const intervalMs = 7 * 24 * 60 * 60 * 1000; + return intervalMs; } - case '30d': { - const intervalMs = 30 * 24 * 60 * 60 * 1000 - return intervalMs + case "30d": { + const intervalMs = 30 * 24 * 60 * 60 * 1000; + return intervalMs; } default: - return 0 + return 0; } } @@ -46,14 +54,14 @@ function getIntervalMs(interval: Interval) { function judgingInterval(alert: Alert) { if (alert.recentlyAt) { // 判断当前时间是否大于静默期 - const now = dayjs() - const last = dayjs(alert.recentlyAt) - const interval = getIntervalMs(alert.interval as Interval) - if (now.isBefore(last.add(interval, 'ms'))) { - return true + const now = dayjs(); + const last = dayjs(alert.recentlyAt); + const interval = getIntervalMs(alert.interval as Interval); + if (now.isBefore(last.add(interval, "ms"))) { + return true; } } - return false + return false; } async function getEventIntervalCount( @@ -66,9 +74,9 @@ async function getEventIntervalCount( const count = await prisma.event.count({ where: { apiKey: event.apiKey, - createdAt: { gte: dayjs().subtract(getIntervalMs(interval), 'ms').toDate() }, + createdAt: { gte: dayjs().subtract(getIntervalMs(interval), "ms").toDate() }, }, - }) + }); if (count >= value) { return { topic: AlertConditionTopic.EventFrequencyCondition, @@ -79,12 +87,12 @@ async function getEventIntervalCount( interval, }, alert, - } + }; } return { topic: AlertConditionTopic.EventFrequencyCondition, condition: false, - } + }; } async function getUserIntervalCount( issue: Issue, @@ -95,10 +103,10 @@ async function getUserIntervalCount( ) { const count = await prisma.eventUser.count({ where: { - createdAt: { gte: dayjs().subtract(getIntervalMs(interval), 'ms').toDate() }, + createdAt: { gte: dayjs().subtract(getIntervalMs(interval), "ms").toDate() }, issues: { some: { issueId: issue.id } }, }, - }) + }); if (count >= value) { return { topic: AlertConditionTopic.UserFrequencyCondition, @@ -109,17 +117,17 @@ async function getUserIntervalCount( interval, }, alert, - } + }; } return { topic: AlertConditionTopic.UserFrequencyCondition, condition: false, - } + }; } async function judgingCondition(event: Event, issue: Issue, alert: Alert, prisma: PrismaService) { - const conditions = alert.conditions as unknown as ConditionOption[] - const result = [] + const conditions = alert.conditions as unknown as ConditionOption[]; + const result = []; for (const condition of conditions) { switch (condition.topic) { case AlertConditionTopic.EventCapturedCondition: { @@ -127,8 +135,8 @@ async function judgingCondition(event: Event, issue: Issue, alert: Alert, prisma topic: AlertConditionTopic.EventCapturedCondition, condition: true, alert, - }) - break + }); + break; } case AlertConditionTopic.FirstSeenEventCondition: { if (dayjs(issue.createdAt).isSame(dayjs(event.createdAt))) { @@ -136,42 +144,42 @@ async function judgingCondition(event: Event, issue: Issue, alert: Alert, prisma topic: AlertConditionTopic.FirstSeenEventCondition, condition: true, alert, - }) - break + }); + break; } result.push({ topic: AlertConditionTopic.FirstSeenEventCondition, condition: false, - }) - break + }); + break; } case AlertConditionTopic.EventFrequencyCondition: { - const { value, interval } = condition + const { value, interval } = condition; const eventIntervalCount = await getEventIntervalCount( event, interval as Interval, Number.parseInt(value as string), alert, prisma, - ) - result.push(eventIntervalCount) - break + ); + result.push(eventIntervalCount); + break; } case AlertConditionTopic.UserFrequencyCondition: { - const { value, interval } = condition + const { value, interval } = condition; const userIntervalCount = await getUserIntervalCount( issue, interval as Interval, Number.parseInt(value as string), alert, prisma, - ) - result.push(userIntervalCount) - break + ); + result.push(userIntervalCount); + break; } } } - return result + return result; } async function judgingFilter( @@ -181,125 +189,124 @@ async function judgingFilter( alert: Alert, prisma: PrismaService, ) { - const filters = alert.filters as unknown as FilterOption[] - if (filters.length === 0) return true - const result = [] + const filters = alert.filters as unknown as FilterOption[]; + if (filters.length === 0) return true; + const result = []; for (const filter of filters) { switch (filter.topic) { case AlertFilterTopic.IssueOccurrencesFilter: { - const { value } = filter + const { value } = filter; if (issueEventsCount >= Number.parseInt(value as string)) { result.push({ topic: filter.topic, filter: true, - }) + }); } - break + break; } case AlertFilterTopic.EventAttributeFilter: { - const { attribute, match, value } = filter - const attr = event[attribute as keyof Event] as string - const v = value?.toString() ?? '' + const { attribute, match, value } = filter; + const attr = event[attribute as keyof Event] as string; + const v = value?.toString() ?? ""; if (attr) { switch (match) { - case 'contains': { + case "contains": { if (attr.includes(v)) { result.push({ topic: filter.topic, filter: true, - }) + }); } - break + break; } - case 'starts with': { + case "starts with": { if (attr.startsWith(v)) { result.push({ topic: filter.topic, filter: true, - }) + }); } - break + break; } - case 'ends with': { + case "ends with": { if (attr.endsWith(v)) { result.push({ topic: filter.topic, filter: true, - }) + }); } - break + break; } - case 'equals': { + case "equals": { if (attr === value) { result.push({ topic: filter.topic, filter: true, - }) + }); } - break + break; } - case 'does not contain': { + case "does not contain": { if (!attr.includes(v)) { result.push({ topic: filter.topic, filter: true, - }) + }); } - break + break; } - case 'does not start with': { + case "does not start with": { if (!attr.startsWith(v)) { result.push({ topic: filter.topic, filter: true, - }) + }); } - break + break; } - case 'does not end with': { + case "does not end with": { if (!attr.endsWith(v)) { result.push({ topic: filter.topic, filter: true, - }) + }); } - break + break; } - case 'does not equal': { + case "does not equal": { if (attr !== value) { result.push({ topic: filter.topic, filter: true, - }) + }); } - break + break; } } } - break + break; } case AlertFilterTopic.LatestReleaseFilter: { const latestIssue = await prisma.issue.findFirstOrThrow({ where: { apiKey: issue.apiKey }, - orderBy: { createdAt: 'desc' }, - }) + orderBy: { createdAt: "desc" }, + }); if (latestIssue.id === issue.id) { result.push({ topic: filter.topic, filter: true, - }) + }); } - break + break; } } } - if (alert.filterMatch === 'every') { - return result.some(item => item.filter === true) + if (alert.filterMatch === "every") { + return result.some((item) => item.filter === true); + } else if (alert.filterMatch === "all") { + return result.every((item) => item.filter === true); } - else if (alert.filterMatch === 'all') { - return result.every(item => item.filter === true) - } - return false + return false; } export async function getAlertStatus( @@ -310,58 +317,57 @@ export async function getAlertStatus( prisma: PrismaService, ) { let result: { - topic: AlertConditionTopic - condition: boolean - metadata?: any - alert?: Alert - }[] = [] + topic: AlertConditionTopic; + condition: boolean; + metadata?: any; + alert?: Alert; + }[] = []; for (const alert of alerts) { - const alertNew = await prisma.alert.findUniqueOrThrow({ where: { id: alert.id } }) - if (!alertNew.enabled) continue - if (judgingInterval(alertNew)) continue - const filtered = await judgingFilter(event, issue, issueEventsCount, alertNew, prisma) - if (!filtered) continue + const alertNew = await prisma.alert.findUniqueOrThrow({ where: { id: alert.id } }); + if (!alertNew.enabled) continue; + if (judgingInterval(alertNew)) continue; + const filtered = await judgingFilter(event, issue, issueEventsCount, alertNew, prisma); + if (!filtered) continue; - const items = await judgingCondition(event, issue, alertNew, prisma) + const items = await judgingCondition(event, issue, alertNew, prisma); - if (alert.conditionMatch === 'every') { - result = result.concat(items.filter(v => v.condition)) - } - else if (alert.conditionMatch === 'all' && items.every(item => item.condition === true)) { - result = result.concat(items) + if (alert.conditionMatch === "every") { + result = result.concat(items.filter((v) => v.condition)); + } else if (alert.conditionMatch === "all" && items.every((item) => item.condition === true)) { + result = result.concat(items); } } - return result + return result; } function switchLevelAndGetText(level: AlertLevel) { const levelList = [ - { label: '严重', value: 'serious' }, - { label: '警告', value: 'warning' }, - { label: '默认', value: 'default' }, - ] - return levelList.find(item => item.value === level)?.label + { label: "严重", value: "serious" }, + { label: "警告", value: "warning" }, + { label: "默认", value: "default" }, + ]; + return levelList.find((item) => item.value === level)?.label; } -const md = markdownIt() +const md = markdownIt(); export function getAlertContent( event: Event, - issue: GetAlertStatusParams['issue'], + issue: GetAlertStatusParams["issue"], issueEventsCount: number, issueUsersCount: number, alert: Alert, ) { - const url = (event.device as any).url - const { type, updatedAt } = issue - const metadata = JSON.parse(issue.metadata || '{}') - const message = metadata.message || 'unknown message' - const filename = metadata.filename - const others = metadata.others - const title = `「Ohbug」[问题通知] [${switchLevelAndGetText(alert.level)}] ${type}` + const url = (event.device as any).url; + const { type, updatedAt } = issue; + const metadata = JSON.parse(issue.metadata || "{}"); + const message = metadata.message || "unknown message"; + const filename = metadata.filename; + const others = metadata.others; + const title = `「Ohbug」[问题通知] [${switchLevelAndGetText(alert.level)}] ${type}`; const statistics = { eventsCount: issueEventsCount, usersCount: issueUsersCount, time: updatedAt, - } + }; const text = ` ${title} @@ -372,29 +378,29 @@ export function getAlertContent( Statistics 总事件数:${statistics.eventsCount} 总用户数:${statistics.usersCount} - 时间:${dayjs(statistics.time).format('YYYY-MM-DD HH:mm:ss')} + 时间:${dayjs(statistics.time).format("YYYY-MM-DD HH:mm:ss")} ${ - (!!url && url !== 'undefined') - ? `Url + !!url && url !== "undefined" + ? `Url ${url}` - : '' -} + : "" + } ${ - (!!filename && filename !== 'undefined') - ? `File + !!filename && filename !== "undefined" + ? `File ${filename}` - : '' -} + : "" + } ${ - (!!others && others !== 'undefined') - ? `Others + !!others && others !== "undefined" + ? `Others ${others}` - : '' -} - ` + : "" + } + `; const markdown = ` # ${title} @@ -404,38 +410,38 @@ export function getAlertContent( ## Statistics - 总事件数:${statistics.eventsCount} - 总用户数:${statistics.usersCount} - - 时间:${dayjs(statistics.time).format('YYYY-MM-DD HH:mm:ss')} + - 时间:${dayjs(statistics.time).format("YYYY-MM-DD HH:mm:ss")} ${ - (!!url && url !== 'undefined') - ? `Url + !!url && url !== "undefined" + ? `Url ${url}` - : '' -} + : "" + } ${ - (!!filename && filename !== 'undefined') - ? `File + !!filename && filename !== "undefined" + ? `File ${filename}` - : '' -} + : "" + } ${ - (!!others && others !== 'undefined') - ? `Others + !!others && others !== "undefined" + ? `Others ${others}` - : '' -} - ` - const html = md.render(markdown) + : "" + } + `; + const html = md.render(markdown); const lite = `总事件数:${statistics.eventsCount} 总用户数:${ statistics.usersCount - } 时间:${dayjs(statistics.time).format('YYYY-MM-DD HH:mm:ss')}` + } 时间:${dayjs(statistics.time).format("YYYY-MM-DD HH:mm:ss")}`; return { title, text, lite, markdown, html, - } + }; } diff --git a/packages/server/src/api/alert/alert.module.ts b/packages/server/src/api/alert/alert.module.ts index e383761..e9ab7c9 100644 --- a/packages/server/src/api/alert/alert.module.ts +++ b/packages/server/src/api/alert/alert.module.ts @@ -1,7 +1,9 @@ -import { Module } from '@nestjs/common' -import { HttpModule } from '@nestjs/axios' -import { AlertProcessor } from './alert.processor' -import { PrismaService } from '~/common' +import { HttpModule } from "@nestjs/axios"; +import { Module } from "@nestjs/common"; + +import { PrismaService } from "~/common"; + +import { AlertProcessor } from "./alert.processor"; @Module({ imports: [HttpModule], diff --git a/packages/server/src/api/alert/alert.processor.ts b/packages/server/src/api/alert/alert.processor.ts index d47e733..5fde969 100644 --- a/packages/server/src/api/alert/alert.processor.ts +++ b/packages/server/src/api/alert/alert.processor.ts @@ -1,15 +1,17 @@ -import { OnQueueError, Process, Processor } from '@nestjs/bull' -import { getConfig } from 'config' -import { Job } from 'bull' -import { Action } from 'common' -import { HttpService } from '@nestjs/axios' -import { GetAlertStatusParams } from '../report/report.interface' -import { getAlertContent, getAlertStatus } from './alert.core' -import email from './email' -import webhook from './webhook' -import { ForbiddenException, PrismaService } from '~/common' +import { HttpService } from "@nestjs/axios"; +import { OnQueueError, Process, Processor } from "@nestjs/bull"; +import { Job } from "bull"; +import { Action } from "common"; +import { getConfig } from "config"; -@Processor('alert') +import { ForbiddenException, PrismaService } from "~/common"; + +import { GetAlertStatusParams } from "../report/report.interface"; +import { getAlertContent, getAlertStatus } from "./alert.core"; +import email from "./email"; +import webhook from "./webhook"; + +@Processor("alert") export class AlertProcessor { constructor( private readonly prisma: PrismaService, @@ -19,15 +21,25 @@ export class AlertProcessor { @Process() async handleAlert(job: Job) { try { - const data = job.data as GetAlertStatusParams + const data = job.data as GetAlertStatusParams; if (data) { - const issueEventsCount = await this.prisma.event.count({ where: { issueId: data.issue.id } }) - const issueUsersCount = (await this.prisma.issue.findUniqueOrThrow({ - where: { id: data.issue.id }, - include: { users: true }, - })).users.length - const status = await getAlertStatus(data.event, data.issue, issueEventsCount, data.alerts, this.prisma) + const issueEventsCount = await this.prisma.event.count({ + where: { issueId: data.issue.id }, + }); + const issueUsersCount = ( + await this.prisma.issue.findUniqueOrThrow({ + where: { id: data.issue.id }, + include: { users: true }, + }) + ).users.length; + const status = await getAlertStatus( + data.event, + data.issue, + issueEventsCount, + data.alerts, + this.prisma, + ); if (status.length > 0) { for (const item of status) { @@ -38,10 +50,10 @@ export class AlertProcessor { issueEventsCount, issueUsersCount, item.alert, - ) + ); for (const action of item.alert.actions as unknown as Action[]) { - if (action.type === 'email') { - const config = getConfig() + if (action.type === "email") { + const config = getConfig(); if (config.email && config.email.server && config.email.from) { email({ server: config.email.server, @@ -50,10 +62,9 @@ export class AlertProcessor { title: alertContent.title, text: alertContent.text, html: alertContent.html, - }) + }); } - } - else if (action.type === 'webhook') { + } else if (action.type === "webhook") { webhook( { title: alertContent.title, @@ -62,7 +73,7 @@ export class AlertProcessor { }, action, this.httpService, - ) + ); } } @@ -72,23 +83,22 @@ export class AlertProcessor { event: { connect: { id: data.event.id } }, issue: { connect: { id: data.issue.id } }, }, - }) + }); await this.prisma.alert.update({ where: { id: item.alert.id }, data: { recentlyAt: new Date() }, - }) + }); } } } } - } - catch (error) { - throw new ForbiddenException(4001100, error) + } catch (error) { + throw new ForbiddenException(4001100, error); } } @OnQueueError() handleError(error: Error) { - console.error(error) + console.error(error); } } diff --git a/packages/server/src/api/alert/email.ts b/packages/server/src/api/alert/email.ts index 60978c0..0dbf639 100644 --- a/packages/server/src/api/alert/email.ts +++ b/packages/server/src/api/alert/email.ts @@ -1,16 +1,16 @@ -import nodemailer from 'nodemailer' -import SMTPTransport from 'nodemailer/lib/smtp-transport' +import nodemailer from "nodemailer"; +import SMTPTransport from "nodemailer/lib/smtp-transport"; interface SendMail { - server: SMTPTransport.Options | string - from: string - to: string - title: string - text: string - html: string + server: SMTPTransport.Options | string; + from: string; + to: string; + title: string; + text: string; + html: string; } async function main({ server, from, to, title, text, html }: SendMail) { - const transporter = nodemailer.createTransport(server) + const transporter = nodemailer.createTransport(server); const info = { from: `Ohbug <${from}>`, @@ -18,13 +18,13 @@ async function main({ server, from, to, title, text, html }: SendMail) { subject: title, text, html, - } + }; - const verify = await transporter.verify() + const verify = await transporter.verify(); if (verify) { - return transporter.sendMail(info) + return transporter.sendMail(info); } - return null + return null; } -export default main +export default main; diff --git a/packages/server/src/api/alert/webhook.ts b/packages/server/src/api/alert/webhook.ts index e0e2b89..dde4166 100644 --- a/packages/server/src/api/alert/webhook.ts +++ b/packages/server/src/api/alert/webhook.ts @@ -1,68 +1,56 @@ -import { lastValueFrom } from 'rxjs' -import { HttpService } from '@nestjs/axios' -import { Action } from 'common' +import { HttpService } from "@nestjs/axios"; +import { Action } from "common"; +import { lastValueFrom } from "rxjs"; interface Content { - title: string - text: string - markdown: string + title: string; + text: string; + markdown: string; } -function switchWebhookTypeAndGetFormatResult( - { title, text, markdown }: Content, - action: Action, -) { - const at = action?.at +function switchWebhookTypeAndGetFormatResult({ title, text, markdown }: Content, action: Action) { + const at = action?.at; const atText = (hasExtra: boolean) => - at?.split(',').reduce( - (pre, cur) => - `${pre}\n${hasExtra ? '<' : ''}@${cur}${hasExtra ? '>' : ''} `, - '', - ) + at + ?.split(",") + .reduce((pre, cur) => `${pre}\n${hasExtra ? "<" : ""}@${cur}${hasExtra ? ">" : ""} `, ""); switch (action?.webhookType) { - case 'dingtalk': { + case "dingtalk": { const result: Record<string, any> = { - msgtype: 'markdown', + msgtype: "markdown", markdown: { title, text: markdown + atText(false), }, - } + }; if (at) { result.at = { atMobiles: [at], isAtAll: false, - } + }; } - return result + return result; } - case 'wechatWork': { + case "wechatWork": { const result: Record<string, any> = { - msgtype: 'text', + msgtype: "text", text: { content: text }, - } + }; if (at) { - result.text.mentioned_mobile_list = [at] + result.text.mentioned_mobile_list = [at]; } - return result + return result; } - case 'others': - return text + case "others": + return text; default: - return text + return text; } } -async function main( - { title, text, markdown }: Content, - action: Action, - httpService: HttpService, -) { - const result = switchWebhookTypeAndGetFormatResult( - { title, text, markdown }, - action, - ) - const source$ = httpService.post(action.uri, result) - lastValueFrom(source$) +async function main({ title, text, markdown }: Content, action: Action, httpService: HttpService) { + const result = switchWebhookTypeAndGetFormatResult({ title, text, markdown }, action); + const source$ = httpService.post(action.uri, result); + lastValueFrom(source$); } -export default main +export default main; diff --git a/packages/server/src/api/api.module.ts b/packages/server/src/api/api.module.ts index 0522b2c..b614185 100644 --- a/packages/server/src/api/api.module.ts +++ b/packages/server/src/api/api.module.ts @@ -1,7 +1,8 @@ -import { Module } from '@nestjs/common' -import { AlertModule } from './alert/alert.module' -import { ReportModule } from './report/report.module' -import { SourceMapModule } from './source-map/source-map.module' +import { Module } from "@nestjs/common"; + +import { AlertModule } from "./alert/alert.module"; +import { ReportModule } from "./report/report.module"; +import { SourceMapModule } from "./source-map/source-map.module"; @Module({ imports: [AlertModule, ReportModule, SourceMapModule] }) export class ApiModule {} diff --git a/packages/server/src/api/report/report.controller.ts b/packages/server/src/api/report/report.controller.ts index 2302b40..421a4d7 100644 --- a/packages/server/src/api/report/report.controller.ts +++ b/packages/server/src/api/report/report.controller.ts @@ -1,6 +1,7 @@ -import { Body, Controller, HttpCode, Ip, Post, Req } from '@nestjs/common' -import { OhbugEvent } from '@ohbug/types' -import { ReportService } from './report.service' +import { Body, Controller, HttpCode, Ip, Post, Req } from "@nestjs/common"; +import { OhbugEvent } from "@ohbug/types"; + +import { ReportService } from "./report.service"; /** * 用于接收上报数据 @@ -19,7 +20,14 @@ export class ReportController { */ @Post() @HttpCode(204) - async receiveEventFromPost(@Body() event: OhbugEvent<any> | string, @Ip() ip: string, @Req() req: any) { - this.reportService.handleEvent(event, req.headers?.['x-real-ip'] || req.headers?.['x-forwarded-for'] || ip) + async receiveEventFromPost( + @Body() event: OhbugEvent<any> | string, + @Ip() ip: string, + @Req() req: any, + ) { + this.reportService.handleEvent( + event, + req.headers?.["x-real-ip"] || req.headers?.["x-forwarded-for"] || ip, + ); } } diff --git a/packages/server/src/api/report/report.core.ts b/packages/server/src/api/report/report.core.ts index a66d7f8..051df30 100644 --- a/packages/server/src/api/report/report.core.ts +++ b/packages/server/src/api/report/report.core.ts @@ -1,9 +1,7 @@ -import { EventTypes } from '@ohbug/core' -import { md5 } from 'common' -import { - AggregationDataAndMetaData, - OhbugEventDetail, -} from './report.interface' +import { EventTypes } from "@ohbug/core"; +import { md5 } from "common"; + +import { AggregationDataAndMetaData, OhbugEventDetail } from "./report.interface"; /** * 根据不同 error detail 返回可用于聚合的字段 @@ -17,40 +15,28 @@ export function switchErrorDetailAndGetAggregationDataAndMetaData( ): AggregationDataAndMetaData { switch (type) { case EventTypes.UNCAUGHT_ERROR: { - const filename = detail.filename?.split?.('?')?.[0] + const filename = detail.filename?.split?.("?")?.[0]; return { - agg: [ - detail.name, - detail.message, - filename, - detail.lineno, - detail.colno, - ], + agg: [detail.name, detail.message, filename, detail.lineno, detail.colno], metadata: { type, message: detail.message, filename: detail.filename, others: detail.stack, }, - } + }; } case EventTypes.UNHANDLEDREJECTION_ERROR: { - const filename = detail.filename?.split?.('?')?.[0] + const filename = detail.filename?.split?.("?")?.[0]; return { - agg: [ - detail.name, - detail.message, - filename, - detail.lineno, - detail.colno, - ], + agg: [detail.name, detail.message, filename, detail.lineno, detail.colno], metadata: { type, message: detail.message, filename: detail.filename, others: detail.stack, }, - } + }; } case EventTypes.UNKNOWN_ERROR: return { @@ -59,7 +45,7 @@ export function switchErrorDetailAndGetAggregationDataAndMetaData( type, message: detail.message, }, - } + }; case EventTypes.RESOURCE_ERROR: return { agg: [ @@ -76,7 +62,7 @@ export function switchErrorDetailAndGetAggregationDataAndMetaData( message: detail.message, others: detail.selector, }, - } + }; case EventTypes.AJAX_ERROR: return { agg: [detail.req?.url, detail.req?.method], @@ -85,7 +71,7 @@ export function switchErrorDetailAndGetAggregationDataAndMetaData( message: detail.req?.url, others: detail.req?.method, }, - } + }; case EventTypes.FETCH_ERROR: return { agg: [detail.req?.url, detail.req?.method], @@ -94,7 +80,7 @@ export function switchErrorDetailAndGetAggregationDataAndMetaData( message: detail.req?.url, others: detail.req?.method, }, - } + }; case EventTypes.WEBSOCKET_ERROR: return { agg: [detail.url], @@ -102,21 +88,16 @@ export function switchErrorDetailAndGetAggregationDataAndMetaData( type, message: detail.url, }, - } + }; case EventTypes.REACT: return { - agg: [ - detail.name, - detail.message, - detail.errorInfo, - detail.stack, - ], + agg: [detail.name, detail.message, detail.errorInfo, detail.stack], metadata: { type, message: detail.message, others: detail.errorInfo, }, - } + }; case EventTypes.VUE: return { agg: [ @@ -134,7 +115,7 @@ export function switchErrorDetailAndGetAggregationDataAndMetaData( filename: detail.file, others: detail.errorInfo, }, - } + }; case EventTypes.MINIAPP_ERROR: return { agg: detail?.stack ? [detail.message, detail.stack] : [detail.message], @@ -143,7 +124,7 @@ export function switchErrorDetailAndGetAggregationDataAndMetaData( message: detail.message, stack: detail?.stack, }, - } + }; case EventTypes.MINIAPP_UNHANDLEDREJECTION_ERROR: return { agg: detail?.stack ? [detail.message, detail.stack] : [detail.message], @@ -152,7 +133,7 @@ export function switchErrorDetailAndGetAggregationDataAndMetaData( message: detail.message, stack: detail?.stack, }, - } + }; case EventTypes.MINIAPP_PAGENOTFOUND_ERROR: return { agg: [detail?.message, detail?.path, detail.query, detail.isEntryPage], @@ -162,7 +143,7 @@ export function switchErrorDetailAndGetAggregationDataAndMetaData( path: detail.path, query: detail.query, }, - } + }; case EventTypes.MINIAPP_MEMORYWARNING_ERROR: return { agg: [detail?.message, detail?.level], @@ -171,7 +152,7 @@ export function switchErrorDetailAndGetAggregationDataAndMetaData( message: detail.message, level: detail.level, }, - } + }; default: return { agg: [detail.message], @@ -179,7 +160,7 @@ export function switchErrorDetailAndGetAggregationDataAndMetaData( type, message: detail.message, }, - } + }; } } @@ -189,9 +170,11 @@ export function switchErrorDetailAndGetAggregationDataAndMetaData( * @param aggregationData */ export function getMd5FromAggregationData(...aggregationData: any[]): string { - const data = aggregationData.map((item) => { - if (typeof item === 'object') return JSON.stringify(item) - return item - }).join(',') - return md5(data) + const data = aggregationData + .map((item) => { + if (typeof item === "object") return JSON.stringify(item); + return item; + }) + .join(","); + return md5(data); } diff --git a/packages/server/src/api/report/report.interface.ts b/packages/server/src/api/report/report.interface.ts index 7b08878..df7501d 100644 --- a/packages/server/src/api/report/report.interface.ts +++ b/packages/server/src/api/report/report.interface.ts @@ -6,59 +6,59 @@ import { UnhandledrejectionErrorDetail, UnknownErrorDetail, WebsocketErrorDetail, -} from '@ohbug/browser' -import { ReactErrorDetail } from '@ohbug/react' -import { VueErrorDetail } from '@ohbug/vue' -import { OhbugEventLike } from 'common' -import { Alert, Event, Issue, Prisma } from '@prisma/client' +} from "@ohbug/browser"; +import { ReactErrorDetail } from "@ohbug/react"; +import { VueErrorDetail } from "@ohbug/vue"; +import { Alert, Event, Issue, Prisma } from "@prisma/client"; +import { OhbugEventLike } from "common"; export type OhbugEventDetail = UncaughtErrorDetail & -UnhandledrejectionErrorDetail & -UnknownErrorDetail & -ResourceErrorDetail & -AjaxErrorDetail & -FetchErrorDetail & -WebsocketErrorDetail & -ReactErrorDetail & -VueErrorDetail & -any + UnhandledrejectionErrorDetail & + UnknownErrorDetail & + ResourceErrorDetail & + AjaxErrorDetail & + FetchErrorDetail & + WebsocketErrorDetail & + ReactErrorDetail & + VueErrorDetail & + any; export interface MetaData { - type: string - message: string - filename?: string - stack?: string - others?: string + type: string; + message: string; + filename?: string; + stack?: string; + others?: string; } export interface AggregationDataAndMetaData { - agg: any[] - metadata: Prisma.InputJsonObject + agg: any[]; + metadata: Prisma.InputJsonObject; } export interface CreateEventParams { - event: OhbugEventLike - issueIntro: string - userIntro: string - metadata: Prisma.InputJsonObject + event: OhbugEventLike; + issueIntro: string; + userIntro: string; + metadata: Prisma.InputJsonObject; } export interface CreateMetricParams { - metric: OhbugEventLike - userIntro: string + metric: OhbugEventLike; + userIntro: string; } export interface CreateFeedbackParams { - feedback: OhbugEventLike - userIntro: string + feedback: OhbugEventLike; + userIntro: string; } export interface CreateViewParams { - view: OhbugEventLike - userIntro: string + view: OhbugEventLike; + userIntro: string; } export interface GetAlertStatusParams { - event: Event - issue: Issue - alerts: Alert[] + event: Event; + issue: Issue; + alerts: Alert[]; } diff --git a/packages/server/src/api/report/report.module.ts b/packages/server/src/api/report/report.module.ts index cb4190d..3ff6f3d 100644 --- a/packages/server/src/api/report/report.module.ts +++ b/packages/server/src/api/report/report.module.ts @@ -1,14 +1,16 @@ -import { Module } from '@nestjs/common' -import { BullModule } from '@nestjs/bull' -import { ReportController } from './report.controller' -import { ReportService } from './report.service' -import { ReportProcessor } from './report.processor' -import { PrismaService } from '~/common' +import { BullModule } from "@nestjs/bull"; +import { Module } from "@nestjs/common"; + +import { PrismaService } from "~/common"; + +import { ReportController } from "./report.controller"; +import { ReportProcessor } from "./report.processor"; +import { ReportService } from "./report.service"; @Module({ imports: [ - BullModule.registerQueue({ name: 'document' }), - BullModule.registerQueue({ name: 'alert' }), + BullModule.registerQueue({ name: "document" }), + BullModule.registerQueue({ name: "alert" }), ], controllers: [ReportController], providers: [ReportService, ReportProcessor, PrismaService], diff --git a/packages/server/src/api/report/report.processor.ts b/packages/server/src/api/report/report.processor.ts index 0b318a8..1358d3a 100644 --- a/packages/server/src/api/report/report.processor.ts +++ b/packages/server/src/api/report/report.processor.ts @@ -1,24 +1,27 @@ -import { InjectQueue, OnQueueError, Process, Processor } from '@nestjs/bull' -import { Job, Queue } from 'bull' -import { Prisma } from '@prisma/client' -import { CreateEventParams, CreateFeedbackParams, CreateMetricParams, CreateViewParams, GetAlertStatusParams } from './report.interface' -import { ForbiddenException, PrismaService } from '~/common' +import { InjectQueue, OnQueueError, Process, Processor } from "@nestjs/bull"; +import { Prisma } from "@prisma/client"; +import { Job, Queue } from "bull"; -@Processor('document') +import { ForbiddenException, PrismaService } from "~/common"; + +import { + CreateEventParams, + CreateFeedbackParams, + CreateMetricParams, + CreateViewParams, + GetAlertStatusParams, +} from "./report.interface"; + +@Processor("document") export class ReportProcessor { constructor( private readonly prisma: PrismaService, - @InjectQueue('alert') private alertQueue: Queue, + @InjectQueue("alert") private alertQueue: Queue, ) {} - async CreateEvent({ - event, - issueIntro, - userIntro, - metadata, - }: CreateEventParams) { + async CreateEvent({ event, issueIntro, userIntro, metadata }: CreateEventParams) { try { - const now = new Date() + const now = new Date(); const createEventOperation = this.prisma.event.create({ data: { apiKey: event.apiKey, @@ -74,7 +77,7 @@ export class ReportProcessor { }, }, include: { issue: true }, - }) + }); const updateIssueOperation = this.prisma.issue.update({ where: { id: issueIntro }, data: { @@ -91,21 +94,20 @@ export class ReportProcessor { }, }, }, - }) + }); const updateEventUserOperation = this.prisma.eventUser.update({ where: { id: userIntro }, data: { updatedAt: now }, - }) + }); const [result] = await this.prisma.$transaction([ createEventOperation, updateIssueOperation, updateEventUserOperation, - ]) - return result - } - catch (error) { - console.error(error) - throw new ForbiddenException(4001003, error) + ]); + return result; + } catch (error) { + console.error(error); + throw new ForbiddenException(4001003, error); } } @@ -154,11 +156,10 @@ export class ReportProcessor { }, }, }, - }) - } - catch (error) { - console.error(error) - throw new ForbiddenException(4001004, error) + }); + } catch (error) { + console.error(error); + throw new ForbiddenException(4001004, error); } } @@ -183,7 +184,9 @@ export class ReportProcessor { ...feedback.user, id: userIntro, ipAddress: feedback.user.ipAddress!, - metadata: feedback.user.metadata ? JSON.stringify(feedback.user.metadata) : undefined, + metadata: feedback.user.metadata + ? JSON.stringify(feedback.user.metadata) + : undefined, projects: { connectOrCreate: { where: { @@ -202,11 +205,10 @@ export class ReportProcessor { }, }, }, - }) - } - catch (error) { - console.error(error) - throw new ForbiddenException(4001005, error) + }); + } catch (error) { + console.error(error); + throw new ForbiddenException(4001005, error); } } @@ -249,11 +251,10 @@ export class ReportProcessor { }, }, }, - }) - } - catch (error) { - console.error(error) - throw new ForbiddenException(4001006, error) + }); + } catch (error) { + console.error(error); + throw new ForbiddenException(4001006, error); } } @@ -296,152 +297,141 @@ export class ReportProcessor { }, }, }, - }) - } - catch (error) { - console.error(error) - throw new ForbiddenException(4001007, error) + }); + } catch (error) { + console.error(error); + throw new ForbiddenException(4001007, error); } } - @Process('event') + @Process("event") async handleEvent(job: Job) { try { - const data = job.data as CreateEventParams + const data = job.data as CreateEventParams; if (data) { // 1. 查询有没有对应的 project - const apiKey = data.event.apiKey + const apiKey = data.event.apiKey; const project = await this.prisma.project.findUniqueOrThrow({ where: { apiKey }, include: { alerts: true }, - }) + }); if (project) { // 2. 创建 issue/event (postgres) - const event = await this.CreateEvent(data) + const event = await this.CreateEvent(data); // 3. 拿到对应的 alert 配置 - const alerts = project.alerts + const alerts = project.alerts; if (event && event.issue && alerts.length > 0) { const getAlertStatusParams: GetAlertStatusParams = { event, issue: event.issue, alerts, - } + }; await this.alertQueue.add(getAlertStatusParams, { delay: 1000, removeOnComplete: true, removeOnFail: true, priority: 2, - }) + }); } - } - else { - throw new Error(`Project not found for apiKey: ${apiKey}`) + } else { + throw new Error(`Project not found for apiKey: ${apiKey}`); } } - } - catch (error) { - console.error(error) - throw new ForbiddenException(4001003, error) + } catch (error) { + console.error(error); + throw new ForbiddenException(4001003, error); } } - @Process('metric') + @Process("metric") async handleMetrics(job: Job) { try { - const data = job.data as CreateMetricParams + const data = job.data as CreateMetricParams; if (data) { - const apiKey = data.metric.apiKey - const project = await this.prisma.project.findUniqueOrThrow({ where: { apiKey } }) + const apiKey = data.metric.apiKey; + const project = await this.prisma.project.findUniqueOrThrow({ where: { apiKey } }); if (project) { - await this.CreateMetric(data) - } - else { - throw new Error(`Project not found for apiKey: ${apiKey}`) + await this.CreateMetric(data); + } else { + throw new Error(`Project not found for apiKey: ${apiKey}`); } } - } - catch (error) { - console.error(error) - throw new ForbiddenException(4001004, error) + } catch (error) { + console.error(error); + throw new ForbiddenException(4001004, error); } } - @Process('feedback') + @Process("feedback") async handleFeedback(job: Job) { try { - const data = job.data as CreateFeedbackParams + const data = job.data as CreateFeedbackParams; if (data) { - const apiKey = data.feedback.apiKey - const project = await this.prisma.project.findUniqueOrThrow({ where: { apiKey } }) + const apiKey = data.feedback.apiKey; + const project = await this.prisma.project.findUniqueOrThrow({ where: { apiKey } }); if (project) { - await this.CreateFeedback(data) - } - else { - throw new Error(`Project not found for apiKey: ${apiKey}`) + await this.CreateFeedback(data); + } else { + throw new Error(`Project not found for apiKey: ${apiKey}`); } } - } - catch (error) { - console.error(error) - throw new ForbiddenException(4001005, error) + } catch (error) { + console.error(error); + throw new ForbiddenException(4001005, error); } } - @Process('pageView') + @Process("pageView") async handlePageView(job: Job) { try { - const data = job.data as CreateViewParams + const data = job.data as CreateViewParams; if (data) { - const apiKey = data.view.apiKey - const project = await this.prisma.project.findUniqueOrThrow({ where: { apiKey } }) + const apiKey = data.view.apiKey; + const project = await this.prisma.project.findUniqueOrThrow({ where: { apiKey } }); if (project) { - await this.CreatePageView(data) - } - else { - throw new Error(`Project not found for apiKey: ${apiKey}`) + await this.CreatePageView(data); + } else { + throw new Error(`Project not found for apiKey: ${apiKey}`); } } - } - catch (error) { - console.error(error) - throw new ForbiddenException(4001006, error) + } catch (error) { + console.error(error); + throw new ForbiddenException(4001006, error); } } - @Process('userView') + @Process("userView") async handleUserView(job: Job) { try { - const data = job.data as CreateViewParams + const data = job.data as CreateViewParams; if (data) { - const apiKey = data.view.apiKey - const project = await this.prisma.project.findUniqueOrThrow({ where: { apiKey } }) + const apiKey = data.view.apiKey; + const project = await this.prisma.project.findUniqueOrThrow({ where: { apiKey } }); if (project) { - await this.CreateUserView(data) - } - else { - throw new Error(`Project not found for apiKey: ${apiKey}`) + await this.CreateUserView(data); + } else { + throw new Error(`Project not found for apiKey: ${apiKey}`); } } - } - catch (error) { - console.error(error) - throw new ForbiddenException(4001007, error) + } catch (error) { + console.error(error); + throw new ForbiddenException(4001007, error); } } @OnQueueError() handleError(error: Error) { - console.error(error) + console.error(error); } } diff --git a/packages/server/src/api/report/report.service.ts b/packages/server/src/api/report/report.service.ts index 5a61d08..4b77e89 100644 --- a/packages/server/src/api/report/report.service.ts +++ b/packages/server/src/api/report/report.service.ts @@ -1,61 +1,68 @@ -import { Injectable } from '@nestjs/common' -import { InjectQueue } from '@nestjs/bull' -import { OhbugEventLike } from 'common' -import { OhbugEvent } from '@ohbug/types' -import { Queue } from 'bull' +import { InjectQueue } from "@nestjs/bull"; +import { Injectable } from "@nestjs/common"; +import { OhbugEvent } from "@ohbug/types"; +import { Queue } from "bull"; +import { OhbugEventLike } from "common"; + +import { ForbiddenException } from "~/common"; + import { getMd5FromAggregationData, switchErrorDetailAndGetAggregationDataAndMetaData, -} from './report.core' -import { CreateEventParams, CreateFeedbackParams, CreateMetricParams, CreateViewParams } from './report.interface' -import { ForbiddenException } from '~/common' +} from "./report.core"; +import { + CreateEventParams, + CreateFeedbackParams, + CreateMetricParams, + CreateViewParams, +} from "./report.interface"; @Injectable() export class ReportService { - constructor(@InjectQueue('document') private documentQueue: Queue) {} + constructor(@InjectQueue("document") private documentQueue: Queue) {} filterEvent(event: OhbugEvent<any>): OhbugEvent<any> { - if (!('apiKey' in event && typeof event.apiKey === 'string')) { - throw new Error(`不合法的 Event 数据 收到 event.apiKey 为 ${event.apiKey}`) + if (!("apiKey" in event && typeof event.apiKey === "string")) { + throw new Error(`不合法的 Event 数据 收到 event.apiKey 为 ${event.apiKey}`); } - if ('appVersion' in event && typeof event.appVersion !== 'string') { - throw new Error(`不合法的 Event 数据 收到 event.appVersion 为 ${event.appVersion}`) + if ("appVersion" in event && typeof event.appVersion !== "string") { + throw new Error(`不合法的 Event 数据 收到 event.appVersion 为 ${event.appVersion}`); } - if ('appType' in event && typeof event.appType !== 'string') { - throw new Error(`不合法的 Event 数据 收到 event.appType 为 ${event.appType}`) + if ("appType" in event && typeof event.appType !== "string") { + throw new Error(`不合法的 Event 数据 收到 event.appType 为 ${event.appType}`); } - if ('releaseStage' in event && typeof event.releaseStage !== 'string') { - throw new Error(`不合法的 Event 数据 收到 event.releaseStage 为 ${event.releaseStage}`) + if ("releaseStage" in event && typeof event.releaseStage !== "string") { + throw new Error(`不合法的 Event 数据 收到 event.releaseStage 为 ${event.releaseStage}`); } - if (!('timestamp' in event && typeof event.timestamp === 'string')) { - throw new Error(`不合法的 Event 数据 收到 event.timestamp 为 ${event.timestamp}`) + if (!("timestamp" in event && typeof event.timestamp === "string")) { + throw new Error(`不合法的 Event 数据 收到 event.timestamp 为 ${event.timestamp}`); } - if ('category' in event && typeof event.category !== 'string') { - throw new Error(`不合法的 Event 数据 收到 event.category 为 ${event.category}`) + if ("category" in event && typeof event.category !== "string") { + throw new Error(`不合法的 Event 数据 收到 event.category 为 ${event.category}`); } - if (!('type' in event && typeof event.type === 'string')) { - throw new Error(`不合法的 Event 数据 收到 event.type 为 ${event.type}`) + if (!("type" in event && typeof event.type === "string")) { + throw new Error(`不合法的 Event 数据 收到 event.type 为 ${event.type}`); } - if (!('sdk' in event && event.sdk instanceof Object)) { - throw new Error(`不合法的 Event 数据 收到 event.sdk 为 ${event.sdk}`) + if (!("sdk" in event && event.sdk instanceof Object)) { + throw new Error(`不合法的 Event 数据 收到 event.sdk 为 ${event.sdk}`); } - if (!('detail' in event)) { - throw new Error('不合法的 Event 数据 缺少 event.detail') + if (!("detail" in event)) { + throw new Error("不合法的 Event 数据 缺少 event.detail"); } - if (!('device' in event)) { - throw new Error('不合法的 Event 数据 缺少 event.device') + if (!("device" in event)) { + throw new Error("不合法的 Event 数据 缺少 event.device"); } - return event + return event; } /** @@ -70,7 +77,7 @@ export class ReportService { ...(event.user ?? {}), ipAddress, }, - }) + }); } /** @@ -81,14 +88,12 @@ export class ReportService { */ aggregation(event: OhbugEventLike) { try { - const { type, detail, apiKey } = event - const { agg, metadata } - = switchErrorDetailAndGetAggregationDataAndMetaData(type, detail) - const issueIntro = getMd5FromAggregationData(apiKey, ...agg) - return { issueIntro, metadata } - } - catch (error) { - throw new ForbiddenException(4001001, error) + const { type, detail, apiKey } = event; + const { agg, metadata } = switchErrorDetailAndGetAggregationDataAndMetaData(type, detail); + const issueIntro = getMd5FromAggregationData(apiKey, ...agg); + return { issueIntro, metadata }; + } catch (error) { + throw new ForbiddenException(4001001, error); } } @@ -98,86 +103,65 @@ export class ReportService { * @param event 通过上报接口拿到的 event * @param ip 用户 ip */ - async handleEvent(event: OhbugEvent<any> | string, ip: string): Promise<'ok'> { + async handleEvent(event: OhbugEvent<any> | string, ip: string): Promise<"ok"> { try { - if (typeof event === 'string') event = JSON.parse(event) - const filteredEvent = this.filterEvent(event as OhbugEvent<any>) - const eventLike = this.transferEvent(filteredEvent, ip) - const userIntro = getMd5FromAggregationData(eventLike.apiKey, ...Object.values(eventLike.user)) - if (eventLike.category === 'performance') { - const createMetricParams: CreateMetricParams = { metric: eventLike, userIntro } - - await this.documentQueue.add( - 'metric', - createMetricParams, - { + if (typeof event === "string") event = JSON.parse(event); + const filteredEvent = this.filterEvent(event as OhbugEvent<any>); + const eventLike = this.transferEvent(filteredEvent, ip); + const userIntro = getMd5FromAggregationData( + eventLike.apiKey, + ...Object.values(eventLike.user), + ); + if (eventLike.category === "performance") { + const createMetricParams: CreateMetricParams = { metric: eventLike, userIntro }; + + await this.documentQueue.add("metric", createMetricParams, { + delay: 3000, + removeOnComplete: true, + removeOnFail: true, + }); + } else if (eventLike.category === "feedback") { + const createFeedbackParams: CreateFeedbackParams = { feedback: eventLike, userIntro }; + await this.documentQueue.add("feedback", createFeedbackParams, { + delay: 3000, + removeOnComplete: true, + removeOnFail: true, + }); + } else if (eventLike.category === "view") { + const createViewParams: CreateViewParams = { view: eventLike, userIntro }; + if (eventLike.type === "pageView") { + await this.documentQueue.add("pageView", createViewParams, { delay: 3000, removeOnComplete: true, removeOnFail: true, - }, - ) - } - else if (eventLike.category === 'feedback') { - const createFeedbackParams: CreateFeedbackParams = { feedback: eventLike, userIntro } - await this.documentQueue.add( - 'feedback', - createFeedbackParams, - { + }); + } + if (eventLike.type === "userView") { + await this.documentQueue.add("userView", createViewParams, { delay: 3000, removeOnComplete: true, removeOnFail: true, - }, - ) - } - else if (eventLike.category === 'view') { - const createViewParams: CreateViewParams = { view: eventLike, userIntro } - if (eventLike.type === 'pageView') { - await this.documentQueue.add( - 'pageView', - createViewParams, - { - delay: 3000, - removeOnComplete: true, - removeOnFail: true, - }, - ) - } - if (eventLike.type === 'userView') { - await this.documentQueue.add( - 'userView', - createViewParams, - { - delay: 3000, - removeOnComplete: true, - removeOnFail: true, - }, - ) + }); } - } - else { - const aggregationEvent = this.aggregation(eventLike) + } else { + const aggregationEvent = this.aggregation(eventLike); const createEventParams: CreateEventParams = { event: eventLike, userIntro, ...aggregationEvent, - } - - await this.documentQueue.add( - 'event', - createEventParams, - { - delay: 3000, - removeOnComplete: true, - removeOnFail: true, - priority: 1, - }, - ) + }; + + await this.documentQueue.add("event", createEventParams, { + delay: 3000, + removeOnComplete: true, + removeOnFail: true, + priority: 1, + }); } - return 'ok' - } - catch (error) { - throw new ForbiddenException(4001000, error) + return "ok"; + } catch (error) { + throw new ForbiddenException(4001000, error); } } } diff --git a/packages/server/src/api/source-map/source-map.constant.ts b/packages/server/src/api/source-map/source-map.constant.ts index a28349f..3dafc61 100644 --- a/packages/server/src/api/source-map/source-map.constant.ts +++ b/packages/server/src/api/source-map/source-map.constant.ts @@ -1,6 +1,6 @@ -import { cwd } from 'node:process' -import { join } from 'node:path' +import { join } from "node:path"; +import { cwd } from "node:process"; -export const UPLOAD_DEST = join(cwd(), '../../.uploads') +export const UPLOAD_DEST = join(cwd(), "../../.uploads"); -export const maxSourceMap = 5000 +export const maxSourceMap = 5000; diff --git a/packages/server/src/api/source-map/source-map.controller.ts b/packages/server/src/api/source-map/source-map.controller.ts index c658733..d55ed28 100644 --- a/packages/server/src/api/source-map/source-map.controller.ts +++ b/packages/server/src/api/source-map/source-map.controller.ts @@ -1,20 +1,15 @@ -import { - Body, - Controller, - Post, - UploadedFile, - UseInterceptors, -} from '@nestjs/common' -import { FileInterceptor } from '@webundsoehne/nest-fastify-file-upload' -import { ReceiveSourceMapFile } from 'common' -import { UPLOAD_DEST } from './source-map.constant' -import { SourceMapService } from './source-map.service' -import { ReceiveSourceMapDto } from './source-map.dto' +import { Body, Controller, Post, UploadedFile, UseInterceptors } from "@nestjs/common"; +import { FileInterceptor } from "@webundsoehne/nest-fastify-file-upload"; +import { ReceiveSourceMapFile } from "common"; + +import { UPLOAD_DEST } from "./source-map.constant"; +import { ReceiveSourceMapDto } from "./source-map.dto"; +import { SourceMapService } from "./source-map.service"; /** * 用于接受上报 SourceMap,经过处理后入库 */ -@Controller('sourceMap') +@Controller("sourceMap") export class SourceMapController { constructor(private readonly sourceMapService: SourceMapService) {} @@ -24,12 +19,12 @@ export class SourceMapController { * @param file sourceMap 文件相关信息 * @param receiveSourceMapDto 此文件对应的 app 信息 */ - @Post('upload') - @UseInterceptors(FileInterceptor('file', { dest: UPLOAD_DEST })) + @Post("upload") + @UseInterceptors(FileInterceptor("file", { dest: UPLOAD_DEST })) async receiveSourceMap( @UploadedFile() file: ReceiveSourceMapFile, @Body() body: ReceiveSourceMapDto, ) { - return this.sourceMapService.handleSourceMap(file, body) + return this.sourceMapService.handleSourceMap(file, body); } } diff --git a/packages/server/src/api/source-map/source-map.dto.ts b/packages/server/src/api/source-map/source-map.dto.ts index 0e7283e..c2fe551 100644 --- a/packages/server/src/api/source-map/source-map.dto.ts +++ b/packages/server/src/api/source-map/source-map.dto.ts @@ -1,13 +1,13 @@ -import { IsOptional, IsString } from 'class-validator' +import { IsOptional, IsString } from "class-validator"; export class ReceiveSourceMapDto { @IsString() - readonly apiKey: string + readonly apiKey: string; @IsString() - readonly appVersion: string + readonly appVersion: string; @IsOptional() @IsString() - readonly appType?: string + readonly appType?: string; } diff --git a/packages/server/src/api/source-map/source-map.module.ts b/packages/server/src/api/source-map/source-map.module.ts index 168268f..037009b 100644 --- a/packages/server/src/api/source-map/source-map.module.ts +++ b/packages/server/src/api/source-map/source-map.module.ts @@ -1,12 +1,14 @@ -import { Module } from '@nestjs/common' -import { BullModule } from '@nestjs/bull' -import { SourceMapController } from './source-map.controller' -import { SourceMapService } from './source-map.service' -import { SourceMapProcessor } from './source-map.processor' -import { PrismaService } from '~/common' +import { BullModule } from "@nestjs/bull"; +import { Module } from "@nestjs/common"; + +import { PrismaService } from "~/common"; + +import { SourceMapController } from "./source-map.controller"; +import { SourceMapProcessor } from "./source-map.processor"; +import { SourceMapService } from "./source-map.service"; @Module({ - imports: [BullModule.registerQueue({ name: 'sourceMap' })], + imports: [BullModule.registerQueue({ name: "sourceMap" })], controllers: [SourceMapController], providers: [SourceMapService, PrismaService, SourceMapProcessor], }) diff --git a/packages/server/src/api/source-map/source-map.processor.ts b/packages/server/src/api/source-map/source-map.processor.ts index 9258c73..a3780ed 100644 --- a/packages/server/src/api/source-map/source-map.processor.ts +++ b/packages/server/src/api/source-map/source-map.processor.ts @@ -1,14 +1,17 @@ -import { unlink } from 'node:fs/promises' -import { Process, Processor } from '@nestjs/bull' -import { nanoid } from 'nanoid' -import { Job } from 'bull' -import { Prisma, Project, Release } from '@prisma/client' -import { ReceiveSourceMapFile, SourceMapData } from 'common' -import { maxSourceMap } from '../source-map/source-map.constant' -import { ReceiveSourceMapDto } from '../source-map/source-map.dto' -import { ForbiddenException, PrismaService } from '~/common' +import { unlink } from "node:fs/promises"; -@Processor('sourceMap') +import { Process, Processor } from "@nestjs/bull"; +import { Prisma, Project, Release } from "@prisma/client"; +import { Job } from "bull"; +import { ReceiveSourceMapFile, SourceMapData } from "common"; +import { nanoid } from "nanoid"; + +import { ForbiddenException, PrismaService } from "~/common"; + +import { maxSourceMap } from "../source-map/source-map.constant"; +import { ReceiveSourceMapDto } from "../source-map/source-map.dto"; + +@Processor("sourceMap") export class SourceMapProcessor { constructor(private readonly prisma: PrismaService) {} @@ -33,47 +36,47 @@ export class SourceMapProcessor { sourceMaps: sourceMaps as unknown as Prisma.InputJsonArray, project: { connect: { id: project.id } }, }, - }) + }); } - @Process('file') + @Process("file") async handleSourceMap(job: Job) { - const data = job.data + const data = job.data; try { const project = await this.prisma.project.findUniqueOrThrow({ where: { apiKey: data.body.apiKey }, include: { releases: true }, - }) + }); if (data.sourceMapFile && project) { const sourceMap = { ...data.sourceMapFile, id: nanoid(), - } + }; // 没有 release - if (project.releases.length === 0) return this.createRelease([sourceMap], data.body, project) + if (project.releases.length === 0) + return this.createRelease([sourceMap], data.body, project); - const { appVersion } = data.body || {} + const { appVersion } = data.body || {}; // 看是否达到上限 - const release = project.releases.find(release => release.appVersion === appVersion) + const release = project.releases.find((release) => release.appVersion === appVersion); if (release) { - const sourceMaps = release?.sourceMaps as unknown as SourceMapData || [] + const sourceMaps = (release?.sourceMaps as unknown as SourceMapData) || []; if (sourceMaps.length < maxSourceMap) { - return this.createRelease([...sourceMaps, sourceMap], data.body, project, release) + return this.createRelease([...sourceMaps, sourceMap], data.body, project, release); } // 已经达到上限 删除最旧的 - const deleteSourceMap = sourceMaps.shift() + const deleteSourceMap = sourceMaps.shift(); if (deleteSourceMap) { - await unlink(deleteSourceMap.path) - sourceMaps.push(sourceMap) - return this.createRelease(sourceMaps, data.body, project, release) + await unlink(deleteSourceMap.path); + sourceMaps.push(sourceMap); + return this.createRelease(sourceMaps, data.body, project, release); } } - return this.createRelease([sourceMap], data.body, project) + return this.createRelease([sourceMap], data.body, project); } - throw new Error('project not found') - } - catch (error) { - throw new ForbiddenException(4001200, error) + throw new Error("project not found"); + } catch (error) { + throw new ForbiddenException(4001200, error); } } } diff --git a/packages/server/src/api/source-map/source-map.service.ts b/packages/server/src/api/source-map/source-map.service.ts index fa7f310..4cdd4f0 100644 --- a/packages/server/src/api/source-map/source-map.service.ts +++ b/packages/server/src/api/source-map/source-map.service.ts @@ -1,19 +1,17 @@ -import { Injectable } from '@nestjs/common' -import { InjectQueue } from '@nestjs/bull' -import { Queue } from 'bull' -import { ReceiveSourceMapFile } from 'common' -import { ReceiveSourceMapDto } from './source-map.dto' +import { InjectQueue } from "@nestjs/bull"; +import { Injectable } from "@nestjs/common"; +import { Queue } from "bull"; +import { ReceiveSourceMapFile } from "common"; + +import { ReceiveSourceMapDto } from "./source-map.dto"; @Injectable() export class SourceMapService { - constructor(@InjectQueue('sourceMap') private sourceMapQueue: Queue) {} + constructor(@InjectQueue("sourceMap") private sourceMapQueue: Queue) {} - async handleSourceMap( - sourceMapFile: ReceiveSourceMapFile, - body: ReceiveSourceMapDto, - ) { + async handleSourceMap(sourceMapFile: ReceiveSourceMapFile, body: ReceiveSourceMapDto) { await this.sourceMapQueue.add( - 'file', + "file", { sourceMapFile, body, @@ -23,6 +21,6 @@ export class SourceMapService { removeOnComplete: true, removeOnFail: true, }, - ) + ); } } diff --git a/packages/server/src/app.module.ts b/packages/server/src/app.module.ts index fcfb085..26c0150 100644 --- a/packages/server/src/app.module.ts +++ b/packages/server/src/app.module.ts @@ -1,13 +1,10 @@ -import { Module } from '@nestjs/common' -import { SharedModule } from '~/shared.module' -import { ApiModule } from '~/api/api.module' -import { TasksModule } from '~/tasks/tasks.module' +import { Module } from "@nestjs/common"; + +import { ApiModule } from "~/api/api.module"; +import { SharedModule } from "~/shared.module"; +import { TasksModule } from "~/tasks/tasks.module"; @Module({ - imports: [ - SharedModule, - ApiModule, - TasksModule, - ], + imports: [SharedModule, ApiModule, TasksModule], }) export class AppModule {} diff --git a/packages/server/src/common/constants/index.ts b/packages/server/src/common/constants/index.ts index 51709ab..611928c 100644 --- a/packages/server/src/common/constants/index.ts +++ b/packages/server/src/common/constants/index.ts @@ -1,3 +1,3 @@ -import status from './status' +import status from "./status"; -export { status } +export { status }; diff --git a/packages/server/src/common/constants/status.ts b/packages/server/src/common/constants/status.ts index e13b135..93f4000 100644 --- a/packages/server/src/common/constants/status.ts +++ b/packages/server/src/common/constants/status.ts @@ -1,14 +1,14 @@ export default { - 4001000: 'preprocessing event failed', - 4001001: 'event an error occurred during aggregation', - 4001002: 'event an error occurred during task scheduling', - 4001003: 'failed to create event', - 4001004: 'failed to create metrics', - 4001005: 'failed to create feedback', - 4001006: 'failed to create pageView', - 4001007: 'failed to create userView', + 4001000: "preprocessing event failed", + 4001001: "event an error occurred during aggregation", + 4001002: "event an error occurred during task scheduling", + 4001003: "failed to create event", + 4001004: "failed to create metrics", + 4001005: "failed to create feedback", + 4001006: "failed to create pageView", + 4001007: "failed to create userView", - 4001100: 'alert task execution failed', + 4001100: "alert task execution failed", - 4001200: 'sourceMap file upload failed', -} + 4001200: "sourceMap file upload failed", +}; diff --git a/packages/server/src/common/database/bull.module.ts b/packages/server/src/common/database/bull.module.ts index 145dc3e..f3ddb74 100644 --- a/packages/server/src/common/database/bull.module.ts +++ b/packages/server/src/common/database/bull.module.ts @@ -1,4 +1,4 @@ -import { BullModule } from '@nestjs/bull' -import { getConfig } from 'config' +import { BullModule } from "@nestjs/bull"; +import { getConfig } from "config"; -export const BullModuleConfig = BullModule.forRoot({ redis: getConfig().db.redis }) +export const BullModuleConfig = BullModule.forRoot({ redis: getConfig().db.redis }); diff --git a/packages/server/src/common/database/index.ts b/packages/server/src/common/database/index.ts index 51ea23b..98474a9 100644 --- a/packages/server/src/common/database/index.ts +++ b/packages/server/src/common/database/index.ts @@ -1,2 +1,2 @@ -export * from './bull.module' -export * from './prisma.service' +export * from "./bull.module"; +export * from "./prisma.service"; diff --git a/packages/server/src/common/database/prisma.service.ts b/packages/server/src/common/database/prisma.service.ts index fb3412b..6d7ea7c 100644 --- a/packages/server/src/common/database/prisma.service.ts +++ b/packages/server/src/common/database/prisma.service.ts @@ -1,16 +1,16 @@ -import { Injectable } from '@nestjs/common' -import { PrismaClient } from '@prisma/client' -import { type INestApplication, type OnModuleInit } from '@nestjs/common' +import { Injectable } from "@nestjs/common"; +import { type INestApplication, type OnModuleInit } from "@nestjs/common"; +import { PrismaClient } from "@prisma/client"; @Injectable() export class PrismaService extends PrismaClient implements OnModuleInit { async onModuleInit() { - await this.$connect() + await this.$connect(); } async enableShutdownHooks(app: INestApplication) { - process.on('beforeExit', async () => { - await app.close() - }) + process.on("beforeExit", async () => { + await app.close(); + }); } } diff --git a/packages/server/src/common/exceptions/forbidden.exception.ts b/packages/server/src/common/exceptions/forbidden.exception.ts index 7d12606..6562dd0 100644 --- a/packages/server/src/common/exceptions/forbidden.exception.ts +++ b/packages/server/src/common/exceptions/forbidden.exception.ts @@ -1,13 +1,14 @@ -import { HttpException, Logger } from '@nestjs/common' -import { type ErrorShowType } from 'common' -import { status } from '../constants' +import { HttpException, Logger } from "@nestjs/common"; +import { type ErrorShowType } from "common"; + +import { status } from "../constants"; export class ForbiddenException extends HttpException { - public readonly code: number + public readonly code: number; - public readonly showType: ErrorShowType + public readonly showType: ErrorShowType; - private readonly logger = new Logger() + private readonly logger = new Logger(); /** * @@ -15,16 +16,12 @@ export class ForbiddenException extends HttpException { * @param extraMessage error message * @param showType error display type: 0 silent; 1 message.warn; 2 message.error; 4 notification; 9 page */ - constructor( - code: number, - extraMessage?: string | unknown, - showType?: ErrorShowType, - ) { - const message = (status as Record<number, string>)[code] - const response = extraMessage ? `[${message}] ${extraMessage}` : message - super(response, 400) - this.code = code - this.showType = showType || 2 - this.logger.error(response) + constructor(code: number, extraMessage?: string | unknown, showType?: ErrorShowType) { + const message = (status as Record<number, string>)[code]; + const response = extraMessage ? `[${message}] ${extraMessage}` : message; + super(response, 400); + this.code = code; + this.showType = showType || 2; + this.logger.error(response); } } diff --git a/packages/server/src/common/exceptions/index.ts b/packages/server/src/common/exceptions/index.ts index c4534f8..35a085e 100644 --- a/packages/server/src/common/exceptions/index.ts +++ b/packages/server/src/common/exceptions/index.ts @@ -1 +1 @@ -export * from './forbidden.exception' +export * from "./forbidden.exception"; diff --git a/packages/server/src/common/filters/all-exceptions.filter.ts b/packages/server/src/common/filters/all-exceptions.filter.ts index c539302..96fbd67 100644 --- a/packages/server/src/common/filters/all-exceptions.filter.ts +++ b/packages/server/src/common/filters/all-exceptions.filter.ts @@ -1,33 +1,29 @@ -import { Catch, HttpException, HttpStatus, Logger } from '@nestjs/common' -import { BaseExceptionFilter } from '@nestjs/core' -import { type ResponseStructure } from 'common' -import { type ArgumentsHost } from '@nestjs/common' +import { Catch, HttpException, HttpStatus, Logger } from "@nestjs/common"; +import { type ArgumentsHost } from "@nestjs/common"; +import { BaseExceptionFilter } from "@nestjs/core"; +import { type ResponseStructure } from "common"; @Catch() export class AllExceptionsFilter extends BaseExceptionFilter { catch(exception: any, host: ArgumentsHost) { - const ctx = host.switchToHttp() - const response = ctx.getResponse() - const status - = exception instanceof HttpException - ? exception.getStatus() - : HttpStatus.INTERNAL_SERVER_ERROR + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + const status = + exception instanceof HttpException ? exception.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR; - const errorMessage - = exception.response?.message - || exception.message.message - || exception.message - const errorCode = exception.code || 50000 + const errorMessage = + exception.response?.message || exception.message.message || exception.message; + const errorCode = exception.code || 50000; const error: ResponseStructure = { errorMessage, errorCode, success: false, showType: exception.showType || 2, - } + }; - Logger.warn('Error', error.errorMessage) + Logger.warn("Error", error.errorMessage); - response.status(status).json(error) + response.status(status).json(error); } } diff --git a/packages/server/src/common/filters/forbidden-exception.filter.ts b/packages/server/src/common/filters/forbidden-exception.filter.ts index 7bce8de..588371d 100644 --- a/packages/server/src/common/filters/forbidden-exception.filter.ts +++ b/packages/server/src/common/filters/forbidden-exception.filter.ts @@ -1,30 +1,29 @@ -import { Catch, HttpException, HttpStatus, Logger } from '@nestjs/common' -import { type ArgumentsHost, type ExceptionFilter } from '@nestjs/common' -import { type ResponseStructure } from 'common' -import { type ForbiddenException } from '../exceptions' +import { Catch, HttpException, HttpStatus, Logger } from "@nestjs/common"; +import { type ArgumentsHost, type ExceptionFilter } from "@nestjs/common"; +import { type ResponseStructure } from "common"; + +import { type ForbiddenException } from "../exceptions"; @Catch(HttpException) export class ForbiddenExceptionFilter implements ExceptionFilter { catch(exception: ForbiddenException, host: ArgumentsHost) { - const ctx = host.switchToHttp() - const response = ctx.getResponse() - const status - = exception instanceof HttpException - ? exception.getStatus() - : HttpStatus.INTERNAL_SERVER_ERROR + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + const status = + exception instanceof HttpException ? exception.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR; - const errorMessage = exception.message - const errorCode = exception.code || 40000 + const errorMessage = exception.message; + const errorCode = exception.code || 40000; const error: ResponseStructure = { errorMessage, errorCode, success: false, showType: exception.showType, - } + }; - Logger.log('Error', error.errorMessage) + Logger.log("Error", error.errorMessage); - response.status(status).json(error) + response.status(status).json(error); } } diff --git a/packages/server/src/common/filters/index.ts b/packages/server/src/common/filters/index.ts index 3500100..9df867a 100644 --- a/packages/server/src/common/filters/index.ts +++ b/packages/server/src/common/filters/index.ts @@ -1,2 +1,2 @@ -export * from './all-exceptions.filter' -export * from './forbidden-exception.filter' +export * from "./all-exceptions.filter"; +export * from "./forbidden-exception.filter"; diff --git a/packages/server/src/common/index.ts b/packages/server/src/common/index.ts index 81c4527..bd1be01 100644 --- a/packages/server/src/common/index.ts +++ b/packages/server/src/common/index.ts @@ -1,6 +1,6 @@ -export * from './constants' -export * from './database' -export * from './exceptions' -export * from './filters' -export * from './interceptors' -export * from './logger' +export * from "./constants"; +export * from "./database"; +export * from "./exceptions"; +export * from "./filters"; +export * from "./interceptors"; +export * from "./logger"; diff --git a/packages/server/src/common/interceptors/index.ts b/packages/server/src/common/interceptors/index.ts index 7272128..4b49163 100644 --- a/packages/server/src/common/interceptors/index.ts +++ b/packages/server/src/common/interceptors/index.ts @@ -1 +1 @@ -export * from './transform.interceptor' +export * from "./transform.interceptor"; diff --git a/packages/server/src/common/interceptors/transform.interceptor.ts b/packages/server/src/common/interceptors/transform.interceptor.ts index 4729a04..0b3ee53 100644 --- a/packages/server/src/common/interceptors/transform.interceptor.ts +++ b/packages/server/src/common/interceptors/transform.interceptor.ts @@ -1,19 +1,20 @@ -import { Injectable } from '@nestjs/common' -import { map } from 'rxjs/operators' -import { type Observable } from 'rxjs' -import { type CallHandler, type NestInterceptor } from '@nestjs/common' +import { Injectable } from "@nestjs/common"; +import { type CallHandler, type NestInterceptor } from "@nestjs/common"; +import { type Observable } from "rxjs"; +import { map } from "rxjs/operators"; interface Response<T> { - data: T + data: T; } @Injectable() -export class TransformInterceptor<T> -implements NestInterceptor<T, Response<T>> { +export class TransformInterceptor<T> implements NestInterceptor<T, Response<T>> { intercept(_: never, next: CallHandler<T>): Observable<Response<T>> { - return next.handle().pipe(map(data => ({ - data, - success: true, - }))) + return next.handle().pipe( + map((data) => ({ + data, + success: true, + })), + ); } } diff --git a/packages/server/src/common/logger/index.ts b/packages/server/src/common/logger/index.ts index 6121e41..2bd3469 100644 --- a/packages/server/src/common/logger/index.ts +++ b/packages/server/src/common/logger/index.ts @@ -1 +1 @@ -export * from './logger.module' +export * from "./logger.module"; diff --git a/packages/server/src/common/logger/logger.module.ts b/packages/server/src/common/logger/logger.module.ts index 7df4635..caa97c2 100644 --- a/packages/server/src/common/logger/logger.module.ts +++ b/packages/server/src/common/logger/logger.module.ts @@ -1,11 +1,11 @@ -import { Module } from '@nestjs/common' -import { LoggerModule as LoggerModuleBase } from 'nestjs-pino' -import pino from 'pino' +import { Module } from "@nestjs/common"; +import { LoggerModule as LoggerModuleBase } from "nestjs-pino"; +import pino from "pino"; @Module({ imports: [ LoggerModuleBase.forRoot({ - pinoHttp: { stream: pino.destination('./logs/logs.log') }, + pinoHttp: { stream: pino.destination("./logs/logs.log") }, useExisting: true, }), ], diff --git a/packages/server/src/main.ts b/packages/server/src/main.ts index 0a6cc1e..b7c041b 100644 --- a/packages/server/src/main.ts +++ b/packages/server/src/main.ts @@ -1,22 +1,21 @@ -import { join } from 'node:path' -import { cwd } from 'node:process' -import { Logger, LoggerErrorInterceptor } from 'nestjs-pino' -import { ValidationPipe } from '@nestjs/common' -import { NestFactory } from '@nestjs/core' -import { FastifyAdapter } from '@nestjs/platform-fastify' -import { contentParser } from 'fastify-multer' -import dotenv from 'dotenv' -import { type NestFastifyApplication } from '@nestjs/platform-fastify' -import { AppModule } from './app.module' -import { - AllExceptionsFilter, - ForbiddenExceptionFilter, - TransformInterceptor, -} from '~/common' - -dotenv.config({ path: join(cwd(), '../../', '.env') }) - -const port = 6660 +import { join } from "node:path"; +import { cwd } from "node:process"; + +import { ValidationPipe } from "@nestjs/common"; +import { NestFactory } from "@nestjs/core"; +import { FastifyAdapter } from "@nestjs/platform-fastify"; +import { type NestFastifyApplication } from "@nestjs/platform-fastify"; +import dotenv from "dotenv"; +import { contentParser } from "fastify-multer"; +import { Logger, LoggerErrorInterceptor } from "nestjs-pino"; + +import { AllExceptionsFilter, ForbiddenExceptionFilter, TransformInterceptor } from "~/common"; + +import { AppModule } from "./app.module"; + +dotenv.config({ path: join(cwd(), "../../", ".env") }); + +const port = 6660; async function bootstrap() { const app = await NestFactory.create<NestFastifyApplication>( @@ -26,23 +25,23 @@ async function bootstrap() { bodyLimit: 624288000, }), { bufferLogs: true, snapshot: true, abortOnError: false }, - ) - app.useLogger(app.get(Logger)) - app.useGlobalInterceptors(new LoggerErrorInterceptor()) - await app.register(contentParser) - app.useGlobalPipes(new ValidationPipe({ transform: true })) - app.useGlobalInterceptors(new TransformInterceptor()) - app.useGlobalFilters(new ForbiddenExceptionFilter()) - app.useGlobalFilters(new AllExceptionsFilter()) - app.enableCors() - - await app.listen(port, '0.0.0.0') - console.warn(`Listening on port ${port}`) + ); + app.useLogger(app.get(Logger)); + app.useGlobalInterceptors(new LoggerErrorInterceptor()); + await app.register(contentParser); + app.useGlobalPipes(new ValidationPipe({ transform: true })); + app.useGlobalInterceptors(new TransformInterceptor()); + app.useGlobalFilters(new ForbiddenExceptionFilter()); + app.useGlobalFilters(new AllExceptionsFilter()); + app.enableCors(); + + await app.listen(port, "0.0.0.0"); + console.warn(`Listening on port ${port}`); } bootstrap() // eslint-disable-next-line unicorn/prefer-top-level-await .catch((error) => { - console.error(error) - process.exit(1) - }) + console.error(error); + process.exit(1); + }); diff --git a/packages/server/src/shared.module.ts b/packages/server/src/shared.module.ts index d6c1235..99dbcb1 100644 --- a/packages/server/src/shared.module.ts +++ b/packages/server/src/shared.module.ts @@ -1,13 +1,10 @@ -import { Global, Module } from '@nestjs/common' -import { ScheduleModule } from '@nestjs/schedule' -import { BullModuleConfig, LoggerModule } from '~/common' +import { Global, Module } from "@nestjs/common"; +import { ScheduleModule } from "@nestjs/schedule"; + +import { BullModuleConfig, LoggerModule } from "~/common"; @Global() @Module({ - imports: [ - BullModuleConfig, - ScheduleModule.forRoot(), - LoggerModule, - ], + imports: [BullModuleConfig, ScheduleModule.forRoot(), LoggerModule], }) export class SharedModule {} diff --git a/packages/server/src/tasks/tasks.module.ts b/packages/server/src/tasks/tasks.module.ts index 9be4070..8b91cbb 100644 --- a/packages/server/src/tasks/tasks.module.ts +++ b/packages/server/src/tasks/tasks.module.ts @@ -1,6 +1,8 @@ -import { Module } from '@nestjs/common' -import { TasksService } from './tasks.service' -import { PrismaService } from '~/common' +import { Module } from "@nestjs/common"; + +import { PrismaService } from "~/common"; + +import { TasksService } from "./tasks.service"; @Module({ providers: [TasksService, PrismaService] }) export class TasksModule {} diff --git a/packages/server/src/tasks/tasks.service.ts b/packages/server/src/tasks/tasks.service.ts index 8019b3f..1e905c4 100644 --- a/packages/server/src/tasks/tasks.service.ts +++ b/packages/server/src/tasks/tasks.service.ts @@ -1,27 +1,45 @@ -import { Injectable, Logger } from '@nestjs/common' -import { Cron, CronExpression } from '@nestjs/schedule' -import { getConfig } from 'config' -import dayjs from 'dayjs' -import { PrismaService } from '~/common' +import { Injectable, Logger } from "@nestjs/common"; +import { Cron, CronExpression } from "@nestjs/schedule"; +import { getConfig } from "config"; +import dayjs from "dayjs"; + +import { PrismaService } from "~/common"; @Injectable() export class TasksService { constructor(private readonly prisma: PrismaService) {} - private readonly logger = new Logger(TasksService.name) + private readonly logger = new Logger(TasksService.name); @Cron(CronExpression.EVERY_DAY_AT_3AM) async handleDeleteExpiredData() { - const dataExpirationTime = getConfig().options?.dataExpirationTime ?? 7 - const options = { where: { createdAt: { lt: dayjs().subtract(dataExpirationTime, 'days').toDate() } } } - await this.prisma.metric.deleteMany(options) - this.logger.log(`Metric from ${dataExpirationTime} days ago has been deleted`, TasksService.name) - await this.prisma.feedback.deleteMany(options) - this.logger.log(`Feedback from ${dataExpirationTime} days ago has been deleted`, TasksService.name) - await this.prisma.pageView.deleteMany(options) - this.logger.log(`PageView from ${dataExpirationTime} days ago has been deleted`, TasksService.name) - await this.prisma.userView.deleteMany(options) - this.logger.log(`UserView from ${dataExpirationTime} days ago has been deleted`, TasksService.name) - await this.prisma.issue.deleteMany(options) - this.logger.log(`Issue/Event from ${dataExpirationTime} days ago has been deleted`, TasksService.name) + const dataExpirationTime = getConfig().options?.dataExpirationTime ?? 7; + const options = { + where: { createdAt: { lt: dayjs().subtract(dataExpirationTime, "days").toDate() } }, + }; + await this.prisma.metric.deleteMany(options); + this.logger.log( + `Metric from ${dataExpirationTime} days ago has been deleted`, + TasksService.name, + ); + await this.prisma.feedback.deleteMany(options); + this.logger.log( + `Feedback from ${dataExpirationTime} days ago has been deleted`, + TasksService.name, + ); + await this.prisma.pageView.deleteMany(options); + this.logger.log( + `PageView from ${dataExpirationTime} days ago has been deleted`, + TasksService.name, + ); + await this.prisma.userView.deleteMany(options); + this.logger.log( + `UserView from ${dataExpirationTime} days ago has been deleted`, + TasksService.name, + ); + await this.prisma.issue.deleteMany(options); + this.logger.log( + `Issue/Event from ${dataExpirationTime} days ago has been deleted`, + TasksService.name, + ); } } diff --git a/packages/server/tsconfig.json b/packages/server/tsconfig.json index d9ad686..227b2b4 100644 --- a/packages/server/tsconfig.json +++ b/packages/server/tsconfig.json @@ -7,7 +7,7 @@ "baseUrl": ".", "paths": { "~/*": ["./src/*"] - }, + } }, "include": ["src", "test"] } diff --git a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alert-id.tsx b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alert-id.tsx index 3eb3bae..398ad5f 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alert-id.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/alert-id.tsx @@ -1,44 +1,44 @@ -'use client' +"use client"; -import Link from 'next/link' -import { useMemo } from 'react' -import { type Action, type ConditionOption, type FilterOption } from 'common' -import dayjs from 'dayjs' -import { type Alert, type AlertEvent, type Event, type Issue } from '@prisma/client' -import { ConditionOptions, FilterOptions } from '../edit-alert' -import { type AlertEventTrend } from '~/services/alerts' -import Wrapper from '~/components/wrapper' -import AccordionSection from '~/components/accordion-section' -import Title from '~/components/title' -import useCurrentProject from '~/hooks/use-current-project' -import EventsList from '~/components/events-list' -import BarChart from '~/components/charts/bar-chart' -import { Button } from '~/components/ui/button' -import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' -import { Badge } from '~/components/ui/badge' +import { type Alert, type AlertEvent, type Event, type Issue } from "@prisma/client"; +import { type Action, type ConditionOption, type FilterOption } from "common"; +import dayjs from "dayjs"; +import Link from "next/link"; +import { useMemo } from "react"; + +import AccordionSection from "~/components/accordion-section"; +import BarChart from "~/components/charts/bar-chart"; +import EventsList from "~/components/events-list"; +import Title from "~/components/title"; +import { Badge } from "~/components/ui/badge"; +import { Button } from "~/components/ui/button"; +import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip"; +import Wrapper from "~/components/wrapper"; +import useCurrentProject from "~/hooks/use-current-project"; +import { type AlertEventTrend } from "~/services/alerts"; + +import { ConditionOptions, FilterOptions } from "../edit-alert"; interface Props { - alert: Alert + alert: Alert; alertEvents: (AlertEvent & { - event: Event - issue: Issue - })[] - alertEventTrends: AlertEventTrend[] + event: Event; + issue: Issue; + })[]; + alertEventTrends: AlertEventTrend[]; } export default function AlertId({ alert, alertEvents, alertEventTrends }: Props) { - const { projectId } = useCurrentProject() - const events = useMemo(() => alertEvents.map(item => item.event), [alertEvents]) + const { projectId } = useCurrentProject(); + const events = useMemo(() => alertEvents.map((item) => item.event), [alertEvents]); return ( <div className="flex flex-col"> <Title rightNodes={ - ( - <Link href={`/${projectId}/alerts/${alert.id}/edit`}> - <Button variant="outline">Edit Alert</Button> - </Link> - ) + <Link href={`/${projectId}/alerts/${alert.id}/edit`}> + <Button variant="outline">Edit Alert</Button> + </Link> } > {alert.name} @@ -46,89 +46,67 @@ export default function AlertId({ alert, alertEvents, alertEventTrends }: Props) <div> <Wrapper className="flex flex-col gap-12"> - <AccordionSection - className="space-y-4" - title="Conditions" - > - { - alert.recentlyAt - ? ( - <Tooltip> - <TooltipTrigger> - <Badge variant="outline">{dayjs(alert.recentlyAt).fromNow()}</Badge> - </TooltipTrigger> - <TooltipContent> - <span>{dayjs(alert.recentlyAt).format('YYYY-MM-DD HH:mm:ss')}</span> - </TooltipContent> - </Tooltip> - ) - : null - } + <AccordionSection className="space-y-4" title="Conditions"> + {alert.recentlyAt ? ( + <Tooltip> + <TooltipTrigger> + <Badge variant="outline">{dayjs(alert.recentlyAt).fromNow()}</Badge> + </TooltipTrigger> + <TooltipContent> + <span>{dayjs(alert.recentlyAt).format("YYYY-MM-DD HH:mm:ss")}</span> + </TooltipContent> + </Tooltip> + ) : null} <div> <div className="flex items-center gap-2 mb-2"> - <Badge - className="flex text-center w-14" - variant="outline" - > + <Badge className="flex text-center w-14" variant="outline"> WHEN </Badge> - <span>an event is captured by Ohbug and {alert.conditionMatch} of the following happens</span> + <span> + an event is captured by Ohbug and {alert.conditionMatch} of the following happens + </span> </div> - { - (alert.conditions as unknown as ConditionOption[])?.map((condition) => { - return ( - <div key={condition.topic}> - <code> - {ConditionOptions.find(item => item.topic === condition.topic)?.name} - </code> - </div> - ) - }) - } + {(alert.conditions as unknown as ConditionOption[])?.map((condition) => { + return ( + <div key={condition.topic}> + <code> + {ConditionOptions.find((item) => item.topic === condition.topic)?.name} + </code> + </div> + ); + })} </div> <div> <div className="flex items-center gap-2 mb-2"> - <Badge - className="flex text-center w-14" - variant="outline" - > + <Badge className="flex text-center w-14" variant="outline"> IF </Badge> <span>{alert.filterMatch} of these filters match</span> </div> - { - (alert.filters as unknown as FilterOption[])?.map((filter) => { - return ( - <div key={filter.topic}> - <code> - {FilterOptions.find(item => item.topic === filter.topic)?.name} - </code> - </div> - ) - }) - } + {(alert.filters as unknown as FilterOption[])?.map((filter) => { + return ( + <div key={filter.topic}> + <code>{FilterOptions.find((item) => item.topic === filter.topic)?.name}</code> + </div> + ); + })} </div> <div> <div className="flex items-center gap-2 mb-2"> - <Badge - className="flex text-center w-14" - variant="outline" - > + <Badge className="flex text-center w-14" variant="outline"> THEN </Badge> <span>{alert.filterMatch} of these filters match</span> </div> - { - (alert.actions as unknown as Action[])?.map((action) => { - return ( - <div key={action.type + action.uri}> - <code> - {action.type}: {action.uri} - </code> - </div> - ) - }) - } + {(alert.actions as unknown as Action[])?.map((action) => { + return ( + <div key={action.type + action.uri}> + <code> + {action.type}: {action.uri} + </code> + </div> + ); + })} </div> <div className="space-x-2"> <Badge variant="outline">{alert.level}</Badge> @@ -137,12 +115,7 @@ export default function AlertId({ alert, alertEvents, alertEventTrends }: Props) </AccordionSection> <AccordionSection title="Trends"> - <BarChart - data={alertEventTrends} - name="Alerts" - nameKey="time" - valueKey="count" - /> + <BarChart data={alertEventTrends} name="Alerts" nameKey="time" valueKey="count" /> </AccordionSection> <AccordionSection title="Events"> @@ -151,5 +124,5 @@ export default function AlertId({ alert, alertEvents, alertEventTrends }: Props) </Wrapper> </div> </div> - ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/edit.tsx b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/edit.tsx index 4334a4b..42afe73 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/edit.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/edit.tsx @@ -1,54 +1,56 @@ -'use client' +"use client"; -import { useCallback } from 'react' -import { useRouter } from 'next-intl/client' -import { useSearchParams } from 'next/navigation' -import { type OmitAlert } from 'common' -import { type z } from 'zod' -import EditAlert from '../../edit-alert' -import { type formSchema } from '../../edit-alert' -import Title from '~/components/title' -import Wrapper from '~/components/wrapper' -import { serviceUpdateAlert } from '~/services/alerts' -import { useToast } from '~/components/ui/use-toast' +import { type OmitAlert } from "common"; +import { useRouter } from "next-intl/client"; +import { useSearchParams } from "next/navigation"; +import { useCallback } from "react"; +import { type z } from "zod"; + +import Title from "~/components/title"; +import { useToast } from "~/components/ui/use-toast"; +import Wrapper from "~/components/wrapper"; +import { serviceUpdateAlert } from "~/services/alerts"; + +import EditAlert from "../../edit-alert"; +import { type formSchema } from "../../edit-alert"; interface Props { - alert: OmitAlert + alert: OmitAlert; } export default function Edit({ alert }: Props) { - const router = useRouter() - const searchParams = useSearchParams() - const alertId = searchParams.get('alertId') - const { toast } = useToast() - const onSubmit = useCallback((value: z.infer<typeof formSchema>) => { - serviceUpdateAlert(Number.parseInt(alertId as string), value) - .then(() => { - toast({ - title: 'Alert Edited!', - description: 'Your alert has been edited!', - }) - router.back() - }) - .catch((error) => { - toast({ - title: 'Alert Edit Error', - description: error.message, - variant: 'destructive', + const router = useRouter(); + const searchParams = useSearchParams(); + const alertId = searchParams.get("alertId"); + const { toast } = useToast(); + const onSubmit = useCallback( + (value: z.infer<typeof formSchema>) => { + serviceUpdateAlert(Number.parseInt(alertId as string), value) + .then(() => { + toast({ + title: "Alert Edited!", + description: "Your alert has been edited!", + }); + router.back(); }) - }) - }, [alertId]) + .catch((error) => { + toast({ + title: "Alert Edit Error", + description: error.message, + variant: "destructive", + }); + }); + }, + [alertId], + ); return ( <div> <Title>Edit Alerts - +
- ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/page.tsx b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/page.tsx index ed06ae3..18481b8 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/page.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/edit/page.tsx @@ -1,12 +1,12 @@ -import { type OmitAlert } from 'common' -import Edit from './edit' -import { serviceGetAlert } from '~/services/alerts' +import { type OmitAlert } from "common"; + +import { serviceGetAlert } from "~/services/alerts"; + +import Edit from "./edit"; export default async function EditPage({ params }: { params: { alertId: string } }) { - const alertId = Number.parseInt(params.alertId) - const alert = (await serviceGetAlert({ id: alertId })) as unknown as OmitAlert + const alertId = Number.parseInt(params.alertId); + const alert = (await serviceGetAlert({ id: alertId })) as unknown as OmitAlert; - return ( - - ) + return ; } diff --git a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/page.tsx b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/page.tsx index 85f2dc6..75ca464 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/[alertId]/page.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/[alertId]/page.tsx @@ -1,17 +1,16 @@ -import AlertId from './alert-id' -import { serviceGetAlert, serviceGetAlertEventTrends, serviceGetAlertEvents } from '~/services/alerts' +import { + serviceGetAlert, + serviceGetAlertEventTrends, + serviceGetAlertEvents, +} from "~/services/alerts"; + +import AlertId from "./alert-id"; export default async function AlertIdPage({ params }: { params: { alertId: string } }) { - const alertId = Number.parseInt(params.alertId, 10) - const alert = await serviceGetAlert({ id: alertId }) - const alertEvents = await serviceGetAlertEvents(alertId) - const alertEventTrends = await serviceGetAlertEventTrends({ id: alertId, type: '14d' }) + const alertId = Number.parseInt(params.alertId, 10); + const alert = await serviceGetAlert({ id: alertId }); + const alertEvents = await serviceGetAlertEvents(alertId); + const alertEventTrends = await serviceGetAlertEventTrends({ id: alertId, type: "14d" }); - return ( - - ) + return ; } diff --git a/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx b/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx index aea5f3d..231db20 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/create/page.tsx @@ -1,47 +1,52 @@ -'use client' +"use client"; -import { useCallback } from 'react' -import { useRouter } from 'next-intl/client' -import { useTranslations } from 'next-intl' -import { type z } from 'zod' -import EditAlert from '../edit-alert' -import { type formSchema } from '../edit-alert' -import Title from '~/components/title' -import Wrapper from '~/components/wrapper' -import useCurrentProject from '~/hooks/use-current-project' -import { serviceCreateAlert } from '~/services/alerts' -import { useToast } from '~/components/ui/use-toast' +import { useTranslations } from "next-intl"; +import { useRouter } from "next-intl/client"; +import { useCallback } from "react"; +import { type z } from "zod"; + +import Title from "~/components/title"; +import { useToast } from "~/components/ui/use-toast"; +import Wrapper from "~/components/wrapper"; +import useCurrentProject from "~/hooks/use-current-project"; +import { serviceCreateAlert } from "~/services/alerts"; + +import EditAlert from "../edit-alert"; +import { type formSchema } from "../edit-alert"; export default function CreatePage() { - const t = useTranslations('Alerts') - const router = useRouter() - const { projectId } = useCurrentProject() - const { toast } = useToast() - const onSubmit = useCallback((value: z.infer) => { - serviceCreateAlert({ ...value, projectId: projectId! }) - .then(() => { - toast({ - title: 'Alert Created!', - description: 'Your alert has been created!', - }) - router.back() - }) - .catch((error) => { - toast({ - title: 'Alert Create Error', - description: error.message, - variant: 'destructive', + const t = useTranslations("Alerts"); + const router = useRouter(); + const { projectId } = useCurrentProject(); + const { toast } = useToast(); + const onSubmit = useCallback( + (value: z.infer) => { + serviceCreateAlert({ ...value, projectId: projectId! }) + .then(() => { + toast({ + title: "Alert Created!", + description: "Your alert has been created!", + }); + router.back(); }) - }) - }, [projectId]) + .catch((error) => { + toast({ + title: "Alert Create Error", + description: error.message, + variant: "destructive", + }); + }); + }, + [projectId], + ); return (
- {t('createAlert')} + {t("createAlert")}
- ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/alerts/edit-alert.tsx b/packages/web/app/[locale]/[projectId]/alerts/edit-alert.tsx index eeaa8d3..c0bbb8c 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/edit-alert.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/edit-alert.tsx @@ -1,13 +1,29 @@ -'use client' +"use client"; -import { useCallback } from 'react' -import { useFieldArray, useForm } from 'react-hook-form' -import { AlertConditionTopic, AlertFilterTopic } from 'common' -import { type Action, type ConditionOption, type FilterMatch, type FilterOption, type Interval, type OmitAlert } from 'common' -import { useTranslations } from 'next-intl' -import { zodResolver } from '@hookform/resolvers/zod' -import { z } from 'zod' -import { Badge } from '~/components/ui/badge' +import { zodResolver } from "@hookform/resolvers/zod"; +import { AlertConditionTopic, AlertFilterTopic } from "common"; +import { + type Action, + type ConditionOption, + type FilterMatch, + type FilterOption, + type Interval, + type OmitAlert, +} from "common"; +import { useTranslations } from "next-intl"; +import { useCallback } from "react"; +import { useFieldArray, useForm } from "react-hook-form"; +import { z } from "zod"; + +import { Badge } from "~/components/ui/badge"; +import { Button } from "~/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuTrigger, +} from "~/components/ui/dropdown-menu"; import { Form, FormControl, @@ -15,93 +31,124 @@ import { FormItem, FormLabel, FormMessage, -} from '~/components/ui/form' -import { Input } from '~/components/ui/input' -import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '~/components/ui/select' -import { Button } from '~/components/ui/button' -import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from '~/components/ui/dropdown-menu' -import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' +} from "~/components/ui/form"; +import { Input } from "~/components/ui/input"; +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectTrigger, + SelectValue, +} from "~/components/ui/select"; +import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip"; -export const ActionOptions = ['email', 'webhook'] as const +export const ActionOptions = ["email", "webhook"] as const; export const ConditionOptions: ConditionOption[] = [ { topic: AlertConditionTopic.EventCapturedCondition, - name: 'An event is captured', + name: "An event is captured", }, { topic: AlertConditionTopic.FirstSeenEventCondition, - name: 'A new issue is created', + name: "A new issue is created", }, { topic: AlertConditionTopic.EventFrequencyCondition, - name: 'The issue is seen more than {value} times in {interval}', + name: "The issue is seen more than {value} times in {interval}", }, { topic: AlertConditionTopic.UserFrequencyCondition, - name: 'The issue is seen by more than {value} users in {interval}', + name: "The issue is seen by more than {value} users in {interval}", }, -] -export const IntervalOptions: Interval[] = ['1m', '5m', '15m', '1h', '1d', '7d', '30d'] +]; +export const IntervalOptions: Interval[] = ["1m", "5m", "15m", "1h", "1d", "7d", "30d"]; export const FilterOptions: FilterOption[] = [ { topic: AlertFilterTopic.IssueOccurrencesFilter, - name: 'The issue has happened at least {value} times', + name: "The issue has happened at least {value} times", }, { topic: AlertFilterTopic.EventAttributeFilter, - name: 'The event\'s {attribute} value {match} {value}', + name: "The event's {attribute} value {match} {value}", }, { topic: AlertFilterTopic.LatestReleaseFilter, - name: 'The event is from the latest release', + name: "The event is from the latest release", }, -] -export const FilterAttributeOptions = ['message', 'type'] as const -export const FilterMatchOptions: FilterMatch[] = ['contains', 'starts with', 'ends with', 'equals', 'does not contain', 'does not start with', 'does not end with', 'does not equal'] +]; +export const FilterAttributeOptions = ["message", "type"] as const; +export const FilterMatchOptions: FilterMatch[] = [ + "contains", + "starts with", + "ends with", + "equals", + "does not contain", + "does not start with", + "does not end with", + "does not equal", +]; export const AlertLevel = { - serious: 'serious', - warning: 'warning', - default: 'default', -} + serious: "serious", + warning: "warning", + default: "default", +}; export const formSchema = z.object({ projectId: z.number(), name: z.string(), releaseStage: z.string(), recentlyAt: z.date().nullable(), - level: z.enum(['serious', 'warning', 'default']), + level: z.enum(["serious", "warning", "default"]), interval: z.string(), enabled: z.boolean(), - filterMatch: z.enum(['all', 'every']), - conditionMatch: z.enum(['all', 'every']), - actions: z.array(z.object({ - type: z.enum(['email', 'webhook']), - uri: z.string(), - at: z.string().optional(), - webhookType: z.enum(['dingtalk', 'wechatWork', 'others']).optional(), - })), - conditions: z.array(z.object({ - topic: z.nativeEnum(AlertConditionTopic), - name: z.string(), - value: z.union([z.string(), z.number()]).optional(), - interval: z.string().optional(), - })), - filters: z.array(z.object({ - topic: z.nativeEnum(AlertFilterTopic), - name: z.string(), - value: z.union([z.string(), z.number()]).optional(), - attribute: z.string().optional(), - match: z.enum(['contains', 'starts with', 'ends with', 'equals', 'does not contain', 'does not start with', 'does not end with', 'does not equal']).optional(), - })), -}) + filterMatch: z.enum(["all", "every"]), + conditionMatch: z.enum(["all", "every"]), + actions: z.array( + z.object({ + type: z.enum(["email", "webhook"]), + uri: z.string(), + at: z.string().optional(), + webhookType: z.enum(["dingtalk", "wechatWork", "others"]).optional(), + }), + ), + conditions: z.array( + z.object({ + topic: z.nativeEnum(AlertConditionTopic), + name: z.string(), + value: z.union([z.string(), z.number()]).optional(), + interval: z.string().optional(), + }), + ), + filters: z.array( + z.object({ + topic: z.nativeEnum(AlertFilterTopic), + name: z.string(), + value: z.union([z.string(), z.number()]).optional(), + attribute: z.string().optional(), + match: z + .enum([ + "contains", + "starts with", + "ends with", + "equals", + "does not contain", + "does not start with", + "does not end with", + "does not equal", + ]) + .optional(), + }), + ), +}); interface Props { - alert?: OmitAlert - onSubmit: (value: z.infer) => void + alert?: OmitAlert; + onSubmit: (value: z.infer) => void; } export default function EditAlert({ alert, onSubmit }: Props) { - const t = useTranslations('Alerts') + const t = useTranslations("Alerts"); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: alert @@ -118,42 +165,49 @@ export default function EditAlert({ alert, onSubmit }: Props) { filterMatch: alert.filterMatch, } : { - filterMatch: 'all', - conditionMatch: 'all', + filterMatch: "all", + conditionMatch: "all", }, - }) - const { fields: actionsFields, append: actionsAppend, remove: actionsRemove } = useFieldArray({ control: form.control, name: 'actions' }) - const { fields: conditionsFields, append: conditionsAppend, remove: conditionsRemove } = useFieldArray({ control: form.control, name: 'conditions' }) - const { fields: filtersFields, append: filtersAppend, remove: filtersRemove } = useFieldArray({ control: form.control, name: 'filters' }) - const handleAddAction = useCallback((type: Action['type']) => { + }); + const { + fields: actionsFields, + append: actionsAppend, + remove: actionsRemove, + } = useFieldArray({ control: form.control, name: "actions" }); + const { + fields: conditionsFields, + append: conditionsAppend, + remove: conditionsRemove, + } = useFieldArray({ control: form.control, name: "conditions" }); + const { + fields: filtersFields, + append: filtersAppend, + remove: filtersRemove, + } = useFieldArray({ control: form.control, name: "filters" }); + const handleAddAction = useCallback((type: Action["type"]) => { if (type) { - actionsAppend({ type, uri: '' }) + actionsAppend({ type, uri: "" }); } - }, []) - const handleAddCondition = useCallback((topic: ConditionOption['topic']) => { + }, []); + const handleAddCondition = useCallback((topic: ConditionOption["topic"]) => { if (topic) { - conditionsAppend({ topic, name: ConditionOptions.find(v => v.topic === topic)!.name }) + conditionsAppend({ topic, name: ConditionOptions.find((v) => v.topic === topic)!.name }); } - }, []) - const handleAddFilter = useCallback((topic: FilterOption['topic']) => { + }, []); + const handleAddFilter = useCallback((topic: FilterOption["topic"]) => { if (topic) { - filtersAppend({ topic, name: FilterOptions.find(v => v.topic === topic)!.name }) + filtersAppend({ topic, name: FilterOptions.find((v) => v.topic === topic)!.name }); } - }, []) + }, []); return (
- +
- {t('alertConditions')} + {t("alertConditions")}
- - WHEN - + WHEN
an event is captured by Ohbug and of the following happens
- { - conditionsFields.map((item, index) => { - return ( -
-
- { - item.topic === AlertConditionTopic.EventCapturedCondition && ( - <>An event is captured - ) - } - { - item.topic === AlertConditionTopic.FirstSeenEventCondition && ( - <>A new issue is created - ) - } - { - item.topic === AlertConditionTopic.EventFrequencyCondition && ( - <> - The issue is seen more than - ( - - - - - - - )} - /> - times in - ( - - - - - - - )} - /> - - ) - } - { - item.topic === AlertConditionTopic.UserFrequencyCondition && ( - <> - The issue is seen by more than - ( - - - - - - - )} - /> - users in - ( - - - - - - - )} - /> - - ) - } -
- + {conditionsFields.map((item, index) => { + return ( +
+
+ {item.topic === AlertConditionTopic.EventCapturedCondition && ( + <>An event is captured + )} + {item.topic === AlertConditionTopic.FirstSeenEventCondition && ( + <>A new issue is created + )} + {item.topic === AlertConditionTopic.EventFrequencyCondition && ( + <> + The issue is seen more than + ( + + + + + + + )} + /> + times in + ( + + + + + + + )} + /> + + )} + {item.topic === AlertConditionTopic.UserFrequencyCondition && ( + <> + The issue is seen by more than + ( + + + + + + + )} + /> + users in + ( + + + + + + + )} + /> + + )}
- ) - }) - } + +
+ ); + })} - - { - ConditionOptions.map(item => ( - { - handleAddCondition(item.topic) - }} - > - {item.name} - - )) - } + {ConditionOptions.map((item) => ( + { + handleAddCondition(item.topic); + }} + > + {item.name} + + ))} @@ -345,11 +364,9 @@ export default function EditAlert({ alert, onSubmit }: Props) {
- {t('alertFilters')} + {t("alertFilters")}
- - IF - + IF
of these filters match
- { - filtersFields.map((item, index) => { - return ( -
- -
- { - item.topic === AlertFilterTopic.IssueOccurrencesFilter && ( - <> - The issue has happened at least - ( - - - - - - - )} - /> - times - - ) - } - { - item.topic === AlertFilterTopic.EventAttributeFilter && ( - <> - The events - ( - - - - - - - )} - /> - value - ( - - - - - - - )} - /> - - ) - } - { - item.topic === AlertFilterTopic.LatestReleaseFilter && ( - <>The event is from the latest release - ) - } -
- + {filtersFields.map((item, index) => { + return ( +
+
+ {item.topic === AlertFilterTopic.IssueOccurrencesFilter && ( + <> + The issue has happened at least + ( + + + + + + + )} + /> + times + + )} + {item.topic === AlertFilterTopic.EventAttributeFilter && ( + <> + The events + ( + + + + + + + )} + /> + value + ( + + + + + + + )} + /> + + )} + {item.topic === AlertFilterTopic.LatestReleaseFilter && ( + <>The event is from the latest release + )}
- ) - }) - } + +
+ ); + })} - - { - FilterOptions.map(item => ( - { - handleAddFilter(item.topic) - }} - > - {item.name} - - )) - } + {FilterOptions.map((item) => ( + { + handleAddFilter(item.topic); + }} + > + {item.name} + + ))} @@ -508,7 +497,7 @@ export default function EditAlert({ alert, onSubmit }: Props) { name="interval" render={({ field }) => ( - {t('alertInterval')} + {t("alertInterval")} @@ -540,7 +524,7 @@ export default function EditAlert({ alert, onSubmit }: Props) { name="level" render={({ field }) => ( - {t('alertLevel')} + {t("alertLevel")} @@ -569,120 +548,112 @@ export default function EditAlert({ alert, onSubmit }: Props) {
- {t('alertActions')} - { - actionsFields.map((item, index) => { - return ( -
-
- { - item.type === 'webhook' && ( - ( - - - - - - - )} + {t("alertActions")} + {actionsFields.map((item, index) => { + return ( +
+
+ {item.type === "webhook" && ( + ( + + + + + + + )} + /> + )} + {item.type === "webhook" && ( + + + ( + + + + + + + )} + /> + + + {t("webhookTooltip")} + + + )} + ( + + + - ) - } - { - item.type === 'webhook' && ( - - - ( - - - - - - - )} - /> - - - {t('webhookTooltip')} - - - ) - } - ( - - - - - - - )} - /> - -
-
- ) - }) - } + + + + )} + /> + +
+
+ ); + })}
- - { - ActionOptions.map(item => ( - { - handleAddAction(item) - }} - > - {item} - - )) - } + {ActionOptions.map((item) => ( + { + handleAddAction(item); + }} + > + {item} + + ))} @@ -693,12 +664,9 @@ export default function EditAlert({ alert, onSubmit }: Props) { name="name" render={({ field }) => ( - {t('alertName')} + {t("alertName")} - + @@ -706,16 +674,11 @@ export default function EditAlert({ alert, onSubmit }: Props) { />
-
- ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/alerts/page.tsx b/packages/web/app/[locale]/[projectId]/alerts/page.tsx index b98df02..ba4450f 100644 --- a/packages/web/app/[locale]/[projectId]/alerts/page.tsx +++ b/packages/web/app/[locale]/[projectId]/alerts/page.tsx @@ -1,57 +1,47 @@ -'use client' +"use client"; -import Link from 'next/link' -import { useTranslations } from 'next-intl' -import { type Alert } from '@prisma/client' -import AlertsList from '~/components/alert-list' -import Title from '~/components/title' -import Wrapper from '~/components/wrapper' -import useCurrentProject from '~/hooks/use-current-project' -import { useInfinite } from '~/hooks/use-infinite' -import LoadingMoreButton from '~/components/load-more-button' -import { serviceGetAlerts } from '~/services/alerts' +import { type Alert } from "@prisma/client"; +import { useTranslations } from "next-intl"; +import Link from "next/link"; -import { Button } from '~/components/ui/button' +import AlertsList from "~/components/alert-list"; +import LoadingMoreButton from "~/components/load-more-button"; +import Title from "~/components/title"; +import { Button } from "~/components/ui/button"; +import Wrapper from "~/components/wrapper"; +import useCurrentProject from "~/hooks/use-current-project"; +import { useInfinite } from "~/hooks/use-infinite"; +import { serviceGetAlerts } from "~/services/alerts"; const Alerts = () => { - const t = useTranslations('Alerts') - const { projectId } = useCurrentProject() + const t = useTranslations("Alerts"); + const { projectId } = useCurrentProject(); const { data, isLoading, size, setSize, isReachingEnd, mutate } = useInfinite( - index => serviceGetAlerts({ - page: index + 1, - projectId: projectId!, - }), + (index) => + serviceGetAlerts({ + page: index + 1, + projectId: projectId!, + }), { enabled: projectId !== undefined, deps: [projectId], }, - ) + ); return (
- <Button>{t('createAlert')}</Button> - </Link> - ) + <Link href={`/${projectId}/alerts/create`}> + <Button>{t("createAlert")}</Button> + </Link> } > Alerts - { - data - ? ( - - ) - : null - } + {data ? : null} { />
- ) -} + ); +}; -export default Alerts +export default Alerts; diff --git a/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedback-id.tsx b/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedback-id.tsx index f246b67..01c9097 100644 --- a/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedback-id.tsx +++ b/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/feedback-id.tsx @@ -1,18 +1,19 @@ -'use client' +"use client"; -import { useMemo } from 'react' -import EventDetailActions from '~/components/event-detail-action' -import EventDetailProfile from '~/components/event-detail-profile' -import EventDetailUser from '~/components/event-detail-user' -import AccordionSection from '~/components/accordion-section' -import Wrapper from '~/components/wrapper' +import { useMemo } from "react"; + +import AccordionSection from "~/components/accordion-section"; +import EventDetailActions from "~/components/event-detail-action"; +import EventDetailProfile from "~/components/event-detail-profile"; +import EventDetailUser from "~/components/event-detail-user"; +import Wrapper from "~/components/wrapper"; interface Props { - feedback: any + feedback: any; } export default function FeedbackId({ feedback }: Props) { - const detail = useMemo(() => feedback.detail as any ?? {}, [feedback]) + const detail = useMemo(() => (feedback.detail as any) ?? {}, [feedback]); return (
@@ -20,13 +21,26 @@ export default function FeedbackId({ feedback }: Props) {
- +
- {detail.feedback ?
Feedback:
{detail.feedback}
: null} - {detail.selector ?
Selector:
{detail.selector}
: null} - {detail.outerHTML ?
outerHTML:
{detail.outerHTML}
: null} + {detail.feedback ? ( +
+
Feedback:
+ {detail.feedback} +
+ ) : null} + {detail.selector ? ( +
+
Selector:
+ {detail.selector} +
+ ) : null} + {detail.outerHTML ? ( +
+
outerHTML:
+ {detail.outerHTML} +
+ ) : null}
@@ -36,5 +50,5 @@ export default function FeedbackId({ feedback }: Props) {
- ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/page.tsx b/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/page.tsx index b6bd7ae..d88b882 100644 --- a/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/page.tsx +++ b/packages/web/app/[locale]/[projectId]/feedbacks/[feedbackId]/page.tsx @@ -1,11 +1,10 @@ -import FeedbackId from './feedback-id' -import { serviceGetFeedback } from '~/services/feedbacks' +import { serviceGetFeedback } from "~/services/feedbacks"; + +import FeedbackId from "./feedback-id"; export default async function FeedbackIdPage({ params }: { params: { feedbackId: string } }) { - const feedbackId = params.feedbackId - const feedback = await serviceGetFeedback({ id: feedbackId }) + const feedbackId = params.feedbackId; + const feedback = await serviceGetFeedback({ id: feedbackId }); - return ( - - ) + return ; } diff --git a/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx b/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx index f6473bd..df999e0 100644 --- a/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx +++ b/packages/web/app/[locale]/[projectId]/feedbacks/page.tsx @@ -1,48 +1,48 @@ -'use client' +"use client"; -import { useTranslations } from 'next-intl' -import { type EventUser, type Feedback } from '@prisma/client' -import Link from 'next/link' -import FeedbacksList from '~/components/feedbacks-list' +import { type EventUser, type Feedback } from "@prisma/client"; +import { useTranslations } from "next-intl"; +import Link from "next/link"; -import Title from '~/components/title' -import Wrapper from '~/components/wrapper' -import useCurrentProject from '~/hooks/use-current-project' -import { useInfinite } from '~/hooks/use-infinite' -import { serviceGetFeedbacks } from '~/services/feedbacks' -import { Button } from '~/components/ui/button' -import LoadingMoreButton from '~/components/load-more-button' +import FeedbacksList from "~/components/feedbacks-list"; +import LoadingMoreButton from "~/components/load-more-button"; +import Title from "~/components/title"; +import { Button } from "~/components/ui/button"; +import Wrapper from "~/components/wrapper"; +import useCurrentProject from "~/hooks/use-current-project"; +import { useInfinite } from "~/hooks/use-infinite"; +import { serviceGetFeedbacks } from "~/services/feedbacks"; export default function FeedbacksPage() { - const ct = useTranslations('Common') - const { projectId } = useCurrentProject() - const { data: feedbacks, isLoading, size, setSize, isReachingEnd } = useInfinite( - index => serviceGetFeedbacks({ - page: index + 1, - projectId: projectId!, - }), + const ct = useTranslations("Common"); + const { projectId } = useCurrentProject(); + const { + data: feedbacks, + isLoading, + size, + setSize, + isReachingEnd, + } = useInfinite( + (index) => + serviceGetFeedbacks({ + page: index + 1, + projectId: projectId!, + }), { enabled: projectId !== undefined, deps: [projectId], }, - ) + ); return (
- <Button - variant="outline" - > - <i className="i-ri-question-line mr-2" /> {ct('integration')} - </Button> - </Link> - ) + <Link href="https://ohbug.net/guide/feedbacks.html" target="_blank"> + <Button variant="outline"> + <i className="i-ri-question-line mr-2" /> {ct("integration")} + </Button> + </Link> } > Feedbacks @@ -57,5 +57,5 @@ export default function FeedbacksPage() { /> </Wrapper> </div> - ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/issues/[issueId]/issue-id.tsx b/packages/web/app/[locale]/[projectId]/issues/[issueId]/issue-id.tsx index ae75c25..8fcc363 100644 --- a/packages/web/app/[locale]/[projectId]/issues/[issueId]/issue-id.tsx +++ b/packages/web/app/[locale]/[projectId]/issues/[issueId]/issue-id.tsx @@ -1,41 +1,42 @@ -'use client' +"use client"; -import { useSearchParams } from 'next/navigation' -import { useMemo } from 'react' -import dynamic from 'next/dynamic' -import { type Issue, type OhbugEventLike } from 'common' -import { type IssueTrend } from '~/services/issues' -import EventDetailActions from '~/components/event-detail-action' -import EventDetailProfile from '~/components/event-detail-profile' -import EventDetailStack from '~/components/event-detail-stack' -import IssueDetailTitle from '~/components/issue-detail-title' -import EventDetailTrend from '~/components/event-detail-trend' -import EventDetailUser from '~/components/event-detail-user' -import IssueRelatedEvents from '~/components/issue-related-events' -import IssueRelatedMetadata from '~/components/issue-related-metadata' +import { type Issue, type OhbugEventLike } from "common"; +import dynamic from "next/dynamic"; +import { useSearchParams } from "next/navigation"; +import { useMemo } from "react"; + +import EventDetailActions from "~/components/event-detail-action"; +import EventDetailProfile from "~/components/event-detail-profile"; +import EventDetailStack from "~/components/event-detail-stack"; +import EventDetailTrend from "~/components/event-detail-trend"; +import EventDetailUser from "~/components/event-detail-user"; +import IssueDetailTitle from "~/components/issue-detail-title"; +import IssueRelatedEvents from "~/components/issue-related-events"; +import IssueRelatedMetadata from "~/components/issue-related-metadata"; +import { type IssueTrend } from "~/services/issues"; const IssueRelatedRrweb = dynamic( () => { - return import('~/components/issue-related-rrweb') + return import("~/components/issue-related-rrweb"); }, { ssr: false }, -) +); interface Props { - issue: Issue - event: OhbugEventLike + issue: Issue; + event: OhbugEventLike; trends: { - '14d': IssueTrend[] - '24h': IssueTrend[] - } + "14d": IssueTrend[]; + "24h": IssueTrend[]; + }; } export default function IssueId({ issue, event, trends }: Props) { - const searchParams = useSearchParams() - const tab = searchParams.get('tab') + const searchParams = useSearchParams(); + const tab = searchParams.get("tab"); const nodes = useMemo(() => { - if (!tab || tab === 'detail') { + if (!tab || tab === "detail") { return ( <> <EventDetailProfile event={event} /> @@ -44,41 +45,24 @@ export default function IssueId({ issue, event, trends }: Props) { <EventDetailActions event={event} /> - <EventDetailTrend - issue={issue} - trends={trends} - /> + <EventDetailTrend issue={issue} trends={trends} /> <EventDetailUser event={event} /> </> - ) - } - else if (tab === 'events') { - return ( - <IssueRelatedEvents issue={issue} /> - ) - } - else if (tab === 'rrweb') { - return ( - <IssueRelatedRrweb event={event} /> - ) + ); + } else if (tab === "events") { + return <IssueRelatedEvents issue={issue} />; + } else if (tab === "rrweb") { + return <IssueRelatedRrweb event={event} />; } - return ( - <IssueRelatedMetadata - event={event} - tab={tab} - /> - ) - }, [tab, event, issue, trends]) + return <IssueRelatedMetadata event={event} tab={tab} />; + }, [tab, event, issue, trends]); return ( <div className="flex flex-col gap-6"> - <IssueDetailTitle - event={event} - issue={issue} - /> + <IssueDetailTitle event={event} issue={issue} /> {nodes} </div> - ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/issues/[issueId]/page.tsx b/packages/web/app/[locale]/[projectId]/issues/[issueId]/page.tsx index 504e288..f9a936d 100644 --- a/packages/web/app/[locale]/[projectId]/issues/[issueId]/page.tsx +++ b/packages/web/app/[locale]/[projectId]/issues/[issueId]/page.tsx @@ -1,24 +1,30 @@ -import { type Issue } from 'common' -import IssueId from './issue-id' -import { serviceGetEvent } from '~/services/events' -import { serviceGetIssue, serviceGetIssuesTrends } from '~/services/issues' +import { type Issue } from "common"; -export default async function IssueIdPage({ params }: { params: { issueId: string; eventId: string } }) { - const issueId = params.issueId - const eventId = params.eventId - const issue = await serviceGetIssue({ id: issueId }) as unknown as Issue - const event = (await serviceGetEvent({ id: eventId, issueId }))! - const trends14d = await serviceGetIssuesTrends({ ids: issueId, type: '14d' }) - const trends24h = await serviceGetIssuesTrends({ ids: issueId, type: '24h' }) +import { serviceGetEvent } from "~/services/events"; +import { serviceGetIssue, serviceGetIssuesTrends } from "~/services/issues"; + +import IssueId from "./issue-id"; + +export default async function IssueIdPage({ + params, +}: { + params: { issueId: string; eventId: string }; +}) { + const issueId = params.issueId; + const eventId = params.eventId; + const issue = (await serviceGetIssue({ id: issueId })) as unknown as Issue; + const event = (await serviceGetEvent({ id: eventId, issueId }))!; + const trends14d = await serviceGetIssuesTrends({ ids: issueId, type: "14d" }); + const trends24h = await serviceGetIssuesTrends({ ids: issueId, type: "24h" }); return ( <IssueId event={event} issue={issue} trends={{ - '14d': trends14d[issueId], - '24h': trends24h[issueId], + "14d": trends14d[issueId], + "24h": trends24h[issueId], }} /> - ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/issues/page.tsx b/packages/web/app/[locale]/[projectId]/issues/page.tsx index 8feedcd..5c07b2e 100644 --- a/packages/web/app/[locale]/[projectId]/issues/page.tsx +++ b/packages/web/app/[locale]/[projectId]/issues/page.tsx @@ -1,15 +1,13 @@ -'use client' +"use client"; -import EmptyIssues from '~/components/empty-issues' -import IssueList from '~/components/issue-list' -import Wrapper from '~/components/wrapper' +import EmptyIssues from "~/components/empty-issues"; +import IssueList from "~/components/issue-list"; +import Wrapper from "~/components/wrapper"; export default function IssuesPage() { return ( <Wrapper> - <IssueList - empty={<EmptyIssues />} - /> + <IssueList empty={<EmptyIssues />} /> </Wrapper> - ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/layout.tsx b/packages/web/app/[locale]/[projectId]/layout.tsx index bf7138d..a68c6b8 100644 --- a/packages/web/app/[locale]/[projectId]/layout.tsx +++ b/packages/web/app/[locale]/[projectId]/layout.tsx @@ -1,10 +1,11 @@ -import { type ReactNode } from 'react' -import Layout from '~/components/layout' +import { type ReactNode } from "react"; + +import Layout from "~/components/layout"; interface Props { - children: ReactNode + children: ReactNode; } export default function ProjectLayout({ children }: Props) { - return <Layout>{children}</Layout> + return <Layout>{children}</Layout>; } diff --git a/packages/web/app/[locale]/[projectId]/metrics/page.tsx b/packages/web/app/[locale]/[projectId]/metrics/page.tsx index 4851158..467ff35 100644 --- a/packages/web/app/[locale]/[projectId]/metrics/page.tsx +++ b/packages/web/app/[locale]/[projectId]/metrics/page.tsx @@ -1,85 +1,94 @@ -'use client' +"use client"; -import { useTranslations } from 'next-intl' -import Link from 'next/link' -import { CLSThresholds, FCPThresholds, FIDThresholds, INPThresholds, LCPThresholds, TTFBThresholds } from 'web-vitals' -import IntroduceChart from '~/components/introduce-chart' -import Title from '~/components/title' -import ReferenceLineChart from '~/components/charts/reference-line-chart' -import Wrapper from '~/components/wrapper' -import useCurrentProject from '~/hooks/use-current-project' -import { average } from '~/libs/utils' -import { serviceGetMetricsTrends } from '~/services/metrics' -import { useQuery } from '~/hooks/use-query' -import { Button } from '~/components/ui/button' +import { useTranslations } from "next-intl"; +import Link from "next/link"; +import { + CLSThresholds, + FCPThresholds, + FIDThresholds, + INPThresholds, + LCPThresholds, + TTFBThresholds, +} from "web-vitals"; + +import ReferenceLineChart from "~/components/charts/reference-line-chart"; +import IntroduceChart from "~/components/introduce-chart"; +import Title from "~/components/title"; +import { Button } from "~/components/ui/button"; +import Wrapper from "~/components/wrapper"; +import useCurrentProject from "~/hooks/use-current-project"; +import { useQuery } from "~/hooks/use-query"; +import { average } from "~/libs/utils"; +import { serviceGetMetricsTrends } from "~/services/metrics"; export default function MetricsPage() { - const ct = useTranslations('Common') - const t = useTranslations('Metrics') - const { projectId } = useCurrentProject() + const ct = useTranslations("Common"); + const t = useTranslations("Metrics"); + const { projectId } = useCurrentProject(); const { data: CLSData } = useQuery( - () => serviceGetMetricsTrends({ - projectId: projectId!, - type: '14d', - metric: 'CLS', - }), + () => + serviceGetMetricsTrends({ + projectId: projectId!, + type: "14d", + metric: "CLS", + }), { enabled: projectId !== undefined }, - ) + ); const { data: FIDData } = useQuery( - () => serviceGetMetricsTrends({ - projectId: projectId!, - type: '14d', - metric: 'FID', - }), + () => + serviceGetMetricsTrends({ + projectId: projectId!, + type: "14d", + metric: "FID", + }), { enabled: projectId !== undefined }, - ) + ); const { data: LCPData } = useQuery( - () => serviceGetMetricsTrends({ - projectId: projectId!, - type: '14d', - metric: 'LCP', - }), + () => + serviceGetMetricsTrends({ + projectId: projectId!, + type: "14d", + metric: "LCP", + }), { enabled: projectId !== undefined }, - ) + ); const { data: INPData } = useQuery( - () => serviceGetMetricsTrends({ - projectId: projectId!, - type: '14d', - metric: 'INP', - }), + () => + serviceGetMetricsTrends({ + projectId: projectId!, + type: "14d", + metric: "INP", + }), { enabled: projectId !== undefined }, - ) + ); const { data: FCPData } = useQuery( - () => serviceGetMetricsTrends({ - projectId: projectId!, - type: '14d', - metric: 'FCP', - }), + () => + serviceGetMetricsTrends({ + projectId: projectId!, + type: "14d", + metric: "FCP", + }), { enabled: projectId !== undefined }, - ) + ); const { data: TTFBData } = useQuery( - () => serviceGetMetricsTrends({ - projectId: projectId!, - type: '14d', - metric: 'TTFB', - }), + () => + serviceGetMetricsTrends({ + projectId: projectId!, + type: "14d", + metric: "TTFB", + }), { enabled: projectId !== undefined }, - ) + ); return ( <div> <Title rightNodes={ - ( - <Link - href="https://ohbug.net/guide/metrics.html" - target="_blank" - > - <Button variant="outline"> - <i className="i-ri-question-line" /> {ct('integration')} - </Button> - </Link> - ) + <Link href="https://ohbug.net/guide/metrics.html" target="_blank"> + <Button variant="outline"> + <i className="i-ri-question-line" /> {ct("integration")} + </Button> + </Link> } > Metrics @@ -87,10 +96,10 @@ export default function MetricsPage() { <Wrapper className="flex flex-col gap-24"> <IntroduceChart - description={t('CLSDescription')} + description={t("CLSDescription")} title="Cumulative Layout Shift (CLS)" unit="ms" - value={average(CLSData?.map(v => v.value) ?? [])} + value={average(CLSData?.map((v) => v.value) ?? [])} > <ReferenceLineChart data={CLSData} @@ -103,10 +112,10 @@ export default function MetricsPage() { </IntroduceChart> <IntroduceChart - description={t('FIDDescription')} + description={t("FIDDescription")} title="First Input Delay (FID)" unit="ms" - value={average(FIDData?.map(v => v.value) ?? [])} + value={average(FIDData?.map((v) => v.value) ?? [])} > <ReferenceLineChart data={FIDData} @@ -119,10 +128,10 @@ export default function MetricsPage() { </IntroduceChart> <IntroduceChart - description={t('LCPDescription')} + description={t("LCPDescription")} title="Largest Contentful Paint (LCP)" unit="ms" - value={average(LCPData?.map(v => v.value) ?? [])} + value={average(LCPData?.map((v) => v.value) ?? [])} > <ReferenceLineChart data={LCPData} @@ -135,10 +144,10 @@ export default function MetricsPage() { </IntroduceChart> <IntroduceChart - description={t('INPDescription')} + description={t("INPDescription")} title="Interaction to Next Paint (INP)" unit="ms" - value={average(INPData?.map(v => v.value) ?? [])} + value={average(INPData?.map((v) => v.value) ?? [])} > <ReferenceLineChart data={INPData} @@ -151,10 +160,10 @@ export default function MetricsPage() { </IntroduceChart> <IntroduceChart - description={t('FCPDescription')} + description={t("FCPDescription")} title="First Contentful Paint (FCP)" unit="ms" - value={average(FCPData?.map(v => v.value) ?? [])} + value={average(FCPData?.map((v) => v.value) ?? [])} > <ReferenceLineChart data={FCPData} @@ -167,10 +176,10 @@ export default function MetricsPage() { </IntroduceChart> <IntroduceChart - description={t('TTFBDescription')} + description={t("TTFBDescription")} title="Time to First Byte (TTFB)" unit="ms" - value={average(TTFBData?.map(v => v.value) ?? [])} + value={average(TTFBData?.map((v) => v.value) ?? [])} > <ReferenceLineChart data={TTFBData} @@ -183,5 +192,5 @@ export default function MetricsPage() { </IntroduceChart> </Wrapper> </div> - ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/Ajax.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/Ajax.tsx index 4f2d137..f155097 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/Ajax.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/Ajax.tsx @@ -1,30 +1,28 @@ -'use client' +"use client"; -import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' -import { Button } from '~/components/ui/button' +import { Button } from "~/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; function Ajax() { const handleError = () => { - const xmlhttp = new XMLHttpRequest() - xmlhttp.addEventListener('readystatechange', () => {}) - xmlhttp.open('GET', 'https://api.nancode.cn/http/error?status=511', true) - xmlhttp.send(JSON.stringify({ a: 123 })) - } + const xmlhttp = new XMLHttpRequest(); + xmlhttp.addEventListener("readystatechange", () => {}); + xmlhttp.open("GET", "https://api.nancode.cn/http/error?status=511", true); + xmlhttp.send(JSON.stringify({ a: 123 })); + }; const handleTimeOut = () => { - const xmlhttp = new XMLHttpRequest() - xmlhttp.addEventListener('readystatechange', () => {}) - xmlhttp.timeout = 3000 - xmlhttp.open('GET', 'https://api.nancode.cn/http/delay?delay=5', true) - xmlhttp.send(JSON.stringify({ a: 1, b: 'i am data' })) - } + const xmlhttp = new XMLHttpRequest(); + xmlhttp.addEventListener("readystatechange", () => {}); + xmlhttp.timeout = 3000; + xmlhttp.open("GET", "https://api.nancode.cn/http/delay?delay=5", true); + xmlhttp.send(JSON.stringify({ a: 1, b: "i am data" })); + }; return ( <Card> <CardHeader> - <CardTitle> - AJAX - </CardTitle> + <CardTitle>AJAX</CardTitle> </CardHeader> <CardContent> <div className="flex"> @@ -33,7 +31,7 @@ function Ajax() { </div> </CardContent> </Card> - ) + ); } -export default Ajax +export default Ajax; diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx index d3ed82c..10911c1 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/Config.tsx @@ -1,14 +1,22 @@ -'use client' +"use client"; -import { useCallback } from 'react' -import { useForm } from 'react-hook-form' -import { useLocalStorage } from 'react-use' -import { zodResolver } from '@hookform/resolvers/zod' -import { z } from 'zod' -import { type OhbugConfig } from '@ohbug/types' -import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '~/components/ui/form' -import { Input } from '~/components/ui/input' -import { Button } from '~/components/ui/button' +import { zodResolver } from "@hookform/resolvers/zod"; +import { type OhbugConfig } from "@ohbug/types"; +import { useCallback } from "react"; +import { useForm } from "react-hook-form"; +import { useLocalStorage } from "react-use"; +import { z } from "zod"; + +import { Button } from "~/components/ui/button"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "~/components/ui/form"; +import { Input } from "~/components/ui/input"; const formSchema = z.object({ apiKey: z.string(), @@ -17,31 +25,29 @@ const formSchema = z.object({ endpoint: z.string(), releaseStage: z.string(), maxActions: z.number().min(1), -}) +}); interface Props { - defaultConfig: OhbugConfig + defaultConfig: OhbugConfig; } function Config({ defaultConfig }: Props) { const form = useForm<z.infer<typeof formSchema>>({ resolver: zodResolver(formSchema), defaultValues: defaultConfig, - }) - const [, setValue, remove] = useLocalStorage('MOCK_CONFIG', defaultConfig) + }); + const [, setValue, remove] = useLocalStorage("MOCK_CONFIG", defaultConfig); const onSubmit = useCallback((values: z.infer<typeof formSchema>) => { - setValue(values) - }, []) + setValue(values); + }, []); const handleReset = useCallback(() => { - remove() - window.location.reload() - }, []) + remove(); + window.location.reload(); + }, []); return ( <Form {...form}> - <form - onSubmit={form.handleSubmit(onSubmit)} - > + <form onSubmit={form.handleSubmit(onSubmit)}> <FormField control={form.control} name="apiKey" @@ -49,10 +55,7 @@ function Config({ defaultConfig }: Props) { <FormItem> <FormLabel>apiKey</FormLabel> <FormControl> - <Input - {...field} - disabled - /> + <Input {...field} disabled /> </FormControl> <FormMessage /> </FormItem> @@ -108,10 +111,7 @@ function Config({ defaultConfig }: Props) { <FormItem> <FormLabel>releaseStage</FormLabel> <FormControl> - <Input - {...field} - disabled - /> + <Input {...field} disabled /> </FormControl> <FormMessage /> </FormItem> @@ -125,33 +125,22 @@ function Config({ defaultConfig }: Props) { <FormItem> <FormLabel>maxActions</FormLabel> <FormControl> - <Input - {...field} - type="number" - /> + <Input {...field} type="number" /> </FormControl> <FormMessage /> </FormItem> )} /> - <Button - className="mr-2" - size="sm" - type="submit" - > + <Button className="mr-2" size="sm" type="submit"> Save </Button> - <Button - size="sm" - variant="outline" - onClick={handleReset} - > + <Button size="sm" variant="outline" onClick={handleReset}> Reset </Button> </form> </Form> - ) + ); } -export default Config +export default Config; diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx index d9e5464..66030a9 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/CustomReport.tsx @@ -1,32 +1,30 @@ -'use client' +"use client"; -import { client } from './index' -import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' -import { Button } from '~/components/ui/button' +import { Button } from "~/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; + +import { client } from "./index"; function CustomReport() { const handleError = () => { try { - throw new Error('test custom report') - } - catch (error: any) { + throw new Error("test custom report"); + } catch (error: any) { const event = client.createEvent({ - category: 'error', - type: 'message', + category: "error", + type: "message", detail: { message: error.message, stack: error.stack, }, - }) - client?.notify(event) + }); + client?.notify(event); } - } + }; return ( <Card> <CardHeader> - <CardTitle> - CustomReport - </CardTitle> + <CardTitle>CustomReport</CardTitle> </CardHeader> <CardContent> <div className="flex"> @@ -34,7 +32,7 @@ function CustomReport() { </div> </CardContent> </Card> - ) + ); } -export default CustomReport +export default CustomReport; diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx index 0684d23..e9ebb29 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/Error.tsx @@ -1,38 +1,36 @@ -'use client' +"use client"; -import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' -import { Button } from '~/components/ui/button' +import { Button } from "~/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; function randomString(length: number) { - const str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' - let result = '' + const str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + let result = ""; for (let i = length; i > 0; --i) { - result += str[Math.floor(Math.random() * str.length)] + result += str[Math.floor(Math.random() * str.length)]; } - return result + return result; } function Error() { const handleError = () => { - const obj = {} + const obj = {}; // @ts-expect-error noop // eslint-disable-next-line no-console - console.log(obj.user.job) - } + console.log(obj.user.job); + }; const handleError1 = () => { - const user = {} + const user = {}; // @ts-expect-error noop // eslint-disable-next-line no-unused-expressions - user.detail[randomString(10)] - } + user.detail[randomString(10)]; + }; return ( <Card> <CardHeader> - <CardTitle> - Error - </CardTitle> + <CardTitle>Error</CardTitle> </CardHeader> <CardContent> <div className="flex"> @@ -41,7 +39,7 @@ function Error() { </div> </CardContent> </Card> - ) + ); } -export default Error +export default Error; diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx index a2fc697..74ffdca 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/HashChange.tsx @@ -1,15 +1,14 @@ -'use client' +"use client"; -import Link from 'next/link' -import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' +import Link from "next/link"; + +import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; function HashChange() { return ( <Card> <CardHeader> - <CardTitle> - ErrorHashChange - </CardTitle> + <CardTitle>ErrorHashChange</CardTitle> </CardHeader> <CardContent> <div className="flex"> @@ -22,7 +21,7 @@ function HashChange() { </div> </CardContent> </Card> - ) + ); } -export default HashChange +export default HashChange; diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx index 3fd6e12..eae4340 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/History.tsx @@ -1,22 +1,20 @@ -'use client' +"use client"; -import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' -import { Button } from '~/components/ui/button' +import { Button } from "~/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; function History() { const pushState = () => { - window?.history.pushState(null, '', '/dd') - } + window?.history.pushState(null, "", "/dd"); + }; const replaceState = () => { - window?.history.replaceState(null, '', '/zz') - } + window?.history.replaceState(null, "", "/zz"); + }; return ( <Card> <CardHeader> - <CardTitle> - History - </CardTitle> + <CardTitle>History</CardTitle> </CardHeader> <CardContent> <div className="flex"> @@ -25,7 +23,7 @@ function History() { </div> </CardContent> </Card> - ) + ); } -export default History +export default History; diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx index 0d92f16..b1e183b 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/InsertRes.tsx @@ -1,23 +1,21 @@ -'use client' +"use client"; -import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' -import { Button } from '~/components/ui/button' +import { Button } from "~/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; export default function InsertRes() { const handle = () => { - const head = document.querySelectorAll('head')[0] - const script = document.createElement('script') - script.type = 'text/javascript' - script.src = 'https://unpkg.com/lodash@4.17.21/lodash.js' - head.append(script) - } + const head = document.querySelectorAll("head")[0]; + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = "https://unpkg.com/lodash@4.17.21/lodash.js"; + head.append(script); + }; return ( <Card> <CardHeader> - <CardTitle> - InsertRes - </CardTitle> + <CardTitle>InsertRes</CardTitle> </CardHeader> <CardContent> <div className="flex"> @@ -25,5 +23,5 @@ export default function InsertRes() { </div> </CardContent> </Card> - ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx index 2239c6c..cac3022 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/PromiseError.tsx @@ -1,18 +1,16 @@ -'use client' +"use client"; -import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' -import { Button } from '~/components/ui/button' +import { Button } from "~/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; function PromiseError() { const handlePromise = () => { - Promise?.reject(new Error('fail')) - } + Promise?.reject(new Error("fail")); + }; return ( <Card> <CardHeader> - <CardTitle> - Promise - </CardTitle> + <CardTitle>Promise</CardTitle> </CardHeader> <CardContent> <div className="flex"> @@ -20,7 +18,7 @@ function PromiseError() { </div> </CardContent> </Card> - ) + ); } -export default PromiseError +export default PromiseError; diff --git a/packages/web/app/[locale]/[projectId]/mock/frame/index.tsx b/packages/web/app/[locale]/[projectId]/mock/frame/index.tsx index f2d207a..0c3f4fb 100644 --- a/packages/web/app/[locale]/[projectId]/mock/frame/index.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/frame/index.tsx @@ -1,50 +1,54 @@ -import { useMemo, useRef } from 'react' -import Ohbug from '@ohbug/browser' -import OhbugExtensionFeedback from '@ohbug/extension-feedback' -import { useLocalStorage, useMount } from 'react-use' -import { type OhbugClient, type OhbugConfig } from '@ohbug/types' -import { type Project } from '@prisma/client' -import Config from './Config' -import Ajax from './Ajax' -import Error from './Error' -import HashChange from './HashChange' -import History from './History' -import InsertRes from './InsertRes' -import CustomReport from './CustomReport' -import PromiseError from './PromiseError' +import Ohbug from "@ohbug/browser"; +import OhbugExtensionFeedback from "@ohbug/extension-feedback"; +import { type OhbugClient, type OhbugConfig } from "@ohbug/types"; +import { type Project } from "@prisma/client"; +import { useMemo, useRef } from "react"; +import { useLocalStorage, useMount } from "react-use"; + +import Ajax from "./Ajax"; +import Config from "./Config"; +import CustomReport from "./CustomReport"; +import Error from "./Error"; +import HashChange from "./HashChange"; +import History from "./History"; +import InsertRes from "./InsertRes"; +import PromiseError from "./PromiseError"; interface Props { - project: Project + project: Project; } // eslint-disable-next-line import/no-mutable-exports -export let client: OhbugClient +export let client: OhbugClient; export default function Frame({ project }: Props) { const defaultConfig = useMemo<OhbugConfig>(() => { - const location = typeof window !== 'undefined' ? window.location : {} as any + const location = typeof window !== "undefined" ? window.location : ({} as any); return { apiKey: project.apiKey, - appVersion: '0.0.1', - appType: 'react', - endpoint: `${location.protocol}//${location.host.split(':')[0]}:6660`, - releaseStage: 'mock', + appVersion: "0.0.1", + appType: "react", + endpoint: `${location.protocol}//${location.host.split(":")[0]}:6660`, + releaseStage: "mock", maxActions: 10, - } - }, [project]) - const [value] = useLocalStorage('MOCK_CONFIG', defaultConfig) - const config = useMemo<OhbugConfig>(() => ({ - ...defaultConfig, - ...value, - }), [defaultConfig, value]) - const feedbackRef = useRef<HTMLDivElement>(null) + }; + }, [project]); + const [value] = useLocalStorage("MOCK_CONFIG", defaultConfig); + const config = useMemo<OhbugConfig>( + () => ({ + ...defaultConfig, + ...value, + }), + [defaultConfig, value], + ); + const feedbackRef = useRef<HTMLDivElement>(null); useMount(() => { - client = Ohbug.setup(config) - client.use(OhbugExtensionFeedback(feedbackRef.current!)) + client = Ohbug.setup(config); + client.use(OhbugExtensionFeedback(feedbackRef.current!)); return () => { - client.destroy() - } - }) + client.destroy(); + }; + }); return ( <div> @@ -60,5 +64,5 @@ export default function Frame({ project }: Props) { <PromiseError /> </div> </div> - ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/mock/mock.tsx b/packages/web/app/[locale]/[projectId]/mock/mock.tsx index d838df9..bf524fc 100644 --- a/packages/web/app/[locale]/[projectId]/mock/mock.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/mock.tsx @@ -1,19 +1,21 @@ -'use client' +"use client"; -import { type Project } from '@prisma/client' -import Frame from './frame' -import Wrapper from '~/components/wrapper' +import { type Project } from "@prisma/client"; + +import Wrapper from "~/components/wrapper"; + +import Frame from "./frame"; interface Props { - project: Project + project: Project; } export default function Mock({ project }: Props) { return ( - <div > + <div> <Wrapper> <Frame project={project} /> </Wrapper> </div> - ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/mock/page.tsx b/packages/web/app/[locale]/[projectId]/mock/page.tsx index c2d8b52..430946a 100644 --- a/packages/web/app/[locale]/[projectId]/mock/page.tsx +++ b/packages/web/app/[locale]/[projectId]/mock/page.tsx @@ -1,12 +1,12 @@ -import { type Metadata } from 'next' -import Mock from './mock' -import { serviceGetProject } from '~/services/projects' +import { type Metadata } from "next"; -export const metadata: Metadata = { title: 'Mock | Ohbug' } +import { serviceGetProject } from "~/services/projects"; + +import Mock from "./mock"; + +export const metadata: Metadata = { title: "Mock | Ohbug" }; export default async function MockPage({ params }: { params: { projectId: string } }) { - const project = await serviceGetProject(Number.parseInt(params.projectId)) - return ( - <Mock project={project} /> - ) + const project = await serviceGetProject(Number.parseInt(params.projectId)); + return <Mock project={project} />; } diff --git a/packages/web/app/[locale]/[projectId]/profile/page.tsx b/packages/web/app/[locale]/[projectId]/profile/page.tsx index caf1e21..6bc3ce1 100644 --- a/packages/web/app/[locale]/[projectId]/profile/page.tsx +++ b/packages/web/app/[locale]/[projectId]/profile/page.tsx @@ -1,30 +1,47 @@ -import dayjs from 'dayjs' -import Profile from './profile' -import { serviceGetProject, serviceGetProjectTrends } from '~/services/projects' -import { serviceGetPVPathGroupResult, serviceGetPVReferrerGroupResult, serviceGetPageView, serviceGetUserView } from '~/services/views' -import { getPrisma } from '~/db' +import dayjs from "dayjs"; + +import { getPrisma } from "~/db"; +import { serviceGetProject, serviceGetProjectTrends } from "~/services/projects"; +import { + serviceGetPVPathGroupResult, + serviceGetPVReferrerGroupResult, + serviceGetPageView, + serviceGetUserView, +} from "~/services/views"; + +import Profile from "./profile"; export default async function ProfilePage({ params }: { params: { projectId: string } }) { - const projectId = Number.parseInt(params.projectId) || (await getPrisma().project.findFirst())?.id - if (!projectId) return null + const projectId = + Number.parseInt(params.projectId) || (await getPrisma().project.findFirst())?.id; + if (!projectId) return null; - const project = await serviceGetProject(projectId) - const trends14d = await serviceGetProjectTrends({ id: projectId, type: '14d' }) - const trends24h = await serviceGetProjectTrends({ id: projectId, type: '24h' }) - const pageView = await serviceGetPageView({ apiKey: project.apiKey }) - const pageViewLastDay = await serviceGetPageView({ apiKey: project.apiKey, expirationDate: dayjs().startOf('date').toDate() }) - const userView = await serviceGetUserView({ apiKey: project.apiKey }) - const userViewLastDay = await serviceGetUserView({ apiKey: project.apiKey, expirationDate: dayjs().startOf('date').toDate() }) - const activeUser = await serviceGetUserView({ apiKey: project.apiKey, startDate: dayjs().subtract(5, 'minute').toDate() }) - const pvPathGroupResult = await serviceGetPVPathGroupResult({ apiKey: project.apiKey }) - const pvReferrerGroupResult = await serviceGetPVReferrerGroupResult({ apiKey: project.apiKey }) + const project = await serviceGetProject(projectId); + const trends14d = await serviceGetProjectTrends({ id: projectId, type: "14d" }); + const trends24h = await serviceGetProjectTrends({ id: projectId, type: "24h" }); + const pageView = await serviceGetPageView({ apiKey: project.apiKey }); + const pageViewLastDay = await serviceGetPageView({ + apiKey: project.apiKey, + expirationDate: dayjs().startOf("date").toDate(), + }); + const userView = await serviceGetUserView({ apiKey: project.apiKey }); + const userViewLastDay = await serviceGetUserView({ + apiKey: project.apiKey, + expirationDate: dayjs().startOf("date").toDate(), + }); + const activeUser = await serviceGetUserView({ + apiKey: project.apiKey, + startDate: dayjs().subtract(5, "minute").toDate(), + }); + const pvPathGroupResult = await serviceGetPVPathGroupResult({ apiKey: project.apiKey }); + const pvReferrerGroupResult = await serviceGetPVReferrerGroupResult({ apiKey: project.apiKey }); return ( <Profile project={project} trends={{ - '14d': trends14d, - '24h': trends24h, + "14d": trends14d, + "24h": trends24h, }} views={{ pageView, @@ -36,5 +53,5 @@ export default async function ProfilePage({ params }: { params: { projectId: str pvReferrerGroupResult, }} /> - ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/profile/profile.tsx b/packages/web/app/[locale]/[projectId]/profile/profile.tsx index aaddf8a..a388408 100644 --- a/packages/web/app/[locale]/[projectId]/profile/profile.tsx +++ b/packages/web/app/[locale]/[projectId]/profile/profile.tsx @@ -1,74 +1,67 @@ -'use client' +"use client"; -import Link from 'next/link' -import { useMemo, useState } from 'react' -import { useTranslations } from 'next-intl' -import { type Event, type Project } from '@prisma/client' -import { type ProjectTrend } from '~/services/projects' +import { type Event, type Project } from "@prisma/client"; +import { useTranslations } from "next-intl"; +import Link from "next/link"; +import { useMemo, useState } from "react"; -import VerticalBarChart from '~/components/charts/vertical-bar-chart' -import BarChart from '~/components/charts/bar-chart' -import Wrapper from '~/components/wrapper' -import EventsList from '~/components/events-list' -import Title from '~/components/title' -import { useInfinite } from '~/hooks/use-infinite' -import { serviceGetEventByProjectId } from '~/services/events' -import { type PVGroupResult } from '~/services/views' -import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' -import { Button } from '~/components/ui/button' -import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' -import { Switch } from '~/components/ui/switch' -import { Label } from '~/components/ui/label' -import LoadingMoreButton from '~/components/load-more-button' +import BarChart from "~/components/charts/bar-chart"; +import VerticalBarChart from "~/components/charts/vertical-bar-chart"; +import EventsList from "~/components/events-list"; +import LoadingMoreButton from "~/components/load-more-button"; +import Title from "~/components/title"; +import { Button } from "~/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; +import { Label } from "~/components/ui/label"; +import { Switch } from "~/components/ui/switch"; +import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip"; +import Wrapper from "~/components/wrapper"; +import { useInfinite } from "~/hooks/use-infinite"; +import { serviceGetEventByProjectId } from "~/services/events"; +import { type ProjectTrend } from "~/services/projects"; +import { type PVGroupResult } from "~/services/views"; interface Props { - project?: Project + project?: Project; trends?: { - '14d': ProjectTrend[] - '24h': ProjectTrend[] - } + "14d": ProjectTrend[]; + "24h": ProjectTrend[]; + }; views?: { - pageView: number - pageViewLastDay: number - userView: number - userViewLastDay: number - activeUser: number - pvPathGroupResult: PVGroupResult - pvReferrerGroupResult: PVGroupResult - } + pageView: number; + pageViewLastDay: number; + userView: number; + userViewLastDay: number; + activeUser: number; + pvPathGroupResult: PVGroupResult; + pvReferrerGroupResult: PVGroupResult; + }; } const View = ({ views }: Props) => { - const t = useTranslations('Profile') - const pageViewTrend = useMemo( - () => { - if (!views) return 100 - return views.pageViewLastDay > 0 - ? ((views.pageView - views.pageViewLastDay) / views.pageViewLastDay * 100).toFixed(2) - : 100 - }, - [views?.pageView, views?.pageViewLastDay], - ) - const userViewTrend = useMemo( - () => { - if (!views) return 100 - return views.pageViewLastDay > 0 - ? ((views.userView - views.userViewLastDay) / views.userViewLastDay * 100).toFixed(2) - : 100 - }, - [views?.userView, views?.userViewLastDay], - ) + const t = useTranslations("Profile"); + const pageViewTrend = useMemo(() => { + if (!views) return 100; + return views.pageViewLastDay > 0 + ? (((views.pageView - views.pageViewLastDay) / views.pageViewLastDay) * 100).toFixed(2) + : 100; + }, [views?.pageView, views?.pageViewLastDay]); + const userViewTrend = useMemo(() => { + if (!views) return 100; + return views.pageViewLastDay > 0 + ? (((views.userView - views.userViewLastDay) / views.userViewLastDay) * 100).toFixed(2) + : 100; + }, [views?.userView, views?.userViewLastDay]); - if (!(views?.pageView || views?.pageViewLastDay || views?.userView || views?.userViewLastDay)) return null + if (!(views?.pageView || views?.pageViewLastDay || views?.userView || views?.userViewLastDay)) + return null; return ( <> <Wrapper className="grid gap-4 grid-cols-3"> <Card> <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2"> - <CardTitle className="text-sm font-medium"> - {t('pv')}(PV) - </CardTitle> + <CardTitle className="text-sm font-medium">{t("pv")}(PV)</CardTitle> <i className="i-ri-bell-line text-stone-500 scale-90" /> </CardHeader> <CardContent> @@ -81,9 +74,7 @@ const View = ({ views }: Props) => { </Card> <Card> <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2"> - <CardTitle className="text-sm font-medium"> - {t('uv')}(UV) - </CardTitle> + <CardTitle className="text-sm font-medium">{t("uv")}(UV)</CardTitle> <i className="i-ri-user-voice-line text-stone-500 scale-90" /> </CardHeader> <CardContent> @@ -96,9 +87,7 @@ const View = ({ views }: Props) => { </Card> <Card> <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2"> - <CardTitle className="text-sm font-medium"> - {t('activeUser')} - </CardTitle> + <CardTitle className="text-sm font-medium">{t("activeUser")}</CardTitle> <i className="i-ri-pulse-line text-stone-500 scale-90" /> </CardHeader> <CardContent> @@ -108,112 +97,105 @@ const View = ({ views }: Props) => { </Wrapper> <Wrapper> <div className="grid grid-cols-2 gap-8"> - { - views?.pvPathGroupResult.length > 0 && ( - <Card> - <CardHeader> - <CardTitle> - <Tooltip> - <TooltipTrigger asChild> - <span className="text-base">{t('pageViews')}</span> - </TooltipTrigger> - <TooltipContent> - <span>{t('pageViewsDesc')}</span> - </TooltipContent> - </Tooltip> - </CardTitle> - </CardHeader> - <CardContent> - <div className="w-full h-60"> - <VerticalBarChart - data={views?.pvPathGroupResult} - name="number" - nameKey="value" - valueKey="count" - /> - </div> - </CardContent> - </Card> - ) - } - { - views?.pvReferrerGroupResult.length > 0 && ( - <Card> - <CardHeader> - <CardTitle> - <Tooltip> - <TooltipTrigger asChild> - <span className="text-base">{t('referrers')}</span> - </TooltipTrigger> - <TooltipContent> - <span>{t('referrersDesc')}</span> - </TooltipContent> - </Tooltip> - </CardTitle> - </CardHeader> - <CardContent> - <div className="w-full h-60"> - <VerticalBarChart - data={views?.pvReferrerGroupResult} - name="number" - nameKey="value" - valueKey="count" - /> - </div> - </CardContent> - </Card> - ) - } + {views?.pvPathGroupResult.length > 0 && ( + <Card> + <CardHeader> + <CardTitle> + <Tooltip> + <TooltipTrigger asChild> + <span className="text-base">{t("pageViews")}</span> + </TooltipTrigger> + <TooltipContent> + <span>{t("pageViewsDesc")}</span> + </TooltipContent> + </Tooltip> + </CardTitle> + </CardHeader> + <CardContent> + <div className="w-full h-60"> + <VerticalBarChart + data={views?.pvPathGroupResult} + name="number" + nameKey="value" + valueKey="count" + /> + </div> + </CardContent> + </Card> + )} + {views?.pvReferrerGroupResult.length > 0 && ( + <Card> + <CardHeader> + <CardTitle> + <Tooltip> + <TooltipTrigger asChild> + <span className="text-base">{t("referrers")}</span> + </TooltipTrigger> + <TooltipContent> + <span>{t("referrersDesc")}</span> + </TooltipContent> + </Tooltip> + </CardTitle> + </CardHeader> + <CardContent> + <div className="w-full h-60"> + <VerticalBarChart + data={views?.pvReferrerGroupResult} + name="number" + nameKey="value" + valueKey="count" + /> + </div> + </CardContent> + </Card> + )} </div> </Wrapper> </> - ) -} + ); +}; const Trend = ({ trends }: Props) => { - const [chartType, setChartType] = useState<'24h' | '14d'>('24h') - const TrendTitle = useMemo(() => ( - <div className="flex justify-between"> - <div className="font-semibold">Event Trends</div> - <div className="flex items-center gap-2"> - <Switch - checked={chartType === '24h'} - id="trendsType" - onCheckedChange={e => setChartType(e ? '24h' : '14d')} - /> - <Label htmlFor="trendsType">{chartType === '24h' ? '24小时' : '14天'}</Label> + const [chartType, setChartType] = useState<"24h" | "14d">("24h"); + const TrendTitle = useMemo( + () => ( + <div className="flex justify-between"> + <div className="font-semibold">Event Trends</div> + <div className="flex items-center gap-2"> + <Switch + checked={chartType === "24h"} + id="trendsType" + onCheckedChange={(e) => setChartType(e ? "24h" : "14d")} + /> + <Label htmlFor="trendsType">{chartType === "24h" ? "24小时" : "14天"}</Label> + </div> </div> - </div> - ), [chartType]) + ), + [chartType], + ); return ( <Wrapper> <Card> <CardHeader> - <CardTitle> - {TrendTitle} - </CardTitle> + <CardTitle>{TrendTitle}</CardTitle> </CardHeader> <CardContent> <div className="h-60"> - <BarChart - data={trends?.[chartType]} - nameKey="time" - valueKey="count" - /> + <BarChart data={trends?.[chartType]} nameKey="time" valueKey="count" /> </div> </CardContent> </Card> </Wrapper> - ) -} + ); +}; const Events = ({ project }: Props) => { const { data, size, setSize, isLoading, isReachingEnd } = useInfinite<Event>( - index => serviceGetEventByProjectId({ projectId: project!.id, page: index + 1 }), + (index) => serviceGetEventByProjectId({ projectId: project!.id, page: index + 1 }), { enabled: project?.id !== undefined, deps: [project?.id], }, - ) + ); return ( <Wrapper> @@ -224,20 +206,20 @@ const Events = ({ project }: Props) => { onClick={() => setSize(size + 1)} /> </Wrapper> - ) -} + ); +}; export default function Profile({ project, trends, views }: Props) { return ( <div className="space-y-8"> <Title - rightNodes={( + rightNodes={ <Link href={`/${project?.id}/settings`}> <Button> <i className="i-ri-settings-2-line mr-2" /> Setting </Button> </Link> - )} + } > {project?.name} @@ -250,5 +232,5 @@ export default function Profile({ project, trends, views }: Props) {
- ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/page.tsx b/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/page.tsx index 1d3dbd9..5e9658a 100644 --- a/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/page.tsx +++ b/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/page.tsx @@ -1,11 +1,10 @@ -import SourceMaps from './source-maps' -import { serviceGetRelease } from '~/services/releases' +import { serviceGetRelease } from "~/services/releases"; + +import SourceMaps from "./source-maps"; export default async function SourceMapsPage({ params }: { params: { releaseId: string } }) { - const releaseId = params.releaseId - const release = await serviceGetRelease({ id: Number.parseInt(releaseId) }) + const releaseId = params.releaseId; + const release = await serviceGetRelease({ id: Number.parseInt(releaseId) }); - return ( - - ) + return ; } diff --git a/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/source-maps.tsx b/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/source-maps.tsx index a796469..73e6861 100644 --- a/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/source-maps.tsx +++ b/packages/web/app/[locale]/[projectId]/releases/[releaseId]/sourceMaps/source-maps.tsx @@ -1,20 +1,21 @@ -'use client' +"use client"; -import { useMemo } from 'react' -import { formatBytes } from 'common' -import { type Release } from '@prisma/client' -import Link from 'next/link' -import Wrapper from '~/components/wrapper' -import Title from '~/components/title' -import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' -import { Button } from '~/components/ui/button' +import { type Release } from "@prisma/client"; +import { formatBytes } from "common"; +import Link from "next/link"; +import { useMemo } from "react"; + +import Title from "~/components/title"; +import { Button } from "~/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; +import Wrapper from "~/components/wrapper"; interface Props { - release: Release + release: Release; } export default function SourceMaps({ release }: Props) { - const sourceMaps = useMemo(() => (release.sourceMaps as Array) ?? [], [release.sourceMaps]) + const sourceMaps = useMemo(() => (release.sourceMaps as Array) ?? [], [release.sourceMaps]); return (
@@ -23,38 +24,28 @@ export default function SourceMaps({ release }: Props) { - - SourceMaps - + SourceMaps - { - sourceMaps?.map(sourceMap => ( -
-
- {sourceMap.originalname} - {sourceMap.mimetype} -
-
- {formatBytes(sourceMap.size)} - - - -
+ {sourceMaps?.map((sourceMap) => ( +
+
+ {sourceMap.originalname} + {sourceMap.mimetype} +
+
+ {formatBytes(sourceMap.size)} + + +
- )) - } +
+ ))}
- ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/releases/page.tsx b/packages/web/app/[locale]/[projectId]/releases/page.tsx index 284b358..ef3a1d2 100644 --- a/packages/web/app/[locale]/[projectId]/releases/page.tsx +++ b/packages/web/app/[locale]/[projectId]/releases/page.tsx @@ -1,61 +1,49 @@ -'use client' +"use client"; -import { useTranslations } from 'next-intl' -import Link from 'next/link' -import { type Release } from '@prisma/client' -import LoadingMoreButton from '~/components/load-more-button' -import ReleaseList from '~/components/release-list' -import Title from '~/components/title' -import { Button } from '~/components/ui/button' -import Wrapper from '~/components/wrapper' -import useCurrentProject from '~/hooks/use-current-project' -import { useInfinite } from '~/hooks/use-infinite' -import { serviceGetReleases } from '~/services/releases' +import { type Release } from "@prisma/client"; +import { useTranslations } from "next-intl"; +import Link from "next/link"; + +import LoadingMoreButton from "~/components/load-more-button"; +import ReleaseList from "~/components/release-list"; +import Title from "~/components/title"; +import { Button } from "~/components/ui/button"; +import Wrapper from "~/components/wrapper"; +import useCurrentProject from "~/hooks/use-current-project"; +import { useInfinite } from "~/hooks/use-infinite"; +import { serviceGetReleases } from "~/services/releases"; export default function ReleasesPage() { - const ct = useTranslations('Common') - const { projectId } = useCurrentProject() + const ct = useTranslations("Common"); + const { projectId } = useCurrentProject(); const { data, isLoading, size, setSize, isReachingEnd, mutate } = useInfinite( - index => serviceGetReleases({ - page: index + 1, - projectId: projectId!, - }), + (index) => + serviceGetReleases({ + page: index + 1, + projectId: projectId!, + }), { enabled: projectId !== undefined, deps: [projectId], }, - ) + ); return (
- <Button variant="outline"> - <i className="i-ri-question-line mr-2" /> {ct('integration')} - </Button> - </Link> - ) + <Link href="https://ohbug.net/guide/releases.html" target="_blank"> + <Button variant="outline"> + <i className="i-ri-question-line mr-2" /> {ct("integration")} + </Button> + </Link> } > Releases - { - data - ? ( - - ) - : null - } + {data ? : null}
- ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/settings/page.tsx b/packages/web/app/[locale]/[projectId]/settings/page.tsx index 95ac1e0..ee05ae7 100644 --- a/packages/web/app/[locale]/[projectId]/settings/page.tsx +++ b/packages/web/app/[locale]/[projectId]/settings/page.tsx @@ -1,81 +1,91 @@ -'use client' - -import { useTranslations } from 'next-intl' -import { useCallback, useMemo, useState } from 'react' -import { useForm } from 'react-hook-form' -import { useSession } from 'next-auth/react' -import { type Project } from '@prisma/client' -import { type ProjectWithMembers } from 'common' -import Title from '~/components/title' -import Wrapper from '~/components/wrapper' -import useCurrentProject from '~/hooks/use-current-project' -import { serviceGetProjectWithUsers, serviceUpdateProject } from '~/services/projects' -import { useQuery } from '~/hooks/use-query' -import { useToast } from '~/components/ui/use-toast' -import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '~/components/ui/card' -import { Input } from '~/components/ui/input' -import { Button } from '~/components/ui/button' -import { Avatar, AvatarFallback, AvatarImage } from '~/components/ui/avatar' -import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '~/components/ui/dialog' -import { Snippet } from '~/components/snippet' +"use client"; + +import { type Project } from "@prisma/client"; +import { type ProjectWithMembers } from "common"; +import { useSession } from "next-auth/react"; +import { useTranslations } from "next-intl"; +import { useCallback, useMemo, useState } from "react"; +import { useForm } from "react-hook-form"; + +import { Snippet } from "~/components/snippet"; +import Title from "~/components/title"; +import { Avatar, AvatarFallback, AvatarImage } from "~/components/ui/avatar"; +import { Button } from "~/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "~/components/ui/card"; +import { + Dialog, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, +} from "~/components/ui/dialog"; +import { Input } from "~/components/ui/input"; +import { useToast } from "~/components/ui/use-toast"; +import Wrapper from "~/components/wrapper"; +import useCurrentProject from "~/hooks/use-current-project"; +import { useQuery } from "~/hooks/use-query"; +import { serviceGetProjectWithUsers, serviceUpdateProject } from "~/services/projects"; interface CommonProps { - project?: ProjectWithMembers + project?: ProjectWithMembers; } const SettingsProjectName = ({ project }: CommonProps) => { - const ct = useTranslations('Common') - const t = useTranslations('Settings') - const { - register, - watch, - handleSubmit, - } = useForm({ defaultValues: { name: project?.name } }) - const { toast } = useToast() - const name = watch('name') - const onSubmit = useCallback((value: Project) => { - serviceUpdateProject(project!.id, value) - .then(() => { - toast({ - title: 'Project Updated!', - description: 'Your project name has been updated!', - }) - }) - .catch((error) => { - toast({ - title: 'Project Update Failed!', - description: error.message, - variant: 'destructive', + const ct = useTranslations("Common"); + const t = useTranslations("Settings"); + const { register, watch, handleSubmit } = useForm({ + defaultValues: { name: project?.name }, + }); + const { toast } = useToast(); + const name = watch("name"); + const onSubmit = useCallback( + (value: Project) => { + serviceUpdateProject(project!.id, value) + .then(() => { + toast({ + title: "Project Updated!", + description: "Your project name has been updated!", + }); }) - }) - }, [project]) + .catch((error) => { + toast({ + title: "Project Update Failed!", + description: error.message, + variant: "destructive", + }); + }); + }, + [project], + ); return (
- {t('projectName')} - {t('projectDescription')} + {t("projectName")} + {t("projectDescription")} - { - (!!name && name !== project?.name) && ( -
- {t('yourProjectWillBeRenamedTo')} ` - - {name} - - `. -
- ) - } + {!!name && name !== project?.name && ( +
+ {t("yourProjectWillBeRenamedTo")} `{name} + `. +
+ )}
@@ -85,92 +95,79 @@ const SettingsProjectName = ({ project }: CommonProps) => { type="submit" variant="outline" > - {t('save')} + {t("save")} - ) -} + ); +}; const SettingsProjectApiKey = ({ project }: CommonProps) => { - const t = useTranslations('Settings') + const t = useTranslations("Settings"); return ( - {t('projectApiKey')} - {t('apiKeyDescription')} + {t("projectApiKey")} + {t("apiKeyDescription")} - {project?.apiKey ?? ''} + {project?.apiKey ?? ""} - ) -} + ); +}; const SettingsProjectUsers = ({ project }: CommonProps) => { - const { data } = useSession() + const { data } = useSession(); const inviteUrl = useMemo(() => { // @ts-expect-error next-auth types are wrong - const userId = data?.user?.id - const projectId = project?.id - return `${process.env.NEXT_PUBLIC_NEXTAUTH_URL}/auth/signin?p=${projectId}&u=${userId}` - }, [data, project]) + const userId = data?.user?.id; + const projectId = project?.id; + return `${process.env.NEXT_PUBLIC_NEXTAUTH_URL}/auth/signin?p=${projectId}&u=${userId}`; + }, [data, project]); - const t = useTranslations('Settings') - const [open, setOpen] = useState(false) + const t = useTranslations("Settings"); + const [open, setOpen] = useState(false); return ( <> - {t('projectMembers')} -
- { - project?.members?.map(member => ( -
-
- - - {member.name ?? ''} - -
- {member.name} - {member.email} -
+ {project?.members?.map((member) => ( +
+
+ + + {member.name ?? ""} + +
+ {member.name} + {member.email}
- )) - } +
+ ))}
- + - - {t('inviteMembers')} - + {t("inviteMembers")}
-
{t('inviteMembersDescription')}
+
{t("inviteMembersDescription")}
{inviteUrl}
@@ -179,37 +176,28 @@ const SettingsProjectUsers = ({ project }: CommonProps) => {
- ) -} + ); +}; export default function SettingsPage() { - const t = useTranslations('Settings') - const { projectId } = useCurrentProject() - const { data: project } = useQuery( - () => serviceGetProjectWithUsers(projectId!), - { - enabled: !!projectId, - deps: [projectId], - }, - ) + const t = useTranslations("Settings"); + const { projectId } = useCurrentProject(); + const { data: project } = useQuery(() => serviceGetProjectWithUsers(projectId!), { + enabled: !!projectId, + deps: [projectId], + }); return (
- {t('projectSettings')} + {t("projectSettings")} - + - + - +
- ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/users/[userId]/page.tsx b/packages/web/app/[locale]/[projectId]/users/[userId]/page.tsx index 006f34d..80c6f45 100644 --- a/packages/web/app/[locale]/[projectId]/users/[userId]/page.tsx +++ b/packages/web/app/[locale]/[projectId]/users/[userId]/page.tsx @@ -1,11 +1,10 @@ -import UserId from './user-id' -import { serviceGetEventUser } from '~/services/event-users' +import { serviceGetEventUser } from "~/services/event-users"; + +import UserId from "./user-id"; export default async function UserIdPage({ params }: { params: { userId: string } }) { - const userId = params.userId - const user = await serviceGetEventUser({ id: userId }) + const userId = params.userId; + const user = await serviceGetEventUser({ id: userId }); - return ( - - ) + return ; } diff --git a/packages/web/app/[locale]/[projectId]/users/[userId]/user-id.tsx b/packages/web/app/[locale]/[projectId]/users/[userId]/user-id.tsx index b9ddb7c..9907077 100644 --- a/packages/web/app/[locale]/[projectId]/users/[userId]/user-id.tsx +++ b/packages/web/app/[locale]/[projectId]/users/[userId]/user-id.tsx @@ -1,15 +1,13 @@ -'use client' +"use client"; -import Link from 'next/link' -import dayjs from 'dayjs' -import dynamic from 'next/dynamic' -import { type Event, type EventUser, type Feedback } from '@prisma/client' -import EventsList from '~/components/events-list' +import { type Event, type EventUser, type Feedback } from "@prisma/client"; +import dayjs from "dayjs"; +import dynamic from "next/dynamic"; +import Link from "next/link"; -import Wrapper from '~/components/wrapper' -import AccordionSection from '~/components/accordion-section' -import useCurrentProject from '~/hooks/use-current-project' -import Title from '~/components/title' +import AccordionSection from "~/components/accordion-section"; +import EventsList from "~/components/events-list"; +import Title from "~/components/title"; import { Table, TableBody, @@ -17,25 +15,26 @@ import { TableHead, TableHeader, TableRow, -} from '~/components/ui/table' +} from "~/components/ui/table"; +import Wrapper from "~/components/wrapper"; +import useCurrentProject from "~/hooks/use-current-project"; -const DynamicReactJson = dynamic(import('react-json-view'), { ssr: false }) +const DynamicReactJson = dynamic(import("react-json-view"), { ssr: false }); interface Props { user: EventUser & { - events: Event[] - feedbacks: Feedback[] - } + events: Event[]; + feedbacks: Feedback[]; + }; } export default function UserId({ user }: Props) { - const { projectId } = useCurrentProject() + const { projectId } = useCurrentProject(); return (
- <DynamicReactJson src={{ ipAddress: user.ipAddress, @@ -64,28 +63,26 @@ export default function UserId({ user }: Props) { </TableRow> </TableHeader> <TableBody> - { - user.feedbacks?.map((feedback) => { - const detail = feedback.detail as any - return ( - <TableRow key={feedback.id}> - <TableCell> - <Link href={`/${projectId}/feedbacks/${feedback.id}`}> - {detail.feedback} - </Link> - </TableCell> - <TableCell> - {dayjs(feedback.createdAt).format('YYYY-MM-DD HH:mm:ss')} - </TableCell> - </TableRow> - ) - }) - } + {user.feedbacks?.map((feedback) => { + const detail = feedback.detail as any; + return ( + <TableRow key={feedback.id}> + <TableCell> + <Link href={`/${projectId}/feedbacks/${feedback.id}`}> + {detail.feedback} + </Link> + </TableCell> + <TableCell> + {dayjs(feedback.createdAt).format("YYYY-MM-DD HH:mm:ss")} + </TableCell> + </TableRow> + ); + })} </TableBody> </Table> </AccordionSection> </Wrapper> </div> </div> - ) + ); } diff --git a/packages/web/app/[locale]/[projectId]/users/page.tsx b/packages/web/app/[locale]/[projectId]/users/page.tsx index de5f5ce..366d447 100644 --- a/packages/web/app/[locale]/[projectId]/users/page.tsx +++ b/packages/web/app/[locale]/[projectId]/users/page.tsx @@ -1,63 +1,70 @@ -'use client' +"use client"; -import { useTranslations } from 'next-intl' -import { useState } from 'react' -import { useDebounce } from 'react-use' -import { type EventUser } from '@prisma/client' -import UsersList from '~/components/users-list' -import Title from '~/components/title' -import Wrapper from '~/components/wrapper' -import useCurrentProject from '~/hooks/use-current-project' -import { useInfinite } from '~/hooks/use-infinite' -import { serviceGetEventUsers } from '~/services/event-users' -import { Input } from '~/components/ui/input' -import LoadingMoreButton from '~/components/load-more-button' +import { type EventUser } from "@prisma/client"; +import { useTranslations } from "next-intl"; +import { useState } from "react"; +import { useDebounce } from "react-use"; + +import LoadingMoreButton from "~/components/load-more-button"; +import Title from "~/components/title"; +import { Input } from "~/components/ui/input"; +import UsersList from "~/components/users-list"; +import Wrapper from "~/components/wrapper"; +import useCurrentProject from "~/hooks/use-current-project"; +import { useInfinite } from "~/hooks/use-infinite"; +import { serviceGetEventUsers } from "~/services/event-users"; export default function UsersPage() { - const ct = useTranslations('Common') - const { projectId } = useCurrentProject() - const [query, setQuery] = useState('') - const [debouncedQuery, setDebouncedQuery] = useState('') + const ct = useTranslations("Common"); + const { projectId } = useCurrentProject(); + const [query, setQuery] = useState(""); + const [debouncedQuery, setDebouncedQuery] = useState(""); useDebounce( () => { - setDebouncedQuery(query) + setDebouncedQuery(query); }, 500, [query], - ) - const { data: eventUsers, isLoading, size, setSize, isReachingEnd } = useInfinite<( + ); + const { + data: eventUsers, + isLoading, + size, + setSize, + isReachingEnd, + } = useInfinite< EventUser & { _count: { - issues: number - metrics: number - feedbacks: number - pageViews: number - userViews: number - } - })>( - index => serviceGetEventUsers({ - page: index + 1, - projectId: projectId!, - query: debouncedQuery, - }), + issues: number; + metrics: number; + feedbacks: number; + pageViews: number; + userViews: number; + }; + } + >( + (index) => + serviceGetEventUsers({ + page: index + 1, + projectId: projectId!, + query: debouncedQuery, + }), { enabled: projectId !== undefined, deps: [projectId, debouncedQuery], }, - ) + ); return ( <div> <Title> <div className="flex gap-4 w-full"> - <h2 className="font-semibold text-lg w-full"> - Users - </h2> + <h2 className="font-semibold text-lg w-full">Users</h2> <div className="w-full"> <Input placeholder="Search for users ipAddress uuid email name and metadata" value={query} - onChange={e => setQuery(e.target.value)} + onChange={(e) => setQuery(e.target.value)} /> </div> </div> @@ -72,5 +79,5 @@ export default function UsersPage() { /> </Wrapper> </div> - ) + ); } diff --git a/packages/web/app/[locale]/auth/signin/page.tsx b/packages/web/app/[locale]/auth/signin/page.tsx index 353eb3a..36ea2f9 100644 --- a/packages/web/app/[locale]/auth/signin/page.tsx +++ b/packages/web/app/[locale]/auth/signin/page.tsx @@ -1,45 +1,42 @@ -import { getProviders } from 'next-auth/react' -import { type Metadata } from 'next' -import SignIn from './signin' -import { serviceGetProject } from '~/services/projects' -import { serviceGetUser } from '~/services/users' +import { type Metadata } from "next"; +import { getProviders } from "next-auth/react"; -type ProviderType = 'email' | 'github' | 'credentials' +import { serviceGetProject } from "~/services/projects"; +import { serviceGetUser } from "~/services/users"; + +import SignIn from "./signin"; + +type ProviderType = "email" | "github" | "credentials"; interface Provider { - id: string - name: string - type: string - callbackUrl: string - signinUrl: string + id: string; + name: string; + type: string; + callbackUrl: string; + signinUrl: string; } async function getInviter(userId: string | null, projectId: string | null) { if (userId && projectId) { - const project = await serviceGetProject(Number.parseInt(projectId)) - const user = await serviceGetUser(userId) + const project = await serviceGetProject(Number.parseInt(projectId)); + const user = await serviceGetUser(userId); if (project && user) { return { project, user, - } + }; } } - return undefined + return undefined; } -export const metadata: Metadata = { title: 'SignIn | Ohbug' } +export const metadata: Metadata = { title: "SignIn | Ohbug" }; export default async function SignInPage({ params }: { params: { u: string; p: string } }) { - const userId = params.u - const projectId = params.p - const providers = await getProviders() as Record<ProviderType, Provider> - const inviter = await getInviter(userId, projectId) - - return ( - <SignIn - inviter={inviter} - providers={providers} - /> - ) + const userId = params.u; + const projectId = params.p; + const providers = (await getProviders()) as Record<ProviderType, Provider>; + const inviter = await getInviter(userId, projectId); + + return <SignIn inviter={inviter} providers={providers} />; } diff --git a/packages/web/app/[locale]/auth/signin/signin.tsx b/packages/web/app/[locale]/auth/signin/signin.tsx index 8c4e8a3..d02639f 100644 --- a/packages/web/app/[locale]/auth/signin/signin.tsx +++ b/packages/web/app/[locale]/auth/signin/signin.tsx @@ -1,64 +1,74 @@ -'use client' +"use client"; -import { getSession, signIn } from 'next-auth/react' -import { useTranslations } from 'next-intl' -import { useRouter } from 'next-intl/client' -import { useCallback, useEffect, useMemo, useState } from 'react' -import { useForm } from 'react-hook-form' -import { useAtom } from 'jotai' -import { useMount } from 'react-use' -import { zodResolver } from '@hookform/resolvers/zod' -import { z } from 'zod' -import { type SignInResponse } from 'next-auth/react' -import { type Project, type User } from '@prisma/client' -import { type Dispatch, type SetStateAction } from 'react' -import { inviteAtom } from '~/atoms/invite' -import { Button } from '~/components/ui/button' -import { Input } from '~/components/ui/input' -import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '~/components/ui/form' -import { useToast } from '~/components/ui/use-toast' -import { Avatar, AvatarFallback, AvatarImage } from '~/components/ui/avatar' -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '~/components/ui/card' +import { zodResolver } from "@hookform/resolvers/zod"; +import { type Project, type User } from "@prisma/client"; +import { useAtom } from "jotai"; +import { getSession, signIn } from "next-auth/react"; +import { type SignInResponse } from "next-auth/react"; +import { useTranslations } from "next-intl"; +import { useRouter } from "next-intl/client"; +import { useCallback, useEffect, useMemo, useState } from "react"; +import { type Dispatch, type SetStateAction } from "react"; +import { useForm } from "react-hook-form"; +import { useMount } from "react-use"; +import { z } from "zod"; -type ProviderType = 'email' | 'github' | 'credentials' +import { inviteAtom } from "~/atoms/invite"; +import { Avatar, AvatarFallback, AvatarImage } from "~/components/ui/avatar"; +import { Button } from "~/components/ui/button"; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "~/components/ui/card"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "~/components/ui/form"; +import { Input } from "~/components/ui/input"; +import { useToast } from "~/components/ui/use-toast"; + +type ProviderType = "email" | "github" | "credentials"; interface Provider { - id: string - name: string - type: string - callbackUrl: string - signinUrl: string + id: string; + name: string; + type: string; + callbackUrl: string; + signinUrl: string; } interface Props { - providers: Record<ProviderType, Provider> + providers: Record<ProviderType, Provider>; inviter?: { - project: Project - user: User - } + project: Project; + user: User; + }; } interface EmailSignInData { - email: string + email: string; } interface EmailSignInProps { - setStep: Dispatch<SetStateAction<number>> - onSignIn: (type: string, options: Record<string, any>) => void + setStep: Dispatch<SetStateAction<number>>; + onSignIn: (type: string, options: Record<string, any>) => void; } function EmailSignIn({ setStep, onSignIn }: EmailSignInProps) { - const ct = useTranslations('Common') - const formSchema = z.object({ email: z.string().email().min(2, { message: ct('mustBeTheCorrectEmailAddress') }) }) - const form = useForm<z.infer<typeof formSchema>>({ resolver: zodResolver(formSchema) }) + const ct = useTranslations("Common"); + const formSchema = z.object({ + email: z + .string() + .email() + .min(2, { message: ct("mustBeTheCorrectEmailAddress") }), + }); + const form = useForm<z.infer<typeof formSchema>>({ resolver: zodResolver(formSchema) }); const onSubmit = useCallback((data: EmailSignInData) => { - onSignIn('email', { callbackUrl: '/', email: data.email }) - }, []) + onSignIn("email", { callbackUrl: "/", email: data.email }); + }, []); return ( <Form {...form}> - <form - className="flex flex-col gap-4" - onSubmit={form.handleSubmit(onSubmit)} - > + <form className="flex flex-col gap-4" onSubmit={form.handleSubmit(onSubmit)}> <FormField control={form.control} name="email" @@ -66,86 +76,78 @@ function EmailSignIn({ setStep, onSignIn }: EmailSignInProps) { <FormItem> <FormLabel>Email</FormLabel> <FormControl> - <Input - placeholder="Email Address" - {...field} - /> + <Input placeholder="Email Address" {...field} /> </FormControl> <FormMessage /> </FormItem> )} /> - <Button - className="w-full" - type="submit" - > + <Button className="w-full" type="submit"> <i className="i-ri-mail-line mr-2" /> Sign in with Email </Button> <Button variant="link" - onClick={() => { setStep(s => s - 1) }} + onClick={() => { + setStep((s) => s - 1); + }} > ← Other Login Options </Button> </form> </Form> - ) + ); } type GithubSignInProps = Props & { - onSignIn: (type: string, options: Record<string, any>) => void -} + onSignIn: (type: string, options: Record<string, any>) => void; +}; function GithubSignIn({ providers, onSignIn }: GithubSignInProps) { const handleSignInGithub = useCallback(() => { - onSignIn(providers.github.id, { callbackUrl: '/' }) - }, [providers]) + onSignIn(providers.github.id, { callbackUrl: "/" }); + }, [providers]); return ( - <Button - variant="outline" - onClick={handleSignInGithub} - > + <Button variant="outline" onClick={handleSignInGithub}> <i className="i-ri-github-fill mr-2" /> {providers.github.name} </Button> - ) + ); } interface AccountSignInData { - email: string - password: string + email: string; + password: string; } interface AccountSignInProps { - onSignIn: (type: string, options: Record<string, any>) => Promise<SignInResponse | undefined> + onSignIn: (type: string, options: Record<string, any>) => Promise<SignInResponse | undefined>; } function AccountSignIn({ onSignIn }: AccountSignInProps) { - const ct = useTranslations('Common') - const router = useRouter() + const ct = useTranslations("Common"); + const router = useRouter(); const formSchema = z.object({ - email: z.string().email().min(2, { message: ct('mustBeTheCorrectEmailAddress') }), + email: z + .string() + .email() + .min(2, { message: ct("mustBeTheCorrectEmailAddress") }), password: z.string().max(24).min(8), - }) - const form = useForm<z.infer<typeof formSchema>>({ resolver: zodResolver(formSchema) }) - const { toast } = useToast() + }); + const form = useForm<z.infer<typeof formSchema>>({ resolver: zodResolver(formSchema) }); + const { toast } = useToast(); const onSubmit = useCallback(async (data: AccountSignInData) => { - const res = await onSignIn('credentials', { redirect: false, ...data }) + const res = await onSignIn("credentials", { redirect: false, ...data }); if (res?.ok) { - router.push('/') - } - else { + router.push("/"); + } else { toast({ - title: 'SignIn Error', - description: ct('signInError'), - variant: 'destructive', - }) + title: "SignIn Error", + description: ct("signInError"), + variant: "destructive", + }); } - }, []) + }, []); return ( <Form {...form}> - <form - className="flex flex-col gap-4" - onSubmit={form.handleSubmit(onSubmit)} - > + <form className="flex flex-col gap-4" onSubmit={form.handleSubmit(onSubmit)}> <FormField control={form.control} name="email" @@ -153,10 +155,7 @@ function AccountSignIn({ onSignIn }: AccountSignInProps) { <FormItem> <FormLabel>Email</FormLabel> <FormControl> - <Input - placeholder="Email Address" - {...field} - /> + <Input placeholder="Email Address" {...field} /> </FormControl> <FormMessage /> </FormItem> @@ -169,147 +168,88 @@ function AccountSignIn({ onSignIn }: AccountSignInProps) { <FormItem> <FormLabel>Password</FormLabel> <FormControl> - <Input - placeholder="Password" - type="password" - {...field} - /> + <Input placeholder="Password" type="password" {...field} /> </FormControl> <FormMessage /> </FormItem> )} /> - <Button - className="w-full" - type="submit" - > + <Button className="w-full" type="submit"> <i className="i-ri-login-box-line mr-2" /> Sign in </Button> </form> </Form> - ) + ); } export default function SignIn({ providers, inviter }: Props) { - const router = useRouter() + const router = useRouter(); useMount(async () => { - const user = (await getSession())?.user + const user = (await getSession())?.user; if (user) { - router.push('/') + router.push("/"); } - }) - const [step, setStep] = useState(1) + }); + const [step, setStep] = useState(1); const title = useMemo(() => { if (inviter && inviter.project && inviter.user) { - const name = inviter.user.name || inviter.user.email || '' + const name = inviter.user.name || inviter.user.email || ""; return ( <h2 className="font-bold text-3xl"> <Avatar> - <AvatarImage - alt={name} - src={inviter.user?.image ?? ''} - /> + <AvatarImage alt={name} src={inviter.user?.image ?? ""} /> <AvatarFallback>{name}</AvatarFallback> </Avatar> - {`${inviter.user.name || inviter.user.email || ''} invited you to join the ${inviter.project.name}`} + {`${inviter.user.name || inviter.user.email || ""} invited you to join the ${inviter.project.name}`} </h2> - ) + ); } - return <h2 className="font-bold text-3xl">Sign in to Ohbug</h2> - }, [inviter]) - const [, setInviteValue] = useAtom(inviteAtom) + return <h2 className="font-bold text-3xl">Sign in to Ohbug</h2>; + }, [inviter]); + const [, setInviteValue] = useAtom(inviteAtom); useEffect(() => { if (inviter && inviter.project && inviter.user) { setInviteValue({ projectId: inviter.project.id, userId: inviter.user.id, - }) + }); } - }, [router]) + }, [router]); return ( <section className="h-screen flex items-center justify-center"> <Card className="w-[450px]"> <CardHeader className="space-y-1"> <CardTitle className="text-2xl">{title}</CardTitle> - <CardDescription> - Choose a way to log in to your account - </CardDescription> + <CardDescription>Choose a way to log in to your account</CardDescription> </CardHeader> <CardContent className="grid gap-4"> - { - step === 1 && ( - <> - <div className="grid grid-cols-2 gap-6"> - { - (providers.github) - ? ( - <GithubSignIn - providers={providers} - onSignIn={signIn} - /> - ) - : null - } - { - (providers.email) - ? ( - <Button - variant="outline" - onClick={() => setStep(s => s + 1)} - > - <i className="i-ri-mail-line mr-2" /> Email - </Button> - ) - : null - } + {step === 1 && ( + <> + <div className="grid grid-cols-2 gap-6"> + {providers.github ? <GithubSignIn providers={providers} onSignIn={signIn} /> : null} + {providers.email ? ( + <Button variant="outline" onClick={() => setStep((s) => s + 1)}> + <i className="i-ri-mail-line mr-2" /> Email + </Button> + ) : null} + </div> + <div className="relative"> + <div className="absolute inset-0 flex items-center"> + <span className="w-full border-t" /> </div> - <div className="relative"> - <div className="absolute inset-0 flex items-center"> - <span className="w-full border-t" /> - </div> - <div className="relative flex justify-center text-xs uppercase"> - <span className="bg-background px-2 text-muted-foreground"> - Or continue with - </span> - </div> + <div className="relative flex justify-center text-xs uppercase"> + <span className="bg-background px-2 text-muted-foreground">Or continue with</span> </div> - </> - ) - } - { - step === 1 && ( - <> - { - (providers.credentials) - ? ( - <AccountSignIn - onSignIn={signIn} - /> - ) - : null - } + </div> </> - ) - } - { - providers.email - ? ( - <> - { - (step === 2) && ( - <EmailSignIn - setStep={setStep} - onSignIn={signIn} - /> - ) - } - </> - ) - : null - } + )} + {step === 1 && <>{providers.credentials ? <AccountSignIn onSignIn={signIn} /> : null}</>} + {providers.email ? ( + <>{step === 2 && <EmailSignIn setStep={setStep} onSignIn={signIn} />}</> + ) : null} </CardContent> </Card> </section> - ) + ); } diff --git a/packages/web/app/[locale]/create-project/action.ts b/packages/web/app/[locale]/create-project/action.ts index 61a6d23..fca87a2 100644 --- a/packages/web/app/[locale]/create-project/action.ts +++ b/packages/web/app/[locale]/create-project/action.ts @@ -1,27 +1,30 @@ -'use server' +"use server"; -import crypto from 'node:crypto' -import { redirect } from 'next/navigation' -import { NextResponse } from 'next/server' -import { getConfig } from 'config' -import { type z } from 'zod' -import schema from './schema' -import { getAuth } from '~/libs/middleware' -import { serviceCreateProject } from '~/services/projects' +import crypto from "node:crypto"; + +import { getConfig } from "config"; +import { redirect } from "next/navigation"; +import { NextResponse } from "next/server"; +import { type z } from "zod"; + +import { getAuth } from "~/libs/middleware"; +import { serviceCreateProject } from "~/services/projects"; + +import schema from "./schema"; export default async function submit(formData: z.infer<typeof schema>) { - const secret = getConfig().secret?.apikey ?? 'ohbug-apikey-s3cret' - const auth = await getAuth() + const secret = getConfig().secret?.apikey ?? "ohbug-apikey-s3cret"; + const auth = await getAuth(); if (!auth) { - return NextResponse.redirect('/auth/signin', { status: 302 }) + return NextResponse.redirect("/auth/signin", { status: 302 }); } - const project = schema.parse(formData) + const project = schema.parse(formData); const apiKey = crypto - .createHmac('sha256', secret) + .createHmac("sha256", secret) .update(JSON.stringify(formData) + Date.now()) - .digest('hex') - await serviceCreateProject({ ...project, apiKey }, auth.user) + .digest("hex"); + await serviceCreateProject({ ...project, apiKey }, auth.user); - return redirect('/') + return redirect("/"); } diff --git a/packages/web/app/[locale]/create-project/create-project.tsx b/packages/web/app/[locale]/create-project/create-project.tsx index 477362b..a6f735f 100644 --- a/packages/web/app/[locale]/create-project/create-project.tsx +++ b/packages/web/app/[locale]/create-project/create-project.tsx @@ -1,11 +1,12 @@ -'use client' +"use client"; -import { useTranslations } from 'next-intl' -import { useForm } from 'react-hook-form' -import { zodResolver } from '@hookform/resolvers/zod' -import schema from './schema' -import submit from './action' -import type * as z from 'zod' +import { zodResolver } from "@hookform/resolvers/zod"; +import { useTranslations } from "next-intl"; +import { useForm } from "react-hook-form"; +import type * as z from "zod"; + +import { Button } from "~/components/ui/button"; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "~/components/ui/card"; import { Form, FormControl, @@ -13,57 +14,58 @@ import { FormItem, FormLabel, FormMessage, -} from '~/components/ui/form' -import { Input } from '~/components/ui/input' -import { Button } from '~/components/ui/button' -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '~/components/ui/select' -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '~/components/ui/card' +} from "~/components/ui/form"; +import { Input } from "~/components/ui/input"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "~/components/ui/select"; + +import submit from "./action"; +import schema from "./schema"; const projectTypes = [ { - label: 'JavaScript', - value: 'javascript', + label: "JavaScript", + value: "javascript", }, -] as const +] as const; export default function CreateProject() { - const t = useTranslations('CreateProject') + const t = useTranslations("CreateProject"); const form = useForm<z.infer<typeof schema>>({ resolver: zodResolver(schema), defaultValues: { - name: '', - type: 'javascript', + name: "", + type: "javascript", }, - }) + }); async function onSubmit(values: z.infer<typeof schema>) { - await submit(values) + await submit(values); } return ( <div className="flex items-center justify-center h-screen"> <Card className="w-80"> <CardHeader> - <CardTitle>{t('createProject')}</CardTitle> - <CardDescription>{t('createProjectDescription')}</CardDescription> + <CardTitle>{t("createProject")}</CardTitle> + <CardDescription>{t("createProjectDescription")}</CardDescription> </CardHeader> <CardContent> <Form {...form}> - <form - className="space-y-6" - onSubmit={form.handleSubmit(onSubmit)} - > + <form className="space-y-6" onSubmit={form.handleSubmit(onSubmit)}> <FormField control={form.control} name="name" render={({ field }) => ( <FormItem> - <FormLabel>{t('projectName')}</FormLabel> + <FormLabel>{t("projectName")}</FormLabel> <FormControl> - <Input - placeholder={t('projectNamePlaceholder')} - {...field} - /> + <Input placeholder={t("projectNamePlaceholder")} {...field} /> </FormControl> <FormMessage /> </FormItem> @@ -74,43 +76,32 @@ export default function CreateProject() { name="type" render={({ field }) => ( <FormItem> - <FormLabel>{t('projectType')}</FormLabel> - <Select - defaultValue={field.value} - onValueChange={field.onChange} - > + <FormLabel>{t("projectType")}</FormLabel> + <Select defaultValue={field.value} onValueChange={field.onChange}> <FormControl> <SelectTrigger> <SelectValue placeholder="Select a verified email to display" /> </SelectTrigger> </FormControl> <SelectContent> - { - projectTypes.map(({ label, value }) => ( - <SelectItem - key={value} - value={value} - > - {label} - </SelectItem> - )) - } + {projectTypes.map(({ label, value }) => ( + <SelectItem key={value} value={value}> + {label} + </SelectItem> + ))} </SelectContent> </Select> <FormMessage /> </FormItem> )} /> - <Button - className="w-full" - type="submit" - > - {t('createProject')} + <Button className="w-full" type="submit"> + {t("createProject")} </Button> </form> </Form> </CardContent> </Card> </div> - ) + ); } diff --git a/packages/web/app/[locale]/create-project/page.tsx b/packages/web/app/[locale]/create-project/page.tsx index 7d94bcb..d8162ed 100644 --- a/packages/web/app/[locale]/create-project/page.tsx +++ b/packages/web/app/[locale]/create-project/page.tsx @@ -1,10 +1,9 @@ -import { type Metadata } from 'next' -import CreateProject from './create-project' +import { type Metadata } from "next"; -export const metadata: Metadata = { title: 'Create Project | Ohbug' } +import CreateProject from "./create-project"; + +export const metadata: Metadata = { title: "Create Project | Ohbug" }; export default async function CreateProjectPage() { - return ( - <CreateProject /> - ) + return <CreateProject />; } diff --git a/packages/web/app/[locale]/create-project/schema.ts b/packages/web/app/[locale]/create-project/schema.ts index 488c50f..7fedad1 100644 --- a/packages/web/app/[locale]/create-project/schema.ts +++ b/packages/web/app/[locale]/create-project/schema.ts @@ -1,8 +1,8 @@ -import { z } from 'zod' +import { z } from "zod"; const formSchema = z.object({ name: z.string().min(2).max(50), - type: z.enum(['javascript'] as const), -}) + type: z.enum(["javascript"] as const), +}); -export default formSchema +export default formSchema; diff --git a/packages/web/app/[locale]/home.tsx b/packages/web/app/[locale]/home.tsx index d36da21..236b26a 100644 --- a/packages/web/app/[locale]/home.tsx +++ b/packages/web/app/[locale]/home.tsx @@ -1,45 +1,41 @@ -'use client' +"use client"; -import Link from 'next/link' -import { useTranslations } from 'next-intl' -import { useSession } from 'next-auth/react' -import { type User } from '@prisma/client' -import { Button } from '~/components/ui/button' -import ProjectCard from '~/components/project-card' -import Wrapper from '~/components/wrapper' -import { useInviteMember } from '~/hooks/use-invite-member' -import { useQuery } from '~/hooks/use-query' -import { serviceGetProjectsWithEventCount } from '~/services/projects' +import { type User } from "@prisma/client"; +import { useSession } from "next-auth/react"; +import { useTranslations } from "next-intl"; +import Link from "next/link"; + +import ProjectCard from "~/components/project-card"; +import { Button } from "~/components/ui/button"; +import Wrapper from "~/components/wrapper"; +import { useInviteMember } from "~/hooks/use-invite-member"; +import { useQuery } from "~/hooks/use-query"; +import { serviceGetProjectsWithEventCount } from "~/services/projects"; export default function Home() { - const t = useTranslations('Index') - const session = useSession() + const t = useTranslations("Index"); + const session = useSession(); const { data: projects } = useQuery( () => serviceGetProjectsWithEventCount(session.data?.user as User), - { enabled: session.status === 'authenticated' }, - ) + { enabled: session.status === "authenticated" }, + ); - useInviteMember() + useInviteMember(); return ( <Wrapper> <div className="flex justify-end"> <Link href="/create-project"> <Button> - <i className="i-ri-add-line mr-2" /> {t('createProject')} + <i className="i-ri-add-line mr-2" /> {t("createProject")} </Button> </Link> </div> <div className="grid grid-cols-3 gap-2 mt-4"> - { - projects?.map(project => ( - <ProjectCard - key={project.id} - project={project} - /> - )) - } + {projects?.map((project) => ( + <ProjectCard key={project.id} project={project} /> + ))} </div> </Wrapper> - ) + ); } diff --git a/packages/web/app/[locale]/layout.tsx b/packages/web/app/[locale]/layout.tsx index 7eafb18..81ada90 100644 --- a/packages/web/app/[locale]/layout.tsx +++ b/packages/web/app/[locale]/layout.tsx @@ -1,32 +1,36 @@ -import { NextIntlClientProvider } from 'next-intl' -import { notFound } from 'next/navigation' -import { getServerSession } from 'next-auth' -import dayjs from 'dayjs' -import relativeTime from 'dayjs/plugin/relativeTime' -import timezone from 'dayjs/plugin/timezone' -import utc from 'dayjs/plugin/utc' -import { type ReactNode } from 'react' -import { Providers } from './providers' -import { getAuthOptions } from '~/auth' -import '~/styles/globals.css' -import { ThemeProvider } from '~/components/ui/theme-provider' +import dayjs from "dayjs"; +import relativeTime from "dayjs/plugin/relativeTime"; +import timezone from "dayjs/plugin/timezone"; +import utc from "dayjs/plugin/utc"; +import { getServerSession } from "next-auth"; +import { NextIntlClientProvider } from "next-intl"; +import { notFound } from "next/navigation"; +import { type ReactNode } from "react"; -dayjs.extend(relativeTime) -dayjs.extend(utc) -dayjs.extend(timezone) +import { getAuthOptions } from "~/auth"; +import { ThemeProvider } from "~/components/ui/theme-provider"; -export default async function Layout({ children, params: { locale } }: { - children: ReactNode - params: { locale: string } +import "~/styles/globals.css"; +import { Providers } from "./providers"; + +dayjs.extend(relativeTime); +dayjs.extend(utc); +dayjs.extend(timezone); + +export default async function Layout({ + children, + params: { locale }, +}: { + children: ReactNode; + params: { locale: string }; }) { - let messages + let messages; try { - messages = (await import(`../../messages/${locale}.json`)).default - } - catch { - notFound() + messages = (await import(`../../messages/${locale}.json`)).default; + } catch { + notFound(); } - const session = await getServerSession(getAuthOptions()) + const session = await getServerSession(getAuthOptions()); return ( <html lang={locale}> @@ -35,21 +39,12 @@ export default async function Layout({ children, params: { locale } }: { </head> <body> - <ThemeProvider - enableSystem - attribute="class" - defaultTheme="system" - > - <NextIntlClientProvider - locale={locale} - messages={messages} - > - <Providers session={session}> - {children} - </Providers> + <ThemeProvider enableSystem attribute="class" defaultTheme="system"> + <NextIntlClientProvider locale={locale} messages={messages}> + <Providers session={session}>{children}</Providers> </NextIntlClientProvider> </ThemeProvider> </body> </html> - ) + ); } diff --git a/packages/web/app/[locale]/page.tsx b/packages/web/app/[locale]/page.tsx index ca347db..248db2d 100644 --- a/packages/web/app/[locale]/page.tsx +++ b/packages/web/app/[locale]/page.tsx @@ -1,6 +1,11 @@ -import Home from './home' -import Layout from '~/components/layout' +import Layout from "~/components/layout"; + +import Home from "./home"; export default async function HomePage() { - return <Layout><Home /></Layout> + return ( + <Layout> + <Home /> + </Layout> + ); } diff --git a/packages/web/app/[locale]/providers.tsx b/packages/web/app/[locale]/providers.tsx index c76f1b2..2110d76 100644 --- a/packages/web/app/[locale]/providers.tsx +++ b/packages/web/app/[locale]/providers.tsx @@ -1,70 +1,67 @@ -'use client' +"use client"; -import { useEffect } from 'react' -import { SessionProvider, useSession } from 'next-auth/react' -import dayjs from 'dayjs' -import relativeTime from 'dayjs/plugin/relativeTime' -import timezone from 'dayjs/plugin/timezone' -import utc from 'dayjs/plugin/utc' -import { usePathname, useRouter } from 'next-intl/client' -import dynamic from 'next/dynamic' -import { type ReactElement, type ReactNode } from 'react' -import { type Session } from 'next-auth' -import { type User } from '@prisma/client' -import { serviceGetProjects } from '~/services/projects' -import { useQuery } from '~/hooks/use-query' -import '~/styles/nprogress.css' -import { Toaster } from '~/components/ui/toaster' -import { ThemeProvider } from '~/components/ui/theme-provider' -import { TooltipProvider } from '~/components/ui/tooltip' +import { type User } from "@prisma/client"; +import dayjs from "dayjs"; +import relativeTime from "dayjs/plugin/relativeTime"; +import timezone from "dayjs/plugin/timezone"; +import utc from "dayjs/plugin/utc"; +import { type Session } from "next-auth"; +import { SessionProvider, useSession } from "next-auth/react"; +import { usePathname, useRouter } from "next-intl/client"; +import dynamic from "next/dynamic"; +import { useEffect } from "react"; +import { type ReactElement, type ReactNode } from "react"; + +import { ThemeProvider } from "~/components/ui/theme-provider"; +import { Toaster } from "~/components/ui/toaster"; + +import "~/styles/nprogress.css"; +import { TooltipProvider } from "~/components/ui/tooltip"; +import { useQuery } from "~/hooks/use-query"; +import { serviceGetProjects } from "~/services/projects"; const TopProgressBar = dynamic( () => { - return import('~/components/top-progress-bar') + return import("~/components/top-progress-bar"); }, { ssr: false }, -) -dayjs.extend(relativeTime) -dayjs.extend(utc) -dayjs.extend(timezone) +); +dayjs.extend(relativeTime); +dayjs.extend(utc); +dayjs.extend(timezone); function Controller({ children }: { children: ReactElement }) { - const router = useRouter() - const pathname = usePathname() - const session = useSession() - const { data: projects } = useQuery( - () => serviceGetProjects(session.data?.user as User), - { enabled: session.status === 'authenticated' }, - ) + const router = useRouter(); + const pathname = usePathname(); + const session = useSession(); + const { data: projects } = useQuery(() => serviceGetProjects(session.data?.user as User), { + enabled: session.status === "authenticated", + }); useEffect(() => { - if (session.status === 'unauthenticated' && pathname !== '/auth/signin') { - router.replace('/auth/signin') + if (session.status === "unauthenticated" && pathname !== "/auth/signin") { + router.replace("/auth/signin"); } - }, [pathname, session]) + }, [pathname, session]); useEffect(() => { - if (session.status === 'authenticated' && projects && projects.length === 0) { - router.replace('/create-project') + if (session.status === "authenticated" && projects && projects.length === 0) { + router.replace("/create-project"); } - }, [session, projects]) + }, [session, projects]); - return children + return children; } interface Props { - children: ReactNode - session: Session | null + children: ReactNode; + session: Session | null; } export function Providers({ children, session }: Props) { return ( <SessionProvider session={session}> <Controller> - <ThemeProvider - enableSystem - attribute="class" - defaultTheme="system" - > + <ThemeProvider enableSystem attribute="class" defaultTheme="system"> <TooltipProvider> <Toaster /> <TopProgressBar /> @@ -73,5 +70,5 @@ export function Providers({ children, session }: Props) { </ThemeProvider> </Controller> </SessionProvider> - ) + ); } diff --git a/packages/web/app/api/auth/[...nextauth]/route.ts b/packages/web/app/api/auth/[...nextauth]/route.ts index 1e91eb1..2389eaf 100644 --- a/packages/web/app/api/auth/[...nextauth]/route.ts +++ b/packages/web/app/api/auth/[...nextauth]/route.ts @@ -1,7 +1,8 @@ -import NextAuth from 'next-auth' -import { getAuthOptions } from '~/auth' +import NextAuth from "next-auth"; -const authOptions = await getAuthOptions() -const handler = NextAuth(authOptions) +import { getAuthOptions } from "~/auth"; -export { handler as GET, handler as POST } +const authOptions = await getAuthOptions(); +const handler = NextAuth(authOptions); + +export { handler as GET, handler as POST }; diff --git a/packages/web/app/api/events/[id]/route.ts b/packages/web/app/api/events/[id]/route.ts index f26da80..b60f8b5 100644 --- a/packages/web/app/api/events/[id]/route.ts +++ b/packages/web/app/api/events/[id]/route.ts @@ -1,12 +1,13 @@ -import { NextResponse } from 'next/server' -import { serviceGetEvent } from '~/services/events' +import { NextResponse } from "next/server"; + +import { serviceGetEvent } from "~/services/events"; export async function GET(_: Request, { params }: { params: { id: string } }) { if (params.id) { - const event = await serviceGetEvent({ id: params.id }) + const event = await serviceGetEvent({ id: params.id }); if (event) { - return NextResponse.json(event) + return NextResponse.json(event); } } - return NextResponse.next() + return NextResponse.next(); } diff --git a/packages/web/app/api/fs/[name]/route.ts b/packages/web/app/api/fs/[name]/route.ts index 178a093..160b4f4 100644 --- a/packages/web/app/api/fs/[name]/route.ts +++ b/packages/web/app/api/fs/[name]/route.ts @@ -1,24 +1,28 @@ -import fs from 'node:fs/promises' -import { NextResponse } from 'next/server' -import { getAuth } from '~/libs/middleware' +import fs from "node:fs/promises"; + +import { NextResponse } from "next/server"; + +import { getAuth } from "~/libs/middleware"; export async function POST(request: Request, { params }: { params: { name: string } }) { - const auth = await getAuth() - if (!auth) return NextResponse.next() + const auth = await getAuth(); + if (!auth) return NextResponse.next(); try { - const { data } = await request.json() + const { data } = await request.json(); // @ts-expect-error need to do this - const result = await (fs[params.name]?.(...data)) + const result = await fs[params.name]?.(...data); return NextResponse.json({ data: result, success: true, - }) - } - catch (error) { - return NextResponse.json({ - success: false, - errorMessage: `${error}`, - }, { status: 500 }) + }); + } catch (error) { + return NextResponse.json( + { + success: false, + errorMessage: `${error}`, + }, + { status: 500 }, + ); } } diff --git a/packages/web/app/api/prisma/[name]/route.ts b/packages/web/app/api/prisma/[name]/route.ts index aa74311..c613a5f 100644 --- a/packages/web/app/api/prisma/[name]/route.ts +++ b/packages/web/app/api/prisma/[name]/route.ts @@ -1,46 +1,49 @@ -import { NextResponse } from 'next/server' -import { getAuth } from '~/libs/middleware' -import { getPrisma } from '~/db' +import { NextResponse } from "next/server"; -const methods = [ - '$queryRaw', - '$queryRawUnsafe', -] +import { getPrisma } from "~/db"; +import { getAuth } from "~/libs/middleware"; + +const methods = ["$queryRaw", "$queryRawUnsafe"]; export async function POST(request: Request, { params }: { params: { name: string } }) { - const auth = await getAuth() - if (!auth) return NextResponse.next() + const auth = await getAuth(); + if (!auth) return NextResponse.next(); try { - const prisma = getPrisma() - const { operate, data } = await request.json() + const prisma = getPrisma(); + const { operate, data } = await request.json(); if (methods.includes(params.name)) { // @ts-expect-error need to do this - const result = await prisma[params.name](data) + const result = await prisma[params.name](data); if (result) { return NextResponse.json({ data: result, success: true, - }) + }); } } // @ts-expect-error need to do this - const result = await prisma[params.name][operate](data) + const result = await prisma[params.name][operate](data); if (result) { return NextResponse.json({ data: result, success: true, - }) + }); } - return NextResponse.json({ - success: false, - errorMessage: `NotFound: ${params.name}`, - }, { status: 404 }) - } - catch (error) { - return NextResponse.json({ - success: false, - errorMessage: `${error}`, - }, { status: 500 }) + return NextResponse.json( + { + success: false, + errorMessage: `NotFound: ${params.name}`, + }, + { status: 404 }, + ); + } catch (error) { + return NextResponse.json( + { + success: false, + errorMessage: `${error}`, + }, + { status: 500 }, + ); } } diff --git a/packages/web/app/api/releases/[id]/sourceMaps/[sourceMapId]/route.ts b/packages/web/app/api/releases/[id]/sourceMaps/[sourceMapId]/route.ts index 46ac443..3cdc51b 100644 --- a/packages/web/app/api/releases/[id]/sourceMaps/[sourceMapId]/route.ts +++ b/packages/web/app/api/releases/[id]/sourceMaps/[sourceMapId]/route.ts @@ -1,28 +1,32 @@ -import { readFile } from 'node:fs/promises' -import { NextResponse } from 'next/server' -import { getAuth } from '~/libs/middleware' -import { serviceGetRelease } from '~/services/releases' +import { readFile } from "node:fs/promises"; + +import { NextResponse } from "next/server"; + +import { getAuth } from "~/libs/middleware"; +import { serviceGetRelease } from "~/services/releases"; export async function GET(_: Request, { params }: { params: { id: string; sourceMapId: string } }) { - const auth = await getAuth() - if (!auth) return NextResponse.next() + const auth = await getAuth(); + if (!auth) return NextResponse.next(); - const sourceMapId = params.sourceMapId - const releaseId = Number.parseInt(params.id as string) + const sourceMapId = params.sourceMapId; + const releaseId = Number.parseInt(params.id as string); - const release = await serviceGetRelease({ id: releaseId }) - const sourceMaps = release.sourceMaps as Array<any> - const sourceMap = sourceMaps?.find(({ id }) => id === sourceMapId) + const release = await serviceGetRelease({ id: releaseId }); + const sourceMaps = release.sourceMaps as Array<any>; + const sourceMap = sourceMaps?.find(({ id }) => id === sourceMapId); if (sourceMap.path) { - const buffer = await readFile(sourceMap.path) + const buffer = await readFile(sourceMap.path); return new Response(buffer, { headers: { - 'Content-Type': sourceMap.mimetype, - 'Content-Disposition': `attachment; filename=${sourceMap.originalname}`, + "Content-Type": sourceMap.mimetype, + "Content-Disposition": `attachment; filename=${sourceMap.originalname}`, }, - }) - } - else { - return NextResponse.json({ success: false, errorMessage: 'Internal Server Error' }, { status: 404 }) + }); + } else { + return NextResponse.json( + { success: false, errorMessage: "Internal Server Error" }, + { status: 404 }, + ); } } diff --git a/packages/web/app/layout.tsx b/packages/web/app/layout.tsx index da93c64..49c08f9 100644 --- a/packages/web/app/layout.tsx +++ b/packages/web/app/layout.tsx @@ -1,9 +1,9 @@ -import { type ReactNode } from 'react' +import { type ReactNode } from "react"; interface Props { - children: ReactNode + children: ReactNode; } export default function RootLayout({ children }: Props) { - return children + return children; } diff --git a/packages/web/app/not-found.tsx b/packages/web/app/not-found.tsx index b4c0dc8..a47b3e0 100644 --- a/packages/web/app/not-found.tsx +++ b/packages/web/app/not-found.tsx @@ -1,6 +1,6 @@ -'use client' +"use client"; -import Error from 'next/error' +import Error from "next/error"; // This page renders when a route is requested that doesn't match the // middleware and therefore doesn't have a locale associated with it. @@ -12,5 +12,5 @@ export default function NotFound() { <Error statusCode={404} /> </body> </html> - ) + ); } diff --git a/packages/web/app/page.tsx b/packages/web/app/page.tsx index 58d0c14..820c73f 100644 --- a/packages/web/app/page.tsx +++ b/packages/web/app/page.tsx @@ -1,6 +1,7 @@ -import { redirect } from 'next/navigation' -import { defaultLocale } from '~/middleware' +import { redirect } from "next/navigation"; + +import { defaultLocale } from "~/middleware"; export default function RootPage() { - return redirect(`/${defaultLocale}`) + return redirect(`/${defaultLocale}`); } diff --git a/packages/web/atoms/invite.ts b/packages/web/atoms/invite.ts index d1ef280..a6d35ed 100644 --- a/packages/web/atoms/invite.ts +++ b/packages/web/atoms/invite.ts @@ -1,10 +1,10 @@ -import { atomWithStorage } from 'jotai/utils' +import { atomWithStorage } from "jotai/utils"; interface userIdAndProjectId { - projectId: number - userId: string + projectId: number; + userId: string; } export const inviteAtom = atomWithStorage<userIdAndProjectId | null>( - 'invite.userIdAndProjectId', + "invite.userIdAndProjectId", null, -) +); diff --git a/packages/web/atoms/issue.ts b/packages/web/atoms/issue.ts index d1a82ec..9749cfd 100644 --- a/packages/web/atoms/issue.ts +++ b/packages/web/atoms/issue.ts @@ -1,7 +1,8 @@ -import { atomWithStorage } from 'jotai/utils' -import { type SearchIssuesOrderBy } from '~/services/issues' +import { atomWithStorage } from "jotai/utils"; + +import { type SearchIssuesOrderBy } from "~/services/issues"; export const issueSortAtom = atomWithStorage<SearchIssuesOrderBy>( - 'issue.searchIssuesSort', - 'updatedAt', -) + "issue.searchIssuesSort", + "updatedAt", +); diff --git a/packages/web/auth.ts b/packages/web/auth.ts index 6f95bc1..c8e98c1 100644 --- a/packages/web/auth.ts +++ b/packages/web/auth.ts @@ -1,69 +1,74 @@ -import CredentialsProvider from 'next-auth/providers/credentials' -import GithubProvider from 'next-auth/providers/github' -import EmailProvider from 'next-auth/providers/email' -import { PrismaAdapter } from '@next-auth/prisma-adapter' -import { getConfig } from 'config' -import { type NextAuthOptions } from 'next-auth' -import { getPrisma } from '~/db' -import { serviceGetUser, serviceLogin } from '~/services/users' +import { PrismaAdapter } from "@next-auth/prisma-adapter"; +import { getConfig } from "config"; +import { type NextAuthOptions } from "next-auth"; +import CredentialsProvider from "next-auth/providers/credentials"; +import EmailProvider from "next-auth/providers/email"; +import GithubProvider from "next-auth/providers/github"; + +import { getPrisma } from "~/db"; +import { serviceGetUser, serviceLogin } from "~/services/users"; export const getAuthOptions = (): NextAuthOptions => { - const config = getConfig() + const config = getConfig(); const options: NextAuthOptions = { adapter: PrismaAdapter(getPrisma()), - session: { strategy: 'jwt' }, + session: { strategy: "jwt" }, providers: [ CredentialsProvider({ - name: 'Credentials', + name: "Credentials", credentials: { - email: { label: 'email', type: 'text', placeholder: 'email' }, - password: { label: 'Password', type: 'password' }, + email: { label: "email", type: "text", placeholder: "email" }, + password: { label: "Password", type: "password" }, }, async authorize(credentials) { try { if (credentials) { - const user = await serviceLogin({ email: credentials?.email, password: credentials?.password }) + const user = await serviceLogin({ + email: credentials?.email, + password: credentials?.password, + }); if (user) { - return user + return user; } } - return null - } - catch (error) { - console.error(error) - return null + return null; + } catch (error) { + console.error(error); + return null; } }, }), ], callbacks: { jwt: async ({ token, user }) => { - if (user) token.user = user - return token + if (user) token.user = user; + return token; }, async session({ session, user, token }) { - if (user) session.user = user + if (user) session.user = user; if (token) { // @ts-expect-error token 有 user - const userData = await serviceGetUser(token.user?.id || user?.id) - if (!userData) return session - session.user = userData - if ('password' in session.user) delete session.user.password + const userData = await serviceGetUser(token.user?.id || user?.id); + if (!userData) return session; + session.user = userData; + if ("password" in session.user) delete session.user.password; } - return session + return session; }, }, - pages: { signIn: '/auth/signin' }, - } + pages: { signIn: "/auth/signin" }, + }; if (config?.email) { - options.providers.push(EmailProvider(config.email)) + options.providers.push(EmailProvider(config.email)); } if (config?.oauth?.github) { - options.providers.push(GithubProvider({ - clientId: config?.oauth?.github?.clientId, - clientSecret: config?.oauth?.github.clientSecret, - httpOptions: { timeout: 10000 }, - })) + options.providers.push( + GithubProvider({ + clientId: config?.oauth?.github?.clientId, + clientSecret: config?.oauth?.github.clientSecret, + httpOptions: { timeout: 10000 }, + }), + ); } - return options -} + return options; +}; diff --git a/packages/web/components/accordion-section.tsx b/packages/web/components/accordion-section.tsx index 77a007d..e7e3ff4 100644 --- a/packages/web/components/accordion-section.tsx +++ b/packages/web/components/accordion-section.tsx @@ -1,66 +1,53 @@ -'use client' +"use client"; + +import { type ReactNode } from "react"; -import { type ReactNode } from 'react' -import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card' import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, -} from '~/components/ui/accordion' +} from "~/components/ui/accordion"; +import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; interface Props { - className?: string - title?: string - head?: ReactNode - collapse?: ReactNode - collapseTitle?: ReactNode - children?: ReactNode + className?: string; + title?: string; + head?: ReactNode; + collapse?: ReactNode; + collapseTitle?: ReactNode; + children?: ReactNode; } -export default function AccordionSection({ title, head, collapse, collapseTitle, children, ...props }: Props) { +export default function AccordionSection({ + title, + head, + collapse, + collapseTitle, + children, + ...props +}: Props) { return ( <div {...props}> - <h2 className="font-semibold"> - {title} - </h2> + <h2 className="font-semibold">{title}</h2> <Card className="mt-4"> - { - head - ? ( - <CardHeader> - <CardTitle className="font-semibold"> - {head} - </CardTitle> - </CardHeader> - ) - : null - } - { - collapse - ? ( - <Accordion - collapsible - type="single" - > - <AccordionItem value="item-1"> - <AccordionTrigger> - <span className="flex-1 font-semibold text-left"> - {collapseTitle} - </span> - </AccordionTrigger> - <AccordionContent> - {collapse} - </AccordionContent> - </AccordionItem> - </Accordion> - ) - : null - } - <CardContent> - {children} - </CardContent> + {head ? ( + <CardHeader> + <CardTitle className="font-semibold">{head}</CardTitle> + </CardHeader> + ) : null} + {collapse ? ( + <Accordion collapsible type="single"> + <AccordionItem value="item-1"> + <AccordionTrigger> + <span className="flex-1 font-semibold text-left">{collapseTitle}</span> + </AccordionTrigger> + <AccordionContent>{collapse}</AccordionContent> + </AccordionItem> + </Accordion> + ) : null} + <CardContent>{children}</CardContent> </Card> </div> - ) + ); } diff --git a/packages/web/components/alert-list.tsx b/packages/web/components/alert-list.tsx index 26d7b39..bbfe226 100644 --- a/packages/web/components/alert-list.tsx +++ b/packages/web/components/alert-list.tsx @@ -1,117 +1,106 @@ -'use client' +"use client"; -import { useCallback } from 'react' -import dayjs from 'dayjs' -import Link from 'next/link' -import { type Alert } from '@prisma/client' -import useCurrentProject from '~/hooks/use-current-project' -import { serviceDeleteAlert } from '~/services/alerts' -import { useToast } from '~/components/ui/use-toast' -import { Badge } from '~/components/ui/badge' -import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' -import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from '~/components/ui/dropdown-menu' -import { Button } from '~/components/ui/button' +import { type Alert } from "@prisma/client"; +import dayjs from "dayjs"; +import Link from "next/link"; +import { useCallback } from "react"; + +import { Badge } from "~/components/ui/badge"; +import { Button } from "~/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuTrigger, +} from "~/components/ui/dropdown-menu"; +import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip"; +import { useToast } from "~/components/ui/use-toast"; +import useCurrentProject from "~/hooks/use-current-project"; +import { serviceDeleteAlert } from "~/services/alerts"; interface Props { - alerts: Alert[] - mutate: any + alerts: Alert[]; + mutate: any; } export default function AlertList({ alerts, mutate }: Props) { - const { projectId } = useCurrentProject() - const { toast } = useToast() + const { projectId } = useCurrentProject(); + const { toast } = useToast(); const onDelete = useCallback((id: number) => { serviceDeleteAlert({ id }) .then(() => { toast({ - title: 'Alert Deleted!', - description: 'Your alert has been deleted!', - }) - mutate() + title: "Alert Deleted!", + description: "Your alert has been deleted!", + }); + mutate(); }) .catch((error) => { toast({ - title: 'Alert Delete Error', + title: "Alert Delete Error", description: error.message, - variant: 'destructive', - }) - }) - }, []) + variant: "destructive", + }); + }); + }, []); return ( <div className="h-full overflow-x-hidden overflow-y-auto rounded-lg w-full"> - { - alerts.map((alert) => { - let variant = 'secondary' - if (alert.level === 'serious') variant = 'destructive' - if (alert.level === 'warning') variant = 'default' - return ( - <div - key={alert.id} - className="mb-2" - > - <div className="flex items-center gap-2"> - <Link - className="text-lg font-semibold" - href={`/${projectId}/alerts/${alert.id}`} - > - {alert.name} - </Link> - <Badge variant={variant as any}>{alert.level}</Badge> - </div> - - <div className="flex items-center justify-end flex-1 gap-2"> - <div className="flex gap-2"> - { - (alert.actions as Array<any>)?.map(action => ( - <Badge - key={action.uri} - variant="outline" - >{action.type} - </Badge> - )) - } - </div> - <Tooltip> + {alerts.map((alert) => { + let variant = "secondary"; + if (alert.level === "serious") variant = "destructive"; + if (alert.level === "warning") variant = "default"; + return ( + <div key={alert.id} className="mb-2"> + <div className="flex items-center gap-2"> + <Link className="text-lg font-semibold" href={`/${projectId}/alerts/${alert.id}`}> + {alert.name} + </Link> + <Badge variant={variant as any}>{alert.level}</Badge> + </div> - <TooltipTrigger asChild> - <div className="text-stone-500">{dayjs(alert.createdAt).fromNow()}</div> - </TooltipTrigger> - <TooltipContent> - <span>Updated at: {dayjs(alert.createdAt).format('YYYY-MM-DD HH:mm:ss')}</span> - </TooltipContent> - </Tooltip> - <DropdownMenu> - <DropdownMenuTrigger> - <Button - size="icon" - variant="outline" - > - <i className="i-ri-more-line" /> - </Button> - </DropdownMenuTrigger> - <DropdownMenuContent className="w-56"> - <DropdownMenuGroup> - <DropdownMenuItem> - <Link href={`/${projectId}/alerts/${alert.id}/edit`}> - Edit - </Link> - </DropdownMenuItem> - <DropdownMenuItem - onClick={() => { - onDelete(alert.id) - }} - > - Delete - </DropdownMenuItem> - </DropdownMenuGroup> - </DropdownMenuContent> - </DropdownMenu> + <div className="flex items-center justify-end flex-1 gap-2"> + <div className="flex gap-2"> + {(alert.actions as Array<any>)?.map((action) => ( + <Badge key={action.uri} variant="outline"> + {action.type} + </Badge> + ))} </div> + <Tooltip> + <TooltipTrigger asChild> + <div className="text-stone-500">{dayjs(alert.createdAt).fromNow()}</div> + </TooltipTrigger> + <TooltipContent> + <span>Updated at: {dayjs(alert.createdAt).format("YYYY-MM-DD HH:mm:ss")}</span> + </TooltipContent> + </Tooltip> + <DropdownMenu> + <DropdownMenuTrigger> + <Button size="icon" variant="outline"> + <i className="i-ri-more-line" /> + </Button> + </DropdownMenuTrigger> + <DropdownMenuContent className="w-56"> + <DropdownMenuGroup> + <DropdownMenuItem> + <Link href={`/${projectId}/alerts/${alert.id}/edit`}>Edit</Link> + </DropdownMenuItem> + <DropdownMenuItem + onClick={() => { + onDelete(alert.id); + }} + > + Delete + </DropdownMenuItem> + </DropdownMenuGroup> + </DropdownMenuContent> + </DropdownMenu> </div> - ) - }) - } + </div> + ); + })} </div> - ) + ); } diff --git a/packages/web/components/breadcrumbs.tsx b/packages/web/components/breadcrumbs.tsx index 97a61d1..1d6a752 100644 --- a/packages/web/components/breadcrumbs.tsx +++ b/packages/web/components/breadcrumbs.tsx @@ -1,54 +1,39 @@ -'use client' +"use client"; -import Link from 'next/link' -import Project from './project' -import Logo from './logo' -import useBreadcrumb from '~/hooks/use-breadcrumb' -import { Separator } from '~/components/ui/separator' +import Link from "next/link"; + +import { Separator } from "~/components/ui/separator"; +import useBreadcrumb from "~/hooks/use-breadcrumb"; + +import Logo from "./logo"; +import Project from "./project"; export default function Breadcrumbs() { - const [breadcrumbs] = useBreadcrumb() + const [breadcrumbs] = useBreadcrumb(); return ( <div className="flex items-center gap-2"> <Logo /> - <Separator - className="h-5 rotate-[26deg] mx-2" - orientation="vertical" - /> + <Separator className="h-5 rotate-[26deg] mx-2" orientation="vertical" /> <Project /> - {breadcrumbs.slice(0, -1).length > 0 - ? ( - <Separator - className="h-5 rotate-[26deg] mx-2" - orientation="vertical" - /> - ) - : null} + {breadcrumbs.slice(0, -1).length > 0 ? ( + <Separator className="h-5 rotate-[26deg] mx-2" orientation="vertical" /> + ) : null} <div className="flex items-center"> - { - breadcrumbs - .slice(0, -1) - .map(v => ( - <div key={v.path}> - <Link href={v.path}> - {v.breadcrumb} - </Link> - </div> - )) - } - - <Separator - className="h-5 rotate-[26deg] mx-2" - orientation="vertical" - /> + {breadcrumbs.slice(0, -1).map((v) => ( + <div key={v.path}> + <Link href={v.path}>{v.breadcrumb}</Link> + </div> + ))} + + <Separator className="h-5 rotate-[26deg] mx-2" orientation="vertical" /> <div className="ml-1 text-stone-500">{breadcrumbs.at(-1)?.breadcrumb}</div> </div> </div> - ) + ); } diff --git a/packages/web/components/charts/bar-chart.tsx b/packages/web/components/charts/bar-chart.tsx index ead3c75..d6fa3b8 100644 --- a/packages/web/components/charts/bar-chart.tsx +++ b/packages/web/components/charts/bar-chart.tsx @@ -1,6 +1,7 @@ -'use client' +"use client"; -import { memo, useCallback } from 'react' +import { useTheme } from "next-themes"; +import { memo, useCallback } from "react"; import { Bar, BarChart, @@ -9,22 +10,23 @@ import { type TooltipProps, XAxis, YAxis, -} from 'recharts' -import { useTheme } from 'next-themes' -import Loading from '../loading' -import { colors } from '~/styles/colors' +} from "recharts"; + +import { colors } from "~/styles/colors"; + +import Loading from "../loading"; interface Props { - data?: object[] - nameKey: string - valueKey: string - name?: string + data?: object[]; + nameKey: string; + valueKey: string; + name?: string; } -const BarChartComponent = memo<Props>(({ data, nameKey, valueKey, name = 'Events' }) => { - if (!data) return <Loading /> +const BarChartComponent = memo<Props>(({ data, nameKey, valueKey, name = "Events" }) => { + if (!data) return <Loading />; - const { resolvedTheme } = useTheme() + const { resolvedTheme } = useTheme(); const CustomTooltip = useCallback( ({ active, payload, label }: TooltipProps<string, string>) => { if (active && payload && payload.length > 0) { @@ -32,48 +34,34 @@ const BarChartComponent = memo<Props>(({ data, nameKey, valueKey, name = 'Events <div className="text-left bg-white dark:bg-stone-900 text-stone-900 dark:text-white rounded shadow-lg p-2"> <span>{label}</span> <br /> - <b>{payload[0].value} {name}</b> + <b> + {payload[0].value} {name} + </b> </div> - ) + ); } - return null + return null; }, [name], - ) + ); return ( - <ResponsiveContainer - height="100%" - width="100%" - > - <BarChart - data={data} - margin={{ top: 0, right: 0, bottom: 0, left: 0 }} - > - <XAxis - axisLine={false} - dataKey={nameKey} - height={20} - tickLine={false} - /> - <YAxis - axisLine={false} - dataKey={valueKey} - tickLine={false} - width={28} - /> + <ResponsiveContainer height="100%" width="100%"> + <BarChart data={data} margin={{ top: 0, right: 0, bottom: 0, left: 0 }}> + <XAxis axisLine={false} dataKey={nameKey} height={20} tickLine={false} /> + <YAxis axisLine={false} dataKey={valueKey} tickLine={false} width={28} /> <Tooltip content={CustomTooltip} /> <Bar dataKey={valueKey} - fill={resolvedTheme === 'light' ? colors.green[500] : colors.green[700]} + fill={resolvedTheme === "light" ? colors.green[500] : colors.green[700]} minPointSize={1} /> </BarChart> </ResponsiveContainer> - ) -}) + ); +}); -BarChartComponent.displayName = 'BarChart' +BarChartComponent.displayName = "BarChart"; -export default BarChartComponent +export default BarChartComponent; diff --git a/packages/web/components/charts/line-chart.tsx b/packages/web/components/charts/line-chart.tsx index 6c83b69..0681e4b 100644 --- a/packages/web/components/charts/line-chart.tsx +++ b/packages/web/components/charts/line-chart.tsx @@ -1,31 +1,26 @@ -'use client' +"use client"; -import { memo, useCallback } from 'react' -import { - Area, - AreaChart, - ResponsiveContainer, - Tooltip, - type TooltipProps, - XAxis, -} from 'recharts' -import dayjs from 'dayjs' -import { useTheme } from 'next-themes' -import Loading from '../loading' -import { colors } from '~/styles/colors' +import dayjs from "dayjs"; +import { useTheme } from "next-themes"; +import { memo, useCallback } from "react"; +import { Area, AreaChart, ResponsiveContainer, Tooltip, type TooltipProps, XAxis } from "recharts"; + +import { colors } from "~/styles/colors"; + +import Loading from "../loading"; interface Props { - data?: object[] - nameKey: string - valueKey: string - name?: string - tooltipType?: 'a' | 'b' + data?: object[]; + nameKey: string; + valueKey: string; + name?: string; + tooltipType?: "a" | "b"; } -const LineChart = memo<Props>(({ data, nameKey, valueKey, name = 'Events', tooltipType = 'a' }) => { - if (!data) return <Loading /> +const LineChart = memo<Props>(({ data, nameKey, valueKey, name = "Events", tooltipType = "a" }) => { + if (!data) return <Loading />; - const { resolvedTheme } = useTheme() + const { resolvedTheme } = useTheme(); const CustomTooltip = useCallback( ({ active, payload, label }: TooltipProps<string, string>) => { if (active && payload && payload.length > 0) { @@ -33,49 +28,43 @@ const LineChart = memo<Props>(({ data, nameKey, valueKey, name = 'Events', toolt <div className="text-left bg-white dark:bg-stone-900 text-stone-900 dark:text-white rounded shadow-lg p-2"> <span> {label} - { - tooltipType === 'b' && ( - <> - <br /> - {dayjs(name).format('h:00 A → h:59 A')} - </> - ) - } + {tooltipType === "b" && ( + <> + <br /> + {dayjs(name).format("h:00 A → h:59 A")} + </> + )} </span> <br /> - <b>{payload[0].value} {name}</b> + <b> + {payload[0].value} {name} + </b> </div> - ) + ); } - return null + return null; }, [name, tooltipType], - ) + ); return ( - <ResponsiveContainer - height="100%" - width="100%" - > + <ResponsiveContainer height="100%" width="100%"> <AreaChart data={data}> - <XAxis - dataKey={nameKey} - height={0} - /> + <XAxis dataKey={nameKey} height={0} /> <Tooltip content={CustomTooltip} /> <Area dataKey={valueKey} - fill={resolvedTheme === 'light' ? colors.green[50] : colors.green[300]} - stroke={resolvedTheme === 'light' ? colors.green[500] : colors.green[700]} + fill={resolvedTheme === "light" ? colors.green[50] : colors.green[300]} + stroke={resolvedTheme === "light" ? colors.green[500] : colors.green[700]} strokeWidth={4} type="monotone" /> </AreaChart> </ResponsiveContainer> - ) -}) + ); +}); -LineChart.displayName = 'LineChart' +LineChart.displayName = "LineChart"; -export default LineChart +export default LineChart; diff --git a/packages/web/components/charts/reference-line-chart.tsx b/packages/web/components/charts/reference-line-chart.tsx index 8140bc4..a8f5a23 100644 --- a/packages/web/components/charts/reference-line-chart.tsx +++ b/packages/web/components/charts/reference-line-chart.tsx @@ -1,6 +1,7 @@ -'use client' +"use client"; -import { memo, useCallback } from 'react' +import { useTheme } from "next-themes"; +import { memo, useCallback } from "react"; import { Area, AreaChart, @@ -10,85 +11,82 @@ import { type TooltipProps, XAxis, YAxis, -} from 'recharts' -import { useTheme } from 'next-themes' -import Loading from '../loading' -import { colors } from '~/styles/colors' +} from "recharts"; + +import { colors } from "~/styles/colors"; + +import Loading from "../loading"; interface Props { - data?: object[] - nameKey: string - valueKey: string - name?: string - plotValue: number[] - unit?: string + data?: object[]; + nameKey: string; + valueKey: string; + name?: string; + plotValue: number[]; + unit?: string; } -const ReferenceLineChart = memo<Props>(({ data, nameKey, valueKey, name = 'Events', plotValue, unit = 'ms' }) => { - if (!data) return <Loading /> +const ReferenceLineChart = memo<Props>( + ({ data, nameKey, valueKey, name = "Events", plotValue, unit = "ms" }) => { + if (!data) return <Loading />; - const { resolvedTheme } = useTheme() - const CustomTooltip = useCallback( - ({ active, payload, label }: TooltipProps<string, string>) => { - if (active && payload && payload.length > 0) { - return ( - <div className="text-left bg-white dark:bg-stone-900 text-stone-900 dark:text-white rounded shadow-lg p-2"> - <span>{label}</span> - <br /> - <b>{payload[0].value} {unit}</b> - </div> - ) - } + const { resolvedTheme } = useTheme(); + const CustomTooltip = useCallback( + ({ active, payload, label }: TooltipProps<string, string>) => { + if (active && payload && payload.length > 0) { + return ( + <div className="text-left bg-white dark:bg-stone-900 text-stone-900 dark:text-white rounded shadow-lg p-2"> + <span>{label}</span> + <br /> + <b> + {payload[0].value} {unit} + </b> + </div> + ); + } - return null - }, - [name], - ) + return null; + }, + [name], + ); - return ( - <ResponsiveContainer - height="100%" - width="100%" - > - <AreaChart data={data}> - <XAxis - dataKey={nameKey} - /> - <YAxis - dataKey={valueKey} - domain={[0, (plotValue?.[1] ?? 0) * 2]} - /> - <Tooltip content={CustomTooltip} /> - <Area - dataKey={valueKey} - fill={resolvedTheme === 'light' ? colors.green[50] : colors.green[300]} - stroke={resolvedTheme === 'light' ? colors.green[500] : colors.green[700]} - strokeWidth={4} - type="monotone" - /> - <ReferenceArea - fill={resolvedTheme === 'light' ? colors.green[50] : colors.green[200]} - label="GOOD" - y1={0} - y2={plotValue?.[0] ?? 0} - /> - <ReferenceArea - fill={resolvedTheme === 'light' ? colors.yellow[50] : colors.yellow[300]} - label="NEED IMPROVEMENT" - y1={plotValue?.[0] ?? 0} - y2={plotValue?.[1] ?? 0} - /> - <ReferenceArea - fill={resolvedTheme === 'light' ? colors.red[50] : colors.red[300]} - label="POOR" - y1={plotValue?.[1] ?? 0} - y2={(plotValue?.[1] ?? 0) * 2} - /> - </AreaChart> - </ResponsiveContainer> - ) -}) + return ( + <ResponsiveContainer height="100%" width="100%"> + <AreaChart data={data}> + <XAxis dataKey={nameKey} /> + <YAxis dataKey={valueKey} domain={[0, (plotValue?.[1] ?? 0) * 2]} /> + <Tooltip content={CustomTooltip} /> + <Area + dataKey={valueKey} + fill={resolvedTheme === "light" ? colors.green[50] : colors.green[300]} + stroke={resolvedTheme === "light" ? colors.green[500] : colors.green[700]} + strokeWidth={4} + type="monotone" + /> + <ReferenceArea + fill={resolvedTheme === "light" ? colors.green[50] : colors.green[200]} + label="GOOD" + y1={0} + y2={plotValue?.[0] ?? 0} + /> + <ReferenceArea + fill={resolvedTheme === "light" ? colors.yellow[50] : colors.yellow[300]} + label="NEED IMPROVEMENT" + y1={plotValue?.[0] ?? 0} + y2={plotValue?.[1] ?? 0} + /> + <ReferenceArea + fill={resolvedTheme === "light" ? colors.red[50] : colors.red[300]} + label="POOR" + y1={plotValue?.[1] ?? 0} + y2={(plotValue?.[1] ?? 0) * 2} + /> + </AreaChart> + </ResponsiveContainer> + ); + }, +); -ReferenceLineChart.displayName = 'ReferenceLineChart' +ReferenceLineChart.displayName = "ReferenceLineChart"; -export default ReferenceLineChart +export default ReferenceLineChart; diff --git a/packages/web/components/charts/vertical-bar-chart.tsx b/packages/web/components/charts/vertical-bar-chart.tsx index bb6dacc..669e4e9 100644 --- a/packages/web/components/charts/vertical-bar-chart.tsx +++ b/packages/web/components/charts/vertical-bar-chart.tsx @@ -1,6 +1,7 @@ -'use client' +"use client"; -import { memo, useCallback } from 'react' +import { useTheme } from "next-themes"; +import { memo, useCallback } from "react"; import { Bar, BarChart, @@ -9,22 +10,23 @@ import { type TooltipProps, XAxis, YAxis, -} from 'recharts' -import { useTheme } from 'next-themes' -import Loading from '../loading' -import { colors } from '~/styles/colors' +} from "recharts"; + +import { colors } from "~/styles/colors"; + +import Loading from "../loading"; interface Props { - data?: object[] - nameKey: string - valueKey: string - name?: string + data?: object[]; + nameKey: string; + valueKey: string; + name?: string; } -const VerticalBarChart = memo<Props>(({ data, nameKey, valueKey, name = 'Events' }) => { - if (!data) return <Loading /> +const VerticalBarChart = memo<Props>(({ data, nameKey, valueKey, name = "Events" }) => { + if (!data) return <Loading />; - const { resolvedTheme } = useTheme() + const { resolvedTheme } = useTheme(); const CustomTooltip = useCallback( ({ active, payload, label }: TooltipProps<string, string>) => { if (active && payload && payload.length > 0) { @@ -32,49 +34,35 @@ const VerticalBarChart = memo<Props>(({ data, nameKey, valueKey, name = 'Events' <div className="text-left bg-white dark:bg-stone-900 text-stone-900 dark:text-white rounded shadow-lg p-2"> <span>{label}</span> <br /> - <b>{payload[0].value} {name}</b> + <b> + {payload[0].value} {name} + </b> </div> - ) + ); } - return null + return null; }, [name], - ) + ); return ( - <ResponsiveContainer - height="100%" - width="100%" - > - <BarChart - data={data} - layout="vertical" - margin={{ top: 0, right: 0, bottom: 0, left: 0 }} - > - <XAxis - axisLine={false} - tickLine={false} - type="number" - /> - <YAxis - axisLine={false} - dataKey={nameKey} - tickLine={false} - type="category" - /> + <ResponsiveContainer height="100%" width="100%"> + <BarChart data={data} layout="vertical" margin={{ top: 0, right: 0, bottom: 0, left: 0 }}> + <XAxis axisLine={false} tickLine={false} type="number" /> + <YAxis axisLine={false} dataKey={nameKey} tickLine={false} type="category" /> <Tooltip /> <Bar // barSize={20} dataKey={valueKey} - fill={resolvedTheme === 'light' ? colors.green[500] : colors.green[700]} + fill={resolvedTheme === "light" ? colors.green[500] : colors.green[700]} minPointSize={1} /> </BarChart> </ResponsiveContainer> - ) -}) + ); +}); -VerticalBarChart.displayName = 'VerticalBarChart' +VerticalBarChart.displayName = "VerticalBarChart"; -export default VerticalBarChart +export default VerticalBarChart; diff --git a/packages/web/components/data-table/data-table.tsx b/packages/web/components/data-table/data-table.tsx index 813c779..c450f53 100644 --- a/packages/web/components/data-table/data-table.tsx +++ b/packages/web/components/data-table/data-table.tsx @@ -1,23 +1,20 @@ -'use client' +"use client"; import { flexRender, getCoreRowModel, getSortedRowModel, useReactTable, -} from '@tanstack/react-table' +} from "@tanstack/react-table"; import { type ColumnDef, - type PaginationState, type RowSelectionState, - type SortingState, -} from '@tanstack/react-table' -import { type ReactNode, useEffect, useState } from 'react' +} from "@tanstack/react-table"; +import { type ReactNode, useEffect, useState } from "react"; -import { DataTablePagination } from './pagination' -import Loading from '~/components/loading' +import Loading from "~/components/loading"; import { Table, TableBody, @@ -25,30 +22,32 @@ import { TableHead, TableHeader, TableRow, -} from '~/components/ui/table' +} from "~/components/ui/table"; + +import { DataTablePagination } from "./pagination"; interface DataTableProps<TData, TValue> { - columns: ColumnDef<TData, TValue>[] - data?: TData[] - pageCount?: number - empty?: ReactNode - onPaginationChange?: ({ pageIndex, pageSize }: PaginationState) => void + columns: ColumnDef<TData, TValue>[]; + data?: TData[]; + pageCount?: number; + empty?: ReactNode; + onPaginationChange?: ({ pageIndex, pageSize }: PaginationState) => void; } export default function DataTable<TData, TValue>({ columns, data, pageCount = -1, - empty = 'No results.', + empty = "No results.", onPaginationChange, }: DataTableProps<TData, TValue>) { if (!data) { - return <Loading /> + return <Loading />; } - const [rowSelection, setRowSelection] = useState<RowSelectionState>({}) - const [sorting, setSorting] = useState<SortingState>([]) - const [pagination, setPagination] = useState<PaginationState>({ pageIndex: 0, pageSize: 10 }) + const [rowSelection, setRowSelection] = useState<RowSelectionState>({}); + const [sorting, setSorting] = useState<SortingState>([]); + const [pagination, setPagination] = useState<PaginationState>({ pageIndex: 0, pageSize: 10 }); const table = useReactTable({ data, @@ -61,64 +60,53 @@ export default function DataTable<TData, TValue>({ onPaginationChange: setPagination, state: { rowSelection, sorting, pagination }, manualPagination: true, - }) + }); useEffect(() => { - onPaginationChange?.(pagination) - }, [pagination]) + onPaginationChange?.(pagination); + }, [pagination]); return ( <div className="space-y-4"> <div className="rounded-md border"> <Table> <TableHeader> - {table.getHeaderGroups().map(headerGroup => ( + {table.getHeaderGroups().map((headerGroup) => ( <TableRow key={headerGroup.id}> {headerGroup.headers.map((header) => { return ( <TableHead key={header.id}> {header.isPlaceholder ? null - : flexRender( - header.column.columnDef.header, - header.getContext(), - )} + : flexRender(header.column.columnDef.header, header.getContext())} </TableHead> - ) + ); })} </TableRow> ))} </TableHeader> <TableBody> - {table.getRowModel().rows?.length - ? ( - table.getRowModel().rows.map(row => ( - <TableRow - key={row.id} - data-state={row.getIsSelected() && 'selected'} - > - {row.getVisibleCells().map(cell => ( - <TableCell key={cell.id}> - {flexRender(cell.column.columnDef.cell, cell.getContext())} - </TableCell> - ))} - </TableRow> - )) - ) - : ( - <TableRow> - <TableCell - className="h-24 text-center" - colSpan={columns.length} - > - {empty} - </TableCell> + {table.getRowModel().rows?.length ? ( + table.getRowModel().rows.map((row) => ( + <TableRow key={row.id} data-state={row.getIsSelected() && "selected"}> + {row.getVisibleCells().map((cell) => ( + <TableCell key={cell.id}> + {flexRender(cell.column.columnDef.cell, cell.getContext())} + </TableCell> + ))} </TableRow> - )} + )) + ) : ( + <TableRow> + <TableCell className="h-24 text-center" colSpan={columns.length}> + {empty} + </TableCell> + </TableRow> + )} </TableBody> </Table> </div> <DataTablePagination table={table} /> </div> - ) + ); } diff --git a/packages/web/components/data-table/index.ts b/packages/web/components/data-table/index.ts index 0a65b12..68f0e4c 100644 --- a/packages/web/components/data-table/index.ts +++ b/packages/web/components/data-table/index.ts @@ -1 +1 @@ -export { default } from './data-table' +export { default } from "./data-table"; diff --git a/packages/web/components/data-table/pagination.tsx b/packages/web/components/data-table/pagination.tsx index 1f3ac4e..e1d5f56 100644 --- a/packages/web/components/data-table/pagination.tsx +++ b/packages/web/components/data-table/pagination.tsx @@ -1,22 +1,23 @@ -import { type Table } from '@tanstack/react-table' -import { Button } from '~/components/ui/button' +import { type Table } from "@tanstack/react-table"; + +import { Button } from "~/components/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, -} from '~/components/ui/select' +} from "~/components/ui/select"; interface DataTablePaginationProps<TData> { - table: Table<TData> + table: Table<TData>; } export function DataTablePagination<TData>({ table }: DataTablePaginationProps<TData>) { return ( <div className="flex items-center justify-between px-2"> <div className="flex-1 text-sm text-muted-foreground"> - {table.getFilteredSelectedRowModel().rows.length} of{' '} + {table.getFilteredSelectedRowModel().rows.length} of{" "} {table.getFilteredRowModel().rows.length} row(s) selected. </div> <div className="flex items-center space-x-6 lg:space-x-8"> @@ -25,18 +26,15 @@ export function DataTablePagination<TData>({ table }: DataTablePaginationProps<T <Select value={`${table.getState().pagination.pageSize}`} onValueChange={(value) => { - table.setPageSize(Number(value)) + table.setPageSize(Number(value)); }} > <SelectTrigger className="h-8 w-[70px]"> <SelectValue placeholder={table.getState().pagination.pageSize} /> </SelectTrigger> <SelectContent side="top"> - {[10, 20, 30, 40, 50].map(pageSize => ( - <SelectItem - key={pageSize} - value={`${pageSize}`} - > + {[10, 20, 30, 40, 50].map((pageSize) => ( + <SelectItem key={pageSize} value={`${pageSize}`}> {pageSize} </SelectItem> ))} @@ -44,8 +42,7 @@ export function DataTablePagination<TData>({ table }: DataTablePaginationProps<T </Select> </div> <div className="flex w-[100px] items-center justify-center text-sm font-medium"> - Page {table.getState().pagination.pageIndex + 1} of{' '} - {table.getPageCount()} + Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()} </div> <div className="flex items-center space-x-2"> <Button @@ -87,5 +84,5 @@ export function DataTablePagination<TData>({ table }: DataTablePaginationProps<T </div> </div> </div> - ) + ); } diff --git a/packages/web/components/empty-issues.tsx b/packages/web/components/empty-issues.tsx index 436f5a7..1da5e39 100644 --- a/packages/web/components/empty-issues.tsx +++ b/packages/web/components/empty-issues.tsx @@ -1,38 +1,28 @@ -'use client' +"use client"; -import Link from 'next/link' -import { useTranslations } from 'next-intl' -import useCurrentProject from '~/hooks/use-current-project' -import { Button } from '~/components/ui/button' +import { useTranslations } from "next-intl"; +import Link from "next/link"; + +import { Button } from "~/components/ui/button"; +import useCurrentProject from "~/hooks/use-current-project"; export default function EmptyIssues() { - const { projectId } = useCurrentProject() - const t = useTranslations('Issues.Empty') + const { projectId } = useCurrentProject(); + const t = useTranslations("Issues.Empty"); return ( <div className="flex flex-col gap-4 p-6"> - <div>{t('gettingStarted')}</div> + <div>{t("gettingStarted")}</div> <div> - <Link - href="https://ohbug.net/guide/getting-started.html" - target="_blank" - > + <Link href="https://ohbug.net/guide/getting-started.html" target="_blank"> <Button> <i className="i-ri-external-link-line mr-2" /> Getting Started </Button> </Link> </div> - <div>{t('getApiKey')}</div> - <Link - href={`/${projectId}/settings`} - > - Get apiKey - </Link> - <div>{t('needMockData')}</div> - <Link - href={`/${projectId}/mock`} - > - Mock - </Link> + <div>{t("getApiKey")}</div> + <Link href={`/${projectId}/settings`}>Get apiKey</Link> + <div>{t("needMockData")}</div> + <Link href={`/${projectId}/mock`}>Mock</Link> </div> - ) + ); } diff --git a/packages/web/components/event-detail-action.tsx b/packages/web/components/event-detail-action.tsx index b82f4ac..1aeefd6 100644 --- a/packages/web/components/event-detail-action.tsx +++ b/packages/web/components/event-detail-action.tsx @@ -1,72 +1,74 @@ -'use client' +"use client"; -import dayjs from 'dayjs' -import { useMemo } from 'react' -import { type OhbugEventLike } from 'common' -import { type OhbugAction } from '@ohbug/types' -import Wrapper from './wrapper' -import AccordionSection from './accordion-section' -import { getMessageAndIconByActionType } from '~/libs/utils' -import { Badge } from '~/components/ui/badge' -import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' +import { type OhbugAction } from "@ohbug/types"; +import { type OhbugEventLike } from "common"; +import dayjs from "dayjs"; +import { useMemo } from "react"; + +import { Badge } from "~/components/ui/badge"; +import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip"; +import { getMessageAndIconByActionType } from "~/libs/utils"; + +import AccordionSection from "./accordion-section"; +import Wrapper from "./wrapper"; interface Props { - event: OhbugEventLike + event: OhbugEventLike; } export default function EventDetailActions({ event }: Props) { - const actions = useMemo<OhbugAction[]>(() => [ - ...event?.actions ?? [], { - type: 'exception', - timestamp: event.createdAt as unknown as string, - message: event.detail.message, - data: event.detail, - }, - ], [event]) + const actions = useMemo<OhbugAction[]>( + () => [ + ...(event?.actions ?? []), + { + type: "exception", + timestamp: event.createdAt as unknown as string, + message: event.detail.message, + data: event.detail, + }, + ], + [event], + ); return ( <Wrapper> <AccordionSection title="Event Actions"> <div className="flex flex-col gap-4 max-h-56 overflow-y-auto"> - { - actions.map((action, index) => { - const { message, icon, color } = getMessageAndIconByActionType(action) - return ( - <div - key={action.timestamp + action.data} - className="flex items-center justify-between gap-2 w-full" - > - <div className="relative w-36"> - <Badge style={{ backgroundColor: color }}> - {icon} - <span className="font-semibold">{action.type}</span> - </Badge> - { - index !== actions.length - 1 && ( - <div className="border-r absolute left-4 h-full w-full" /> - ) - } - </div> - - <div className="flex-1"> - <span className="text-sm text-stone-500">{message}</span> - </div> + {actions.map((action, index) => { + const { message, icon, color } = getMessageAndIconByActionType(action); + return ( + <div + key={action.timestamp + action.data} + className="flex items-center justify-between gap-2 w-full" + > + <div className="relative w-36"> + <Badge style={{ backgroundColor: color }}> + {icon} + <span className="font-semibold">{action.type}</span> + </Badge> + {index !== actions.length - 1 && ( + <div className="border-r absolute left-4 h-full w-full" /> + )} + </div> - <Tooltip> - <TooltipTrigger> - <span className="text-sm text-stone-500"> - {dayjs(action.timestamp).format('HH:mm:ss')} - </span> - </TooltipTrigger> - <TooltipContent> - <span>{dayjs(action.timestamp).format('YYYY-MM-DD HH:mm:ss')}</span> - </TooltipContent> - </Tooltip> + <div className="flex-1"> + <span className="text-sm text-stone-500">{message}</span> </div> - ) - }) - } + + <Tooltip> + <TooltipTrigger> + <span className="text-sm text-stone-500"> + {dayjs(action.timestamp).format("HH:mm:ss")} + </span> + </TooltipTrigger> + <TooltipContent> + <span>{dayjs(action.timestamp).format("YYYY-MM-DD HH:mm:ss")}</span> + </TooltipContent> + </Tooltip> + </div> + ); + })} </div> </AccordionSection> </Wrapper> - ) + ); } diff --git a/packages/web/components/event-detail-profile.tsx b/packages/web/components/event-detail-profile.tsx index 0ae9f46..d4af78f 100644 --- a/packages/web/components/event-detail-profile.tsx +++ b/packages/web/components/event-detail-profile.tsx @@ -1,113 +1,115 @@ -'use client' +"use client"; -import dayjs from 'dayjs' -import { useMemo } from 'react' -import { useTranslations } from 'next-intl' -import { type OhbugEventLike } from 'common' -import Link from 'next/link' -import Wrapper from './wrapper' -import { Separator } from './ui/separator' -import { getDeviceInfo } from '~/libs/utils' -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '~/components/ui/card' -import { Badge } from '~/components/ui/badge' -import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' +import { type OhbugEventLike } from "common"; +import dayjs from "dayjs"; +import { useTranslations } from "next-intl"; +import Link from "next/link"; +import { useMemo } from "react"; + +import { Badge } from "~/components/ui/badge"; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "~/components/ui/card"; +import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip"; +import { getDeviceInfo } from "~/libs/utils"; + +import { Separator } from "./ui/separator"; +import Wrapper from "./wrapper"; interface Props { - event: OhbugEventLike | any + event: OhbugEventLike | any; } export default function EventDetailProfile({ event }: Props) { - const t = useTranslations('Event') - const deviceInfo = useMemo(() => getDeviceInfo(event), [event]) + const t = useTranslations("Event"); + const deviceInfo = useMemo(() => getDeviceInfo(event), [event]); const tagList = useMemo(() => { - const result = [] + const result = []; if (event?.createdAt) { result.push({ - key: 'time', - title: `${t('profileTimestamp')}: ${dayjs(event.createdAt).format('YYYY-MM-DD HH:mm:ss')}`, + key: "time", + title: `${t("profileTimestamp")}: ${dayjs(event.createdAt).format("YYYY-MM-DD HH:mm:ss")}`, value: dayjs(event.createdAt).fromNow(), icon: <i className="i-ri-time-line" />, - }) + }); } if (event?.user?.uuid) { result.push({ - key: 'uuid', + key: "uuid", title: `UUID: ${event?.user?.uuid}`, value: event?.user?.uuid, icon: <i className="i-ri-fingerprint-line" />, - }) + }); } if (event?.user?.ipAddress) { result.push({ - key: 'ip', + key: "ip", title: `IP: ${event?.user?.ipAddress}`, value: event?.user?.ipAddress, icon: <i className="i-ri-links-line" />, - }) + }); } if (event?.device?.title) { result.push({ - key: 'title', - title: `${t('profileTitle')}: ${event.device.title}`, + key: "title", + title: `${t("profileTitle")}: ${event.device.title}`, value: event.device.title, icon: <i className="i-ri-heading" />, - }) + }); } if (event?.device?.url) { result.push({ - key: 'url', + key: "url", title: `URL: ${event.device.url}`, value: event.device.url, icon: <i className="i-ri-linkedin-line" />, - }) + }); } if (event?.device?.language) { result.push({ - key: 'language', - title: `${t('profileLanguage')}: ${event.device.language}`, + key: "language", + title: `${t("profileLanguage")}: ${event.device.language}`, value: event.device.language, icon: <i className="i-ri-earth-line" />, - }) + }); } if (event?.appVersion) { result.push({ - key: 'appVersion', + key: "appVersion", title: `AppVersion: ${event.appVersion}`, value: event.appVersion, icon: <i className="i-ri-cake-line" />, - }) + }); } if (event?.appType) { result.push({ - key: 'appType', + key: "appType", title: `AppType: ${event.appType}`, value: event.appType, icon: <i className="i-ri-cake-2-line" />, - }) + }); } if (event?.releaseStage) { result.push({ - key: 'releaseStage', + key: "releaseStage", title: `ReleaseStage: ${event.releaseStage}`, value: event.releaseStage, icon: <i className="i-ri-cake-3-line" />, - }) + }); } if ( - event?.device?.device?.screenWidth - && event?.device?.device?.screenHeight - && event?.device?.device?.pixelRatio + event?.device?.device?.screenWidth && + event?.device?.device?.screenHeight && + event?.device?.device?.pixelRatio ) { result.push({ - key: 'dpi', - title: `${t('profileDPI')}: ${event?.device?.device?.screenWidth} × ${event?.device?.device?.screenHeight} @ ${event?.device?.device?.pixelRatio}x`, + key: "dpi", + title: `${t("profileDPI")}: ${event?.device?.device?.screenWidth} × ${event?.device?.device?.screenHeight} @ ${event?.device?.device?.pixelRatio}x`, value: `${event?.device?.device?.screenWidth} × ${event?.device?.device?.screenHeight} @ ${event?.device?.device?.pixelRatio}x`, icon: <i className="i-ri-computer-line" />, - }) + }); } - return result - }, [event]) + return result; + }, [event]); return ( <Wrapper> @@ -115,138 +117,89 @@ export default function EventDetailProfile({ event }: Props) { <CardHeader> <CardTitle>Event Environment</CardTitle> <CardDescription> - { - event.category === 'error' - ? ( - <Link - href={`/api/events/${event.id}`} - > - JSON Raw {event.id} - </Link> - ) - : null - } + {event.category === "error" ? ( + <Link href={`/api/events/${event.id}`}>JSON Raw {event.id}</Link> + ) : null} </CardDescription> </CardHeader> <CardContent> <div className="flex flex-wrap gap-4"> {/* 浏览器 */} - { - deviceInfo?.browser - ? ( - <> - <div className="flex flex-col"> - <div>{deviceInfo?.browser?.name ?? ''}</div> - <div>{deviceInfo?.browser?.version ?? ''}</div> - </div> - <Separator - className="h-12" - orientation="vertical" - /> - </> - ) - : null - } + {deviceInfo?.browser ? ( + <> + <div className="flex flex-col"> + <div>{deviceInfo?.browser?.name ?? ""}</div> + <div>{deviceInfo?.browser?.version ?? ""}</div> + </div> + <Separator className="h-12" orientation="vertical" /> + </> + ) : null} {/* 系统 */} - { - deviceInfo?.os - ? ( - <> - <div className="flex flex-col"> - <div>{deviceInfo?.os?.name ?? ''}</div> - <div>{deviceInfo?.os?.version ?? ''}</div> - </div> - <Separator - className="h-12" - orientation="vertical" - /> - </> - ) - : null - } + {deviceInfo?.os ? ( + <> + <div className="flex flex-col"> + <div>{deviceInfo?.os?.name ?? ""}</div> + <div>{deviceInfo?.os?.version ?? ""}</div> + </div> + <Separator className="h-12" orientation="vertical" /> + </> + ) : null} {/* App */} - { - deviceInfo?.app - ? ( - <> - <div className="flex flex-col"> - <div>{deviceInfo?.app ?? ''}</div> - <div>{`${deviceInfo?.version} / ${deviceInfo?.SDKVersion}`}</div> - </div> - <Separator - className="h-12" - orientation="vertical" - /> - </> - ) - : null - } + {deviceInfo?.app ? ( + <> + <div className="flex flex-col"> + <div>{deviceInfo?.app ?? ""}</div> + <div>{`${deviceInfo?.version} / ${deviceInfo?.SDKVersion}`}</div> + </div> + <Separator className="h-12" orientation="vertical" /> + </> + ) : null} {/* 品牌 */} - { - (deviceInfo?.device && deviceInfo?.device?.brand) - ? ( - <> - <div> - <div>{deviceInfo?.device?.brand ?? ''}</div> - <div>{deviceInfo?.device?.model ?? ''}</div> - </div> - <Separator - className="h-12" - orientation="vertical" - /> - </> - ) - : null - } + {deviceInfo?.device && deviceInfo?.device?.brand ? ( + <> + <div> + <div>{deviceInfo?.device?.brand ?? ""}</div> + <div>{deviceInfo?.device?.model ?? ""}</div> + </div> + <Separator className="h-12" orientation="vertical" /> + </> + ) : null} {/* 平台 */} - { - deviceInfo?.platform - ? ( - <> - <div className="flex flex-col"> - <div>{deviceInfo?.platform ?? ''}</div> - <div>{deviceInfo?.system ?? ''}</div> - </div> - <Separator - className="h-12" - orientation="vertical" - /> - </> - ) - : null - } + {deviceInfo?.platform ? ( + <> + <div className="flex flex-col"> + <div>{deviceInfo?.platform ?? ""}</div> + <div>{deviceInfo?.system ?? ""}</div> + </div> + <Separator className="h-12" orientation="vertical" /> + </> + ) : null} {/* SDK */} - { - deviceInfo?.sdk - ? ( - <div className="flex flex-col"> - <div>{deviceInfo?.sdk.platform ?? ''}</div> - <div>{deviceInfo?.sdk.version ?? ''}</div> - </div> - ) - : null - } + {deviceInfo?.sdk ? ( + <div className="flex flex-col"> + <div>{deviceInfo?.sdk.platform ?? ""}</div> + <div>{deviceInfo?.sdk.version ?? ""}</div> + </div> + ) : null} </div> <div className="flex flex-wrap gap-2 mt-6"> - { - tagList.map(tag => ( - <Tooltip key={tag.key}> - <TooltipTrigger> - <Badge className="space-x-2"> - {tag.icon} - {tag.value} - </Badge> - </TooltipTrigger> - <TooltipContent> - <span>{tag.title}</span> - </TooltipContent> - </Tooltip> - )) - } + {tagList.map((tag) => ( + <Tooltip key={tag.key}> + <TooltipTrigger> + <Badge className="space-x-2"> + {tag.icon} + {tag.value} + </Badge> + </TooltipTrigger> + <TooltipContent> + <span>{tag.title}</span> + </TooltipContent> + </Tooltip> + ))} </div> </CardContent> </Card> </Wrapper> - ) + ); } diff --git a/packages/web/components/event-detail-stack.tsx b/packages/web/components/event-detail-stack.tsx index 0fcc5ab..5541037 100644 --- a/packages/web/components/event-detail-stack.tsx +++ b/packages/web/components/event-detail-stack.tsx @@ -1,13 +1,15 @@ -'use client' +"use client"; -import { type OhbugEventLike } from 'common' -import StackInfo from './stack-info' -import Wrapper from './wrapper' -import AccordionSection from './accordion-section' -import { renderStringOrJson } from '~/libs/utils' +import { type OhbugEventLike } from "common"; + +import { renderStringOrJson } from "~/libs/utils"; + +import AccordionSection from "./accordion-section"; +import StackInfo from "./stack-info"; +import Wrapper from "./wrapper"; interface Props { - event: OhbugEventLike + event: OhbugEventLike; } export default function EventDetailStack({ event }: Props) { @@ -17,53 +19,35 @@ export default function EventDetailStack({ event }: Props) { collapseTitle="Code" title="Error Stack" collapse={ - (event.detail.stack && event?.source) - ? ( - <div className="mb-4"> - <StackInfo - source={event?.source} - /> - </div> - ) - : null - } - head={ - event.detail.message ? renderStringOrJson(event.detail.message) : null - } + event.detail.stack && event?.source ? ( + <div className="mb-4"> + <StackInfo source={event?.source} /> + </div> + ) : null + } + head={event.detail.message ? renderStringOrJson(event.detail.message) : null} > {/* unhandledrejectionError */} {/* uncaughtError */} <pre className="mt-4 break-words"> - {typeof event.detail.stack === 'string' ? event.detail.stack : JSON.stringify(event.detail.stack)} + {typeof event.detail.stack === "string" + ? event.detail.stack + : JSON.stringify(event.detail.stack)} </pre> {/* resourceError */} - { - event?.detail.selector - ? ( - <div className="mb-4"> - {renderStringOrJson(event.detail)} - </div> - ) - : null - } + {event?.detail.selector ? ( + <div className="mb-4">{renderStringOrJson(event.detail)}</div> + ) : null} {/* ajaxError */} {/* fetchError */} - { - event?.type === 'ajaxError' && ( - <div className="mb-4"> - {renderStringOrJson(event.detail)} - </div> - ) - } + {event?.type === "ajaxError" && ( + <div className="mb-4">{renderStringOrJson(event.detail)}</div> + )} {/* websocketError */} - { - event?.type === 'websocketError' && ( - <div className="mb-4"> - {renderStringOrJson(event.detail)} - </div> - ) - } + {event?.type === "websocketError" && ( + <div className="mb-4">{renderStringOrJson(event.detail)}</div> + )} </AccordionSection> </Wrapper> - ) + ); } diff --git a/packages/web/components/event-detail-trend.tsx b/packages/web/components/event-detail-trend.tsx index 1a1d494..e4e7cfc 100644 --- a/packages/web/components/event-detail-trend.tsx +++ b/packages/web/components/event-detail-trend.tsx @@ -1,84 +1,70 @@ -'use client' +"use client"; -import dayjs from 'dayjs' -import { useTranslations } from 'next-intl' -import { type Issue } from 'common' -import Wrapper from './wrapper' -import AccordionSection from './accordion-section' -import BarChart from './charts/bar-chart' -import { type IssueTrend } from '~/services/issues' -import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' +import { type Issue } from "common"; +import dayjs from "dayjs"; +import { useTranslations } from "next-intl"; + +import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip"; +import { type IssueTrend } from "~/services/issues"; + +import AccordionSection from "./accordion-section"; +import BarChart from "./charts/bar-chart"; +import Wrapper from "./wrapper"; interface Props { - issue: Issue + issue: Issue; trends: { - '14d': IssueTrend[] - '24h': IssueTrend[] - } + "14d": IssueTrend[]; + "24h": IssueTrend[]; + }; } export default function EventDetailTrend({ issue, trends }: Props) { - const ct = useTranslations('Common') + const ct = useTranslations("Common"); return ( <Wrapper> <AccordionSection title="Event Trends" head={ - ( - <div className="flex flex-wrap"> - <div className="flex flex-col"> - <div>{ct('firstSeen')}</div> - <Tooltip> - <TooltipTrigger> - <div> - {dayjs(issue?.createdAt).fromNow()} - </div> - </TooltipTrigger> - <TooltipContent> - <span>{dayjs(issue?.createdAt).format('YYYY-MM-DD HH:mm:ss A')}</span> - </TooltipContent> - </Tooltip> - </div> - <div className="flex flex-col"> - <div>{ct('lastSeen')}</div> - <Tooltip> - <TooltipTrigger> - <div> - {dayjs(issue?.updatedAt).fromNow()} - </div> - </TooltipTrigger> - <TooltipContent> - <span>{dayjs(issue?.updatedAt).format('YYYY-MM-DD HH:mm:ss A')}</span> - </TooltipContent> - </Tooltip> - </div> + <div className="flex flex-wrap"> + <div className="flex flex-col"> + <div>{ct("firstSeen")}</div> + <Tooltip> + <TooltipTrigger> + <div>{dayjs(issue?.createdAt).fromNow()}</div> + </TooltipTrigger> + <TooltipContent> + <span>{dayjs(issue?.createdAt).format("YYYY-MM-DD HH:mm:ss A")}</span> + </TooltipContent> + </Tooltip> </div> - ) + <div className="flex flex-col"> + <div>{ct("lastSeen")}</div> + <Tooltip> + <TooltipTrigger> + <div>{dayjs(issue?.updatedAt).fromNow()}</div> + </TooltipTrigger> + <TooltipContent> + <span>{dayjs(issue?.updatedAt).format("YYYY-MM-DD HH:mm:ss A")}</span> + </TooltipContent> + </Tooltip> + </div> + </div> } > <div className="mb-12"> - <h3 className="mb-4">{ct('14d')}</h3> + <h3 className="mb-4">{ct("14d")}</h3> <div className="h-32"> - <BarChart - data={trends['14d']} - nameKey="time" - tooltipType="a" - valueKey="count" - /> + <BarChart data={trends["14d"]} nameKey="time" tooltipType="a" valueKey="count" /> </div> </div> <div> - <h3 className="mb-4">{ct('24h')}</h3> + <h3 className="mb-4">{ct("24h")}</h3> <div className="h-32"> - <BarChart - data={trends['24h']} - nameKey="time" - tooltipType="b" - valueKey="count" - /> + <BarChart data={trends["24h"]} nameKey="time" tooltipType="b" valueKey="count" /> </div> </div> </AccordionSection> </Wrapper> - ) + ); } diff --git a/packages/web/components/event-detail-user.tsx b/packages/web/components/event-detail-user.tsx index f245cb0..7f516b8 100644 --- a/packages/web/components/event-detail-user.tsx +++ b/packages/web/components/event-detail-user.tsx @@ -1,14 +1,15 @@ -'use client' +"use client"; -import dynamic from 'next/dynamic' -import { type OhbugEventLike } from 'common' -import Wrapper from './wrapper' -import AccordionSection from './accordion-section' +import { type OhbugEventLike } from "common"; +import dynamic from "next/dynamic"; -const DynamicReactJson = dynamic(import('react-json-view'), { ssr: false }) +import AccordionSection from "./accordion-section"; +import Wrapper from "./wrapper"; + +const DynamicReactJson = dynamic(import("react-json-view"), { ssr: false }); interface Props { - event: OhbugEventLike | any + event: OhbugEventLike | any; } export default function EventDetailUser({ event }: Props) { @@ -18,5 +19,5 @@ export default function EventDetailUser({ event }: Props) { <DynamicReactJson src={event.user} /> </AccordionSection> </Wrapper> - ) + ); } diff --git a/packages/web/components/events-list.tsx b/packages/web/components/events-list.tsx index 9091313..7587a59 100644 --- a/packages/web/components/events-list.tsx +++ b/packages/web/components/events-list.tsx @@ -1,91 +1,93 @@ -'use client' +"use client"; -import Link from 'next/link' -import dayjs from 'dayjs' -import { type Event } from '@prisma/client' -import { type OhbugEventLike } from 'common' -import { ColumnDef } from '@tanstack/react-table' -import { useMemo } from 'react' -import { renderStringOrJson } from '~/libs/utils' -import useCurrentProject from '~/hooks/use-current-project' -import DataTable from '~/components/data-table' +import { type Event } from "@prisma/client"; +import { ColumnDef } from "@tanstack/react-table"; +import { type OhbugEventLike } from "common"; +import dayjs from "dayjs"; +import Link from "next/link"; +import { useMemo } from "react"; + +import DataTable from "~/components/data-table"; +import useCurrentProject from "~/hooks/use-current-project"; +import { renderStringOrJson } from "~/libs/utils"; interface Props { - events?: Event[] | OhbugEventLike[] + events?: Event[] | OhbugEventLike[]; } export default function EventsList({ events }: Props) { - const { projectId } = useCurrentProject() + const { projectId } = useCurrentProject(); const columns = useMemo<ColumnDef<Event | OhbugEventLike>[]>( () => [ { - id: 'description', - header: 'TITLE', + id: "description", + header: "TITLE", cell: ({ row }) => { - const detail = row.getValue('detail') + const detail = row.getValue("detail"); return ( <div> - <Link href={`/${projectId}/issues/${row.getValue('issueId')}/?eventId=${row.getValue('id')}`}> - {dayjs(row.getValue('createdAt')).format('YYYY-MM-DD HH:mm:ss')} + <Link + href={`/${projectId}/issues/${row.getValue("issueId")}/?eventId=${row.getValue("id")}`} + > + {dayjs(row.getValue("createdAt")).format("YYYY-MM-DD HH:mm:ss")} </Link> - <div className="truncate max-w-xs">{row.getValue('type')}: {renderStringOrJson((detail as any)?.message ?? detail)}</div> + <div className="truncate max-w-xs"> + {row.getValue("type")}: {renderStringOrJson((detail as any)?.message ?? detail)} + </div> </div> - ) + ); }, }, { - accessorKey: 'appType', - header: 'APPTYPE', + accessorKey: "appType", + header: "APPTYPE", }, { - accessorKey: 'appVersion', - header: 'APPVERSION', + accessorKey: "appVersion", + header: "APPVERSION", }, { - accessorKey: 'category', - header: 'CATEGORY', + accessorKey: "category", + header: "CATEGORY", }, { - accessorKey: 'releaseStage', - header: 'RELEASESTAGE', + accessorKey: "releaseStage", + header: "RELEASESTAGE", }, { - accessorKey: 'user', - header: 'USER', + accessorKey: "user", + header: "USER", cell: ({ row }) => ( - <div className="line-clamp-2">{renderStringOrJson(row.getValue('user' || ''))}</div> + <div className="line-clamp-2">{renderStringOrJson(row.getValue("user" || ""))}</div> ), }, { - accessorKey: 'sdk', - header: 'SDK', + accessorKey: "sdk", + header: "SDK", cell: ({ row }) => ( - <div className="line-clamp-2">{renderStringOrJson(row.getValue('sdk'))}</div> + <div className="line-clamp-2">{renderStringOrJson(row.getValue("sdk"))}</div> ), }, { - accessorKey: 'device', - header: 'DEVICE', + accessorKey: "device", + header: "DEVICE", cell: ({ row }) => ( - <div className="line-clamp-2">{renderStringOrJson(row.getValue('device'))}</div> + <div className="line-clamp-2">{renderStringOrJson(row.getValue("device"))}</div> ), }, { - accessorKey: 'metadata', - header: 'METADATA', + accessorKey: "metadata", + header: "METADATA", cell: ({ row }) => ( - <div className="line-clamp-2 max-w-xs">{renderStringOrJson(row.getValue('metadata'))}</div> + <div className="line-clamp-2 max-w-xs"> + {renderStringOrJson(row.getValue("metadata"))} + </div> ), }, ], [projectId], - ) + ); - return ( - <DataTable - columns={columns} - data={events} - /> - ) + return <DataTable columns={columns} data={events} />; } diff --git a/packages/web/components/feedbacks-list.tsx b/packages/web/components/feedbacks-list.tsx index eddabe9..69b6745 100644 --- a/packages/web/components/feedbacks-list.tsx +++ b/packages/web/components/feedbacks-list.tsx @@ -1,52 +1,48 @@ -'use client' +"use client"; -import Link from 'next/link' -import dayjs from 'dayjs' -import { useMemo } from 'react' -import { type EventUser, type Feedback } from '@prisma/client' -import { ColumnDef } from '@tanstack/react-table' -import DataTable from '~/components/data-table' -import { renderStringOrJson } from '~/libs/utils' -import useCurrentProject from '~/hooks/use-current-project' +import { type EventUser, type Feedback } from "@prisma/client"; +import { ColumnDef } from "@tanstack/react-table"; +import dayjs from "dayjs"; +import Link from "next/link"; +import { useMemo } from "react"; + +import DataTable from "~/components/data-table"; +import useCurrentProject from "~/hooks/use-current-project"; +import { renderStringOrJson } from "~/libs/utils"; interface Props { - feedbacks?: (Feedback & { user: EventUser })[] + feedbacks?: (Feedback & { user: EventUser })[]; } export default function FeedbacksList({ feedbacks }: Props) { - const { projectId } = useCurrentProject() + const { projectId } = useCurrentProject(); const columns = useMemo<ColumnDef<Feedback & { user: EventUser }>[]>( () => [ { - accessorKey: 'detail', - header: 'feedback', + accessorKey: "detail", + header: "feedback", cell: ({ row }) => { return ( <Link href={`/${projectId}/feedbacks/${row.original.id}`}> - {(row.getValue('detail') as any)?.feedback} + {(row.getValue("detail") as any)?.feedback} </Link> - ) + ); }, }, { - accessorKey: 'createdAt', - header: 'createdAt', - cell: ({ row }) => dayjs(row.getValue('createdAt')).format('YYYY-MM-DD HH:mm:ss'), + accessorKey: "createdAt", + header: "createdAt", + cell: ({ row }) => dayjs(row.getValue("createdAt")).format("YYYY-MM-DD HH:mm:ss"), }, { - accessorKey: 'user', - header: 'user', - cell: ({ row }) => renderStringOrJson(row.getValue('user')), + accessorKey: "user", + header: "user", + cell: ({ row }) => renderStringOrJson(row.getValue("user")), }, ], [projectId], - ) + ); - return ( - <DataTable - columns={columns} - data={feedbacks} - /> - ) + return <DataTable columns={columns} data={feedbacks} />; } diff --git a/packages/web/components/footer.tsx b/packages/web/components/footer.tsx index 16126e8..f1bcaa5 100644 --- a/packages/web/components/footer.tsx +++ b/packages/web/components/footer.tsx @@ -1,31 +1,24 @@ -'use client' +"use client"; -import Link from 'next/link' -import Logo from './logo' -import Intl from './intl' -import Theme from './theme' +import Link from "next/link"; + +import Intl from "./intl"; +import Logo from "./logo"; +import Theme from "./theme"; export default function Footer() { return ( <footer className="flex items-center justify-between"> <div className="flex items-center gap-4"> <Logo /> - <div className="text-sm text-stone-500"> - v{process.env.NEXT_PUBLIC_VERSION} - </div> + <div className="text-sm text-stone-500">v{process.env.NEXT_PUBLIC_VERSION}</div> </div> <div className="flex items-center gap-4"> - <Link - href="https://github.com/ohbug-org" - target="_blank" - > + <Link href="https://github.com/ohbug-org" target="_blank"> <i className="i-ri-github-fill text-xl" /> </Link> - <Link - href="https://discord.gg/FmxaBSBumM" - target="_blank" - > + <Link href="https://discord.gg/FmxaBSBumM" target="_blank"> <i className="i-ri-discord-fill text-xl" /> </Link> </div> @@ -35,5 +28,5 @@ export default function Footer() { <Theme /> </div> </footer> - ) + ); } diff --git a/packages/web/components/intl.tsx b/packages/web/components/intl.tsx index 744b769..e12e0cb 100644 --- a/packages/web/components/intl.tsx +++ b/packages/web/components/intl.tsx @@ -1,57 +1,59 @@ -'use client' +"use client"; -import { useCallback, useTransition } from 'react' -import { usePathname } from 'next-intl/client' -import { useLocale } from 'next-intl' -import { useRouter } from 'next/navigation' -import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '~/components/ui/select' +import { useLocale } from "next-intl"; +import { usePathname } from "next-intl/client"; +import { useRouter } from "next/navigation"; +import { useCallback, useTransition } from "react"; + +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectTrigger, + SelectValue, +} from "~/components/ui/select"; const options = [ { - label: '中文', - value: 'zh', + label: "中文", + value: "zh", }, { - label: 'English', - value: 'en', + label: "English", + value: "en", }, -] +]; export default function Intl() { - const router = useRouter() - const pathname = usePathname() - const [isPending, startTransition] = useTransition() - const locale = useLocale() + const router = useRouter(); + const pathname = usePathname(); + const [isPending, startTransition] = useTransition(); + const locale = useLocale(); - const handleChange = useCallback(async (value: string) => { - startTransition(() => { - router.replace(`/${value}${pathname}`) - }) - }, [pathname]) + const handleChange = useCallback( + async (value: string) => { + startTransition(() => { + router.replace(`/${value}${pathname}`); + }); + }, + [pathname], + ); return ( - <Select - disabled={isPending} - value={locale} - onValueChange={handleChange} - > + <Select disabled={isPending} value={locale} onValueChange={handleChange}> <SelectTrigger className="w-24"> <SelectValue placeholder="Select a fruit" /> </SelectTrigger> <SelectContent> <SelectGroup> - { - options.map(({ label, value }) => ( - <SelectItem - key={value} - value={value} - > - {label} - </SelectItem> - )) - } + {options.map(({ label, value }) => ( + <SelectItem key={value} value={value}> + {label} + </SelectItem> + ))} </SelectGroup> </SelectContent> </Select> - ) + ); } diff --git a/packages/web/components/introduce-chart.tsx b/packages/web/components/introduce-chart.tsx index a9859be..241e3a7 100644 --- a/packages/web/components/introduce-chart.tsx +++ b/packages/web/components/introduce-chart.tsx @@ -1,23 +1,28 @@ -'use client' +"use client"; -import { type ReactNode } from 'react' +import { type ReactNode } from "react"; interface Props { - title: string - value: string | number - unit?: string - description?: string - actions?: ReactNode - children: ReactNode + title: string; + value: string | number; + unit?: string; + description?: string; + actions?: ReactNode; + children: ReactNode; } -export default function IntroduceChart({ title, value, unit, description, actions, children }: Props) { +export default function IntroduceChart({ + title, + value, + unit, + description, + actions, + children, +}: Props) { return ( <div className="flex items-center gap-2 w-full"> <div className="flex flex-col w-[200px]"> - <div className="text-xl font-bold"> - {title} - </div> + <div className="text-xl font-bold">{title}</div> <div className="text-3xl"> {value} {unit} @@ -27,5 +32,5 @@ export default function IntroduceChart({ title, value, unit, description, action </div> <div className="flex-1 h-80">{children}</div> </div> - ) + ); } diff --git a/packages/web/components/issue-detail-tabs.tsx b/packages/web/components/issue-detail-tabs.tsx index 46e3aa7..3acf76e 100644 --- a/packages/web/components/issue-detail-tabs.tsx +++ b/packages/web/components/issue-detail-tabs.tsx @@ -1,81 +1,76 @@ -'use client' +"use client"; -import { useCallback, useMemo } from 'react' -import { usePathname, useRouter } from 'next-intl/client' -import { useSearchParams } from 'next/navigation' -import { useTranslations } from 'next-intl' -import { type OhbugEventLike } from 'common' -import useCurrentProject from '~/hooks/use-current-project' -import { Tabs, TabsList, TabsTrigger } from '~/components/ui/tabs' +import { type OhbugEventLike } from "common"; +import { useTranslations } from "next-intl"; +import { usePathname, useRouter } from "next-intl/client"; +import { useSearchParams } from "next/navigation"; +import { useCallback, useMemo } from "react"; + +import { Tabs, TabsList, TabsTrigger } from "~/components/ui/tabs"; +import useCurrentProject from "~/hooks/use-current-project"; interface Props { - event: OhbugEventLike + event: OhbugEventLike; } export default function IssueDetailTabs({ event }: Props) { - const t = useTranslations('Event') - const router = useRouter() - const pathname = usePathname() - const searchParams = useSearchParams() - const tab = searchParams.get('tab') - const { projectId } = useCurrentProject() + const t = useTranslations("Event"); + const router = useRouter(); + const pathname = usePathname(); + const searchParams = useSearchParams(); + const tab = searchParams.get("tab"); + const { projectId } = useCurrentProject(); const list = useMemo(() => { const base = [ { - label: t('tabsDetail'), - value: 'detail', - tab: 'detail', + label: t("tabsDetail"), + value: "detail", + tab: "detail", }, { - label: t('tabsEvents'), - value: 'events', - tab: 'events', + label: t("tabsEvents"), + value: "events", + tab: "events", }, - ] - let metadata = null + ]; + let metadata = null; try { - metadata = JSON.parse(event.metadata as unknown as string) - } - catch {} + metadata = JSON.parse(event.metadata as unknown as string); + } catch {} if (metadata) { Object.keys(metadata).forEach((key) => { base.push({ label: key, value: key, tab: key, - }) - }) + }); + }); } - return base - }, [event, router, projectId]) + return base; + }, [event, router, projectId]); const active = useMemo(() => { - const value = (list.find(item => item.tab === tab) || list[0]).value - return value - }, [list, tab]) - const handleTabChange = useCallback((value: string) => { - const item = list.find(v => v.value === value) - if (item) { - router.push(`${pathname}?tab=${item.tab}`) - } - }, [list, pathname]) + const value = (list.find((item) => item.tab === tab) || list[0]).value; + return value; + }, [list, tab]); + const handleTabChange = useCallback( + (value: string) => { + const item = list.find((v) => v.value === value); + if (item) { + router.push(`${pathname}?tab=${item.tab}`); + } + }, + [list, pathname], + ); return ( - <Tabs - value={active} - onValueChange={handleTabChange} - > + <Tabs value={active} onValueChange={handleTabChange}> <TabsList> - { - list.map(v => ( - <TabsTrigger - key={v.value} - value={v.value} - > - <a>{v.label}</a> - </TabsTrigger> - )) - } + {list.map((v) => ( + <TabsTrigger key={v.value} value={v.value}> + <a>{v.label}</a> + </TabsTrigger> + ))} </TabsList> </Tabs> - ) + ); } diff --git a/packages/web/components/issue-detail-title.tsx b/packages/web/components/issue-detail-title.tsx index e38bcc3..ee315a5 100644 --- a/packages/web/components/issue-detail-title.tsx +++ b/packages/web/components/issue-detail-title.tsx @@ -1,73 +1,56 @@ -'use client' +"use client"; -import { useMemo } from 'react' -import { useTranslations } from 'next-intl' -import { type Issue, type OhbugEventLike } from 'common' -import Title from './title' -import IssueDetailTabs from './issue-detail-tabs' -import { renderStringOrJson } from '~/libs/utils' -import { Badge } from '~/components/ui/badge' +import { type Issue, type OhbugEventLike } from "common"; +import { useTranslations } from "next-intl"; +import { useMemo } from "react"; + +import { Badge } from "~/components/ui/badge"; +import { renderStringOrJson } from "~/libs/utils"; + +import IssueDetailTabs from "./issue-detail-tabs"; +import Title from "./title"; interface Props { - issue: Issue - event: OhbugEventLike + issue: Issue; + event: OhbugEventLike; } export default function IssueDetailTitle({ issue, event }: Props) { - const t = useTranslations('Event') - const metadata = useMemo(() => JSON.parse(issue.metadata) || {}, [issue]) + const t = useTranslations("Event"); + const metadata = useMemo(() => JSON.parse(issue.metadata) || {}, [issue]); return ( <Title className="sticky top-12 z-50 !py-6 bg-background text-foreground shadow-sm" - bottomNodes={ - <IssueDetailTabs event={event} /> - } + bottomNodes={<IssueDetailTabs event={event} />} rightNodes={ - ( - <div className="flex gap-4"> - <div className="flex flex-col"> - <h3>{t('titleEvents')}</h3> - <div className="text-center font-bold">{issue._count?.events}</div> - </div> - <div className="flex flex-col"> - <h3>{t('titleUsers')}</h3> - <div className="text-center font-bold">{issue._count?.users}</div> - </div> + <div className="flex gap-4"> + <div className="flex flex-col"> + <h3>{t("titleEvents")}</h3> + <div className="text-center font-bold">{issue._count?.events}</div> </div> - ) + <div className="flex flex-col"> + <h3>{t("titleUsers")}</h3> + <div className="text-center font-bold">{issue._count?.users}</div> + </div> + </div> } > <div> <a className="line-clamp-2"> - <span className="font-semibold mr-2"> - {issue.type} - </span> - { - issue.releaseStage === 'mock' && ( - <Badge - className="mr-2" - variant="destructive" - > - Mock - </Badge> - ) - } + <span className="font-semibold mr-2">{issue.type}</span> + {issue.releaseStage === "mock" && ( + <Badge className="mr-2" variant="destructive"> + Mock + </Badge> + )} <code className="text-stone-500"> {renderStringOrJson(metadata.filename ?? metadata.others)} </code> </a> <div className="line-clamp-2 text-stone-500"> - { - metadata.message - ? ( - <code> - {renderStringOrJson(metadata.message)} - </code> - ) - : null - } + {metadata.message ? <code>{renderStringOrJson(metadata.message)}</code> : null} </div> </div> - ) + ); } diff --git a/packages/web/components/issue-list.tsx b/packages/web/components/issue-list.tsx index 7e1b611..bdcfaff 100644 --- a/packages/web/components/issue-list.tsx +++ b/packages/web/components/issue-list.tsx @@ -1,144 +1,154 @@ -'use client' +"use client"; -import { useCallback, useMemo, useRef, useState } from 'react' -import Link from 'next/link' -import { type Issue } from 'common' -import dayjs from 'dayjs' -import { useTranslations } from 'next-intl' -import { useDebounce } from 'react-use' -import { useAtom } from 'jotai' -import { type ReactNode } from 'react' -import { type ColumnDef, type PaginationState } from '@tanstack/react-table' -import { type SearchIssuesOrderBy } from '~/services/issues' +import { type ColumnDef, type PaginationState } from "@tanstack/react-table"; +import { type Issue } from "common"; +import dayjs from "dayjs"; +import { useAtom } from "jotai"; +import { useTranslations } from "next-intl"; +import Link from "next/link"; +import { useCallback, useMemo, useRef, useState } from "react"; +import { type ReactNode } from "react"; +import { useDebounce } from "react-use"; + +import { issueSortAtom } from "~/atoms/issue"; +import LineChart from "~/components/charts/line-chart"; +import DataTable from "~/components/data-table"; +import { Badge } from "~/components/ui/badge"; +import { Button } from "~/components/ui/button"; +import { Checkbox } from "~/components/ui/checkbox"; +import { + Dialog, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, +} from "~/components/ui/dialog"; import { - serviceDeleteIssues, - serviceGetIssues, - serviceGetIssuesTrends, -} from '~/services/issues' -import { renderStringOrJson } from '~/libs/utils' -import useCurrentProject from '~/hooks/use-current-project' -import { useQuery } from '~/hooks/use-query' -import { useInfinite } from '~/hooks/use-infinite' -import { issueSortAtom } from '~/atoms/issue' -import LineChart from '~/components/charts/line-chart' -import DataTable from '~/components/data-table' -import { useToast } from '~/components/ui/use-toast' -import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '~/components/ui/dropdown-menu' -import { Button } from '~/components/ui/button' -import { Switch } from '~/components/ui/switch' -import { Label } from '~/components/ui/label' -import { Badge } from '~/components/ui/badge' -import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' -import { Input } from '~/components/ui/input' -import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '~/components/ui/dialog' -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '~/components/ui/select' -import { Checkbox } from '~/components/ui/checkbox' + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "~/components/ui/dropdown-menu"; +import { Input } from "~/components/ui/input"; +import { Label } from "~/components/ui/label"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "~/components/ui/select"; +import { Switch } from "~/components/ui/switch"; +import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip"; +import { useToast } from "~/components/ui/use-toast"; +import useCurrentProject from "~/hooks/use-current-project"; +import { useInfinite } from "~/hooks/use-infinite"; +import { useQuery } from "~/hooks/use-query"; +import { renderStringOrJson } from "~/libs/utils"; +import { type SearchIssuesOrderBy } from "~/services/issues"; +import { serviceDeleteIssues, serviceGetIssues, serviceGetIssuesTrends } from "~/services/issues"; interface Props { - empty: ReactNode + empty: ReactNode; } export default function IssueList({ empty }: Props) { - const { toast } = useToast() - const t = useTranslations('Issues') - const ct = useTranslations('Common') - const { projectId } = useCurrentProject() - const [open, setOpen] = useState(false) - const cancelRef = useRef(null) - const [orderBy, setOrderBy] = useAtom(issueSortAtom) - const [query, setQuery] = useState('') - const [debouncedQuery, setDebouncedQuery] = useState('') + const { toast } = useToast(); + const t = useTranslations("Issues"); + const ct = useTranslations("Common"); + const { projectId } = useCurrentProject(); + const [open, setOpen] = useState(false); + const cancelRef = useRef(null); + const [orderBy, setOrderBy] = useAtom(issueSortAtom); + const [query, setQuery] = useState(""); + const [debouncedQuery, setDebouncedQuery] = useState(""); useDebounce( () => { - setDebouncedQuery(query) + setDebouncedQuery(query); }, 500, [query], - ) - const { data, setSize, mutate } - = useInfinite( - index => - serviceGetIssues({ - page: index + 1, - projectId: projectId!, - orderBy, - query: debouncedQuery, - }), - { - enabled: projectId !== undefined, - deps: [projectId, orderBy, debouncedQuery], - pagination: true, - }, - ) - const [chartType, setChartType] = useState<'24h' | '14d'>('24h') + ); + const { data, setSize, mutate } = useInfinite( + (index) => + serviceGetIssues({ + page: index + 1, + projectId: projectId!, + orderBy, + query: debouncedQuery, + }), + { + enabled: projectId !== undefined, + deps: [projectId, orderBy, debouncedQuery], + pagination: true, + }, + ); + const [chartType, setChartType] = useState<"24h" | "14d">("24h"); const { data: trends } = useQuery( () => serviceGetIssuesTrends({ - ids: data!.map(issue => issue.id).join(','), + ids: data!.map((issue) => issue.id).join(","), type: chartType, }), { enabled: !!data, deps: [data, chartType], }, - ) + ); const columns = useMemo[]>( - () => ([ + () => [ { - id: 'select', + id: "select", header: ({ table }) => ( table.toggleAllPageRowsSelected(!!value)} + onCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)} /> ), cell: ({ row }) => ( row.toggleSelected(!!value)} + onCheckedChange={(value) => row.toggleSelected(!!value)} /> ), }, { - id: 'title', + id: "title", header: ({ table }) => { const handleDeleteIssue = () => { - const checkedIssues = table.getFilteredSelectedRowModel().rows - serviceDeleteIssues(checkedIssues.map(v => v.id)) + const checkedIssues = table.getFilteredSelectedRowModel().rows; + serviceDeleteIssues(checkedIssues.map((v) => v.id)) .then(() => { toast({ - title: 'Issue Deleted!', - description: 'Your issues has been deleted!', - }) - mutate() + title: "Issue Deleted!", + description: "Your issues has been deleted!", + }); + mutate(); }) .catch((error) => { toast({ - title: 'Alert Delete Error', + title: "Alert Delete Error", description: error.message, - variant: 'destructive', - }) + variant: "destructive", + }); }) - .finally(() => setOpen(false)) - } + .finally(() => setOpen(false)); + }; return (
- setOrderBy(e as SearchIssuesOrderBy)}> - {t('orderByUpdatedAt')} - {t('orderByCreatedAt')} - {t('orderByEvents')} - {t('orderByUsers')} + {t("orderByUpdatedAt")} + {t("orderByCreatedAt")} + {t("orderByEvents")} + {t("orderByUsers")} @@ -153,48 +163,35 @@ export default function IssueList({ empty }: Props) { - setOpen(true)} - > + setOpen(true)}> Delete - + - Are you sure you want to delete this {table.getFilteredSelectedRowModel().rows.length} issue? + Are you sure you want to delete this{" "} + {table.getFilteredSelectedRowModel().rows.length} issue? -
{t('deleteIssuesConfirm')}
+
{t("deleteIssuesConfirm")}
- -
- ) + ); }, cell: ({ row }) => { - const metadata = JSON.parse(row.original.metadata) || {} + const metadata = JSON.parse(row.original.metadata) || {}; return (
{/* title */} {row.original.type} - { - row.original.releaseStage === 'mock' && ( - - Mock - - ) - } + {row.original.releaseStage === "mock" && ( + + Mock + + )} {/* second description */} {renderStringOrJson(metadata.filename ?? metadata.others)} @@ -220,9 +212,7 @@ export default function IssueList({ empty }: Props) { {/* message */}
- { - metadata.message ? {renderStringOrJson(metadata.message)} : null - } + {metadata.message ? {renderStringOrJson(metadata.message)} : null}
{/* other message (time/appType/...) */}
@@ -235,7 +225,10 @@ export default function IssueList({ empty }: Props) { {dayjs(row.original.updatedAt).fromNow()} - {ct('lastSeen')} {dayjs(row.original.updatedAt).format('YYYY-MM-DD HH:mm:ss')} + + {ct("lastSeen")}{" "} + {dayjs(row.original.updatedAt).format("YYYY-MM-DD HH:mm:ss")} + @@ -246,26 +239,29 @@ export default function IssueList({ empty }: Props) { {dayjs(row.original.createdAt).fromNow()} - {ct('firstSeen')} {dayjs(row.original.createdAt).format('YYYY-MM-DD HH:mm:ss')} + + {ct("firstSeen")}{" "} + {dayjs(row.original.createdAt).format("YYYY-MM-DD HH:mm:ss")} +
- ) + ); }, }, { - id: 'trends', + id: "trends", header: () => (
setChartType(e ? '24h' : '14d')} + onCheckedChange={(e) => setChartType(e ? "24h" : "14d")} /> - +
), cell: ({ row }) => ( @@ -273,45 +269,37 @@ export default function IssueList({ empty }: Props) {
), }, { - id: 'eventsCount', - header: 'Events', + id: "eventsCount", + header: "Events", cell: ({ row }) => ( -
- {row.original._count?.events} -
+
{row.original._count?.events}
), }, { - id: 'usersCount', - header: 'Users', + id: "usersCount", + header: "Users", cell: ({ row }) => ( -
- {row.original._count?.users} -
+
{row.original._count?.users}
), }, - ]), + ], [orderBy, chartType, data, trends, open], - ) + ); const handlePaginationChange = useCallback(({ pageIndex }: PaginationState) => { - setSize(pageIndex) - }, []) + setSize(pageIndex); + }, []); return (
- setQuery(e.target.value)} - /> + setQuery(e.target.value)} />
- ) + ); } diff --git a/packages/web/components/issue-related-events.tsx b/packages/web/components/issue-related-events.tsx index 9e9fa75..fb19e9d 100644 --- a/packages/web/components/issue-related-events.tsx +++ b/packages/web/components/issue-related-events.tsx @@ -1,28 +1,35 @@ -'use client' +"use client"; -import { type Event } from '@prisma/client' -import { useTranslations } from 'next-intl' -import { type Issue } from 'common' -import EventsList from '~/components/events-list' -import Wrapper from '~/components/wrapper' -import AccordionSection from '~/components/accordion-section' -import { useInfinite } from '~/hooks/use-infinite' -import { serviceGetEventsByIssueId } from '~/services/events' -import { Button } from '~/components/ui/button' +import { type Event } from "@prisma/client"; +import { type Issue } from "common"; +import { useTranslations } from "next-intl"; + +import AccordionSection from "~/components/accordion-section"; +import EventsList from "~/components/events-list"; +import { Button } from "~/components/ui/button"; +import Wrapper from "~/components/wrapper"; +import { useInfinite } from "~/hooks/use-infinite"; +import { serviceGetEventsByIssueId } from "~/services/events"; interface Props { - issue: Issue + issue: Issue; } export default function IssueRelatedEvents({ issue }: Props) { - const ct = useTranslations('Common') - const { data: events, isLoading, size, setSize, isReachingEnd } = useInfinite( - index => serviceGetEventsByIssueId({ issueId: issue.id, page: index + 1 }), + const ct = useTranslations("Common"); + const { + data: events, + isLoading, + size, + setSize, + isReachingEnd, + } = useInfinite( + (index) => serviceGetEventsByIssueId({ issueId: issue.id, page: index + 1 }), { enabled: issue.id !== undefined, deps: [issue.id], }, - ) + ); return ( @@ -35,15 +42,9 @@ export default function IssueRelatedEvents({ issue }: Props) { variant="outline" onClick={() => setSize(size + 1)} > - { - isLoading - ? `${ct('loading')}...` - : isReachingEnd - ? ct('noMoreData') - : ct('loadMore') - } + {isLoading ? `${ct("loading")}...` : isReachingEnd ? ct("noMoreData") : ct("loadMore")} - ) + ); } diff --git a/packages/web/components/issue-related-metadata.tsx b/packages/web/components/issue-related-metadata.tsx index 2c4feee..6fcd12a 100644 --- a/packages/web/components/issue-related-metadata.tsx +++ b/packages/web/components/issue-related-metadata.tsx @@ -1,26 +1,26 @@ -'use client' +"use client"; -import dynamic from 'next/dynamic' -import { useMemo } from 'react' -import { type OhbugEventLike } from 'common' -import AccordionSection from './accordion-section' +import { type OhbugEventLike } from "common"; +import dynamic from "next/dynamic"; +import { useMemo } from "react"; -import Wrapper from './wrapper' +import AccordionSection from "./accordion-section"; +import Wrapper from "./wrapper"; -const DynamicReactJson = dynamic(import('react-json-view'), { ssr: false }) +const DynamicReactJson = dynamic(import("react-json-view"), { ssr: false }); interface Props { - event: OhbugEventLike - tab: string + event: OhbugEventLike; + tab: string; } export default function IssueRelatedMetadata({ event, tab }: Props) { const metadata = useMemo(() => { - if (typeof event.metadata === 'string') { - return JSON.parse(event.metadata) + if (typeof event.metadata === "string") { + return JSON.parse(event.metadata); } - return event.metadata - }, [event]) + return event.metadata; + }, [event]); return ( @@ -28,5 +28,5 @@ export default function IssueRelatedMetadata({ event, tab }: Props) { - ) + ); } diff --git a/packages/web/components/issue-related-rrweb.tsx b/packages/web/components/issue-related-rrweb.tsx index 8cbbb54..2ffefdb 100644 --- a/packages/web/components/issue-related-rrweb.tsx +++ b/packages/web/components/issue-related-rrweb.tsx @@ -1,35 +1,36 @@ -'use client' +"use client"; -import { useRef } from 'react' -import RrwebPlayer from 'rrweb-player' -import { unpack } from 'rrweb' -import { useMount } from 'react-use' -import { type OhbugEventLike } from 'common' +import { type OhbugEventLike } from "common"; +import { useRef } from "react"; +import { useMount } from "react-use"; +import { unpack } from "rrweb"; +import RrwebPlayer from "rrweb-player"; -import Wrapper from '~/components/wrapper' -import 'rrweb-player/dist/style.css' +import Wrapper from "~/components/wrapper"; + +import "rrweb-player/dist/style.css"; interface Props { - event: OhbugEventLike + event: OhbugEventLike; } export default function IssueRelatedRrweb({ event }: Props) { - const rootRef = useRef(null) + const rootRef = useRef(null); useMount(() => { if (rootRef.current && rootRef.current.children.length === 0) { const events = event?.metadata - ? JSON.parse(event.metadata as unknown as string)?.rrweb ?? [] - : [] + ? (JSON.parse(event.metadata as unknown as string)?.rrweb ?? []) + : []; // eslint-disable-next-line no-new new RrwebPlayer({ target: rootRef.current, props: { events, unpackFn: unpack }, - }) + }); } - }) + }); return (
- ) + ); } diff --git a/packages/web/components/layout.tsx b/packages/web/components/layout.tsx index ea9cdcc..2534015 100644 --- a/packages/web/components/layout.tsx +++ b/packages/web/components/layout.tsx @@ -1,70 +1,75 @@ -'use client' +"use client"; -import { useState } from 'react' -import { useIsomorphicLayoutEffect, useWindowScroll } from 'react-use' -import { type ReactNode } from 'react' -import Nav from './nav' -import NavMenu from './nav-menu' -import User from './user' -import Logo from './logo' -import Footer from './footer' -import Wrapper from './wrapper' -import { cn, scrollWindowTo } from '~/libs/utils' +import { useState } from "react"; +import { type ReactNode } from "react"; +import { useIsomorphicLayoutEffect, useWindowScroll } from "react-use"; -const HeadHeight = 64 -const NavHeight = 48 +import { cn, scrollWindowTo } from "~/libs/utils"; + +import Footer from "./footer"; +import Logo from "./logo"; +import Nav from "./nav"; +import NavMenu from "./nav-menu"; +import User from "./user"; +import Wrapper from "./wrapper"; + +const HeadHeight = 64; +const NavHeight = 48; interface Props { - children: ReactNode + children: ReactNode; } export default function Layout({ children }: Props) { - const { y } = useWindowScroll() - const [scrollNavVisible, setScrollNavVisible] = useState(false) + const { y } = useWindowScroll(); + const [scrollNavVisible, setScrollNavVisible] = useState(false); useIsomorphicLayoutEffect(() => { - setScrollNavVisible(y > HeadHeight) - }, [y]) + setScrollNavVisible(y > HeadHeight); + }, [y]); return ( <>
{/* nav */} -
+
{/* navMenu */}
-
- ) + ); } diff --git a/packages/web/components/load-more-button.tsx b/packages/web/components/load-more-button.tsx index 0febad8..1fcba49 100644 --- a/packages/web/components/load-more-button.tsx +++ b/packages/web/components/load-more-button.tsx @@ -1,12 +1,13 @@ -'use client' +"use client"; -import { type MouseEventHandler } from 'react' -import { Button } from '~/components/ui/button' +import { type MouseEventHandler } from "react"; + +import { Button } from "~/components/ui/button"; interface Props { - isLoading?: boolean - isReachingEnd?: boolean - onClick: MouseEventHandler + isLoading?: boolean; + isReachingEnd?: boolean; + onClick: MouseEventHandler; } export default function LoadingMoreButton({ isLoading, isReachingEnd, onClick }: Props) { @@ -18,13 +19,7 @@ export default function LoadingMoreButton({ isLoading, isReachingEnd, onClick }: variant="outline" onClick={onClick} > - { - isLoading - ? 'Loading...' - : isReachingEnd - ? 'No More Events' - : 'Load More' - } + {isLoading ? "Loading..." : isReachingEnd ? "No More Events" : "Load More"} - ) + ); } diff --git a/packages/web/components/loading.tsx b/packages/web/components/loading.tsx index e6ae337..ba33dc6 100644 --- a/packages/web/components/loading.tsx +++ b/packages/web/components/loading.tsx @@ -1,7 +1,11 @@ -'use client' +"use client"; -import Spinning from './spinning' +import Spinning from "./spinning"; export default function Loading() { - return
+ return ( +
+ +
+ ); } diff --git a/packages/web/components/login-button.tsx b/packages/web/components/login-button.tsx index bce07f2..22d2032 100644 --- a/packages/web/components/login-button.tsx +++ b/packages/web/components/login-button.tsx @@ -1,30 +1,23 @@ -'use client' +"use client"; -import { signIn, signOut, useSession } from 'next-auth/react' -import { Button } from '~/components/ui/button' +import { signIn, signOut, useSession } from "next-auth/react"; + +import { Button } from "~/components/ui/button"; export default function LoginButton() { - const { data: session } = useSession() + const { data: session } = useSession(); if (session) { return ( <> Signed in as {session.user?.email}
- + - ) + ); } return ( <> Not signed in
- + - ) + ); } diff --git a/packages/web/components/logo.tsx b/packages/web/components/logo.tsx index 80e5228..38887b3 100644 --- a/packages/web/components/logo.tsx +++ b/packages/web/components/logo.tsx @@ -1,36 +1,37 @@ -'use client' +"use client"; -import { forwardRef } from 'react' -import Link from 'next/link' -import Image from 'next/image' -import { useTheme } from 'next-themes' -import { type CSSProperties } from 'react' -import { cn } from '~/libs/utils' +import { useTheme } from "next-themes"; +import Image from "next/image"; +import Link from "next/link"; +import { forwardRef } from "react"; +import { type CSSProperties } from "react"; + +import { cn } from "~/libs/utils"; interface Props { - className?: string - style?: CSSProperties - onClick?: () => void + className?: string; + style?: CSSProperties; + onClick?: () => void; } const Logo = forwardRef((props, ref) => { - const { resolvedTheme } = useTheme() + const { resolvedTheme } = useTheme(); return ( logo - ) -}) -Logo.displayName = 'Logo' -export default Logo + ); +}); +Logo.displayName = "Logo"; +export default Logo; diff --git a/packages/web/components/nav-container.tsx b/packages/web/components/nav-container.tsx index e048e7a..68af552 100644 --- a/packages/web/components/nav-container.tsx +++ b/packages/web/components/nav-container.tsx @@ -1,41 +1,34 @@ -'use client' +"use client"; -import Link from 'next/link' -import { type ReactNode } from 'react' -import { Button } from '~/components/ui/button' -import { cn } from '~/libs/utils' +import Link from "next/link"; +import { type ReactNode } from "react"; + +import { Button } from "~/components/ui/button"; +import { cn } from "~/libs/utils"; export interface Nav { - label: string - href: string - active: boolean + label: string; + href: string; + active: boolean; } interface Props { - children: ReactNode - navs: Nav[] + children: ReactNode; + navs: Nav[]; } export default function NavContainer({ children, navs }: Props) { return (
- { - navs.map(nav => ( - - - - )) - } + {navs.map((nav) => ( + + + + ))}
{children}
- ) + ); } diff --git a/packages/web/components/nav-menu.tsx b/packages/web/components/nav-menu.tsx index d66001b..17a9f92 100644 --- a/packages/web/components/nav-menu.tsx +++ b/packages/web/components/nav-menu.tsx @@ -1,82 +1,86 @@ -'use client' +"use client"; -import { useMemo } from 'react' -import Link from 'next/link' -import useCurrentProject from '~/hooks/use-current-project' -import { NavigationMenu, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, navigationMenuTriggerStyle } from '~/components/ui/navigation-menu' +import Link from "next/link"; +import { useMemo } from "react"; + +import { + NavigationMenu, + NavigationMenuItem, + NavigationMenuLink, + NavigationMenuList, + navigationMenuTriggerStyle, +} from "~/components/ui/navigation-menu"; +import useCurrentProject from "~/hooks/use-current-project"; interface NavMenuItem { - label: string - link: string - as: string + label: string; + link: string; + as: string; } export default function NavMenu() { - const { projectId } = useCurrentProject() - const navMenuList = useMemo(() => [ - { - label: 'Profile', - link: '/[projectId]/profile', - as: `/${projectId}/profile`, - }, - { - label: 'Issues', - link: '/[projectId]/issues', - as: `/${projectId}/issues`, - }, - { - label: 'Users', - link: '/[projectId]/users', - as: `/${projectId}/users`, - }, - { - label: 'Metrics', - link: '/[projectId]/metrics', - as: `/${projectId}/metrics`, - }, - { - label: 'Feedback', - link: '/[projectId]/feedbacks', - as: `/${projectId}/feedbacks`, - }, - { - label: 'Releases', - link: '/[projectId]/releases', - as: `/${projectId}/releases`, - }, - { - label: 'Alerts', - link: '/[projectId]/alerts', - as: `/${projectId}/alerts`, - }, - { - label: 'Settings', - link: '/[projectId]/settings', - as: `/${projectId}/settings`, - }, - ], [projectId]) + const { projectId } = useCurrentProject(); + const navMenuList = useMemo( + () => [ + { + label: "Profile", + link: "/[projectId]/profile", + as: `/${projectId}/profile`, + }, + { + label: "Issues", + link: "/[projectId]/issues", + as: `/${projectId}/issues`, + }, + { + label: "Users", + link: "/[projectId]/users", + as: `/${projectId}/users`, + }, + { + label: "Metrics", + link: "/[projectId]/metrics", + as: `/${projectId}/metrics`, + }, + { + label: "Feedback", + link: "/[projectId]/feedbacks", + as: `/${projectId}/feedbacks`, + }, + { + label: "Releases", + link: "/[projectId]/releases", + as: `/${projectId}/releases`, + }, + { + label: "Alerts", + link: "/[projectId]/alerts", + as: `/${projectId}/alerts`, + }, + { + label: "Settings", + link: "/[projectId]/settings", + as: `/${projectId}/settings`, + }, + ], + [projectId], + ); return ( - { - navMenuList.map((item) => { - return ( - - - - {item.label} - - - - ) - }) - } + {navMenuList.map((item) => { + return ( + + + + {item.label} + + + + ); + })} - ) + ); } diff --git a/packages/web/components/nav.tsx b/packages/web/components/nav.tsx index 4061189..aa32b30 100644 --- a/packages/web/components/nav.tsx +++ b/packages/web/components/nav.tsx @@ -1,25 +1,21 @@ -'use client' +"use client"; -import Link from 'next/link' -import User from './user' -import Breadcrumbs from './breadcrumbs' +import Link from "next/link"; + +import Breadcrumbs from "./breadcrumbs"; +import User from "./user"; export default function Nav() { return ( -
+
- + Docs
- ) + ); } diff --git a/packages/web/components/pagination.tsx b/packages/web/components/pagination.tsx index accde74..e945d72 100644 --- a/packages/web/components/pagination.tsx +++ b/packages/web/components/pagination.tsx @@ -1,37 +1,30 @@ -'use client' +"use client"; -import { useCallback } from 'react' -import { Button } from '~/components/ui/button' +import { useCallback } from "react"; + +import { Button } from "~/components/ui/button"; interface Props { - page: number - onChange: (page: number) => void - isReachingEnd: boolean + page: number; + onChange: (page: number) => void; + isReachingEnd: boolean; } export default function Pagination({ page = 1, onChange, isReachingEnd, ...props }: Props) { const handlePrev = useCallback(() => { - const _page = page - 1 - const value = _page > 0 ? _page : 1 - onChange(value) - }, [page]) + const _page = page - 1; + const value = _page > 0 ? _page : 1; + onChange(value); + }, [page]); const handleNext = useCallback(() => { - const _page = page + 1 - const value = _page > 0 ? _page : 1 - onChange(value) - }, [page]) + const _page = page + 1; + const value = _page > 0 ? _page : 1; + onChange(value); + }, [page]); return ( -
- @@ -45,5 +38,5 @@ export default function Pagination({ page = 1, onChange, isReachingEnd, ...props
- ) + ); } diff --git a/packages/web/components/project-card.tsx b/packages/web/components/project-card.tsx index eda0236..6c5cb3e 100644 --- a/packages/web/components/project-card.tsx +++ b/packages/web/components/project-card.tsx @@ -1,27 +1,29 @@ -'use client' +"use client"; -import Link from 'next/link' -import { type ProjectWithEventCount } from 'common' -import { type ProjectTrend } from '~/services/projects' -import { serviceGetProjectTrends } from '~/services/projects' -import { useQuery } from '~/hooks/use-query' -import Loading from '~/components/loading' -import { Card, CardContent, CardHeader } from '~/components/ui/card' -import { Avatar, AvatarFallback, AvatarImage } from '~/components/ui/avatar' -import LineChart from '~/components/charts/line-chart' +import { type ProjectWithEventCount } from "common"; +import Link from "next/link"; + +import LineChart from "~/components/charts/line-chart"; +import Loading from "~/components/loading"; +import { Avatar, AvatarFallback, AvatarImage } from "~/components/ui/avatar"; +import { Card, CardContent, CardHeader } from "~/components/ui/card"; +import { useQuery } from "~/hooks/use-query"; +import { type ProjectTrend } from "~/services/projects"; +import { serviceGetProjectTrends } from "~/services/projects"; interface Props { - project: ProjectWithEventCount + project: ProjectWithEventCount; } export default function ProjectCard({ project }: Props) { const { data: trends, isLoading } = useQuery( - () => serviceGetProjectTrends({ - id: project.id, - type: '14d', - }), + () => + serviceGetProjectTrends({ + id: project.id, + type: "14d", + }), { enabled: project.id !== undefined }, - ) + ); return ( @@ -29,40 +31,26 @@ export default function ProjectCard({ project }: Props) {
- + {project.name}
- - {project.name} - + {project.name} - - Events: {project.eventCount ?? 0} - + Events: {project.eventCount ?? 0}
- { - isLoading - ? - : ( - - ) - } + {isLoading ? ( + + ) : ( + + )}
- ) + ); } diff --git a/packages/web/components/project.tsx b/packages/web/components/project.tsx index 6aad10b..3ca15ab 100644 --- a/packages/web/components/project.tsx +++ b/packages/web/components/project.tsx @@ -1,59 +1,67 @@ -'use client' +"use client"; -import { useCallback, useEffect, useMemo, useState } from 'react' -import { type User } from '@prisma/client' -import { usePathname, useRouter } from 'next-intl/client' -import { useSession } from 'next-auth/react' -import Loading from './loading' -import { useStore } from '~/store' -import { serviceGetProjectsWithEventCount } from '~/services/projects' -import { useQuery } from '~/hooks/use-query' -import { Avatar, AvatarFallback, AvatarImage } from '~/components/ui/avatar' -import { Button } from '~/components/ui/button' -import { Popover, PopoverContent, PopoverTrigger } from '~/components/ui/popover' -import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator } from '~/components/ui/command' -import { cn } from '~/libs/utils' +import { type User } from "@prisma/client"; +import { useSession } from "next-auth/react"; +import { usePathname, useRouter } from "next-intl/client"; +import { useCallback, useEffect, useMemo, useState } from "react"; + +import { Avatar, AvatarFallback, AvatarImage } from "~/components/ui/avatar"; +import { Button } from "~/components/ui/button"; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, + CommandSeparator, +} from "~/components/ui/command"; +import { Popover, PopoverContent, PopoverTrigger } from "~/components/ui/popover"; +import { useQuery } from "~/hooks/use-query"; +import { cn } from "~/libs/utils"; +import { serviceGetProjectsWithEventCount } from "~/services/projects"; +import { useStore } from "~/store"; + +import Loading from "./loading"; export default function ProjectComponent() { - const router = useRouter() - const pathname = usePathname() - const session = useSession() + const router = useRouter(); + const pathname = usePathname(); + const session = useSession(); const { data: projects } = useQuery( () => serviceGetProjectsWithEventCount(session.data?.user as User), - { enabled: session.status === 'authenticated' }, - ) - const currentProject = useStore(state => state.project) - const setCurrentProject = useStore(state => state.setProject) - const loading = useMemo(() => !projects, [projects]) - const [open, setOpen] = useState(false) + { enabled: session.status === "authenticated" }, + ); + const currentProject = useStore((state) => state.project); + const setCurrentProject = useStore((state) => state.setProject); + const loading = useMemo(() => !projects, [projects]); + const [open, setOpen] = useState(false); useEffect(() => { - const target = projects?.find(project => project.default) ?? projects?.[0] - if (target) setCurrentProject(target) - }, [projects]) + const target = projects?.find((project) => project.default) ?? projects?.[0]; + if (target) setCurrentProject(target); + }, [projects]); - const handleSelectProject = useCallback((value: string | string[]) => { - const project = projects?.find(v => v.id.toString() === value) - if (project) { - setCurrentProject(project) - router.replace(`${pathname}?projectId=${project.id}`) - } - }, [projects, pathname]) + const handleSelectProject = useCallback( + (value: string | string[]) => { + const project = projects?.find((v) => v.id.toString() === value); + if (project) { + setCurrentProject(project); + router.replace(`${pathname}?projectId=${project.id}`); + } + }, + [projects, pathname], + ); const handleCreateProject = useCallback(() => { - router.push('/create-project') - }, []) + router.push("/create-project"); + }, []); if (loading) { - return ( - - ) + return ; } return ( - + + + + + { + onDelete(release.id); + }} > - - - - - - { - onDelete(release.id) - }} - > - Delete - - - - -
+ Delete + + + +
- )) - } +
+ ))}
- ) + ); } diff --git a/packages/web/components/snippet.tsx b/packages/web/components/snippet.tsx index e1036b2..9b1d894 100644 --- a/packages/web/components/snippet.tsx +++ b/packages/web/components/snippet.tsx @@ -1,77 +1,63 @@ -import * as React from 'react' -import { type VariantProps, cva } from 'class-variance-authority' -import { useCopyToClipboard } from 'react-use' +import { type VariantProps, cva } from "class-variance-authority"; +import * as React from "react"; +import { useCopyToClipboard } from "react-use"; -import { Tooltip, TooltipContent, TooltipTrigger } from '~/components/ui/tooltip' -import { cn } from '~/libs/utils' +import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip"; +import { cn } from "~/libs/utils"; const snippetVariants = cva( - 'inline-flex items-center rounded-xl px-4 py-2.5 text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-stone-950 focus:ring-offset-2 dark:focus:ring-stone-300', + "inline-flex items-center rounded-xl px-4 py-2.5 text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-stone-950 focus:ring-offset-2 dark:focus:ring-stone-300", { variants: { variant: { default: - 'bg-stone-100 text-stone-900 hover:bg-stone-100/80 dark:bg-stone-800 dark:text-stone-50 dark:hover:bg-stone-800/80', + "bg-stone-100 text-stone-900 hover:bg-stone-100/80 dark:bg-stone-800 dark:text-stone-50 dark:hover:bg-stone-800/80", destructive: - 'bg-red-500 text-stone-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-stone-50 dark:hover:bg-red-900/80', - outline: 'text-stone-950 dark:text-stone-50', + "bg-red-500 text-stone-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-stone-50 dark:hover:bg-red-900/80", + outline: "text-stone-950 dark:text-stone-50", }, }, - defaultVariants: { variant: 'default' }, + defaultVariants: { variant: "default" }, }, -) +); export interface BadgeProps - extends React.HTMLAttributes, - VariantProps { - children: string + extends React.HTMLAttributes, VariantProps { + children: string; } function Snippet({ className, variant, children, ...props }: BadgeProps) { - const [state, copyToClipboard] = useCopyToClipboard() - const [copied, setCopied] = React.useState(false) + const [state, copyToClipboard] = useCopyToClipboard(); + const [copied, setCopied] = React.useState(false); const handleCopy = React.useCallback(() => { - copyToClipboard(children) - setCopied(true) + copyToClipboard(children); + setCopied(true); setTimeout(() => { - setCopied(false) - }, 3000) - }, [children]) + setCopied(false); + }, 3000); + }, [children]); return ( -
+
{children}
- { - copied - ? state.error - ? ( - - ) - : ( - - ) - : ( - - ) - } + {copied ? ( + state.error ? ( + + ) : ( + + ) + ) : ( + + )}
- {state.error?.message || 'Copy to clipboard'} + {state.error?.message || "Copy to clipboard"}
- ) + ); } -export { Snippet, snippetVariants } +export { Snippet, snippetVariants }; diff --git a/packages/web/components/spinning.tsx b/packages/web/components/spinning.tsx index 22ebc5f..70fb805 100644 --- a/packages/web/components/spinning.tsx +++ b/packages/web/components/spinning.tsx @@ -1,7 +1,5 @@ -'use client' +"use client"; export default function Spinning() { - return ( - - ) + return ; } diff --git a/packages/web/components/stack-info.tsx b/packages/web/components/stack-info.tsx index 8af3196..81a15cf 100644 --- a/packages/web/components/stack-info.tsx +++ b/packages/web/components/stack-info.tsx @@ -1,61 +1,49 @@ -'use client' +"use client"; -import { useMemo } from 'react' -import { type Result } from 'source-map-trace' -import { type ReactElement } from 'react' -import { cn } from '~/libs/utils' +import { useMemo } from "react"; +import { type ReactElement } from "react"; +import { type Result } from "source-map-trace"; + +import { cn } from "~/libs/utils"; interface Props { - source?: Result + source?: Result; } export default function StackInfo({ source }: Props) { const title = useMemo( () => (
- - {source?.parsed?.source} - - - in - - - {source?.parsed?.name} - - - at line - - - {source?.parsed?.line}: - - - {source?.parsed?.column} - + {source?.parsed?.source} + in + {source?.parsed?.name} + at line + {source?.parsed?.line}: + {source?.parsed?.column}
), [source], - ) + ); return (
       
{title}
-
    - { - source?.code?.map(({ code, number, highlight }): ReactElement => { - return ( -
  1. - {code} -
  2. - ) - }) - } +
      + {source?.code?.map(({ code, number, highlight }): ReactElement => { + return ( +
    1. + {code} +
    2. + ); + })}
- ) + ); } diff --git a/packages/web/components/theme.tsx b/packages/web/components/theme.tsx index 0aa842e..89d1382 100644 --- a/packages/web/components/theme.tsx +++ b/packages/web/components/theme.tsx @@ -1,40 +1,32 @@ -'use client' +"use client"; -import { useTheme } from 'next-themes' +import { useTheme } from "next-themes"; + +import { Button } from "~/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, -} from '~/components/ui/dropdown-menu' -import { Button } from '~/components/ui/button' +} from "~/components/ui/dropdown-menu"; export default function Theme() { - const { setTheme } = useTheme() + const { setTheme } = useTheme(); return ( - - setTheme('light')}> - Light - - setTheme('dark')}> - Dark - - setTheme('system')}> - System - + setTheme("light")}>Light + setTheme("dark")}>Dark + setTheme("system")}>System - ) + ); } diff --git a/packages/web/components/title.tsx b/packages/web/components/title.tsx index c87a93f..12c69bd 100644 --- a/packages/web/components/title.tsx +++ b/packages/web/components/title.tsx @@ -1,45 +1,43 @@ -'use client' +"use client"; -import { type ReactNode } from 'react' -import Wrapper from './wrapper' -import { cn } from '~/libs/utils' +import { type ReactNode } from "react"; + +import { cn } from "~/libs/utils"; + +import Wrapper from "./wrapper"; interface Props { - className?: string - children: ReactNode - rightNodes?: ReactNode - bottomNodes?: ReactNode + className?: string; + children: ReactNode; + rightNodes?: ReactNode; + bottomNodes?: ReactNode; } export default function Title({ className, children, rightNodes, bottomNodes, ...props }: Props) { return (
- { - typeof children === 'string' - ? ( -

- {children} -

- ) - : children - } + {typeof children === "string" ? ( +

{children}

+ ) : ( + children + )}
{rightNodes}
{bottomNodes}
- ) + ); } diff --git a/packages/web/components/top-progress-bar.tsx b/packages/web/components/top-progress-bar.tsx index e93cc2e..bac2002 100644 --- a/packages/web/components/top-progress-bar.tsx +++ b/packages/web/components/top-progress-bar.tsx @@ -1,34 +1,34 @@ -'use client' +"use client"; -import Router from 'next/router' -import NProgress from 'nprogress' +import Router from "next/router"; +import NProgress from "nprogress"; -let timer: any -let state: 'loading' | 'stop' -const delay = 250 +let timer: any; +let state: "loading" | "stop"; +const delay = 250; function load() { - if (state === 'loading') { - return + if (state === "loading") { + return; } - state = 'loading' + state = "loading"; timer = setTimeout(() => { - NProgress.start() - }, delay) + NProgress.start(); + }, delay); } function stop() { - state = 'stop' + state = "stop"; - clearTimeout(timer) - NProgress.done() + clearTimeout(timer); + NProgress.done(); } -Router.events.on('routeChangeStart', load) -Router.events.on('routeChangeComplete', stop) -Router.events.on('routeChangeError', stop) +Router.events.on("routeChangeStart", load); +Router.events.on("routeChangeComplete", stop); +Router.events.on("routeChangeError", stop); -const TopProgressBar = () => null -export default TopProgressBar +const TopProgressBar = () => null; +export default TopProgressBar; diff --git a/packages/web/components/ui/accordion.tsx b/packages/web/components/ui/accordion.tsx index 3d6584d..d6de97d 100644 --- a/packages/web/components/ui/accordion.tsx +++ b/packages/web/components/ui/accordion.tsx @@ -1,24 +1,20 @@ -'use client' +"use client"; -import * as React from 'react' -import * as AccordionPrimitive from '@radix-ui/react-accordion' -import { ChevronDownIcon } from '@radix-ui/react-icons' +import * as AccordionPrimitive from "@radix-ui/react-accordion"; +import { ChevronDownIcon } from "@radix-ui/react-icons"; +import * as React from "react"; -import { cn } from '~/libs/utils' +import { cn } from "~/libs/utils"; -const Accordion = AccordionPrimitive.Root +const Accordion = AccordionPrimitive.Root; const AccordionItem = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( - -)) -AccordionItem.displayName = 'AccordionItem' + +)); +AccordionItem.displayName = "AccordionItem"; const AccordionTrigger = React.forwardRef< React.ElementRef, @@ -28,7 +24,7 @@ const AccordionTrigger = React.forwardRef< svg]:rotate-180', + "flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180", className, )} {...props} @@ -37,8 +33,8 @@ const AccordionTrigger = React.forwardRef< -)) -AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName +)); +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName; const AccordionContent = React.forwardRef< React.ElementRef, @@ -47,14 +43,14 @@ const AccordionContent = React.forwardRef<
{children}
-)) -AccordionContent.displayName = AccordionPrimitive.Content.displayName +)); +AccordionContent.displayName = AccordionPrimitive.Content.displayName; -export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }; diff --git a/packages/web/components/ui/avatar.tsx b/packages/web/components/ui/avatar.tsx index 7b14fd4..6b34de6 100644 --- a/packages/web/components/ui/avatar.tsx +++ b/packages/web/components/ui/avatar.tsx @@ -1,9 +1,9 @@ -'use client' +"use client"; -import * as React from 'react' -import * as AvatarPrimitive from '@radix-ui/react-avatar' +import * as AvatarPrimitive from "@radix-ui/react-avatar"; +import * as React from "react"; -import { cn } from '~/libs/utils' +import { cn } from "~/libs/utils"; const Avatar = React.forwardRef< React.ElementRef, @@ -11,14 +11,11 @@ const Avatar = React.forwardRef< >(({ className, ...props }, ref) => ( -)) -Avatar.displayName = AvatarPrimitive.Root.displayName +)); +Avatar.displayName = AvatarPrimitive.Root.displayName; const AvatarImage = React.forwardRef< React.ElementRef, @@ -26,11 +23,11 @@ const AvatarImage = React.forwardRef< >(({ className, ...props }, ref) => ( -)) -AvatarImage.displayName = AvatarPrimitive.Image.displayName +)); +AvatarImage.displayName = AvatarPrimitive.Image.displayName; const AvatarFallback = React.forwardRef< React.ElementRef, @@ -39,12 +36,12 @@ const AvatarFallback = React.forwardRef< -)) -AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName +)); +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; -export { Avatar, AvatarImage, AvatarFallback } +export { Avatar, AvatarImage, AvatarFallback }; diff --git a/packages/web/components/ui/badge.tsx b/packages/web/components/ui/badge.tsx index 2d6d837..68824f8 100644 --- a/packages/web/components/ui/badge.tsx +++ b/packages/web/components/ui/badge.tsx @@ -1,37 +1,31 @@ -import * as React from 'react' -import { type VariantProps, cva } from 'class-variance-authority' +import { type VariantProps, cva } from "class-variance-authority"; +import * as React from "react"; -import { cn } from '~/libs/utils' +import { cn } from "~/libs/utils"; const badgeVariants = cva( - 'inline-flex items-center rounded-md border border-stone-200 px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-stone-950 focus:ring-offset-2 dark:border-stone-800 dark:focus:ring-stone-300', + "inline-flex items-center rounded-md border border-stone-200 px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-stone-950 focus:ring-offset-2 dark:border-stone-800 dark:focus:ring-stone-300", { variants: { variant: { default: - 'border-transparent bg-stone-900 text-stone-50 shadow hover:bg-stone-900/80 dark:bg-stone-50 dark:text-stone-900 dark:hover:bg-stone-50/80', + "border-transparent bg-stone-900 text-stone-50 shadow hover:bg-stone-900/80 dark:bg-stone-50 dark:text-stone-900 dark:hover:bg-stone-50/80", secondary: - 'border-transparent bg-stone-100 text-stone-900 hover:bg-stone-100/80 dark:bg-stone-800 dark:text-stone-50 dark:hover:bg-stone-800/80', + "border-transparent bg-stone-100 text-stone-900 hover:bg-stone-100/80 dark:bg-stone-800 dark:text-stone-50 dark:hover:bg-stone-800/80", destructive: - 'border-transparent bg-red-500 text-stone-50 shadow hover:bg-red-500/80 dark:bg-red-900 dark:text-stone-50 dark:hover:bg-red-900/80', - outline: 'text-stone-950 dark:text-stone-50', + "border-transparent bg-red-500 text-stone-50 shadow hover:bg-red-500/80 dark:bg-red-900 dark:text-stone-50 dark:hover:bg-red-900/80", + outline: "text-stone-950 dark:text-stone-50", }, }, - defaultVariants: { variant: 'default' }, + defaultVariants: { variant: "default" }, }, -) +); export interface BadgeProps - extends React.HTMLAttributes, - VariantProps {} + extends React.HTMLAttributes, VariantProps {} function Badge({ className, variant, ...props }: BadgeProps) { - return ( -
- ) + return
; } -export { Badge, badgeVariants } +export { Badge, badgeVariants }; diff --git a/packages/web/components/ui/button.tsx b/packages/web/components/ui/button.tsx index 874dd0c..597633b 100644 --- a/packages/web/components/ui/button.tsx +++ b/packages/web/components/ui/button.tsx @@ -1,55 +1,53 @@ -import * as React from 'react' -import { Slot } from '@radix-ui/react-slot' -import { type VariantProps, cva } from 'class-variance-authority' +import { Slot } from "@radix-ui/react-slot"; +import { type VariantProps, cva } from "class-variance-authority"; +import * as React from "react"; -import { cn } from '~/libs/utils' +import { cn } from "~/libs/utils"; const buttonVariants = cva( - 'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-stone-950 disabled:pointer-events-none disabled:opacity-50 dark:focus-visible:ring-stone-300', + "inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-stone-950 disabled:pointer-events-none disabled:opacity-50 dark:focus-visible:ring-stone-300", { variants: { variant: { default: - 'bg-stone-900 text-stone-50 shadow hover:bg-stone-900/90 dark:bg-stone-50 dark:text-stone-900 dark:hover:bg-stone-50/90', + "bg-stone-900 text-stone-50 shadow hover:bg-stone-900/90 dark:bg-stone-50 dark:text-stone-900 dark:hover:bg-stone-50/90", destructive: - 'bg-red-500 text-stone-50 shadow-sm hover:bg-red-500/90 dark:bg-red-900 dark:text-stone-50 dark:hover:bg-red-900/90', + "bg-red-500 text-stone-50 shadow-sm hover:bg-red-500/90 dark:bg-red-900 dark:text-stone-50 dark:hover:bg-red-900/90", outline: - 'border border-stone-200 bg-transparent shadow-sm hover:bg-stone-100 hover:text-stone-900 dark:border-stone-800 dark:hover:bg-stone-800 dark:hover:text-stone-50', + "border border-stone-200 bg-transparent shadow-sm hover:bg-stone-100 hover:text-stone-900 dark:border-stone-800 dark:hover:bg-stone-800 dark:hover:text-stone-50", secondary: - 'bg-stone-100 text-stone-900 shadow-sm hover:bg-stone-100/80 dark:bg-stone-800 dark:text-stone-50 dark:hover:bg-stone-800/80', - ghost: 'hover:bg-stone-100 hover:text-stone-900 dark:hover:bg-stone-800 dark:hover:text-stone-50', - link: 'text-stone-900 underline-offset-4 hover:underline dark:text-stone-50', + "bg-stone-100 text-stone-900 shadow-sm hover:bg-stone-100/80 dark:bg-stone-800 dark:text-stone-50 dark:hover:bg-stone-800/80", + ghost: + "hover:bg-stone-100 hover:text-stone-900 dark:hover:bg-stone-800 dark:hover:text-stone-50", + link: "text-stone-900 underline-offset-4 hover:underline dark:text-stone-50", }, size: { - default: 'h-9 px-4 py-2', - sm: 'h-8 rounded-md px-3 text-xs', - lg: 'h-10 rounded-md px-8', - icon: 'h-9 w-9', + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", }, }, defaultVariants: { - variant: 'default', - size: 'default', + variant: "default", + size: "default", }, }, -) +); export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { - asChild?: boolean + extends React.ButtonHTMLAttributes, VariantProps { + asChild?: boolean; } -const Button = React.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => { - const Comp = asChild ? Slot : 'button' - return ( - - ) -}) -Button.displayName = 'Button' +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button"; + return ( + + ); + }, +); +Button.displayName = "Button"; -export { Button, buttonVariants } +export { Button, buttonVariants }; diff --git a/packages/web/components/ui/card.tsx b/packages/web/components/ui/card.tsx index 4c6513d..cd1999a 100644 --- a/packages/web/components/ui/card.tsx +++ b/packages/web/components/ui/card.tsx @@ -1,80 +1,59 @@ -import * as React from 'react' - -import { cn } from '~/libs/utils' - -const Card = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -
-)) -Card.displayName = 'Card' - -const CardHeader = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -
-)) -CardHeader.displayName = 'CardHeader' - -const CardTitle = React.forwardRef< - HTMLParagraphElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -

-)) -CardTitle.displayName = 'CardTitle' +import * as React from "react"; + +import { cn } from "~/libs/utils"; + +const Card = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ), +); +Card.displayName = "Card"; + +const CardHeader = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ), +); +CardHeader.displayName = "CardHeader"; + +const CardTitle = React.forwardRef>( + ({ className, ...props }, ref) => ( +

+ ), +); +CardTitle.displayName = "CardTitle"; const CardDescription = React.forwardRef< HTMLParagraphElement, React.HTMLAttributes >(({ className, ...props }, ref) => ( -

-)) -CardDescription.displayName = 'CardDescription' - -const CardContent = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -

-)) -CardContent.displayName = 'CardContent' - -const CardFooter = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -
-)) -CardFooter.displayName = 'CardFooter' - -export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } +

+)); +CardDescription.displayName = "CardDescription"; + +const CardContent = React.forwardRef>( + ({ className, ...props }, ref) => ( +

+ ), +); +CardContent.displayName = "CardContent"; + +const CardFooter = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ), +); +CardFooter.displayName = "CardFooter"; + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }; diff --git a/packages/web/components/ui/checkbox.tsx b/packages/web/components/ui/checkbox.tsx index c090b70..69278a7 100644 --- a/packages/web/components/ui/checkbox.tsx +++ b/packages/web/components/ui/checkbox.tsx @@ -1,10 +1,10 @@ -'use client' +"use client"; -import * as React from 'react' -import * as CheckboxPrimitive from '@radix-ui/react-checkbox' -import { CheckIcon } from '@radix-ui/react-icons' +import * as CheckboxPrimitive from "@radix-ui/react-checkbox"; +import { CheckIcon } from "@radix-ui/react-icons"; +import * as React from "react"; -import { cn } from '~/libs/utils' +import { cn } from "~/libs/utils"; const Checkbox = React.forwardRef< React.ElementRef, @@ -13,18 +13,16 @@ const Checkbox = React.forwardRef< - + -)) -Checkbox.displayName = CheckboxPrimitive.Root.displayName +)); +Checkbox.displayName = CheckboxPrimitive.Root.displayName; -export { Checkbox } +export { Checkbox }; diff --git a/packages/web/components/ui/command.tsx b/packages/web/components/ui/command.tsx index e309d61..84bf006 100644 --- a/packages/web/components/ui/command.tsx +++ b/packages/web/components/ui/command.tsx @@ -1,12 +1,12 @@ -'use client' +"use client"; -import * as React from 'react' -import { MagnifyingGlassIcon } from '@radix-ui/react-icons' -import { Command as CommandPrimitive } from 'cmdk' -import { type DialogProps } from '@radix-ui/react-dialog' +import { type DialogProps } from "@radix-ui/react-dialog"; +import { MagnifyingGlassIcon } from "@radix-ui/react-icons"; +import { Command as CommandPrimitive } from "cmdk"; +import * as React from "react"; -import { cn } from '~/libs/utils' -import { Dialog, DialogContent } from '~/components/ui/dialog' +import { Dialog, DialogContent } from "~/components/ui/dialog"; +import { cn } from "~/libs/utils"; const Command = React.forwardRef< React.ElementRef, @@ -15,13 +15,13 @@ const Command = React.forwardRef< -)) -Command.displayName = CommandPrimitive.displayName +)); +Command.displayName = CommandPrimitive.displayName; interface CommandDialogProps extends DialogProps {} @@ -34,30 +34,27 @@ const CommandDialog = ({ children, ...props }: CommandDialogProps) => {

- ) -} + ); +}; const CommandInput = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( -
+
-)) +)); -CommandInput.displayName = CommandPrimitive.Input.displayName +CommandInput.displayName = CommandPrimitive.Input.displayName; const CommandList = React.forwardRef< React.ElementRef, @@ -65,25 +62,21 @@ const CommandList = React.forwardRef< >(({ className, ...props }, ref) => ( -)) +)); -CommandList.displayName = CommandPrimitive.List.displayName +CommandList.displayName = CommandPrimitive.List.displayName; const CommandEmpty = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >((props, ref) => ( - -)) + +)); -CommandEmpty.displayName = CommandPrimitive.Empty.displayName +CommandEmpty.displayName = CommandPrimitive.Empty.displayName; const CommandGroup = React.forwardRef< React.ElementRef, @@ -92,14 +85,14 @@ const CommandGroup = React.forwardRef< -)) +)); -CommandGroup.displayName = CommandPrimitive.Group.displayName +CommandGroup.displayName = CommandPrimitive.Group.displayName; const CommandSeparator = React.forwardRef< React.ElementRef, @@ -107,11 +100,11 @@ const CommandSeparator = React.forwardRef< >(({ className, ...props }, ref) => ( -)) -CommandSeparator.displayName = CommandPrimitive.Separator.displayName +)); +CommandSeparator.displayName = CommandPrimitive.Separator.displayName; const CommandItem = React.forwardRef< React.ElementRef, @@ -120,30 +113,27 @@ const CommandItem = React.forwardRef< -)) +)); -CommandItem.displayName = CommandPrimitive.Item.displayName +CommandItem.displayName = CommandPrimitive.Item.displayName; -const CommandShortcut = ({ - className, - ...props -}: React.HTMLAttributes) => { +const CommandShortcut = ({ className, ...props }: React.HTMLAttributes) => { return ( - ) -} -CommandShortcut.displayName = 'CommandShortcut' + ); +}; +CommandShortcut.displayName = "CommandShortcut"; export { Command, @@ -155,4 +145,4 @@ export { CommandItem, CommandShortcut, CommandSeparator, -} +}; diff --git a/packages/web/components/ui/dialog.tsx b/packages/web/components/ui/dialog.tsx index 75f7c02..4f9be4b 100644 --- a/packages/web/components/ui/dialog.tsx +++ b/packages/web/components/ui/dialog.tsx @@ -1,25 +1,19 @@ -'use client' +"use client"; -import * as React from 'react' -import * as DialogPrimitive from '@radix-ui/react-dialog' -import { Cross2Icon } from '@radix-ui/react-icons' +import * as DialogPrimitive from "@radix-ui/react-dialog"; +import { Cross2Icon } from "@radix-ui/react-icons"; +import * as React from "react"; -import { cn } from '~/libs/utils' +import { cn } from "~/libs/utils"; -const Dialog = DialogPrimitive.Root +const Dialog = DialogPrimitive.Root; -const DialogTrigger = DialogPrimitive.Trigger +const DialogTrigger = DialogPrimitive.Trigger; -const DialogPortal = ({ - className, - ...props -}: DialogPrimitive.DialogPortalProps) => ( - -) -DialogPortal.displayName = DialogPrimitive.Portal.displayName +const DialogPortal = ({ className, ...props }: DialogPrimitive.DialogPortalProps) => ( + +); +DialogPortal.displayName = DialogPrimitive.Portal.displayName; const DialogOverlay = React.forwardRef< React.ElementRef, @@ -28,13 +22,13 @@ const DialogOverlay = React.forwardRef< -)) -DialogOverlay.displayName = DialogPrimitive.Overlay.displayName +)); +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName; const DialogContent = React.forwardRef< React.ElementRef, @@ -45,7 +39,7 @@ const DialogContent = React.forwardRef< -)) -DialogContent.displayName = DialogPrimitive.Content.displayName +)); +DialogContent.displayName = DialogPrimitive.Content.displayName; -const DialogHeader = ({ - className, - ...props -}: React.HTMLAttributes) => ( -
-) -DialogHeader.displayName = 'DialogHeader' +const DialogHeader = ({ className, ...props }: React.HTMLAttributes) => ( +
+); +DialogHeader.displayName = "DialogHeader"; -const DialogFooter = ({ - className, - ...props -}: React.HTMLAttributes) => ( +const DialogFooter = ({ className, ...props }: React.HTMLAttributes) => (
-) -DialogFooter.displayName = 'DialogFooter' +); +DialogFooter.displayName = "DialogFooter"; const DialogTitle = React.forwardRef< React.ElementRef, @@ -94,14 +73,11 @@ const DialogTitle = React.forwardRef< >(({ className, ...props }, ref) => ( -)) -DialogTitle.displayName = DialogPrimitive.Title.displayName +)); +DialogTitle.displayName = DialogPrimitive.Title.displayName; const DialogDescription = React.forwardRef< React.ElementRef, @@ -109,11 +85,11 @@ const DialogDescription = React.forwardRef< >(({ className, ...props }, ref) => ( -)) -DialogDescription.displayName = DialogPrimitive.Description.displayName +)); +DialogDescription.displayName = DialogPrimitive.Description.displayName; export { Dialog, @@ -123,4 +99,4 @@ export { DialogFooter, DialogTitle, DialogDescription, -} +}; diff --git a/packages/web/components/ui/dropdown-menu.tsx b/packages/web/components/ui/dropdown-menu.tsx index 9c1e8e7..874369b 100644 --- a/packages/web/components/ui/dropdown-menu.tsx +++ b/packages/web/components/ui/dropdown-menu.tsx @@ -1,38 +1,34 @@ -'use client' +"use client"; -import * as React from 'react' -import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' -import { - CheckIcon, - ChevronRightIcon, - DotFilledIcon, -} from '@radix-ui/react-icons' +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; +import { CheckIcon, ChevronRightIcon, DotFilledIcon } from "@radix-ui/react-icons"; +import * as React from "react"; -import { cn } from '~/libs/utils' +import { cn } from "~/libs/utils"; -const DropdownMenu = DropdownMenuPrimitive.Root +const DropdownMenu = DropdownMenuPrimitive.Root; -const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; -const DropdownMenuGroup = DropdownMenuPrimitive.Group +const DropdownMenuGroup = DropdownMenuPrimitive.Group; -const DropdownMenuPortal = DropdownMenuPrimitive.Portal +const DropdownMenuPortal = DropdownMenuPrimitive.Portal; -const DropdownMenuSub = DropdownMenuPrimitive.Sub +const DropdownMenuSub = DropdownMenuPrimitive.Sub; -const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; const DropdownMenuSubTrigger = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { - inset?: boolean + inset?: boolean; } >(({ className, inset, children, ...props }, ref) => ( -)) -DropdownMenuSubTrigger.displayName - = DropdownMenuPrimitive.SubTrigger.displayName +)); +DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName; const DropdownMenuSubContent = React.forwardRef< React.ElementRef, @@ -51,14 +46,13 @@ const DropdownMenuSubContent = React.forwardRef< -)) -DropdownMenuSubContent.displayName - = DropdownMenuPrimitive.SubContent.displayName +)); +DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName; const DropdownMenuContent = React.forwardRef< React.ElementRef, @@ -69,33 +63,33 @@ const DropdownMenuContent = React.forwardRef< ref={ref} sideOffset={sideOffset} className={cn( - 'z-50 min-w-[8rem] overflow-hidden rounded-md border border-stone-200 bg-white p-1 text-stone-950 shadow-md dark:border-stone-800 dark:bg-stone-950 dark:text-stone-50', - 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', + "z-50 min-w-[8rem] overflow-hidden rounded-md border border-stone-200 bg-white p-1 text-stone-950 shadow-md dark:border-stone-800 dark:bg-stone-950 dark:text-stone-50", + "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", className, )} {...props} /> -)) -DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName +)); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; const DropdownMenuItem = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { - inset?: boolean + inset?: boolean; } >(({ className, inset, ...props }, ref) => ( -)) -DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName +)); +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; const DropdownMenuCheckboxItem = React.forwardRef< React.ElementRef, @@ -105,7 +99,7 @@ const DropdownMenuCheckboxItem = React.forwardRef< ref={ref} checked={checked} className={cn( - 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-stone-100 focus:text-stone-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-stone-800 dark:focus:text-stone-50', + "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-stone-100 focus:text-stone-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-stone-800 dark:focus:text-stone-50", className, )} {...props} @@ -117,9 +111,8 @@ const DropdownMenuCheckboxItem = React.forwardRef< {children} -)) -DropdownMenuCheckboxItem.displayName - = DropdownMenuPrimitive.CheckboxItem.displayName +)); +DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName; const DropdownMenuRadioItem = React.forwardRef< React.ElementRef, @@ -128,7 +121,7 @@ const DropdownMenuRadioItem = React.forwardRef< {children} -)) -DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; const DropdownMenuLabel = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { - inset?: boolean + inset?: boolean; } >(({ className, inset, ...props }, ref) => ( -)) -DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName +)); +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; const DropdownMenuSeparator = React.forwardRef< React.ElementRef, @@ -167,24 +156,18 @@ const DropdownMenuSeparator = React.forwardRef< >(({ className, ...props }, ref) => ( -)) -DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; -const DropdownMenuShortcut = ({ - className, - ...props -}: React.HTMLAttributes) => { +const DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes) => { return ( - - ) -} -DropdownMenuShortcut.displayName = 'DropdownMenuShortcut' + + ); +}; +DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; export { DropdownMenu, @@ -202,4 +185,4 @@ export { DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuRadioGroup, -} +}; diff --git a/packages/web/components/ui/form.tsx b/packages/web/components/ui/form.tsx index d0d1b54..a29de4f 100644 --- a/packages/web/components/ui/form.tsx +++ b/packages/web/components/ui/form.tsx @@ -1,56 +1,50 @@ -import * as React from 'react' -import { Slot } from '@radix-ui/react-slot' -import { - type ControllerProps, - type FieldPath, - type FieldValues, -} from 'react-hook-form' -import { - Controller, - FormProvider, - useFormContext, -} from 'react-hook-form' -import type * as LabelPrimitive from '@radix-ui/react-label' - -import { cn } from '~/libs/utils' -import { Label } from '~/components/ui/label' - -const Form = FormProvider - -const FormItemContext = React.createContext({} as FormItemContextValue) +import type * as LabelPrimitive from "@radix-ui/react-label"; +import { Slot } from "@radix-ui/react-slot"; +import * as React from "react"; +import { type ControllerProps, type FieldPath, type FieldValues } from "react-hook-form"; +import { Controller, FormProvider, useFormContext } from "react-hook-form"; + +import { Label } from "~/components/ui/label"; +import { cn } from "~/libs/utils"; + +const Form = FormProvider; + +const FormItemContext = React.createContext({} as FormItemContextValue); interface FormFieldContextValue< TFieldValues extends FieldValues = FieldValues, TName extends FieldPath = FieldPath, > { - name: TName + name: TName; } -const FormFieldContext = React.createContext({} as FormFieldContextValue) +const FormFieldContext = React.createContext({} as FormFieldContextValue); const FormField = < TFieldValues extends FieldValues = FieldValues, TName extends FieldPath = FieldPath, ->({ ...props }: ControllerProps) => { +>({ + ...props +}: ControllerProps) => { return ( - ) -} + ); +}; const useFormField = () => { - const fieldContext = React.useContext(FormFieldContext) - const itemContext = React.useContext(FormItemContext) - const { getFieldState, formState } = useFormContext() + const fieldContext = React.useContext(FormFieldContext); + const itemContext = React.useContext(FormItemContext); + const { getFieldState, formState } = useFormContext(); - const fieldState = getFieldState(fieldContext.name, formState) + const fieldState = getFieldState(fieldContext.name, formState); if (!fieldContext) { - throw new Error('useFormField should be used within ') + throw new Error("useFormField should be used within "); } - const { id } = itemContext + const { id } = itemContext; return { id, @@ -59,110 +53,101 @@ const useFormField = () => { formDescriptionId: `${id}-form-item-description`, formMessageId: `${id}-form-item-message`, ...fieldState, - } -} + }; +}; interface FormItemContextValue { - id: string + id: string; } -const FormItem = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => { - const id = React.useId() +const FormItem = React.forwardRef>( + ({ className, ...props }, ref) => { + const id = React.useId(); - return ( - -
- - ) -}) -FormItem.displayName = 'FormItem' + return ( + +
+ + ); + }, +); +FormItem.displayName = "FormItem"; const FormLabel = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => { - const { error, formItemId } = useFormField() + const { error, formItemId } = useFormField(); return (