diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f80d334591..98be545ece 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,2 +1,3 @@ **/project.json @darkskygit **/pnpm-lock.yaml @darkskygit +**/en.json @JimmFly \ No newline at end of file diff --git a/.github/workflows/languages-sync.yml b/.github/workflows/languages-sync.yml new file mode 100644 index 0000000000..3cacc35749 --- /dev/null +++ b/.github/workflows/languages-sync.yml @@ -0,0 +1,63 @@ +name: Languages Sync + +on: + push: + branches: ['master'] + paths: + - 'packages/i18n/**' + - '.github/workflows/languages-sync.yml' + pull_request: + branches: ['master'] + paths: + - 'packages/i18n/**' + - '.github/workflows/languages-sync.yml' + workflow_dispatch: + +# Cancels all previous workflow runs for pull requests that have not completed. +# See https://docs.github.com/en/actions/using-jobs/using-concurrency +concurrency: + # The concurrency group contains the workflow name and the branch name for + # pull requests or the commit hash for any other events. + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} + cancel-in-progress: true + +jobs: + main: + strategy: + matrix: + node-version: [18] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Use pnpm + uses: pnpm/action-setup@v2 + with: + version: 7 + + - name: Use Node.js ${{ matrix.node-version }} + # https://github.com/actions/setup-node + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'pnpm' + + - name: Install node modules + run: pnpm install + + - name: Check Language Key + if: github.ref != 'refs/heads/master' + working-directory: ./packages/i18n + run: pnpm run sync-languages:check + env: + TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} + + - name: Sync Languages + if: github.ref == 'refs/heads/master' + working-directory: ./packages/i18n + run: pnpm run sync-languages + env: + TOLGEE_API_KEY: ${{ secrets.TOLGEE_API_KEY }} diff --git a/package.json b/package.json index fb1cff44e3..9ba3fb02b0 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "test:unit": "playwright test --config=playwright.config.unit.ts", "postinstall": "husky install", "notify": "node --experimental-modules scripts/notify.mjs", - "check:ci": "pnpm lint & pnpm test" + "check:ci": "pnpm lint & pnpm test", + "update:blocksuite": "pnpm i --filter @affine/app --filter @affine/datacenter @blocksuite/blocks@nightly @blocksuite/store@nightly && pnpm i --filter @affine/app @blocksuite/editor@nightly" }, "lint-staged": { "*": "prettier --write --ignore-unknown", diff --git a/packages/app/next.config.js b/packages/app/next.config.js index b71ade0105..2e54ff005a 100644 --- a/packages/app/next.config.js +++ b/packages/app/next.config.js @@ -12,11 +12,12 @@ const EDITOR_VERSION = enableDebugLocal const profileTarget = { ac: '100.85.73.88:12001', dev: '100.77.180.48:11001', + test: '100.77.180.48:11001', + stage: '', + pro: 'http://pathfinder.affine.pro', local: '127.0.0.1:3000', }; -// 100.77.180.48:11001 - const getRedirectConfig = profile => { const target = profileTarget[profile || 'dev'] || profileTarget['dev']; diff --git a/packages/app/package.json b/packages/app/package.json index aece2897f9..31fa964621 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -11,10 +11,10 @@ "dependencies": { "@affine/datacenter": "workspace:*", "@affine/i18n": "workspace:*", - "@blocksuite/blocks": "0.3.1-20230109032243-37ad3ba", - "@blocksuite/editor": "0.3.1-20230109032243-37ad3ba", + "@blocksuite/blocks": "0.4.0-20230111171650-bc63456", + "@blocksuite/editor": "0.4.0-20230111171650-bc63456", "@blocksuite/icons": "^2.0.2", - "@blocksuite/store": "0.3.1-20230109032243-37ad3ba", + "@blocksuite/store": "0.4.0-20230111171650-bc63456", "@emotion/css": "^11.10.0", "@emotion/react": "^11.10.4", "@emotion/server": "^11.10.0", diff --git a/packages/app/public/globals.css b/packages/app/public/globals.css index aa58d38563..ca43c3fec8 100644 --- a/packages/app/public/globals.css +++ b/packages/app/public/globals.css @@ -166,9 +166,9 @@ a:visited { input { border: none; -moz-appearance: none; - -webkit-appearance: none; /*解决ios上按钮的圆角问题*/ - border-radius: 0; /*解决ios上输入框圆角问题*/ - outline: medium; /*去掉鼠标点击的默认黄色边框*/ + -webkit-appearance: none; /*Solve the rounded corners of buttons on ios*/ + border-radius: 0; /*Solve the problem of rounded corners of the input box on ios*/ + outline: medium; /*Remove the default yellow border on mouse click*/ background-color: transparent; } diff --git a/packages/app/src/components/404/index.tsx b/packages/app/src/components/404/index.tsx index 8ed4232807..36f1b90a34 100644 --- a/packages/app/src/components/404/index.tsx +++ b/packages/app/src/components/404/index.tsx @@ -1,10 +1,24 @@ import { NotFoundTitle, PageContainer } from './styles'; import { useTranslation } from '@affine/i18n'; +import { Button } from '@/ui/button'; +import { useRouter } from 'next/router'; export const NotfoundPage = () => { const { t } = useTranslation(); + const router = useRouter(); return ( - {t('404 - Page Not Found')} + + {t('404 - Page Not Found')} +

+ +

+
); }; diff --git a/packages/app/src/components/contact-modal/index.tsx b/packages/app/src/components/contact-modal/index.tsx index 3cd4d04f85..6ec64fc144 100644 --- a/packages/app/src/components/contact-modal/index.tsx +++ b/packages/app/src/components/contact-modal/index.tsx @@ -76,6 +76,8 @@ export const ContactModal = ({ link: 'https://community.affine.pro', }, ]; + const date = new Date(); + const year = date.getFullYear(); return (

-

Copyright © 2022 Toeverything

+

Copyright © {year} Toeverything

diff --git a/packages/app/src/components/create-workspace/index.tsx b/packages/app/src/components/create-workspace/index.tsx index 7b473afbfb..9a26b56863 100644 --- a/packages/app/src/components/create-workspace/index.tsx +++ b/packages/app/src/components/create-workspace/index.tsx @@ -16,11 +16,15 @@ interface ModalProps { export const CreateWorkspaceModal = ({ open, onClose }: ModalProps) => { const [workspaceName, setWorkspaceName] = useState(''); + const [loading, setLoading] = useState(false); const { createWorkspace } = useWorkspaceHelper(); const router = useRouter(); const handleCreateWorkspace = async () => { + setLoading(true); const workspace = await createWorkspace(workspaceName); + if (workspace && workspace.id) { + setLoading(false); router.replace(`/workspace/${workspace.id}`); onClose(); } else { @@ -37,9 +41,8 @@ export const CreateWorkspaceModal = ({ open, onClose }: ModalProps) => { return (
- +
- {t('New Workspace')} { />
-

{t('Workspace description')}

+ {t('New Workspace')} +

+ Workspace is your virtual space to capture, create and plan as + just one person or together as a team. +

{ setWorkspaceName(value); }} > + ); +}; diff --git a/packages/app/src/components/header/Header.tsx b/packages/app/src/components/header/Header.tsx index a7c153127d..4fe79467a7 100644 --- a/packages/app/src/components/header/Header.tsx +++ b/packages/app/src/components/header/Header.tsx @@ -7,7 +7,7 @@ import { StyledCloseButton, } from './styles'; import CloseIcon from '@mui/icons-material/Close'; -import { getWarningMessage, shouldShowWarning } from './utils'; +import { useWarningMessage, shouldShowWarning } from './utils'; import EditorOptionMenu from './header-right-items/EditorOptionMenu'; import TrashButtonGroup from './header-right-items/TrashButtonGroup'; import ThemeModeSwitch from './header-right-items/theme-mode-switch'; @@ -22,7 +22,7 @@ const BrowserWarning = ({ }) => { return ( - {getWarningMessage()} + {useWarningMessage()} @@ -44,7 +44,7 @@ const HeaderRightItems: Record = { }; export const Header = ({ - rightItems = ['syncUser'], + rightItems = ['syncUser', 'themeModeSwitch'], children, }: PropsWithChildren<{ rightItems?: HeaderRightItemNames[] }>) => { const [showWarning, setShowWarning] = useState(shouldShowWarning()); diff --git a/packages/app/src/components/header/PageListHeader.tsx b/packages/app/src/components/header/PageListHeader.tsx index 43a1c976b9..99efff25de 100644 --- a/packages/app/src/components/header/PageListHeader.tsx +++ b/packages/app/src/components/header/PageListHeader.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren, ReactNode } from 'react'; import Header from './Header'; import { StyledPageListTittleWrapper } from './styles'; -import QuickSearchButton from './QuickSearchButton'; +// import QuickSearchButton from './QuickSearchButton'; export type PageListHeaderProps = PropsWithChildren<{ icon?: ReactNode; @@ -12,7 +12,7 @@ export const PageListHeader = ({ icon, children }: PageListHeaderProps) => { {icon} {children} - + {/* */} ); diff --git a/packages/app/src/components/header/QuickSearchButton.tsx b/packages/app/src/components/header/QuickSearchButton.tsx index ffe1fe7e14..dfc00eef14 100644 --- a/packages/app/src/components/header/QuickSearchButton.tsx +++ b/packages/app/src/components/header/QuickSearchButton.tsx @@ -1,12 +1,10 @@ import React from 'react'; import { IconButton, IconButtonProps } from '@/ui/button'; -import { Tooltip } from '@/ui/tooltip'; import { ArrowDownIcon } from '@blocksuite/icons'; import { useModal } from '@/providers/GlobalModalProvider'; -import { useTranslation } from '@affine/i18n'; import { styled } from '@/styles'; -const StyledIconButtonWithAnimate = styled(IconButton)(() => { +const StyledIconButtonWithAnimate = styled(IconButton)(({ theme }) => { return { svg: { transition: 'transform 0.15s ease-in-out', @@ -15,6 +13,9 @@ const StyledIconButtonWithAnimate = styled(IconButton)(() => { svg: { transform: 'translateY(3px)', }, + '::after': { + background: theme.colors.pageBackground, + }, }, }; }); @@ -23,20 +24,17 @@ export const QuickSearchButton = ({ ...props }: Omit) => { const { triggerQuickSearchModal } = useModal(); - const { t } = useTranslation(); return ( - - { - onClick?.(e); - triggerQuickSearchModal(); - }} - > - - - + { + onClick?.(e); + triggerQuickSearchModal(); + }} + > + + ); }; diff --git a/packages/app/src/components/header/styles.ts b/packages/app/src/components/header/styles.ts index 1deb826faa..146164eebd 100644 --- a/packages/app/src/components/header/styles.ts +++ b/packages/app/src/components/header/styles.ts @@ -3,35 +3,25 @@ import { displayFlex, styled } from '@/styles'; export const StyledHeaderContainer = styled.div<{ hasWarning: boolean }>( ({ hasWarning }) => { return { - position: 'relative', height: hasWarning ? '96px' : '60px', }; } ); -export const StyledHeader = styled.div<{ hasWarning: boolean }>( - ({ hasWarning }) => { - return { - height: '60px', - width: '100%', - ...displayFlex('flex-end', 'center'), - background: 'var(--affine-page-background)', - transition: 'background-color 0.5s', - position: 'absolute', - left: '0', - top: hasWarning ? '36px' : '0', - padding: '0 22px', - zIndex: 99, - }; - } -); +export const StyledHeader = styled.div<{ hasWarning: boolean }>(() => { + return { + height: '60px', + width: '100%', + ...displayFlex('flex-end', 'center'), + background: 'var(--affine-page-background)', + transition: 'background-color 0.5s', + zIndex: 99, + }; +}); export const StyledTitle = styled('div')(({ theme }) => ({ width: '720px', height: '100%', - position: 'absolute', - left: 0, - right: 0, - top: 0, + margin: 'auto', ...displayFlex('center', 'center'), diff --git a/packages/app/src/components/header/utils.tsx b/packages/app/src/components/header/utils.tsx index dd9ff50127..1bf0fc88f6 100644 --- a/packages/app/src/components/header/utils.tsx +++ b/packages/app/src/components/header/utils.tsx @@ -1,4 +1,5 @@ import getIsMobile from '@/utils/get-is-mobile'; +import { Trans, useTranslation } from '@affine/i18n'; // Inspire by https://stackoverflow.com/a/4900484/8415727 const getChromeVersion = () => { const raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); @@ -19,20 +20,20 @@ export const shouldShowWarning = () => { ); }; -export const getWarningMessage = () => { +export const useWarningMessage = () => { + const { t } = useTranslation(); if (!getIsChrome()) { return ( - We recommend the Chrome browser for optimal experience. + + We recommend the Chrome browser for optimal + experience. + ); } if (getChromeVersion() < minimumChromeVersion) { - return ( - - Please upgrade to the latest version of Chrome for the best experience. - - ); + return {t('upgradeBrowser')}; } return ''; }; diff --git a/packages/app/src/components/import/index.tsx b/packages/app/src/components/import/index.tsx index 1116481389..a594b08e35 100644 --- a/packages/app/src/components/import/index.tsx +++ b/packages/app/src/components/import/index.tsx @@ -29,14 +29,21 @@ export const ImportModal = ({ open, onClose }: ImportModalProps) => { currentWorkspace?.blocksuiteWorkspace?.setPageMeta(page.id, { title }); if (page && page.root === null) { setTimeout(() => { - const editor = document.querySelector('editor-container'); - if (editor) { - page.addBlock({ flavour: 'affine:surface' }, null); - const frameId = page.addBlock({ flavour: 'affine:frame' }, pageId); - // TODO blocksuite should offer a method to import markdown from store - editor.clipboard.importMarkdown(template.source, `${frameId}`); - page.resetHistory(); - editor.requestUpdate(); + try { + const editor = document.querySelector('editor-container'); + if (editor) { + page.addBlock({ flavour: 'affine:surface' }, null); + const frameId = page.addBlock( + { flavour: 'affine:frame' }, + pageId + ); + // TODO blocksuite should offer a method to import markdown from store + editor.clipboard.importMarkdown(template.source, `${frameId}`); + page.resetHistory(); + editor.requestUpdate(); + } + } catch (e) { + console.error(e); } }, 300); } @@ -98,13 +105,13 @@ export const ImportModal = ({ open, onClose }: ImportModalProps) => { > Markdown - {/* */} + )} diff --git a/packages/app/src/components/loading/PageLoading.tsx b/packages/app/src/components/loading/PageLoading.tsx index 025eba7687..ef853c4d61 100644 --- a/packages/app/src/components/loading/PageLoading.tsx +++ b/packages/app/src/components/loading/PageLoading.tsx @@ -1,5 +1,6 @@ import { styled } from '@/styles'; import Loading from './Loading'; +import { useTranslation } from '@affine/i18n'; // Used for the full page loading const StyledLoadingContainer = styled('div')(() => { @@ -17,12 +18,13 @@ const StyledLoadingContainer = styled('div')(() => { }; }); -export const PageLoading = ({ text = 'Loading...' }: { text?: string }) => { +export const PageLoading = ({ text }: { text?: string }) => { + const { t } = useTranslation(); return (
-

{text}

+

{text ? text : t('Loading')}

); diff --git a/packages/app/src/components/login-modal/Icons.tsx b/packages/app/src/components/login-modal/Icons.tsx index a6c694c876..12356f60d3 100644 --- a/packages/app/src/components/login-modal/Icons.tsx +++ b/packages/app/src/components/login-modal/Icons.tsx @@ -13,8 +13,6 @@ export const GoogleIcon = () => { }; const GoogleIconWrapper = styled('div')(({ theme }) => ({ - width: '48px', - height: '48px', background: theme.colors.pageBackground, display: 'flex', alignItems: 'center', diff --git a/packages/app/src/components/login-modal/LoginOptionButton.tsx b/packages/app/src/components/login-modal/LoginOptionButton.tsx index c1384bc8eb..f104efc58b 100644 --- a/packages/app/src/components/login-modal/LoginOptionButton.tsx +++ b/packages/app/src/components/login-modal/LoginOptionButton.tsx @@ -1,38 +1,24 @@ -// import { getDataCenter } from '@affine/datacenter'; import { styled } from '@/styles'; import { Button } from '@/ui/button'; -// import { useModal } from '@/providers/GlobalModalProvider'; import { GoogleIcon, StayLogOutIcon } from './Icons'; - +import { useTranslation } from '@affine/i18n'; export const GoogleLoginButton = () => { - // const { triggerLoginModal } = useModal(); + const { t } = useTranslation(); + return ( - { - // getDataCenter() - // .then(dc => dc.apis.signInWithGoogle?.()) - // .then(() => { - // triggerLoginModal(); - // }) - // .catch(error => { - // console.log('sign google error', error); - // }); - }} - > + - - Continue with Google - Set up an AFFiNE account to sync data - + {t('Continue with Google')} ); }; export const StayLogOutButton = () => { + const { t } = useTranslation(); return ( @@ -40,29 +26,26 @@ export const StayLogOutButton = () => { - Stay logged out - All changes are saved locally + {t('Stay logged out')} + {t('All changes are saved locally')} ); }; -const StyledGoogleButton = styled(Button)(() => { +const StyledGoogleButton = styled('div')(({ theme }) => { return { - width: '361px', - height: '56px', - padding: '4px', - background: '#6880FF', - color: '#fff', - - '& > span': { - marginLeft: 0, - }, - + width: '284px', + height: '40px', + marginTop: '30px', + fontSize: '16px', + cursor: 'pointer', + borderRadius: '40px', + border: `1px solid ${theme.colors.iconColor}`, + overflow: 'hidden', ':hover': { - background: '#516BF4', - color: '#fff', + border: `1px solid ${theme.colors.primaryColor}`, }, }; }); @@ -72,11 +55,6 @@ const StyledStayLogOutButton = styled(Button)(() => { width: '361px', height: '56px', padding: '4px', - - '& > span': { - marginLeft: 0, - }, - ':hover': { borderColor: '#6880FF', }, @@ -86,20 +64,22 @@ const StyledStayLogOutButton = styled(Button)(() => { const ButtonWrapper = styled('div')({ display: 'flex', flexDirection: 'row', + width: '100%', }); const IconWrapper = styled('div')({ - width: '48px', - height: '48px', flex: '0 48px', borderRadius: '5px', overflow: 'hidden', marginRight: '12px', + marginTop: '8px', }); const TextWrapper = styled('div')({ flex: 1, textAlign: 'left', + height: '40px', + lineHeight: '40px', }); const Title = styled('h1')(() => { diff --git a/packages/app/src/components/login-modal/index.tsx b/packages/app/src/components/login-modal/index.tsx index f398383196..d572190ee9 100644 --- a/packages/app/src/components/login-modal/index.tsx +++ b/packages/app/src/components/login-modal/index.tsx @@ -1,18 +1,17 @@ -import { ResetIcon } from '@blocksuite/icons'; import { styled } from '@/styles'; import { Modal, ModalWrapper, ModalCloseButton } from '@/ui/modal'; -import { TextButton } from '@/ui/button'; -import { GoogleLoginButton, StayLogOutButton } from './LoginOptionButton'; - +import { GoogleLoginButton } from './LoginOptionButton'; +import { useAppState } from '@/providers/app-state-provider'; interface LoginModalProps { open: boolean; onClose: () => void; } export const LoginModal = ({ open, onClose }: LoginModalProps) => { + const { login } = useAppState(); return ( - +
{ />
- Currently not logged in - - + {'Sign in'} + Set up an AFFINE account to sync data + { + await login(); + onClose(); + }} + > + + -
- }>Clear local data -
); @@ -55,14 +58,10 @@ const ContentTitle = styled('h1')({ paddingBottom: '16px', }); -const Footer = styled('div')({ - height: '70px', - paddingLeft: '24px', - marginTop: '32px', -}); - -const StyledResetIcon = styled(ResetIcon)({ - marginRight: '12px', - width: '20px', - height: '20px', +const SignDes = styled('div')(({ theme }) => { + return { + fontWeight: 400, + color: theme.colors.textColor, + fontSize: '16px', + }; }); diff --git a/packages/app/src/components/logout-modal/icon.tsx b/packages/app/src/components/logout-modal/icon.tsx new file mode 100644 index 0000000000..df23248b78 --- /dev/null +++ b/packages/app/src/components/logout-modal/icon.tsx @@ -0,0 +1,48 @@ +export const Check = () => { + return ( + + + + + + + + + + + + + ); +}; + +export const UnCheck = () => { + return ( + + + + + + ); +}; diff --git a/packages/app/src/components/logout-modal/index.tsx b/packages/app/src/components/logout-modal/index.tsx new file mode 100644 index 0000000000..91a5641d5b --- /dev/null +++ b/packages/app/src/components/logout-modal/index.tsx @@ -0,0 +1,118 @@ +import { styled } from '@/styles'; +import { Modal, ModalWrapper, ModalCloseButton } from '@/ui/modal'; +import { Button } from '@/ui/button'; +import { Check, UnCheck } from './icon'; +import { useState } from 'react'; +interface LoginModalProps { + open: boolean; + onClose: (wait: boolean) => void; +} + +export const LogoutModal = ({ open, onClose }: LoginModalProps) => { + const [localCache, setLocalCache] = useState(false); + return ( + + +
+ { + onClose(true); + }} + /> +
+ + {'Sign out?'} + Set up an AFFINE account to sync data + + {localCache ? ( + { + setLocalCache(false); + }} + > + + + ) : ( + { + setLocalCache(true); + }} + > + + + )} + Retain local cached data + +
+ + +
+
+
+
+ ); +}; + +const Header = styled('div')({ + position: 'relative', + height: '44px', +}); + +const Content = styled('div')({ + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + gap: '16px', +}); + +const ContentTitle = styled('h1')({ + fontSize: '20px', + lineHeight: '28px', + fontWeight: 600, + textAlign: 'center', + paddingBottom: '16px', +}); + +const SignDes = styled('div')(({ theme }) => { + return { + fontWeight: 400, + color: theme.colors.textColor, + fontSize: '16px', + }; +}); + +const StyleCheck = styled('span')(() => { + return { + display: 'inline-block', + cursor: 'pointer', + + svg: { + verticalAlign: 'sub', + marginRight: '8px', + }, + }; +}); + +const StyleTips = styled('span')(() => { + return { + userSelect: 'none', + }; +}); diff --git a/packages/app/src/components/mobile-modal/index.tsx b/packages/app/src/components/mobile-modal/index.tsx index ff9796359b..b568c2697d 100644 --- a/packages/app/src/components/mobile-modal/index.tsx +++ b/packages/app/src/components/mobile-modal/index.tsx @@ -3,8 +3,10 @@ import Modal, { ModalCloseButton, ModalWrapper } from '@/ui/modal'; import getIsMobile from '@/utils/get-is-mobile'; import { StyledButton, StyledContent, StyledTitle } from './styles'; import bg from './bg.png'; +import { useTranslation } from '@affine/i18n'; export const MobileModal = () => { const [showModal, setShowModal] = useState(getIsMobile()); + const { t } = useTranslation(); return ( { }} /> - Ooops! + {t('Ooops!')} -

Looks like you are browsing on a mobile device.

-

- We are still working on mobile support and recommend you use a - desktop device. -

+

{t('mobile device')}

+

{t('mobile device description')}

{ setShowModal(false); }} > - Got it + {t('Got it')}
diff --git a/packages/app/src/components/page-list/Empty.tsx b/packages/app/src/components/page-list/Empty.tsx index ef13e1b117..4430b8f1a9 100644 --- a/packages/app/src/components/page-list/Empty.tsx +++ b/packages/app/src/components/page-list/Empty.tsx @@ -1,6 +1,9 @@ import React from 'react'; import { Empty } from '@/ui/empty'; -export const PageListEmpty = () => { +import { useTranslation } from '@affine/i18n'; +export const PageListEmpty = (props: { listType?: string }) => { + const { listType } = props; + const { t } = useTranslation(); return (
{ height={300} sx={{ marginTop: '100px', marginBottom: '30px' }} /> -

Tips: Click Add to Favourites/Trash and the page will appear here.

-

(Designer is grappling with designing)

+ {listType === 'all' &&

{t('emptyAllPages')}

} + {listType === 'favorite' &&

{t('emptyFavourite')}

} + {listType === 'trash' &&

{t('emptyTrash')}

} +

{t('still designed')}

); }; diff --git a/packages/app/src/components/page-list/index.tsx b/packages/app/src/components/page-list/index.tsx index c275e8295b..7623eb4895 100644 --- a/packages/app/src/components/page-list/index.tsx +++ b/packages/app/src/components/page-list/index.tsx @@ -68,17 +68,19 @@ export const PageList = ({ showFavoriteTag = false, isTrash = false, isPublic = false, + listType, }: { pageList: PageMeta[]; showFavoriteTag?: boolean; isTrash?: boolean; isPublic?: boolean; + listType?: 'all' | 'trash' | 'favorite'; }) => { const router = useRouter(); const { currentWorkspace } = useAppState(); const { t } = useTranslation(); if (pageList.length === 0) { - return ; + return ; } return ( diff --git a/packages/app/src/components/quick-search/Input.tsx b/packages/app/src/components/quick-search/Input.tsx index 83ff131f71..6d96d239b0 100644 --- a/packages/app/src/components/quick-search/Input.tsx +++ b/packages/app/src/components/quick-search/Input.tsx @@ -9,6 +9,7 @@ import { SearchIcon } from '@blocksuite/icons'; import { StyledInputContent, StyledLabel } from './style'; import { Command } from 'cmdk'; import { useAppState } from '@/providers/app-state-provider'; +import { useTranslation } from '@affine/i18n'; export const Input = (props: { query: string; setQuery: Dispatch>; @@ -18,7 +19,7 @@ export const Input = (props: { const [inputValue, setInputValue] = useState(''); const inputRef = useRef(null); const { currentWorkspace } = useAppState(); - + const { t } = useTranslation(); useEffect(() => { inputRef.current?.addEventListener( 'blur', @@ -78,8 +79,10 @@ export const Input = (props: { }} placeholder={ currentWorkspace?.isPublish - ? `Search in ${currentWorkspace?.blocksuiteWorkspace?.meta.name}` - : 'Quick Search...' + ? t('Quick search placeholder2', { + workspace: currentWorkspace?.blocksuiteWorkspace?.meta.name, + }) + : t('Quick search placeholder') } /> diff --git a/packages/app/src/components/quick-search/Results.tsx b/packages/app/src/components/quick-search/Results.tsx index fe9cc5d883..9e23c5f7c6 100644 --- a/packages/app/src/components/quick-search/Results.tsx +++ b/packages/app/src/components/quick-search/Results.tsx @@ -79,7 +79,7 @@ export const Results = (props: { ) ) : ( - + {List.map(link => { return ( { setShowCreatePage={setShowCreatePage} /> - {currentWorkspace?.isPublish ? ( + {currentWorkspace?.published ? ( <> ) : showCreatePage ? ( <> diff --git a/packages/app/src/components/workspace-avatar/index.tsx b/packages/app/src/components/workspace-avatar/Avatar.tsx similarity index 74% rename from packages/app/src/components/workspace-avatar/index.tsx rename to packages/app/src/components/workspace-avatar/Avatar.tsx index 22f5fdd048..e9bea0aadd 100644 --- a/packages/app/src/components/workspace-avatar/index.tsx +++ b/packages/app/src/components/workspace-avatar/Avatar.tsx @@ -3,6 +3,7 @@ interface IWorkspaceAvatar { size: number; name: string; avatar: string; + style?: React.CSSProperties; } export const WorkspaceAvatar = (props: IWorkspaceAvatar) => { @@ -14,21 +15,29 @@ export const WorkspaceAvatar = (props: IWorkspaceAvatar) => { {props.avatar ? (
- +
) : (
{ borderRadius: '50%', textAlign: 'center', lineHeight: size + 'px', + display: 'inline-block', + verticalAlign: 'middle', }} > {(props.name || 'AFFiNE').substring(0, 1)} diff --git a/packages/app/src/components/workspace-avatar/WorkspaceUnitAvatar.tsx b/packages/app/src/components/workspace-avatar/WorkspaceUnitAvatar.tsx new file mode 100644 index 0000000000..bdb8431e2c --- /dev/null +++ b/packages/app/src/components/workspace-avatar/WorkspaceUnitAvatar.tsx @@ -0,0 +1,43 @@ +import { useState, useEffect } from 'react'; +import type { WorkspaceUnit } from '@affine/datacenter'; +import { WorkspaceAvatar as Avatar } from './Avatar'; + +const useAvatar = (workspaceUnit?: WorkspaceUnit) => { + const [avatarUrl, setAvatarUrl] = useState(''); + const avatarId = + workspaceUnit?.avatar || workspaceUnit?.blocksuiteWorkspace?.meta.avatar; + const blobs = workspaceUnit?.blocksuiteWorkspace?.blobs; + useEffect(() => { + if (avatarId && blobs) { + blobs.then(blobs => { + blobs?.get(avatarId).then(url => setAvatarUrl(url || '')); + }); + } else { + setAvatarUrl(''); + } + }, [avatarId, blobs]); + + return avatarUrl; +}; + +export const WorkspaceUnitAvatar = ({ + size = 20, + name, + workspaceUnit, + style, +}: { + size?: number; + name?: string; + workspaceUnit?: WorkspaceUnit | null; + style?: React.CSSProperties; +}) => { + const avatarUrl = useAvatar(workspaceUnit || undefined); + return ( + + ); +}; diff --git a/packages/app/src/components/workspace-avatar/index.ts b/packages/app/src/components/workspace-avatar/index.ts new file mode 100644 index 0000000000..8d6dfe17ba --- /dev/null +++ b/packages/app/src/components/workspace-avatar/index.ts @@ -0,0 +1,2 @@ +export { WorkspaceAvatar } from './Avatar'; +export { WorkspaceUnitAvatar } from './WorkspaceUnitAvatar'; diff --git a/packages/app/src/components/workspace-modal/icons/index.tsx b/packages/app/src/components/workspace-modal/icons/index.tsx new file mode 100644 index 0000000000..773a8383f3 --- /dev/null +++ b/packages/app/src/components/workspace-modal/icons/index.tsx @@ -0,0 +1,99 @@ +export const LocalIcon = () => { + return ( + + + + ); +}; + +export const OfflineIcon = () => { + return ( + + + + ); +}; +export const PublishedIcon = () => { + return ( + + + + + ); +}; + +export const CloudIcon = () => { + return ( + + + + + ); +}; + +export const LineIcon = () => { + return ( + + + + ); +}; diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 4328224d8c..c0dd2a8bd3 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -1,20 +1,28 @@ import { styled } from '@/styles'; -import { Modal, ModalWrapper, ModalCloseButton } from '@/ui/modal'; -import { Button } from '@/ui/button'; +import { Modal, ModalWrapper } from '@/ui/modal'; +import { Button, IconButton } from '@/ui/button'; import { useState } from 'react'; import { CreateWorkspaceModal } from '../create-workspace'; import { - CloudUnsyncedIcon, - CloudInsyncIcon, UsersIcon, AddIcon, + LogOutIcon, + CloudInsyncIcon, + PublishIcon, + CloseIcon, } from '@blocksuite/icons'; -import { toast } from '@/ui/toast'; -import { WorkspaceAvatar } from '@/components/workspace-avatar'; +import { + WorkspaceAvatar, + WorkspaceUnitAvatar, +} from '@/components/workspace-avatar'; import { useAppState } from '@/providers/app-state-provider'; import { useRouter } from 'next/router'; -import { useConfirm } from '@/providers/ConfirmProvider'; +import { useTranslation } from '@affine/i18n'; +import { LanguageMenu } from './languageMenu'; +import { CloudIcon, LineIcon, LocalIcon, OfflineIcon } from './icons'; +import { LoginModal } from '../login-modal'; +import { LogoutModal } from '../logout-modal'; interface WorkspaceModalProps { open: boolean; onClose: () => void; @@ -22,27 +30,49 @@ interface WorkspaceModalProps { export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { const [createWorkspaceOpen, setCreateWorkspaceOpen] = useState(false); - const { confirm } = useConfirm(); - const { workspaceList, currentWorkspace, login, user, logout } = + const { workspaceList, currentWorkspace, user, logout, isOwner } = useAppState(); const router = useRouter(); + const { t } = useTranslation(); + const [loginOpen, setLoginOpen] = useState(false); + const [logoutOpen, setLogoutOpen] = useState(false); return (
- My Workspaces - {/* */} - { - onClose(); - }} - /> + {t('My Workspaces')} + + +
+ +
+ + +
@@ -56,139 +86,142 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { active={item.id === currentWorkspace?.id} key={index} > - -
- -
+
+ +
- + + {item.name || 'AFFiNE'} - -
- - {(item.provider === 'local' || !item.provider) && ( - + + {isOwner ? ( + item.provider === 'local' ? ( +

+ + Local Workspace +

+ ) : ( +

+ + Cloud Workspace +

+ ) + ) : ( +

+ + Joined Workspace +

)} - {item.provider === 'affine' && ( - + {item.provider === 'local' && ( +

+ + All data can be accessed offline +

)} - {item.published && } -
- {/* {item.isLocal ? 'isLocal' : ''}/ */} + {item.published && ( +

+ Published to Web +

+ )} + ); })} -
  • - -
  • + { + setCreateWorkspaceOpen(true); + }} + > +
    + + + +
    + + + New workspace +

    Crete or import

    +
    +
    -

    - Tips:Workspace is your virtual space to capture, create and plan - as just one person or together as a team. -

    + {/*

    + {t('Tips')} + {t('Workspace description')} +

    */}
    + { + setLoginOpen(false); + }} + >
    {!user ? ( - + + + + Sign in to sync with AFFINE Cloud + ) : ( - +
    +
    + +
    + +

    {user.name}

    +

    {user.email}

    +
    +
    + { + setLogoutOpen(true); + // confirm({ + // title: 'Sign out?', + // content: `All data has been stored in the cloud. `, + // confirmText: 'Sign out', + // cancelText: 'Cancel', + // }).then(async confirm => { + // // if (confirm) { + // // if (user) { + // // await logout(); + // // router.replace(`/workspace`); + // // toast('Enabled success'); + // // } + // // } + // }); + }} + > + + +
    +
    )}
    { setCreateWorkspaceOpen(false); - onClose(); - // confirm({ - // title: 'Enable AFFiNE Cloud?', - // content: `If enabled, the data in this workspace will be backed up and synchronized via AFFiNE Cloud.`, - // confirmText: user ? 'Enable' : 'Sign in and Enable', - // cancelText: 'Skip', - // }).then(confirm => { - // if (confirm) { - // if (user) { - // // workspaceId && - // // updateWorkspaceMeta(workspaceId, { isPublish: true }); - // } else { - // // login(); - // // workspaceId && - // // updateWorkspaceMeta(workspaceId, { isPublish: true }); - // } - // } - // }); }} > + { + if (!wait) { + await logout(); + router.replace(`/workspace`); + } + setLogoutOpen(false); + }} + >
    @@ -196,52 +229,138 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { }; const Header = styled('div')({ - position: 'relative', - height: '44px', + display: 'flex', }); const Content = styled('div')({ - padding: '0 20px', flexDirection: 'column', alignItems: 'center', gap: '16px', flex: 1, }); - -const ContentTitle = styled('span')({ +const HeaderOption = styled.div(() => { + return { + marginLeft: '16px', + }; +}); +const ContentTitle = styled('div')({ fontSize: '20px', - lineHeight: '28px', + lineHeight: '24px', fontWeight: 600, textAlign: 'left', - paddingBottom: '16px', -}); - -const Footer = styled('div')({ - height: '70px', - paddingLeft: '24px', - marginTop: '32px', - textAlign: 'center', + flex: 1, }); const WorkspaceList = styled('div')({ + maxHeight: '500px', + overflow: 'auto', display: 'grid', - gridRowGap: '10px', - gridColumnGap: '10px', + gridRowGap: '24px', + gridColumnGap: '24px', fontSize: '16px', + marginTop: '36px', gridTemplateColumns: 'repeat(2, 1fr)', }); export const WorkspaceItem = styled.div<{ - active: boolean; + active?: boolean; }>(({ theme, active }) => { - const backgroundColor = active ? theme.colors.hoverBackground : 'transparent'; + const borderColor = active ? theme.colors.primaryColor : 'transparent'; return { cursor: 'pointer', - padding: '8px', - border: '1px solid #eee', - backgroundColor: backgroundColor, + padding: '16px', + height: '124px', + boxShadow: theme.shadow.modal, + display: 'flex', + borderRadius: '12px', + border: `1px solid ${borderColor}`, ':hover': { background: theme.colors.hoverBackground, + '.add-icon': { + border: `1.5px dashed ${theme.colors.primaryColor}`, + svg: { + fill: theme.colors.primaryColor, + }, + }, + }, + }; +}); + +const StyleWorkspaceInfo = styled.div(({ theme }) => { + return { + marginLeft: '16px', + p: { + fontSize: theme.font.xs, + lineHeight: '16px', + }, + svg: { + verticalAlign: 'text-bottom', + marginRight: '8px', + }, + }; +}); + +const StyleWorkspaceTitle = styled.div(({ theme }) => { + return { + fontSize: theme.font.base, + fontWeight: 600, + lineHeight: '24px', + marginBottom: '8px', + }; +}); + +const StyleWorkspaceAdd = styled.div(() => { + return { + width: '58px', + height: '58px', + borderRadius: '100%', + textAlign: 'center', + background: '#f4f5fa', + border: '1.5px dashed #f4f5fa', + lineHeight: '58px', + marginTop: '2px', + }; +}); + +const Footer = styled('div')({ + paddingTop: '16px', +}); + +const StyleUserInfo = styled.div(({ theme }) => { + return { + textAlign: 'left', + marginLeft: '16px', + marginTop: '16px', + flex: 1, + p: { + lineHeight: '24px', + color: theme.colors.iconColor, + }, + 'p:nth-child(1)': { + color: theme.colors.textColor, + fontWeight: 600, + }, + }; +}); + +const StyleSignIn = styled.div(({ theme }) => { + return { + cursor: 'pointer', + fontSize: '16px', + fontWeight: 700, + color: theme.colors.iconColor, + span: { + display: 'inline-block', + width: '40px', + height: '40px', + borderRadius: '40px', + backgroundColor: theme.colors.innerHoverBackground, + textAlign: 'center', + lineHeight: '44px', + marginRight: '16px', + svg: { + fill: theme.colors.primaryColor, + }, }, }; }); diff --git a/packages/app/src/components/workspace-modal/languageMenu.tsx b/packages/app/src/components/workspace-modal/languageMenu.tsx index e58f7edee0..d8f907663d 100644 --- a/packages/app/src/components/workspace-modal/languageMenu.tsx +++ b/packages/app/src/components/workspace-modal/languageMenu.tsx @@ -1,9 +1,11 @@ -import UnfoldMoreIcon from '@mui/icons-material/UnfoldMore'; -import type { TooltipProps } from '@mui/material'; +import { LOCALES } from '@affine/i18n'; +import { TooltipProps } from '@mui/material'; import { styled } from '@/styles'; -import { Button, Tooltip } from '@mui/material'; +import { Tooltip } from '@mui/material'; import { useState } from 'react'; -import { useTranslation, LOCALES } from '@affine/i18n'; +import { useTranslation } from '@affine/i18n'; +import { ArrowDownIcon } from '@blocksuite/icons'; +import { Button } from '@/ui/button'; export const LanguageMenu = () => { const { i18n } = useTranslation(); @@ -22,6 +24,7 @@ export const LanguageMenu = () => { {LOCALES.map(option => { return ( { @@ -39,14 +42,14 @@ export const LanguageMenu = () => { open={show} > { setShow(!show); }} > {languageName} - + @@ -55,8 +58,6 @@ export const LanguageMenu = () => { const StyledContainer = styled('div')(() => ({ display: 'flex', - flexDirection: 'row', - justifyContent: 'center', alignItems: 'center', })); @@ -87,8 +88,6 @@ const ListItem = styled(Button)(({ theme }) => ({ })); const StyledTitleButton = styled(Button)(({ theme }) => ({ - position: 'absolute', - right: '50px', color: theme.colors.popoverColor, fontSize: theme.font.sm, })); diff --git a/packages/app/src/components/workspace-setting/ExportPage.tsx b/packages/app/src/components/workspace-setting/ExportPage.tsx index e3bde461f9..e3cf6117f6 100644 --- a/packages/app/src/components/workspace-setting/ExportPage.tsx +++ b/packages/app/src/components/workspace-setting/ExportPage.tsx @@ -1,10 +1,10 @@ import { styled } from '@/styles'; import { WorkspaceUnit } from '@affine/datacenter'; - +import { Trans } from '@affine/i18n'; export const ExportPageTitleContainer = styled('div')(() => { return { display: 'flex', - marginTop: '60px', + fontWeight: '500', flex: 1, }; @@ -12,8 +12,13 @@ export const ExportPageTitleContainer = styled('div')(() => { export const ExportPage = ({ workspace }: { workspace: WorkspaceUnit }) => { return ( - Export Workspace{' '} - {workspace.name} Is Comming + + Export Workspace + + {{ workspace: workspace.name }} + + Is Comming + ); }; diff --git a/packages/app/src/components/workspace-setting/PublishPage.tsx b/packages/app/src/components/workspace-setting/PublishPage.tsx index 6cc17f68f2..a30b72bdf7 100644 --- a/packages/app/src/components/workspace-setting/PublishPage.tsx +++ b/packages/app/src/components/workspace-setting/PublishPage.tsx @@ -4,21 +4,28 @@ import { StyledPublishCopyContainer, StyledPublishExplanation, StyledSettingH2, + StyledStopPublishContainer, } from './style'; - +import { useState } from 'react'; import { Button } from '@/ui/button'; import Input from '@/ui/input'; import { toast } from '@/ui/toast'; // import { useAppState } from '@/providers/app-state-provider3'; import { WorkspaceUnit } from '@affine/datacenter'; import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; - +import { useTranslation } from '@affine/i18n'; +import { EnableWorkspaceButton } from '../enable-workspace'; export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => { const shareUrl = window.location.host + '/public-workspace/' + workspace.id; - const { publishWorkspace, enableWorkspace } = useWorkspaceHelper(); - + const { publishWorkspace } = useWorkspaceHelper(); + const { t } = useTranslation(); + const [loaded, setLoaded] = useState(false); const togglePublic = async (flag: boolean) => { - await publishWorkspace(workspace.id.toString(), flag); + try { + await publishWorkspace(workspace.id.toString(), flag); + } catch (e) { + toast('Failed to publish workspace'); + } }; const copyUrl = () => { @@ -26,56 +33,70 @@ export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => { toast('Copied url to clipboard'); }; - const enableAffineCloud = async () => { - await enableWorkspace(); - }; return ( <> {workspace.provider === 'affine' ? ( -
    +
    - {workspace?.published ? ( + {workspace.published ? ( <> - Publishing to web requires AFFiNE Cloud service . + The current workspace has been published to the web, everyone + can view the contents of this workspace through the link. - Share with link + + + {t('Share with link')} + ) : ( - After publishing to the web, everyone can view the content of - this workspace through the link. + {t('Publishing Description')} +
    + +
    )}
    + {workspace.published ? ( - + + + ) : ( - + <> )}
    ) : ( @@ -85,17 +106,9 @@ export const PublishPage = ({ workspace }: { workspace: WorkspaceUnit }) => { Publishing to web requires AFFiNE Cloud service. - - - +
    + +
    )} diff --git a/packages/app/src/components/workspace-setting/SyncPage.tsx b/packages/app/src/components/workspace-setting/SyncPage.tsx index d6345a294b..6969461a38 100644 --- a/packages/app/src/components/workspace-setting/SyncPage.tsx +++ b/packages/app/src/components/workspace-setting/SyncPage.tsx @@ -1,45 +1,52 @@ import { + StyleAsync, StyledPublishContent, - StyledPublishCopyContainer, StyledPublishExplanation, + StyledWorkspaceName, + StyledWorkspaceType, } from './style'; import { DownloadIcon } from '@blocksuite/icons'; import { Button } from '@/ui/button'; import { Menu, MenuItem } from '@/ui/menu'; import { WorkspaceUnit } from '@affine/datacenter'; -import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; +import { Trans, useTranslation } from '@affine/i18n'; +import { WorkspaceUnitAvatar } from '@/components/workspace-avatar'; +import { EnableWorkspaceButton } from '../enable-workspace'; export const SyncPage = ({ workspace }: { workspace: WorkspaceUnit }) => { - const { enableWorkspace } = useWorkspaceHelper(); + const { t } = useTranslation(); return (
    - {workspace?.provider === 'local' ? ( + {workspace.provider === 'local' ? ( <> - {workspace.name ?? 'Affine'} is Local Workspace. All data is - stored on the current device. You can enable AFFiNE Cloud for this - workspace to keep data in sync with the cloud. + + {workspace.name}; + is a Local Workspace. - - - - + + All data is stored on the current device. You can enable AFFiNE + Cloud for this workspace to keep data in sync with the cloud. + + + + ) : ( <> - {workspace.name ?? 'Affine'} is Cloud Workspace. All - data will be synchronized and saved to the AFFiNE + + {{ workspaceName: workspace.name ?? 'Affine' }} + is Cloud Workspace. All data will be synchronised and saved to + the AFFiNE + - + @@ -49,7 +56,7 @@ export const SyncPage = ({ workspace }: { workspace: WorkspaceUnit }) => { }} icon={} > - Download core data to device + {t('Download data to device', { CoreOrAll: 'core' })} { @@ -57,16 +64,18 @@ export const SyncPage = ({ workspace }: { workspace: WorkspaceUnit }) => { }} icon={} > - Download all data to device + {t('Download data to device', { CoreOrAll: 'all' })} } placement="bottom-end" disablePortal={true} > - + - + )} diff --git a/packages/app/src/components/workspace-setting/general/General.tsx b/packages/app/src/components/workspace-setting/general/General.tsx index 0ced889c68..0207cb6a95 100644 --- a/packages/app/src/components/workspace-setting/general/General.tsx +++ b/packages/app/src/components/workspace-setting/general/General.tsx @@ -3,26 +3,36 @@ import { // StyledSettingAvatar, StyledSettingAvatarContent, StyledSettingInputContainer, + StyledDoneButtonContainer, + StyledInput, + StyledProviderInfo, + StyleGeneral, + StyledAvatar, } from './style'; import { StyledSettingH2 } from '../style'; import { useState } from 'react'; -import { Button, TextButton } from '@/ui/button'; -import Input from '@/ui/input'; +import { Button } from '@/ui/button'; import { useAppState } from '@/providers/app-state-provider'; import { WorkspaceDelete } from './delete'; import { WorkspaceLeave } from './leave'; -import { Upload } from '@/components/file-upload'; -import { WorkspaceAvatar } from '@/components/workspace-avatar'; +import { DoneIcon, UsersIcon } from '@blocksuite/icons'; +// import { Upload } from '@/components/file-upload'; +import { WorkspaceUnitAvatar } from '@/components/workspace-avatar'; import { WorkspaceUnit } from '@affine/datacenter'; import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; +import { useTranslation } from '@affine/i18n'; +import { CloudIcon, LocalIcon } from '@/components/workspace-modal/icons'; +import { CameraIcon } from './icons'; +import { Upload } from '@/components/file-upload'; export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { const [showDelete, setShowDelete] = useState(false); const [showLeave, setShowLeave] = useState(false); - const [uploading, setUploading] = useState(false); const [workspaceName, setWorkspaceName] = useState(workspace.name); const { currentWorkspace, isOwner } = useAppState(); const { updateWorkspace } = useWorkspaceHelper(); + const { t } = useTranslation(); + const handleChangeWorkSpaceName = (newName: string) => { setWorkspaceName(newName); }; @@ -32,74 +42,99 @@ export const GeneralPage = ({ workspace }: { workspace: WorkspaceUnit }) => { }; const fileChange = async (file: File) => { - setUploading(true); const blob = new Blob([file], { type: file.type }); currentWorkspace && (await updateWorkspace({ avatarBlob: blob }, currentWorkspace)); - setUploading(false); }; return workspace ? ( -
    - Workspace Icon - -
    - -
    - +
    + Workspace Avatar + + + + <> +
    + +
    + + +
    +
    + {/* TODO: Wait for image sync to complete */} + {/* - - - {/* TODO: add upload logic */} -
    - Workspace Name - - - {isOwner ? ( - { - handleUpdateWorkspaceName(); - }} - style={{ marginLeft: '0px' }} - > - ✔️ - - ) : null} - - Workspace Type - - {workspace.provider} - + + */} + {/* TODO: add upload logic */} + + {t('Workspace Name')} + + + {isOwner ? ( + { + handleUpdateWorkspaceName(); + }} + > + + + ) : null} + + {t('Workspace Type')} + + {isOwner ? ( + currentWorkspace?.provider === 'local' ? ( + + + Local Workspace + + ) : ( + + + All data can be accessed offline + + ) + ) : ( + + + Joined Workspace + + )} + +
    + {isOwner ? ( <> { setShowLeave(true); }} > - Leave Workspace + {t('Leave Workspace')} { )} -
    + ) : null; }; diff --git a/packages/app/src/components/workspace-setting/general/delete/Delete.tsx b/packages/app/src/components/workspace-setting/general/delete/Delete.tsx index 59e73f7381..3fcab8c158 100644 --- a/packages/app/src/components/workspace-setting/general/delete/Delete.tsx +++ b/packages/app/src/components/workspace-setting/general/delete/Delete.tsx @@ -14,6 +14,7 @@ import { Button } from '@/ui/button'; import { useRouter } from 'next/router'; import { WorkspaceUnit } from '@affine/datacenter'; +import { Trans, useTranslation } from '@affine/i18n'; import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; interface WorkspaceDeleteProps { @@ -28,6 +29,7 @@ export const WorkspaceDelete = ({ workspace, }: WorkspaceDeleteProps) => { const [deleteStr, setDeleteStr] = useState(''); + const { t } = useTranslation(); const router = useRouter(); const { deleteWorkSpace } = useWorkspaceHelper(); const handlerInputChange = (workspaceName: string) => { @@ -44,31 +46,42 @@ export const WorkspaceDelete = ({ - Delete Workspace + {t('Delete Workspace')}? {workspace.provider === 'local' ? ( - Deleting ( - {workspace.name}) cannot - be undone, please proceed with caution. along with all its content. + + Deleting ( + + {{ workspace: workspace.name }} + + ) cannot be undone, please proceed with caution. along with all + its content. + ) : ( - Deleting ( - {workspace.name}) will - delete both local and cloud data, this operation cannot be undone, - please proceed with caution. + + Deleting ( + + {{ workspace: workspace.name }} + + ) will delete both local and cloud data, this operation cannot be + undone, please proceed with caution. + )} diff --git a/packages/app/src/components/workspace-setting/general/delete/style.ts b/packages/app/src/components/workspace-setting/general/delete/style.ts index 939ba638bc..d029d54fea 100644 --- a/packages/app/src/components/workspace-setting/general/delete/style.ts +++ b/packages/app/src/components/workspace-setting/general/delete/style.ts @@ -4,20 +4,20 @@ export const StyledModalWrapper = styled('div')(({ theme }) => { return { position: 'relative', padding: '0px', - width: '460px', + width: '560px', background: theme.colors.popoverBackground, borderRadius: '12px', + height: '312px', }; }); export const StyledModalHeader = styled('div')(({ theme }) => { return { margin: '44px 0px 12px 0px', - width: '460px', + width: '560px', fontWeight: '600', fontSize: '20px;', - textAlign: 'left', - paddingLeft: '20px', + textAlign: 'center', color: theme.colors.popoverColor, }; }); @@ -37,21 +37,25 @@ export const StyledTextContent = styled('div')(() => { }; }); -export const StyledInputContent = styled('div')(() => { +export const StyledInputContent = styled('div')(({ theme }) => { return { display: 'flex', flexDirection: 'row', justifyContent: 'center', - margin: '20px 0 24px 0', + margin: '32px 0', + fontSize: theme.font.base, }; }); export const StyledButtonContent = styled('div')(() => { return { + position: 'absolute', + left: '50%', + transform: 'translateX(-50%)', + bottom: '32px', display: 'flex', flexDirection: 'row', justifyContent: 'center', - margin: '0px 0 32px 0', }; }); diff --git a/packages/app/src/components/workspace-setting/general/icons.tsx b/packages/app/src/components/workspace-setting/general/icons.tsx new file mode 100644 index 0000000000..a126cafc0f --- /dev/null +++ b/packages/app/src/components/workspace-setting/general/icons.tsx @@ -0,0 +1,20 @@ +export const CameraIcon = () => { + return ( + + + + + + ); +}; diff --git a/packages/app/src/components/workspace-setting/general/leave/Leave.tsx b/packages/app/src/components/workspace-setting/general/leave/Leave.tsx index aed3617abc..3c91b026bf 100644 --- a/packages/app/src/components/workspace-setting/general/leave/Leave.tsx +++ b/packages/app/src/components/workspace-setting/general/leave/Leave.tsx @@ -7,6 +7,7 @@ import { } from './style'; import { ModalCloseButton } from '@/ui/modal'; import { Button } from '@/ui/button'; +import { useTranslation } from '@affine/i18n'; import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; // import { getDataCenter } from '@affine/datacenter'; // import { useAppState } from '@/providers/app-state-provider'; @@ -18,6 +19,7 @@ interface WorkspaceDeleteProps { export const WorkspaceLeave = ({ open, onClose }: WorkspaceDeleteProps) => { const { leaveWorkSpace } = useWorkspaceHelper(); + const { t } = useTranslation(); const handleLeave = async () => { await leaveWorkSpace(); onClose(); @@ -27,14 +29,13 @@ export const WorkspaceLeave = ({ open, onClose }: WorkspaceDeleteProps) => { - Leave Workspace + {t('Leave Workspace')} - After you leave, you will not be able to access all the contents of - this workspace. + {t('Leave Workspace Description')} diff --git a/packages/app/src/components/workspace-setting/general/style.ts b/packages/app/src/components/workspace-setting/general/style.ts index 739ec24aec..d2e8d7b4d2 100644 --- a/packages/app/src/components/workspace-setting/general/style.ts +++ b/packages/app/src/components/workspace-setting/general/style.ts @@ -1,15 +1,45 @@ -import { styled } from '@/styles'; +import { displayFlex, styled } from '@/styles'; import MuiAvatar from '@mui/material/Avatar'; +import IconButton from '@/ui/button/IconButton'; +import Input from '@/ui/input'; export const StyledSettingInputContainer = styled('div')(() => { return { marginTop: '12px', + width: '100%', + ...displayFlex('flex-start', 'center'), }; }); export const StyledDeleteButtonContainer = styled('div')(() => { return { - marginTop: '30px', + textAlign: 'center', + }; +}); +export const StyleGeneral = styled('div')(() => { + return { + display: 'flex', + flexDirection: 'column', + height: '100%', + }; +}); +export const StyledDoneButtonContainer = styled(IconButton)(({ theme }) => { + return { + border: `1px solid ${theme.colors.borderColor}`, + borderRadius: '10px', + height: '32px', + overflow: 'hidden', + marginLeft: '20px', + ':hover': { + borderColor: theme.colors.primaryColor, + }, + }; +}); +export const StyledInput = styled(Input)(({ theme }) => { + return { + border: `1px solid ${theme.colors.borderColor}`, + borderRadius: '10px', + fontSize: theme.font.sm, }; }); @@ -26,3 +56,39 @@ export const StyledSettingAvatarContent = styled('div')(() => { export const StyledSettingAvatar = styled(MuiAvatar)(() => { return { height: '72px', width: '72px', marginRight: '24px' }; }); + +export const StyledProviderInfo = styled('p')(({ theme }) => { + return { + color: theme.colors.iconColor, + fontSize: theme.font.sm, + svg: { + verticalAlign: 'sub', + marginRight: '10px', + }, + }; +}); + +export const StyledAvatar = styled('div')(() => { + return { + position: 'relative', + marginRight: '20px', + cursor: 'pointer', + ':hover': { + '.camera-icon': { + display: 'block', + }, + }, + '.camera-icon': { + position: 'absolute', + display: 'none', + width: '100%', + height: '100%', + borderRadius: '50%', + backgroundColor: 'rgba(60, 61, 63, 0.5)', + top: 0, + left: 0, + textAlign: 'center', + lineHeight: '72px', + }, + }; +}); diff --git a/packages/app/src/components/workspace-setting/member/InviteMemberModal.tsx b/packages/app/src/components/workspace-setting/member/InviteMemberModal.tsx index c066908ed0..7bd542efb6 100644 --- a/packages/app/src/components/workspace-setting/member/InviteMemberModal.tsx +++ b/packages/app/src/components/workspace-setting/member/InviteMemberModal.tsx @@ -7,6 +7,7 @@ import { useState } from 'react'; import { Avatar } from '@mui/material'; import useMembers from '@/hooks/use-members'; import { User } from '@affine/datacenter'; +import { useTranslation } from '@affine/i18n'; interface LoginModalProps { open: boolean; onClose: () => void; @@ -53,6 +54,7 @@ export const InviteMemberModal = ({ const [showTip, setShowTip] = useState(false); const [userData, setUserData] = useState(null); const { inviteMember, getUserByEmail } = useMembers(); + const { t } = useTranslation(); const inputChange = (value: string) => { setShowMember(true); if (gmailReg.test(value)) { @@ -82,7 +84,7 @@ export const InviteMemberModal = ({ /> - Invite members + {t('Invite Members')} { setShowMember(false); }} - placeholder="Search mail (Gmail support only)" + placeholder={t('Invite placeholder')} > {showMember ? ( {showTip ? ( - Non-Gmail is not supported + {t('Non-Gmail')} ) : ( {userData?.avatar ? ( @@ -120,12 +122,13 @@ export const InviteMemberModal = ({ @@ -141,10 +144,8 @@ const Header = styled('div')({ const Content = styled('div')({ display: 'flex', - padding: '0 48px', flexDirection: 'column', alignItems: 'center', - gap: '16px', }); const ContentTitle = styled('h1')({ @@ -156,9 +157,8 @@ const ContentTitle = styled('h1')({ }); const Footer = styled('div')({ - height: '70px', - paddingLeft: '24px', - marginTop: '32px', + height: '102px', + margin: '32px 0', textAlign: 'center', }); diff --git a/packages/app/src/components/workspace-setting/member/MembersPage.tsx b/packages/app/src/components/workspace-setting/member/MembersPage.tsx index f0e8fbdf01..b1b64ffa0e 100644 --- a/packages/app/src/components/workspace-setting/member/MembersPage.tsx +++ b/packages/app/src/components/workspace-setting/member/MembersPage.tsx @@ -12,6 +12,7 @@ import { StyledMoreVerticalButton, StyledPublishExplanation, StyledMemberWarp, + StyledMemberContainer, } from './style'; import { MoreVerticalIcon, EmailIcon, TrashIcon } from '@blocksuite/icons'; import { useState } from 'react'; @@ -25,17 +26,19 @@ import { toast } from '@/ui/toast'; import useMembers from '@/hooks/use-members'; import Loading from '@/components/loading'; import { Wrapper } from '@/ui/layout'; -import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; +import { useTranslation } from '@affine/i18n'; +import { EnableWorkspaceButton } from '@/components/enable-workspace'; export const MembersPage = ({ workspace }: { workspace: WorkspaceUnit }) => { const [isInviteModalShow, setIsInviteModalShow] = useState(false); const { members, removeMember, loaded } = useMembers(); - const { enableWorkspace } = useWorkspaceHelper(); + + const { t } = useTranslation(); const { confirm } = useConfirm(); if (workspace.provider === 'affine') { return ( - <> + {!loaded && ( @@ -45,15 +48,16 @@ export const MembersPage = ({ workspace }: { workspace: WorkspaceUnit }) => { {loaded && members.length === 0 && ( )} - {loaded && members.length && ( + {loaded && members.length > 0 && ( <> - Users({members.length}) + {t('Users')} ({members.length}) - Access level + {t('Access level')} +
    {members.map((member, index) => { const user = Object.assign( @@ -136,7 +140,7 @@ export const MembersPage = ({ workspace }: { workspace: WorkspaceUnit }) => { type="primary" shape="circle" > - Invite Members + {t('Invite Members')} { @@ -150,23 +154,15 @@ export const MembersPage = ({ workspace }: { workspace: WorkspaceUnit }) => { open={isInviteModalShow} > - +
    ); } return ( - <>Collaborating with other members requires AFFiNE Cloud service. + {t('Collaboration Description')} - + ); diff --git a/packages/app/src/components/workspace-setting/member/style.ts b/packages/app/src/components/workspace-setting/member/style.ts index eeea67d6d8..ce18dcb0ad 100644 --- a/packages/app/src/components/workspace-setting/member/style.ts +++ b/packages/app/src/components/workspace-setting/member/style.ts @@ -1,14 +1,21 @@ import { styled } from '@/styles'; import MuiAvatar from '@mui/material/Avatar'; -export const StyledMemberTitleContainer = styled('div')(() => { +export const StyledMemberTitleContainer = styled('li')(() => { return { display: 'flex', - marginTop: '60px', fontWeight: '500', + marginBottom: '32px', flex: 1, }; }); +export const StyledMemberContainer = styled('div')(() => { + return { + display: 'flex', + height: '100%', + flexDirection: 'column', + }; +}); export const StyledMemberAvatar = styled(MuiAvatar)(() => { return { height: '40px', width: '40px' }; @@ -18,7 +25,7 @@ export const StyledMemberNameContainer = styled('div')(() => { return { display: 'flex', alignItems: 'center', - width: '402px', + flex: '2 0 402px', }; }); @@ -26,14 +33,15 @@ export const StyledMemberRoleContainer = styled('div')(() => { return { display: 'flex', alignItems: 'center', - width: '222px', + flex: '1 0 222px', }; }); export const StyledMemberListContainer = styled('ul')(() => { return { - marginTop: '15px', overflowY: 'scroll', + width: '100%', + flex: 1, }; }); @@ -42,6 +50,7 @@ export const StyledMemberListItem = styled('li')(() => { display: 'flex', alignItems: 'center', height: '72px', + width: '100%', }; }); @@ -55,7 +64,7 @@ export const StyledMemberName = styled('div')(({ theme }) => { return { fontWeight: '400', fontSize: '18px', - lineHeight: '16px', + lineHeight: '26px', color: theme.colors.textColor, }; }); @@ -71,7 +80,9 @@ export const StyledMemberEmail = styled('div')(({ theme }) => { export const StyledMemberButtonContainer = styled('div')(() => { return { - marginTop: '14px', + position: 'absolute', + bottom: '0', + marginBottom: '20px', }; }); @@ -83,6 +94,7 @@ export const StyledMoreVerticalButton = styled('button')(() => { width: '24px', height: '24px', cursor: 'pointer', + paddingRight: '48px', }; }); @@ -93,7 +105,7 @@ export const StyledPublishExplanation = styled('div')(() => { fontSize: '18px', lineHeight: '26px', flex: 1, - marginTop: '60px', + marginTop: '64px', }; }); @@ -101,6 +113,8 @@ export const StyledMemberWarp = styled('div')(() => { return { display: 'flex', flexDirection: 'column', - padding: '40px 0', + padding: '0 0 48px 0', + fontWeight: '500', + fontSize: '18px', }; }); diff --git a/packages/app/src/components/workspace-setting/style.ts b/packages/app/src/components/workspace-setting/style.ts index f3177fe4d1..dcde665f31 100644 --- a/packages/app/src/components/workspace-setting/style.ts +++ b/packages/app/src/components/workspace-setting/style.ts @@ -3,25 +3,27 @@ import { styled } from '@/styles'; export const StyledSettingContainer = styled('div')(() => { return { display: 'flex', - padding: '50px', flexDirection: 'column', + + padding: '0 34px 20px 48px', height: '100vh', - overflow: 'auto', }; }); export const StyledSettingSidebar = styled('div')(() => { { return { - flexShrink: 0, - flexGrow: 0, + // height: '48px', + marginTop: '50px', }; } }); export const StyledSettingContent = styled('div')(() => { return { - paddingLeft: '48px', + overflow: 'hidden', + flex: 1, + paddingTop: '48px', }; }); @@ -50,7 +52,6 @@ export const StyledSettingTabContainer = styled('ul')(() => { { return { display: 'flex', - marginTop: '25px', }; } }); @@ -60,14 +61,18 @@ export const WorkspaceSettingTagItem = styled('li')<{ isActive?: boolean }>( { return { display: 'flex', - marginBottom: '12px', - padding: '0 24px', - height: '32px', + margin: '0 48px 0 0', + height: '34px', color: isActive ? theme.colors.primaryColor : theme.colors.textColor, - fontWeight: '400', - fontSize: '16px', - lineHeight: '32px', + fontWeight: '500', + fontSize: theme.font.base, + lineHeight: theme.font.lineHeightBase, cursor: 'pointer', + transition: 'all 0.15s ease', + borderBottom: `2px solid ${ + isActive ? theme.colors.primaryColor : 'none' + }`, + ':hover': { color: theme.colors.primaryColor }, }; } } @@ -77,22 +82,21 @@ export const StyledSettingTagIconContainer = styled('div')(() => { return { display: 'flex', alignItems: 'center', - marginRight: '14.64px', - width: '14.47px', - fontSize: '14.47px', }; }); -export const StyledSettingH2 = styled('h2')<{ marginTop?: number }>( - ({ marginTop }) => { - return { - fontWeight: '500', - fontSize: '18px', - lineHeight: '26px', - marginTop: marginTop ? `${marginTop}px` : '0px', - }; - } -); +export const StyledSettingH2 = styled('h2')<{ + marginTop?: number; + marginBottom?: number; +}>(({ marginTop, marginBottom, theme }) => { + return { + fontWeight: '500', + fontSize: theme.font.base, + lineHeight: theme.font.lineHeightBase, + marginTop: marginTop ? `${marginTop}px` : '0px', + marginBottom: marginBottom ? `${marginBottom}px` : '0px', + }; +}); export const StyledPublishExplanation = styled('div')(() => { return { @@ -100,25 +104,41 @@ export const StyledPublishExplanation = styled('div')(() => { fontWeight: '500', fontSize: '18px', lineHeight: '26px', - flex: 1, - marginTop: '60px', + marginBottom: '22px', + }; +}); +export const StyledWorkspaceName = styled('span')(() => { + return { + fontWeight: '400', + fontSize: '18px', + lineHeight: '26px', + }; +}); +export const StyledWorkspaceType = styled('span')(() => { + return { + fontWeight: '500', + fontSize: '18px', + lineHeight: '26px', }; }); export const StyledPublishCopyContainer = styled('div')(() => { return { marginTop: '12px', - display: 'flex', - flexDirection: 'row', - alignItems: 'center', marginBottom: '20px', paddingTop: '20px', + flex: 1, + }; +}); +export const StyledStopPublishContainer = styled('div')(() => { + return { + textAlign: 'center', }; }); export const StyledCopyButtonContainer = styled('div')(() => { return { - marginLeft: '12px', + marginTop: '64px', }; }); @@ -128,3 +148,9 @@ export const StyledPublishContent = styled('div')(() => { flexDirection: 'column', }; }); + +export const StyleAsync = styled('div')(() => { + return { + marginTop: '64px', + }; +}); diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx deleted file mode 100644 index 287523689e..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx +++ /dev/null @@ -1,183 +0,0 @@ -// import { InformationIcon, LogOutIcon } from '@blocksuite/icons'; -// import { styled } from '@/styles'; -// import { Divider } from '@/ui/divider'; -// import { useAppState } from '@/providers/app-state-provider'; -// import { SelectorPopperContainer } from './styles'; -// import { -// PrivateWorkspaceItem, -// WorkspaceItem, -// CreateWorkspaceItem, -// ListItem, -// LoginItem, -// } from './WorkspaceItem'; -// import { WorkspaceSetting } from '@/components/workspace-setting'; -// import { useCallback, useEffect, useState } from 'react'; -// import { WorkspaceInfo } from '@affine/datacenter'; -// import { useModal } from '@/providers/GlobalModalProvider'; - -// export type WorkspaceDetails = Record< -// string, -// { memberCount: number; owner: { id: string; name: string } } -// >; - -// type SelectorPopperContentProps = { -// isShow: boolean; -// }; - -// export const SelectorPopperContent = ({ -// isShow, -// }: SelectorPopperContentProps) => { -// const { user, workspacesMeta, refreshWorkspacesMeta } = useAppState(); -// const [settingWorkspaceId, setSettingWorkspaceId] = useState( -// null -// ); -// const [workSpaceDetails, setWorkSpaceDetails] = useState( -// {} -// ); -// const { triggerContactModal } = useModal(); - -// const handleClickSettingWorkspace = (workspaceId: string) => { -// setSettingWorkspaceId(workspaceId); -// }; -// const handleCloseWorkSpace = () => { -// setSettingWorkspaceId(null); -// }; -// const settingWorkspace = settingWorkspaceId -// ? workspacesMeta.find(workspace => workspace.id === settingWorkspaceId) -// : undefined; - -// const refreshDetails = useCallback(async () => { -// const workspaceDetailList = await Promise.all( -// workspacesMeta.map(async ({ id, type }) => { -// if (user) { -// if (type === WorkspaceType.Private) { -// return { id, member_count: 1, owner: user }; -// } else { -// // const dc = await getDataCenter(); -// // const data = await dc.apis.getWorkspaceDetail({ id }); -// // return { id, ...data } || { id, member_count: 0, owner: user }; -// } -// } -// }) -// ); -// const workSpaceDetails: WorkspaceDetails = {}; -// workspaceDetailList.forEach(details => { -// if (details) { -// const { id, member_count, owner } = details; -// if (!owner) return; -// workSpaceDetails[id] = { -// memberCount: member_count || 1, -// owner: { -// id: owner.id, -// name: owner.name, -// }, -// }; -// } -// }); -// setWorkSpaceDetails(workSpaceDetails); -// }, [user, workspacesMeta]); - -// useEffect(() => { -// if (isShow) { -// setSettingWorkspaceId(null); -// refreshWorkspacesMeta(); -// refreshDetails(); -// } -// // eslint-disable-next-line react-hooks/exhaustive-deps -// }, [isShow]); - -// return !user ? ( -// -// -// -// } -// name="About AFFiNE" -// onClick={() => triggerContactModal()} -// /> -// -// ) : ( -// -// workspace.type === WorkspaceType.Private -// )?.id -// } -// /> -// -// Workspace -// -// {workspacesMeta.map(workspace => { -// return workspace.type !== WorkspaceType.Private ? ( -// -// ) : null; -// })} -// -// -// {settingWorkspace ? ( -// -// ) : null} -// -// } -// name="About AFFiNE" -// onClick={() => triggerContactModal()} -// /> -// } -// name="Sign out" -// onClick={() => { -// console.log('Sign out'); -// // FIXME: remove token from local storage and reload the page -// localStorage.removeItem('affine_token'); -// window.location.reload(); -// }} -// /> -// -// ); -// }; - -// const StyledDivider = styled(Divider)({ -// margin: '8px 12px', -// width: 'calc(100% - 24px)', -// }); - -// const WorkspaceGroupTitle = styled('div')(({ theme }) => { -// return { -// color: theme.colors.iconColor, -// fontSize: theme.font.sm, -// lineHeight: '30px', -// height: '30px', -// padding: '0 12px', -// }; -// }); - -// const WorkspaceWrapper = styled('div')(() => { -// return { -// maxHeight: '200px', -// overflow: 'auto', -// }; -// }); -export const test = () => { - return <>; -}; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/CreateWorkspaceItem.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/CreateWorkspaceItem.tsx deleted file mode 100644 index ccb6526691..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/CreateWorkspaceItem.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { useState } from 'react'; -import { AddIcon } from '@blocksuite/icons'; -import { styled } from '@/styles'; -import { - WorkspaceItemAvatar, - WorkspaceItemWrapper, - WorkspaceItemContent, -} from '../styles'; -import { WorkspaceCreate } from './workspace-create'; - -const name = 'Create new Workspace'; - -export const CreateWorkspaceItem = () => { - const [open, setOpen] = useState(false); - return ( - <> - setOpen(true)}> - - - - - {name} - - - setOpen(false)} /> - - ); -}; - -const Name = styled('div')(({ theme }) => { - return { - color: theme.colors.quoteColor, - fontSize: theme.font.base, - fontWeight: 400, - overflow: 'hidden', - textOverflow: 'ellipsis', - whiteSpace: 'nowrap', - }; -}); diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/index.ts b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/index.ts deleted file mode 100644 index 8db80b1dc7..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './CreateWorkspaceItem'; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/WorkspaceCreate.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/WorkspaceCreate.tsx deleted file mode 100644 index c71ee76d14..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/WorkspaceCreate.tsx +++ /dev/null @@ -1,123 +0,0 @@ -// import { getDataCenter } from '@affine/datacenter'; -import Modal from '@/ui/modal'; -import Input from '@/ui/input'; -import { - StyledModalHeader, - StyledTextContent, - StyledModalWrapper, - StyledInputContent, - StyledButtonContent, - StyledButton, -} from './style'; -import { useState } from 'react'; -import { ModalCloseButton } from '@/ui/modal'; -// import router from 'next/router'; -// import { useAppState } from '@/providers/app-state-provider'; - -interface WorkspaceCreateProps { - open: boolean; - onClose: () => void; -} - -const DefaultHeadImgColors = [ - ['#C6F2F3', '#0C6066'], - ['#FFF5AB', '#896406'], - ['#FFCCA7', '#8F4500'], - ['#FFCECE', '#AF1212'], - ['#E3DEFF', '#511AAB'], -]; - -export const WorkspaceCreate = ({ open, onClose }: WorkspaceCreateProps) => { - const [workspaceName, setWorkspaceId] = useState(''); - const [creating, setCreating] = useState(false); - // const { refreshWorkspacesMeta } = useAppState(); - const handlerInputChange = (workspaceName: string) => { - setWorkspaceId(workspaceName); - }; - const createDefaultHeadImg = (workspaceName: string) => { - const canvas = document.createElement('canvas'); - canvas.height = 100; - canvas.width = 100; - const ctx = canvas.getContext('2d'); - return new Promise((resolve, reject) => { - if (ctx) { - const randomNumber = Math.floor(Math.random() * 5); - const randomColor = DefaultHeadImgColors[randomNumber]; - ctx.fillStyle = randomColor[0]; - ctx.fillRect(0, 0, 100, 100); - ctx.font = "600 50px 'PingFang SC', 'Microsoft Yahei'"; - ctx.fillStyle = randomColor[1]; - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - ctx.fillText(workspaceName[0], 50, 50); - canvas.toBlob(blob => { - if (blob) { - // const blobId = getDataCenter().then(dc => - // dc.apis.uploadBlob({ blob }) - // ); - // resolve(blobId); - } else { - reject(); - } - }, 'image/png'); - } else { - reject(); - } - }); - }; - const handleCreateWorkspace = async () => { - setCreating(true); - const blobId = await createDefaultHeadImg(workspaceName).catch(() => { - setCreating(false); - }); - if (blobId) { - // getDataCenter() - // .then(dc => - // dc.apis.createWorkspace({ name: workspaceName, avatar: blobId }) - // ) - // .then(async data => { - // await refreshWorkspacesMeta(); - // // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // // @ts-ignore - // router.push(`/workspace/${data.id}`); - // onClose(); - // }) - // .catch(err => { - // console.log(err, 'err'); - // }) - // .finally(() => { - // setCreating(false); - // }); - } - }; - return ( - - - - Create new Workspace - - Workspaces are shared environments where teams can collaborate. After - creating a Workspace, you can invite others to join. - - - - - - - Create - - - - - ); -}; - -export default WorkspaceCreate; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/index.ts b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/index.ts deleted file mode 100644 index 85746bc70d..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './WorkspaceCreate'; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/style.ts b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/style.ts deleted file mode 100644 index 4c5162a94f..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/style.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { styled } from '@/styles'; -import { Button } from '@/ui/button'; - -export const StyledModalWrapper = styled('div')(({ theme }) => { - return { - position: 'relative', - padding: '0px', - width: '460px', - background: theme.colors.popoverBackground, - borderRadius: '12px', - }; -}); - -export const StyledModalHeader = styled('div')(({ theme }) => { - return { - margin: '44px 0px 12px 0px', - width: '460px', - fontWeight: '600', - fontSize: '20px;', - textAlign: 'center', - color: theme.colors.popoverColor, - }; -}); - -// export const StyledModalContent = styled('div')(({ theme }) => {}); - -export const StyledTextContent = styled('div')(() => { - return { - margin: 'auto', - width: '425px', - fontFamily: 'Avenir Next', - fontStyle: 'normal', - fontWeight: '400', - fontSize: '18px', - lineHeight: '26px', - textAlign: 'center', - }; -}); - -export const StyledInputContent = styled('div')(() => { - return { - display: 'flex', - flexDirection: 'row', - justifyContent: 'center', - margin: '40px 0 24px 0', - }; -}); - -export const StyledButtonContent = styled('div')(() => { - return { - display: 'flex', - flexDirection: 'row', - justifyContent: 'center', - margin: '0px 0 32px 0', - }; -}); - -export const StyledButton = styled(Button)(() => { - return { - width: '260px', - justifyContent: 'center', - }; -}); diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/PrivateWorkspaceItem.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/PrivateWorkspaceItem.tsx deleted file mode 100644 index b9d9522a91..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/PrivateWorkspaceItem.tsx +++ /dev/null @@ -1,63 +0,0 @@ -// import { styled } from '@/styles'; -// import { useAppState } from '@/providers/app-state-provider'; -// import { -// WorkspaceItemAvatar, -// PrivateWorkspaceWrapper, -// WorkspaceItemContent, -// } from './styles'; -// import { useRouter } from 'next/router'; - -// type PrivateWorkspaceItemProps = { -// privateWorkspaceId?: string; -// }; - -// export const PrivateWorkspaceItem = ({ -// privateWorkspaceId, -// }: PrivateWorkspaceItemProps) => { -// const { user } = useAppState(); -// const router = useRouter(); -// const handleClick = () => { -// if (privateWorkspaceId) { -// router.push(`/workspace/${privateWorkspaceId}`); -// } -// }; -// if (user) { -// const Username = user.name; -// return ( -// -// -// {Username} -// -// -// {Username} -// {user.email} -// -// -// ); -// } -// return null; -// }; - -// const Name = styled('div')(({ theme }) => { -// return { -// color: theme.colors.quoteColor, -// fontSize: theme.font.base, -// fontWeight: 500, -// overflow: 'hidden', -// textOverflow: 'ellipsis', -// whiteSpace: 'nowrap', -// }; -// }); - -// const Email = styled('div')(({ theme }) => { -// return { -// color: theme.colors.iconColor, -// fontSize: theme.font.sm, -// overflow: 'hidden', -// textOverflow: 'ellipsis', -// whiteSpace: 'nowrap', -// }; -// }); -export const test = () => { - return <>; -}; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/FooterSetting.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/FooterSetting.tsx deleted file mode 100644 index eb761058b6..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/FooterSetting.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { SettingsIcon } from '@blocksuite/icons'; -import { styled } from '@/styles'; -import { IconButton } from '@/ui/button'; -import { MouseEventHandler } from 'react'; - -type SettingProps = { - onClick?: () => void; -}; - -export const FooterSetting = ({ onClick }: SettingProps) => { - const handleClick: MouseEventHandler = e => { - e.stopPropagation(); - onClick && onClick(); - }; - return ( - { - e.stopPropagation(); - handleClick(e); - }} - > - - - ); -}; - -const Wrapper = styled(IconButton)(() => { - return { - fontSize: '20px', - }; -}); diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/FooterUsers.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/FooterUsers.tsx deleted file mode 100644 index c241555877..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/FooterUsers.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { UsersIcon } from '@blocksuite/icons'; -import { styled } from '@/styles'; -import { IconButton } from '@/ui/button'; - -type FooterUsersProps = { - memberCount: number; -}; - -export const FooterUsers = ({ memberCount = 1 }: FooterUsersProps) => { - return ( - - <> - - {memberCount > 99 ? '99+' : memberCount} - - - ); -}; - -const Wrapper = styled(IconButton)({ - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - fontSize: '16px', -}); - -const Tip = styled('span')({ - fontSize: '12px', -}); diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/WorkspaceItem.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/WorkspaceItem.tsx deleted file mode 100644 index 3833f1b516..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/WorkspaceItem.tsx +++ /dev/null @@ -1,100 +0,0 @@ -// import { useRouter } from 'next/router'; -// import { styled } from '@/styles'; -// import { -// WorkspaceItemAvatar, -// WorkspaceItemWrapper, -// WorkspaceItemContent, -// } from '../styles'; -// import { FooterSetting } from './FooterSetting'; -// import { FooterUsers } from './FooterUsers'; -// import { WorkspaceType } from '@affine/datacenter'; -// import { useAppState } from '@/providers/app-state-provider'; - -// interface WorkspaceItemProps { -// id: string; -// name: string; -// icon: string; -// type: WorkspaceType; -// memberCount: number; -// onClickSetting?: (workspaceId: string) => void; -// } - -// export const WorkspaceItem = ({ -// id, -// name, -// icon, -// type, -// onClickSetting, -// memberCount, -// }: WorkspaceItemProps) => { -// const router = useRouter(); - -// const { currentWorkspaceId } = useAppState(); - -// const handleClickSetting = async () => { -// onClickSetting && onClickSetting(id); -// }; - -// return ( -// { -// router.push(`/workspace/${id}`); -// }} -// canSet={ -// type !== WorkspaceType.Private && currentWorkspaceId === String(id) -// } -// > -// -// {name.charAt(0)} -// -// -// {name} -// -//
    -// -// -//
    -//
    -// ); -// }; - -// const Name = styled('div')(({ theme }) => { -// return { -// color: theme.colors.quoteColor, -// fontSize: theme.font.sm, -// fontWeight: 400, -// overflow: 'hidden', -// textOverflow: 'ellipsis', -// whiteSpace: 'nowrap', -// }; -// }); - -// const StyledWrapper = styled(WorkspaceItemWrapper)<{ canSet: boolean }>( -// ({ canSet }) => { -// return { -// '& .footer-setting': { -// display: 'none', -// }, -// ':hover .footer-users': { -// display: canSet ? 'none' : '', -// }, -// ':hover .footer-setting': { -// display: canSet ? 'block' : 'none', -// }, -// }; -// } -// ); - -// const Footer = styled('div')({ -// width: '42px', -// flex: '0 42px', -// fontSize: '20px', -// display: 'flex', -// alignItems: 'center', -// justifyContent: 'center', -// marginLeft: '12px', -// }); - -export const test = () => { - return <>; -}; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/index.ts b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/index.ts deleted file mode 100644 index 60080d5a77..0000000000 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/WorkspaceItem/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './WorkspaceItem'; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/index.ts b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/index.ts index 2c8649631c..59d6e170a4 100644 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/index.ts +++ b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/index.ts @@ -1,5 +1,2 @@ -export * from './PrivateWorkspaceItem'; -// export * from './WorkspaceItem'; -export * from './CreateWorkspaceItem'; export * from './ListItem'; export * from './LoginItem'; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx index 5997106ee3..36484ca46c 100644 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx +++ b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx @@ -1,7 +1,7 @@ import { Avatar, WorkspaceName, SelectorWrapper } from './styles'; import { useEffect, useState } from 'react'; import { WorkspaceModal } from '@/components/workspace-modal'; -import { WorkspaceAvatar } from '@/components/workspace-avatar'; +import { WorkspaceUnitAvatar } from '@/components/workspace-avatar'; import { useAppState } from '@/providers/app-state-provider'; export const WorkspaceSelector = () => { const [workspaceListShow, setWorkspaceListShow] = useState(false); @@ -23,17 +23,17 @@ export const WorkspaceSelector = () => {
    -
    diff --git a/packages/app/src/components/workspace-slider-bar/index.tsx b/packages/app/src/components/workspace-slider-bar/index.tsx index 32c7962ebf..ce6f8d43d3 100644 --- a/packages/app/src/components/workspace-slider-bar/index.tsx +++ b/packages/app/src/components/workspace-slider-bar/index.tsx @@ -84,7 +84,6 @@ export const WorkSpaceSliderBar = () => { ? `/workspace/${currentWorkspaceId}/setting` : '', }; - return ( <> @@ -152,7 +151,7 @@ export const WorkSpaceSliderBar = () => { - Settings + {t('Settings')} diff --git a/packages/app/src/hooks/use-members.ts b/packages/app/src/hooks/use-members.ts index 3011c94f83..a0e7cd8156 100644 --- a/packages/app/src/hooks/use-members.ts +++ b/packages/app/src/hooks/use-members.ts @@ -22,7 +22,7 @@ export const useMembers = () => { const inviteMember = async (email: string) => { currentWorkspace && dataCenter && - (await dataCenter.inviteMember(currentWorkspace?.id, email)); + (await dataCenter.inviteMember(currentWorkspace.id, email)); }; const removeMember = async (permissionId: number) => { diff --git a/packages/app/src/hooks/use-workspace-helper.ts b/packages/app/src/hooks/use-workspace-helper.ts index f1dee901d3..2a1977f968 100644 --- a/packages/app/src/hooks/use-workspace-helper.ts +++ b/packages/app/src/hooks/use-workspace-helper.ts @@ -42,6 +42,8 @@ export const useWorkspaceHelper = () => { content: `If enabled, the data in this workspace will be backed up and synchronized via AFFiNE Cloud.`, confirmText: user ? 'Enable' : 'Sign in and Enable', cancelText: 'Skip', + confirmType: 'primary', + buttonDirection: 'column', }).then(async confirm => { if (confirm && currentWorkspace) { if (!user) { @@ -57,11 +59,18 @@ export const useWorkspaceHelper = () => { }; const deleteWorkSpace = async () => { - currentWorkspace && - (await dataCenter.deleteWorkspace(currentWorkspace?.id)); + currentWorkspace && (await dataCenter.deleteWorkspace(currentWorkspace.id)); }; const leaveWorkSpace = async () => { - currentWorkspace && (await dataCenter.leaveWorkspace(currentWorkspace?.id)); + currentWorkspace && (await dataCenter.leaveWorkspace(currentWorkspace.id)); + }; + + const acceptInvite = async (inviteCode: string) => { + let inviteInfo; + if (inviteCode) { + inviteInfo = await dataCenter.acceptInvitation(inviteCode); + } + return inviteInfo; }; return { @@ -71,5 +80,6 @@ export const useWorkspaceHelper = () => { enableWorkspace, deleteWorkSpace, leaveWorkSpace, + acceptInvite, }; }; diff --git a/packages/app/src/pages/404.tsx b/packages/app/src/pages/404.tsx index 74f25f07ed..0eef5261e5 100644 --- a/packages/app/src/pages/404.tsx +++ b/packages/app/src/pages/404.tsx @@ -1,9 +1,5 @@ import NotfoundPage from '@/components/404'; -import { useAppState } from '@/providers/app-state-provider'; export default function Custom404() { - const { workspaceList } = useAppState(); - console.log('workspaceList: ', workspaceList); - return ; } diff --git a/packages/app/src/pages/invite/[invite_code].tsx b/packages/app/src/pages/invite/[invite_code].tsx index e007a6cd25..872b3f927a 100644 --- a/packages/app/src/pages/invite/[invite_code].tsx +++ b/packages/app/src/pages/invite/[invite_code].tsx @@ -1,45 +1,35 @@ +import { useWorkspaceHelper } from '@/hooks/use-workspace-helper'; import { styled } from '@/styles'; import { Empty } from '@/ui/empty'; -import { Avatar } from '@mui/material'; -// import { getDataCenter } from '@affine/datacenter'; +// import { Avatar } from '@mui/material'; import { useRouter } from 'next/router'; import { useEffect, useState } from 'react'; -const User = ({ name, avatar }: { name: string; avatar?: string }) => { - return ( - - {avatar ? ( - - ) : ( - {name.slice(0, 1)} - )} - {name} - - ); -}; +// const User = ({ name, avatar }: { name: string; avatar?: string }) => { +// return ( +// +// {avatar ? ( +// +// ) : ( +// {name.slice(0, 1)} +// )} +// {name} +// +// ); +// }; export default function DevPage() { const router = useRouter(); const [successInvited, setSuccessInvited] = useState(false); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const [inviteData, setInviteData] = useState(null); + const { acceptInvite } = useWorkspaceHelper(); useEffect(() => { - // getDataCenter() - // .then(dc => - // dc.apis.acceptInviting({ - // invitingCode: router.query.invite_code as string, - // }) - // ) - // .then(data => { - // setSuccessInvited(true); - // setInviteData(data); - // }) - // .catch(err => { - // console.log('err: ', err); - // }); - setSuccessInvited(true); - setInviteData(null); - }, [router.query.invite_code]); + router.query.invite_code && + acceptInvite(router.query.invite_code as string).then(data => { + if (data && data.accepted) { + setSuccessInvited(true); + } + }); + }, [router, acceptInvite]); return ( @@ -47,11 +37,12 @@ export default function DevPage() { - invited - you to join - invited */} + {/* you to join */} + {/* + >
    */} {successInvited ? ( ); } -const UserIcon = styled('div')({ - display: 'inline-block', - width: '28px', - height: '28px', - borderRadius: '50%', - backgroundColor: '#FFF5AB', - textAlign: 'center', - color: '#896406', - lineHeight: '28px', -}); +// const UserIcon = styled('div')({ +// display: 'inline-block', +// width: '28px', +// height: '28px', +// borderRadius: '50%', +// backgroundColor: '#FFF5AB', +// textAlign: 'center', +// color: '#896406', +// lineHeight: '28px', +// }); const Invited = styled('div')(({ theme }) => { return { @@ -132,14 +123,6 @@ const Content = styled('div')({ marginTop: '35px', }); -const UserContent = styled('span')({ - fontSize: '18px', - marginLeft: '12px', - span: { - padding: '0 12px', - }, -}); - const Status = styled('div')(() => { return { marginTop: '16px', diff --git a/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx b/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx index 734e627f3e..4993246384 100644 --- a/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx +++ b/packages/app/src/pages/public-workspace/[workspaceId]/[pageId].tsx @@ -5,6 +5,8 @@ import { styled } from '@/styles'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/router'; import { Page as PageStore, Workspace } from '@blocksuite/store'; +import { PageLoading } from '@/components/loading'; + const DynamicBlocksuite = dynamic(() => import('@/components/editor'), { ssr: false, }); @@ -13,6 +15,8 @@ const Page: NextPageWithLayout = () => { const [page, setPage] = useState(); const { dataCenter } = useAppState(); const router = useRouter(); + const [loaded, setLoaded] = useState(false); + useEffect(() => { dataCenter .loadPublicWorkspace(router.query.workspaceId as string) @@ -25,7 +29,7 @@ const Page: NextPageWithLayout = () => { p => p.id === router.query.pageId ) ) { - const page = data.blocksuiteWorkspace?.getPage( + const page = data.blocksuiteWorkspace.getPage( router.query.pageId as string ); page && setPage(page); @@ -39,17 +43,21 @@ const Page: NextPageWithLayout = () => { }); }, [router, dataCenter]); return ( - - {workspace && page && ( - { - editor.readonly = true; - }} - /> - )} - + <> + {!loaded && } + + {workspace && page && ( + { + editor.readonly = true; + setLoaded(true); + }} + /> + )} + + ); }; diff --git a/packages/app/src/pages/workspace/[workspaceId]/all.tsx b/packages/app/src/pages/workspace/[workspaceId]/all.tsx index 27718d02ef..1a0ba456d7 100644 --- a/packages/app/src/pages/workspace/[workspaceId]/all.tsx +++ b/packages/app/src/pages/workspace/[workspaceId]/all.tsx @@ -14,6 +14,7 @@ const All = () => { !p.trash)} showFavoriteTag={true} + listType="all" /> ); diff --git a/packages/app/src/pages/workspace/[workspaceId]/favorite.tsx b/packages/app/src/pages/workspace/[workspaceId]/favorite.tsx index 5e9e9ad752..cc3f0369a3 100644 --- a/packages/app/src/pages/workspace/[workspaceId]/favorite.tsx +++ b/packages/app/src/pages/workspace/[workspaceId]/favorite.tsx @@ -13,7 +13,10 @@ export const Favorite = () => { }> {t('Favourites')} - p.favorite && !p.trash)} /> + p.favorite && !p.trash)} + listType="favorite" + /> ); }; diff --git a/packages/app/src/pages/workspace/[workspaceId]/setting.tsx b/packages/app/src/pages/workspace/[workspaceId]/setting.tsx index e39a424166..11de4aa598 100644 --- a/packages/app/src/pages/workspace/[workspaceId]/setting.tsx +++ b/packages/app/src/pages/workspace/[workspaceId]/setting.tsx @@ -2,17 +2,9 @@ import { StyledSettingContainer, StyledSettingContent, StyledSettingSidebar, - StyledSettingSidebarHeader, StyledSettingTabContainer, - StyledSettingTagIconContainer, WorkspaceSettingTagItem, } from '@/components/workspace-setting/style'; -import { - EditIcon, - UsersIcon, - PublishIcon, - CloudInsyncIcon, -} from '@blocksuite/icons'; import { ReactElement, ReactNode, useState } from 'react'; import { GeneralPage, @@ -21,45 +13,44 @@ import { ExportPage, SyncPage, } from '@/components/workspace-setting'; +import { SettingsIcon } from '@blocksuite/icons'; import { useAppState } from '@/providers/app-state-provider'; import WorkspaceLayout from '@/components/workspace-layout'; import { WorkspaceUnit } from '@affine/datacenter'; +import { useTranslation } from '@affine/i18n'; +import { PageListHeader } from '@/components/header'; -type TabNames = 'general' | 'members' | 'publish' | 'sync' | 'export'; +type TabNames = 'General' | 'Sync' | 'Collaboration' | 'Publish' | 'Export'; const tabMap: { name: TabNames; - icon: ReactNode; panelRender: (workspace: WorkspaceUnit) => ReactNode; }[] = [ { - name: 'general', - icon: , + name: 'General', panelRender: workspace => , }, { - name: 'members', - icon: , - panelRender: workspace => , - }, - { - name: 'publish', - icon: , - panelRender: workspace => , - }, - { - name: 'sync', - icon: , + name: 'Sync', panelRender: workspace => , }, { - name: 'export', - icon: , + name: 'Collaboration', + panelRender: workspace => , + }, + { + name: 'Publish', + panelRender: workspace => , + }, + + { + name: 'Export', panelRender: workspace => , }, ]; const WorkspaceSetting = () => { + const { t } = useTranslation(); const { currentWorkspace, isOwner } = useAppState(); const [activeTab, setActiveTab] = useState(tabMap[0].name); @@ -72,48 +63,43 @@ const WorkspaceSetting = () => { )?.panelRender; let tableArr: { name: TabNames; - icon: ReactNode; panelRender: (workspace: WorkspaceUnit) => ReactNode; }[] = tabMap; if (!isOwner) { tableArr = [ { - name: 'general', - icon: , + name: 'General', panelRender: workspace => , }, ]; } return ( - - - - Workspace Settings - - - {tableArr.map(({ icon, name }) => { - return ( - { - handleTabChange(name); - }} - > - - {icon} - - {name} - - ); - })} - - + <> + + }>{t('Settings')} + + + {tableArr.map(({ name }) => { + return ( + { + handleTabChange(name); + }} + > + {name} + + ); + })} + + - - {currentWorkspace && activeTabPanelRender?.(currentWorkspace)} - - + + {currentWorkspace && activeTabPanelRender?.(currentWorkspace)} + + + ); }; WorkspaceSetting.getLayout = function getLayout(page: ReactElement) { diff --git a/packages/app/src/pages/workspace/[workspaceId]/trash.tsx b/packages/app/src/pages/workspace/[workspaceId]/trash.tsx index bbcc742a63..d0c2350373 100644 --- a/packages/app/src/pages/workspace/[workspaceId]/trash.tsx +++ b/packages/app/src/pages/workspace/[workspaceId]/trash.tsx @@ -11,7 +11,11 @@ export const Trash = () => { return ( <> }>{t('Trash')} - p.trash)} isTrash={true} /> + p.trash)} + isTrash={true} + listType="trash" + /> ); }; diff --git a/packages/app/src/providers/app-state-provider/Provider.tsx b/packages/app/src/providers/app-state-provider/Provider.tsx index 3e864b76d2..9ec23cd69c 100644 --- a/packages/app/src/providers/app-state-provider/Provider.tsx +++ b/packages/app/src/providers/app-state-provider/Provider.tsx @@ -101,11 +101,12 @@ export const AppStateProvider = ({ } const workspace = (await dataCenter.loadWorkspace(workspaceId)) ?? null; let isOwner; - if (workspace.provider === 'local') { + if (workspace?.provider === 'local') { // isOwner is useful only in the cloud isOwner = true; } else { - isOwner = workspace?.owner && user?.id === workspace?.owner?.id; + // We must ensure workspace.owner exists, then ensure id same. + isOwner = workspace?.owner && user?.id === workspace.owner.id; } const pageList = (workspace?.blocksuiteWorkspace?.meta.pageMetas as PageMeta[]) ?? []; @@ -133,7 +134,11 @@ export const AppStateProvider = ({ const login = async () => { const { dataCenter } = appState; await dataCenter.login(); + const user = (await dataCenter.getUserInfo()) as User; + if (!user) { + throw new Error('User info not found'); + } setAppState({ ...appState, user, diff --git a/packages/app/src/styles/helper.ts b/packages/app/src/styles/helper.ts index 826b222a5c..da70c3cd4b 100644 --- a/packages/app/src/styles/helper.ts +++ b/packages/app/src/styles/helper.ts @@ -106,7 +106,7 @@ export const textEllipsis = (lineNum = 1): CSSProperties => { display: '-webkit-box', wordBreak: 'break-all', WebkitBoxOrient: 'vertical', - WebkitLineClamp: `${lineNum}`, //需要显示的行数 + WebkitLineClamp: `${lineNum}`, //the number of rows to display overflow: 'hidden', textOverflow: 'ellipsis', }; diff --git a/packages/app/src/styles/theme.ts b/packages/app/src/styles/theme.ts index 1412e00285..f317397fae 100644 --- a/packages/app/src/styles/theme.ts +++ b/packages/app/src/styles/theme.ts @@ -20,6 +20,7 @@ export const getLightTheme = ( popoverBackground: '#fff', tooltipBackground: '#6880FF', codeBackground: '#f2f5f9', + codeBlockBackground: '#fafbfd', warningBackground: '#FFF9C7', errorBackground: '#FFDED8', @@ -40,6 +41,7 @@ export const getLightTheme = ( disableColor: '#C0C0C0', warningColor: '#906616', errorColor: '#EB4335', + lineNumberColor: '#888A9E', }, font: { xs: '12px', @@ -96,6 +98,7 @@ export const getDarkTheme = ( editorMode === 'edgeless' ? lightTheme.colors.codeBackground : '#505662', + codeBlockBackground: '#36383D', warningBackground: '#FFF9C7', errorBackground: '#FFDED8', @@ -117,6 +120,7 @@ export const getDarkTheme = ( disableColor: '#4b4b4b', warningColor: '#906616', errorColor: '#EB4335', + lineNumberColor: '#888A9E', }, shadow: { popover: @@ -154,12 +158,14 @@ export const globalThemeVariables: ( '--affine-popover-color': theme.colors.popoverColor, '--affine-input-color': theme.colors.inputColor, '--affine-code-color': theme.colors.codeColor, + '--affine-code-block-background': theme.colors.codeBlockBackground, '--affine-quote-color': theme.colors.quoteColor, '--affine-selected-color': theme.colors.selectedColor, '--affine-placeholder-color': theme.colors.placeHolderColor, '--affine-border-color': theme.colors.borderColor, '--affine-disable-color': theme.colors.disableColor, '--affine-tooltip-color': theme.colors.tooltipColor, + '--affine-line-number-color': theme.colors.lineNumberColor, '--affine-modal-shadow': theme.shadow.modal, '--affine-popover-shadow': theme.shadow.popover, diff --git a/packages/app/src/styles/types.ts b/packages/app/src/styles/types.ts index 85b12df586..81816ad611 100644 --- a/packages/app/src/styles/types.ts +++ b/packages/app/src/styles/types.ts @@ -25,6 +25,7 @@ export interface AffineTheme { hoverBackground: string; innerHoverBackground: string; codeBackground: string; + codeBlockBackground: string; warningBackground: string; errorBackground: string; // Use for the page`s text @@ -47,6 +48,7 @@ export interface AffineTheme { disableColor: string; warningColor: string; errorColor: string; + lineNumberColor: string; }; font: { xs: string; // tiny @@ -90,6 +92,8 @@ export interface AffineThemeCSSVariables { '--affine-popover-background': AffineTheme['colors']['popoverBackground']; '--affine-hover-background': AffineTheme['colors']['hoverBackground']; '--affine-code-background': AffineTheme['colors']['codeBackground']; + + '--affine-code-block-background': AffineTheme['colors']['codeBlockBackground']; '--affine-tooltip-background': AffineTheme['colors']['tooltipBackground']; '--affine-text-color': AffineTheme['colors']['textColor']; @@ -107,6 +111,7 @@ export interface AffineThemeCSSVariables { '--affine-border-color': AffineTheme['colors']['borderColor']; '--affine-disable-color': AffineTheme['colors']['disableColor']; '--affine-tooltip-color': AffineTheme['colors']['tooltipColor']; + '--affine-line-number-color': AffineTheme['colors']['lineNumberColor']; '--affine-modal-shadow': AffineTheme['shadow']['modal']; '--affine-popover-shadow': AffineTheme['shadow']['popover']; diff --git a/packages/app/src/templates/Welcome-to-AFFiNE-Alpha-v2.0.md b/packages/app/src/templates/Welcome-to-AFFiNE-Abbey-Alpha-Wood.md similarity index 99% rename from packages/app/src/templates/Welcome-to-AFFiNE-Alpha-v2.0.md rename to packages/app/src/templates/Welcome-to-AFFiNE-Abbey-Alpha-Wood.md index 130b2918b8..91e2fe48c0 100644 --- a/packages/app/src/templates/Welcome-to-AFFiNE-Alpha-v2.0.md +++ b/packages/app/src/templates/Welcome-to-AFFiNE-Abbey-Alpha-Wood.md @@ -39,7 +39,7 @@ docker run -it --name affine -d -v [YOUR_PATH]:/app/data -p 3000:3000 ghcr.io/to [] What about a code block? ````` -```javascript +```JavaScript console.log('Hello world'); ``` diff --git a/packages/app/src/templates/Welcome-to-AFFiNE-Alpha-Downhill.md b/packages/app/src/templates/Welcome-to-AFFiNE-Alpha-Downhill.md new file mode 100644 index 0000000000..41dca80200 --- /dev/null +++ b/packages/app/src/templates/Welcome-to-AFFiNE-Alpha-Downhill.md @@ -0,0 +1,24 @@ +We've been working hard on improving the user experience and have made several new features live for you to use. + +If you are looking for **support**, would like to **suggest** your ideas, and keep on top of all the **latest updates**. We suggest you visit the [AFFiNE Community](https://community.affine.pro/home) site. + +Let us know what you think of this latest version. + +**AFFiNE Alpha Downhill brings:** + +We are mainly working on features for pathfinder. + +- Support SlashMenu #629 +- Support BlockHub + DragHandle #630 +- Support Whiteboard with basic usability #631 +- Support bracket autocomplete #632 @lawvs +- Support Database #633 +- Support Account(Google Login) #608 @alt1o @darkskygit +- Support AFFiNE Collaboration by AFFiNE Cloud #609 @darkskygit @zuoxiaodong0815 +- Support Local First Multi Workspace #610 @QiShaoXuan @darkskygit +- Support AFFiNE Cloud Sync #611 @alt1o @SaikaSakura @darkskygit +- Support Download Workspace by AFFiNE Cloud #612 @darkskygit @alt1o @SaikaSakura +- Support Workspace Sharing by AFFiNE Cloud #613 @alt1o @SaikaSakura +- Import Markdown #615 @QiShaoXuan @thorseraq +- [improvement]: i18n integration #567 @JimmFly +- Support DataCEnter @SaikaSakura @alt1o #708 diff --git a/packages/app/src/ui/button/styles.ts b/packages/app/src/ui/button/styles.ts index 54cda81dcc..aceb22fddd 100644 --- a/packages/app/src/ui/button/styles.ts +++ b/packages/app/src/ui/button/styles.ts @@ -182,7 +182,7 @@ export const StyledButton = styled('button', { paddingLeft: padding, paddingRight: padding, border: '1px solid', - ...displayInlineFlex('flex-start', 'center'), + ...displayInlineFlex('center', 'center'), position: 'relative', // TODO: disabled color is not decided ...(disabled @@ -202,6 +202,7 @@ export const StyledButton = styled('button', { }, '>span': { marginLeft: '5px', + width: '100%', }, // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore diff --git a/packages/app/src/ui/confirm/Confirm.tsx b/packages/app/src/ui/confirm/Confirm.tsx index 1c22e16021..27bf8579e0 100644 --- a/packages/app/src/ui/confirm/Confirm.tsx +++ b/packages/app/src/ui/confirm/Confirm.tsx @@ -1,7 +1,8 @@ import { useState } from 'react'; import { Modal, ModalCloseButton, ModalProps } from '../modal'; import { - StyledButtonWrapper, + StyledRowButtonWrapper, + StyledColumnButtonWrapper, StyledConfirmContent, StyledConfirmTitle, StyledModalWrapper, @@ -15,6 +16,7 @@ export type ConfirmProps = { cancelText?: string; // TODO: Confirm button's color should depend on confirm type confirmType?: 'primary' | 'warning' | 'danger'; + buttonDirection?: 'row' | 'column'; onConfirm?: () => void; onCancel?: () => void; } & Omit; @@ -26,6 +28,7 @@ export const Confirm = ({ confirmType, onConfirm, onCancel, + buttonDirection = 'row', cancelText = 'Cancel', }: ConfirmProps) => { const [open, setOpen] = useState(true); @@ -41,31 +44,63 @@ export const Confirm = ({ /> {title} {content} - - - - - + {buttonDirection === 'row' ? ( + + + + + ) : ( + + + + + )}
    ); diff --git a/packages/app/src/ui/confirm/styles.ts b/packages/app/src/ui/confirm/styles.ts index ef2c86155d..3646cdcc38 100644 --- a/packages/app/src/ui/confirm/styles.ts +++ b/packages/app/src/ui/confirm/styles.ts @@ -3,8 +3,10 @@ import { ModalWrapper } from '@/ui/modal'; export const StyledModalWrapper = styled(ModalWrapper)(() => { return { - width: '460px', - padding: '46px 60px 32px', + minWidth: '460px', + maxWidth: '560px', + maxHeight: '292px', + padding: '44px 84px 32px 84px', }; }); @@ -14,6 +16,7 @@ export const StyledConfirmTitle = styled.div(({ theme }) => { fontWeight: 600, textAlign: 'center', color: theme.colors.popoverColor, + lineHeight: '28px', }; }); @@ -23,12 +26,21 @@ export const StyledConfirmContent = styled.div(({ theme }) => { textAlign: 'center', marginTop: '12px', color: theme.colors.textColor, + lineHeight: '26px', }; }); -export const StyledButtonWrapper = styled.div(() => { +export const StyledColumnButtonWrapper = styled.div(() => { return { ...displayFlex('center', 'center'), + flexDirection: 'column', + marginTop: '32px', + }; +}); +export const StyledRowButtonWrapper = styled.div(() => { + return { + ...displayFlex('center', 'center'), + flexDirection: 'row', marginTop: '32px', }; }); diff --git a/packages/app/src/ui/input/Input.tsx b/packages/app/src/ui/input/Input.tsx index c4fe7600ca..1ca8b8684f 100644 --- a/packages/app/src/ui/input/Input.tsx +++ b/packages/app/src/ui/input/Input.tsx @@ -12,6 +12,7 @@ type inputProps = { placeholder?: string; disabled?: boolean; width?: number; + height?: number; maxLength?: number; minLength?: number; onChange?: (value: string) => void; @@ -26,6 +27,7 @@ export const Input = (props: inputProps) => { placeholder, maxLength, minLength, + height, width = 260, onChange, onBlur, @@ -62,6 +64,7 @@ export const Input = (props: inputProps) => { onChange={handleChange} onBlur={handleBlur} onKeyDown={handleKeyDown} + height={height} > ); }; diff --git a/packages/app/src/ui/input/style.ts b/packages/app/src/ui/input/style.ts index fd0e4d21f1..b8cb51c3d2 100644 --- a/packages/app/src/ui/input/style.ts +++ b/packages/app/src/ui/input/style.ts @@ -4,7 +4,8 @@ export const StyledInput = styled('input')<{ disabled?: boolean; value?: string; width: number; -}>(({ theme, width, disabled }) => { + height?: number; +}>(({ theme, width, disabled, height }) => { const fontWeight = 400; const fontSize = '16px'; return { @@ -13,6 +14,7 @@ export const StyledInput = styled('input')<{ padding: '8px 12px', fontWeight, fontSize, + height: height ? `${height}px` : 'auto', color: disabled ? theme.colors.disableColor : theme.colors.inputColor, border: `1px solid`, borderColor: theme.colors.borderColor, // TODO: check out disableColor, diff --git a/packages/data-center/package.json b/packages/data-center/package.json index e17a2fb65e..37431877e6 100644 --- a/packages/data-center/package.json +++ b/packages/data-center/package.json @@ -23,11 +23,12 @@ "@playwright/test": "^1.29.1", "@types/debug": "^4.1.7", "fake-indexeddb": "4.0.1", - "typescript": "^4.8.4" + "typescript": "^4.8.4", + "yjs": "^13.5.44" }, "dependencies": { - "@blocksuite/blocks": "0.3.1-20230109032243-37ad3ba", - "@blocksuite/store": "0.3.1-20230109032243-37ad3ba", + "@blocksuite/blocks": "0.4.0-20230111171650-bc63456", + "@blocksuite/store": "0.4.0-20230111171650-bc63456", "@tauri-apps/api": "^1.2.0", "debug": "^4.3.4", "encoding": "^0.1.13", @@ -37,11 +38,6 @@ "ky-universal": "^0.11.0", "lib0": "^0.2.58", "swr": "^2.0.0", - "y-protocols": "^1.0.5", - "yjs": "^13.5.44" - }, - "peerDependencies": { - "@blocksuite/blocks": "0.3.1-*", - "@blocksuite/store": "0.3.1-*" + "y-protocols": "^1.0.5" } } diff --git a/packages/data-center/src/datacenter.ts b/packages/data-center/src/datacenter.ts index 306b9f0184..d8cb8ef201 100644 --- a/packages/data-center/src/datacenter.ts +++ b/packages/data-center/src/datacenter.ts @@ -23,7 +23,7 @@ export class DataCenter { private readonly _workspaceUnitCollection = new WorkspaceUnitCollection(); private readonly _logger = getLogger('dc'); private _workspaceInstances: Map = new Map(); - private _messageCenter = new MessageCenter(); + private _messageCenter = MessageCenter.getInstance(); /** * A mainProvider must exist as the only data trustworthy source. */ @@ -159,7 +159,9 @@ export class DataCenter { * @param {string} workspaceId workspace id * @returns {Promise} */ - public async loadWorkspace(workspaceId: string) { + public async loadWorkspace( + workspaceId: string + ): Promise { const workspaceUnit = this._workspaceUnitCollection.find(workspaceId); assert(workspaceUnit, 'Workspace not found'); const currentProvider = this.providerMap.get(workspaceUnit.provider); @@ -425,13 +427,14 @@ export class DataCenter { /** * accept invitation * @param {string} inviteCode + * @returns {Promise} permission */ async acceptInvitation(inviteCode: string, providerStr = 'affine') { const provider = this.providerMap.get(providerStr); if (provider) { return await provider.acceptInvitation(inviteCode); } - return []; + return null; } onMessage(cb: (message: Message) => void) { diff --git a/packages/data-center/src/message/code.ts b/packages/data-center/src/message/code.ts index 271ffc8d38..d7df926960 100644 --- a/packages/data-center/src/message/code.ts +++ b/packages/data-center/src/message/code.ts @@ -1,3 +1,61 @@ export enum MessageCode { loginError, + noPermission, + loadListFailed, + getDetailFailed, + createWorkspaceFailed, + getMembersFailed, + updateWorkspaceFailed, + deleteWorkspaceFailed, + inviteMemberFailed, + removeMemberFailed, + acceptInvitingFailed, + getBlobFailed, + leaveWorkspaceFailed, + downloadWorkspaceFailed, } + +export const messages = { + [MessageCode.loginError]: { + message: 'Login failed', + }, + [MessageCode.noPermission]: { + message: 'No permission', + }, + [MessageCode.loadListFailed]: { + message: 'Load list failed', + }, + [MessageCode.getDetailFailed]: { + message: 'Get detail failed', + }, + [MessageCode.createWorkspaceFailed]: { + message: 'Create workspace failed', + }, + [MessageCode.getMembersFailed]: { + message: 'Get members failed', + }, + [MessageCode.updateWorkspaceFailed]: { + message: 'Update workspace failed', + }, + [MessageCode.deleteWorkspaceFailed]: { + message: 'Delete workspace failed', + }, + [MessageCode.inviteMemberFailed]: { + message: 'Invite member failed', + }, + [MessageCode.removeMemberFailed]: { + message: 'Remove member failed', + }, + [MessageCode.acceptInvitingFailed]: { + message: 'Accept inviting failed', + }, + [MessageCode.getBlobFailed]: { + message: 'Get blob failed', + }, + [MessageCode.leaveWorkspaceFailed]: { + message: 'Leave workspace failed', + }, + [MessageCode.downloadWorkspaceFailed]: { + message: 'Download workspace failed', + }, +}; diff --git a/packages/data-center/src/message/message.ts b/packages/data-center/src/message/message.ts index 6de9c75795..4becebc2ff 100644 --- a/packages/data-center/src/message/message.ts +++ b/packages/data-center/src/message/message.ts @@ -1,24 +1,36 @@ import { Observable } from 'lib0/observable'; import { Message } from '../types'; -import { MessageCode } from './code.js'; +import { MessageCode, messages } from './code.js'; export class MessageCenter extends Observable { + private _messages: Record> = + messages; constructor() { super(); } - public send(message: MessageCode) { - this.emit('message', [message]); + static instance: MessageCenter; + + static getInstance() { + if (!MessageCenter.instance) { + MessageCenter.instance = new MessageCenter(); + } + return MessageCenter.instance; + } + + static messageCode = MessageCode; + + public getMessageSender(provider: string) { + return this._send.bind(this, provider); + } + + private _send(provider: string, messageCode: MessageCode) { + this.emit('message', [ + { ...this._messages[messageCode], provider, code: messageCode }, + ]); } public onMessage(callback: (message: Message) => void) { this.on('message', callback); } - - private messages: Record = { - [MessageCode.loginError]: { - code: MessageCode.loginError, - message: 'Login failed', - }, - }; } diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index f33080fc32..025ef96d39 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -2,7 +2,6 @@ import { BaseProvider } from '../base.js'; import type { ProviderConstructorParams, CreateWorkspaceInfoParams, - WorkspaceMeta0, } from '../base'; import type { User } from '../../types'; import { Workspace as BlocksuiteWorkspace } from '@blocksuite/store'; @@ -12,18 +11,13 @@ import { WebsocketProvider } from './sync.js'; // import { IndexedDBProvider } from '../local/indexeddb'; import { getApis, Workspace } from './apis/index.js'; import type { Apis, WorkspaceDetail, Callback } from './apis'; -import { setDefaultAvatar } from '../utils.js'; -import { MessageCode } from '../../message/index.js'; import { token } from './apis/token.js'; import { WebsocketClient } from './channel'; -import { - loadWorkspaceUnit, - createWorkspaceUnit, - syncToCloud, -} from './utils.js'; +import { loadWorkspaceUnit, createWorkspaceUnit } from './utils.js'; import { WorkspaceUnit } from '../../workspace-unit.js'; import { createBlocksuiteWorkspace, applyUpdate } from '../../utils/index.js'; import type { SyncMode } from '../../workspace-unit'; +import { MessageCenter } from '../../message/index.js'; type ChannelMessage = { ws_list: Workspace[]; @@ -42,9 +36,8 @@ const { export class AffineProvider extends BaseProvider { public id = 'affine'; - private _workspacesCache: Map = new Map(); private _onTokenRefresh?: Callback = undefined; - private _wsMap: Map = new Map(); + private _wsMap: Map = new Map(); private _apis: Apis; private _channel?: WebsocketClient; // private _idbMap: Map = new Map(); @@ -105,11 +98,23 @@ export class AffineProvider extends BaseProvider { }); } - private _handlerAffineListMessage({ ws_details, metadata }: ChannelMessage) { + private async _handlerAffineListMessage({ + ws_details, + metadata, + }: ChannelMessage) { this._logger('receive server message'); - Object.entries(ws_details).forEach(async ([id, detail]) => { + const addedWorkspaces: WorkspaceUnit[] = []; + const removeWorkspaceList = this._workspaces.list().map(w => w.id); + for (const [id, detail] of Object.entries(ws_details)) { const { name, avatar } = metadata[id]; - assert(name); + const index = removeWorkspaceList.indexOf(id); + if (index !== -1) { + removeWorkspaceList.splice(index, 1); + } + assert( + name, + 'workspace name not found by id when receive server message' + ); const workspace = { name: name, avatar, @@ -121,26 +126,31 @@ export class AffineProvider extends BaseProvider { }, published: detail.public, memberCount: detail.member_count, - provider: 'affine', + provider: this.id, syncMode: 'core' as SyncMode, }; if (this._workspaces.get(id)) { + // update workspaces this._workspaces.update(id, workspace); } else { const workspaceUnit = await loadWorkspaceUnit( { id, ...workspace }, this._apis ); - this._workspaces.add(workspaceUnit); + addedWorkspaces.push(workspaceUnit); } - }); + } + // add workspaces + this._workspaces.add(addedWorkspaces); + // remove workspaces + this._workspaces.remove(removeWorkspaceList); } private _getWebsocketProvider(workspace: BlocksuiteWorkspace) { const { doc, room } = workspace; assert(room); assert(doc); - let ws = this._wsMap.get(room); + let ws = this._wsMap.get(workspace); if (!ws) { const wsUrl = `${ window.location.protocol === 'https:' ? 'wss' : 'ws' @@ -148,7 +158,7 @@ export class AffineProvider extends BaseProvider { ws = new WebsocketProvider(wsUrl, room, doc, { params: { token: this._apis.token.refresh }, }); - this._wsMap.set(room, ws); + this._wsMap.set(workspace, ws); } return ws; } @@ -175,8 +185,8 @@ export class AffineProvider extends BaseProvider { this.linkLocal(workspace); const ws = this._getWebsocketProvider(workspace); // close all websocket links - Array.from(this._wsMap.entries()).forEach(([id, ws]) => { - if (id !== room) { + Array.from(this._wsMap.entries()).forEach(([blocksuiteWorkspace, ws]) => { + if (blocksuiteWorkspace !== workspace) { ws.disconnect(); } }); @@ -207,7 +217,7 @@ export class AffineProvider extends BaseProvider { owner: undefined, published: w.public, memberCount: 1, - provider: 'affine', + provider: this.id, syncMode: 'core', }, this._apis @@ -232,14 +242,12 @@ export class AffineProvider extends BaseProvider { this._connectChannel(); } if (!user) { - this._messageCenter.send(MessageCode.loginError); + this._sendMessage(MessageCenter.messageCode.loginError); } } public override async getUserInfo(): Promise { - await this.init(); const user = this._apis.token.user; - await this.init; return user ? { id: user.id, @@ -258,23 +266,29 @@ export class AffineProvider extends BaseProvider { } public override async clear(): Promise { - for (const w of this._workspacesCache.values()) { - if (w.room) { + for (const w of this._workspaces.list()) { + if (w.id) { try { - await this.deleteWorkspace(w.room); - this._workspaces.remove(w.room); + await this.deleteWorkspace(w.id); + this._workspaces.remove(w.id); } catch (e) { this._logger('has a problem of delete workspace ', e); } } } - this._workspacesCache.clear(); + this._workspaces.clear(); } public override async closeWorkspace(id: string) { // const idb = this._idbMap.get(id); // idb?.destroy(); - const ws = this._wsMap.get(id); + const workspaceUnit = this._workspaces.get(id); + const ws = workspaceUnit?.blocksuiteWorkspace + ? this._wsMap.get(workspaceUnit?.blocksuiteWorkspace) + : null; + if (!ws) { + console.error('close workspace websocket which not exist.'); + } ws?.disconnect(); } @@ -305,7 +319,22 @@ export class AffineProvider extends BaseProvider { public override async createWorkspace( meta: CreateWorkspaceInfoParams ): Promise { - const { id } = await this._apis.createWorkspace(meta); + const workspaceUnitForUpload = await createWorkspaceUnit({ + id: '', + name: meta.name, + avatar: undefined, + owner: await this.getUserInfo(), + published: false, + memberCount: 1, + provider: this.id, + syncMode: 'core', + }); + const { id } = await this._apis.createWorkspace( + new Blob([ + encodeStateAsUpdate(workspaceUnitForUpload.blocksuiteWorkspace!.doc) + .buffer, + ]) + ); const workspaceUnit = await createWorkspaceUnit({ id, @@ -314,14 +343,10 @@ export class AffineProvider extends BaseProvider { owner: await this.getUserInfo(), published: false, memberCount: 1, - provider: 'affine', + provider: this.id, syncMode: 'core', }); - await syncToCloud( - workspaceUnit.blocksuiteWorkspace!, - this._apis.token.refresh - ); this._workspaces.add(workspaceUnit); return workspaceUnit; @@ -349,9 +374,11 @@ export class AffineProvider extends BaseProvider { public override async extendWorkspace( workspaceUnit: WorkspaceUnit ): Promise { - const { id } = await this._apis.createWorkspace({ - name: workspaceUnit.name, - }); + const { id } = await this._apis.createWorkspace( + new Blob([ + encodeStateAsUpdate(workspaceUnit.blocksuiteWorkspace!.doc).buffer, + ]) + ); const newWorkspaceUnit = new WorkspaceUnit({ id, name: workspaceUnit.name, @@ -359,7 +386,7 @@ export class AffineProvider extends BaseProvider { owner: await this.getUserInfo(), published: false, memberCount: 1, - provider: 'affine', + provider: this.id, syncMode: 'core', }); @@ -370,8 +397,6 @@ export class AffineProvider extends BaseProvider { encodeStateAsUpdate(workspaceUnit.blocksuiteWorkspace.doc) ); - await syncToCloud(blocksuiteWorkspace, this._apis.token.refresh); - newWorkspaceUnit.setBlocksuiteWorkspace(blocksuiteWorkspace); this._workspaces.add(newWorkspaceUnit); @@ -382,6 +407,7 @@ export class AffineProvider extends BaseProvider { token.clear(); this._channel?.disconnect(); this._wsMap.forEach(ws => ws.disconnect()); + this._workspaces.clear(); storage.removeItem('token'); } @@ -389,7 +415,7 @@ export class AffineProvider extends BaseProvider { return this._apis.getWorkspaceMembers({ id }); } - public override async acceptInvitation(invitingCode: string): Promise { - await this._apis.acceptInviting({ invitingCode }); + public override async acceptInvitation(invitingCode: string) { + return await this._apis.acceptInviting({ invitingCode }); } } diff --git a/packages/data-center/src/provider/affine/apis/request.ts b/packages/data-center/src/provider/affine/apis/request.ts index ce5b64eebe..306ac5b9e7 100644 --- a/packages/data-center/src/provider/affine/apis/request.ts +++ b/packages/data-center/src/provider/affine/apis/request.ts @@ -1,9 +1,15 @@ -import kyOrigin from 'ky'; import ky from 'ky-universal'; +import { MessageCenter } from '../../../message/index.js'; import { token } from './token.js'; -export const bareClient = ky.extend({ - prefixUrl: 'http://localhost:8080', +type KyInstance = typeof ky; + +const messageCenter = MessageCenter.getInstance(); + +const _sendMessage = messageCenter.getMessageSender('affine'); + +export const bareClient: KyInstance = ky.extend({ + prefixUrl: '/', retry: 1, hooks: { // afterResponse: [ @@ -22,7 +28,7 @@ export const bareClient = ky.extend({ }, }); -export const client = bareClient.extend({ +export const client: KyInstance = bareClient.extend({ hooks: { beforeRequest: [ async request => { @@ -41,5 +47,15 @@ export const client = bareClient.extend({ request.headers.set('Authorization', token.token); }, ], + + beforeError: [ + error => { + const { response } = error; + if (response.status === 401) { + _sendMessage(MessageCenter.messageCode.noPermission); + } + return error; + }, + ], }, }); diff --git a/packages/data-center/src/provider/affine/apis/token.ts b/packages/data-center/src/provider/affine/apis/token.ts index 4df48b3075..88c1997772 100644 --- a/packages/data-center/src/provider/affine/apis/token.ts +++ b/packages/data-center/src/provider/affine/apis/token.ts @@ -70,9 +70,6 @@ class Token { } async refreshToken(token?: string) { - if (!this._refreshToken && !token) { - throw new Error('No authorization token.'); - } if (!this._padding) { this._padding = login({ type: 'Refresh', @@ -194,6 +191,7 @@ export const getAuthorizer = () => { return [signInWithGoogle, onAuthStateChanged] as const; } catch (e) { getLogger('getAuthorizer')(e); + console.error('getAuthorizer', e); return [] as const; } }; diff --git a/packages/data-center/src/provider/affine/apis/workspace.ts b/packages/data-center/src/provider/affine/apis/workspace.ts index 050875ea18..0a02ea5602 100644 --- a/packages/data-center/src/provider/affine/apis/workspace.ts +++ b/packages/data-center/src/provider/affine/apis/workspace.ts @@ -1,6 +1,20 @@ +import { MessageCenter } from '../../../message/index.js'; import { bareClient, client } from './request.js'; import type { User } from './user'; +const messageCenter = MessageCenter.getInstance(); + +const sendMessage = messageCenter.getMessageSender('affine'); + +const { messageCode } = MessageCenter; + +class RequestError extends Error { + constructor(message: string, cause: unknown | null = null) { + super(message); + this.name = 'RequestError'; + this.cause = cause; + } +} export interface GetWorkspaceDetailParams { id: string; } @@ -26,13 +40,18 @@ export interface Workspace { } export async function getWorkspaces(): Promise { - return client - .get('api/workspace', { - headers: { - 'Cache-Control': 'no-cache', - }, - }) - .json(); + try { + return client + .get('api/workspace', { + headers: { + 'Cache-Control': 'no-cache', + }, + }) + .json(); + } catch (error) { + sendMessage(messageCode.loadListFailed); + throw new RequestError('load list failed', error); + } } export interface WorkspaceDetail extends Workspace { @@ -43,7 +62,13 @@ export interface WorkspaceDetail extends Workspace { export async function getWorkspaceDetail( params: GetWorkspaceDetailParams ): Promise { - return client.get(`api/workspace/${params.id}`).json(); + try { + const response = client.get(`api/workspace/${params.id}`); + return response.json(); + } catch (error) { + sendMessage(messageCode.getDetailFailed); + throw new RequestError('get detail failed', error); + } } export interface Permission { @@ -74,7 +99,12 @@ export interface GetWorkspaceMembersParams { export async function getWorkspaceMembers( params: GetWorkspaceDetailParams ): Promise { - return client.get(`api/workspace/${params.id}/permission`).json(); + try { + return client.get(`api/workspace/${params.id}/permission`).json(); + } catch (error) { + sendMessage(messageCode.getMembersFailed); + throw new RequestError('get members failed', error); + } } export interface CreateWorkspaceParams { @@ -82,12 +112,14 @@ export interface CreateWorkspaceParams { } export async function createWorkspace( - params: CreateWorkspaceParams + encodedYDoc: Blob ): Promise<{ id: string }> { - // FIXME: avatar should be optional - return client - .post('api/workspace', { json: { ...params, avatar: '123' } }) - .json(); + try { + return client.post('api/workspace', { body: encodedYDoc }).json(); + } catch (error) { + sendMessage(messageCode.createWorkspaceFailed); + throw new RequestError('create workspace failed', error); + } } export interface UpdateWorkspaceParams { @@ -98,13 +130,18 @@ export interface UpdateWorkspaceParams { export async function updateWorkspace( params: UpdateWorkspaceParams ): Promise<{ public: boolean | null }> { - return client - .post(`api/workspace/${params.id}`, { - json: { - public: params.public, - }, - }) - .json(); + try { + return client + .post(`api/workspace/${params.id}`, { + json: { + public: params.public, + }, + }) + .json(); + } catch (error) { + sendMessage(messageCode.updateWorkspaceFailed); + throw new RequestError('update workspace failed', error); + } } export interface DeleteWorkspaceParams { @@ -114,7 +151,10 @@ export interface DeleteWorkspaceParams { export async function deleteWorkspace( params: DeleteWorkspaceParams ): Promise { - await client.delete(`api/workspace/${params.id}`); + await client.delete(`api/workspace/${params.id}`).catch(error => { + sendMessage(messageCode.deleteWorkspaceFailed); + throw new RequestError('delete workspace failed', error); + }); } export interface InviteMemberParams { @@ -126,13 +166,18 @@ export interface InviteMemberParams { * Notice: Only support normal(contrast to private) workspace. */ export async function inviteMember(params: InviteMemberParams): Promise { - return client - .post(`api/workspace/${params.id}/permission`, { - json: { - email: params.email, - }, - }) - .json(); + try { + return client + .post(`api/workspace/${params.id}/permission`, { + json: { + email: params.email, + }, + }) + .json(); + } catch (error) { + sendMessage(messageCode.inviteMemberFailed); + throw new RequestError('invite member failed', error); + } } export interface RemoveMemberParams { @@ -140,7 +185,10 @@ export interface RemoveMemberParams { } export async function removeMember(params: RemoveMemberParams): Promise { - await client.delete(`api/permission/${params.permissionId}`); + await client.delete(`api/permission/${params.permissionId}`).catch(error => { + sendMessage(messageCode.removeMemberFailed); + throw new RequestError('remove member failed', error); + }); } export interface AcceptInvitingParams { @@ -149,8 +197,13 @@ export interface AcceptInvitingParams { export async function acceptInviting( params: AcceptInvitingParams -): Promise { - await bareClient.post(`api/invitation/${params.invitingCode}`); +): Promise { + try { + return bareClient.post(`api/invitation/${params.invitingCode}`).json(); + } catch (error) { + sendMessage(messageCode.acceptInvitingFailed); + throw new RequestError('accept inviting failed', error); + } } export async function uploadBlob(params: { blob: Blob }): Promise { @@ -160,7 +213,12 @@ export async function uploadBlob(params: { blob: Blob }): Promise { export async function getBlob(params: { blobId: string; }): Promise { - return client.get(`api/blob/${params.blobId}`).arrayBuffer(); + try { + return client.get(`api/blob/${params.blobId}`).arrayBuffer(); + } catch (error) { + sendMessage(messageCode.getBlobFailed); + throw new RequestError('get blob failed', error); + } } export interface LeaveWorkspaceParams { @@ -168,15 +226,26 @@ export interface LeaveWorkspaceParams { } export async function leaveWorkspace({ id }: LeaveWorkspaceParams) { - await client.delete(`api/workspace/${id}/permission`).json(); + await client + .delete(`api/workspace/${id}/permission`) + .json() + .catch(error => { + sendMessage(messageCode.leaveWorkspaceFailed); + throw new RequestError('leave workspace failed', error); + }); } export async function downloadWorkspace( workspaceId: string, published = false ): Promise { - if (published) { - return bareClient.get(`api/public/doc/${workspaceId}`).arrayBuffer(); + try { + if (published) { + return bareClient.get(`api/public/doc/${workspaceId}`).arrayBuffer(); + } + return client.get(`api/workspace/${workspaceId}/doc`).arrayBuffer(); + } catch (error) { + sendMessage(messageCode.downloadWorkspaceFailed); + throw new RequestError('download workspace failed', error); } - return client.get(`api/workspace/${workspaceId}/doc`).arrayBuffer(); } diff --git a/packages/data-center/src/provider/affine/channel.ts b/packages/data-center/src/provider/affine/channel.ts index 1503a8b450..da9e81c35e 100644 --- a/packages/data-center/src/provider/affine/channel.ts +++ b/packages/data-center/src/provider/affine/channel.ts @@ -3,13 +3,13 @@ import { Logger } from 'src/types'; import { token } from './apis/token'; import * as url from 'lib0/url'; -const RECONNECT_INTERVAL_TIME = 5000; +const RECONNECT_INTERVAL_TIME = 500; const MAX_RECONNECT_TIMES = 50; export class WebsocketClient extends websocket.WebsocketClient { public shouldReconnect = false; - private _reconnectInterval: number | null = null; private _logger: Logger; + private _retryTimes = 0; constructor( serverUrl: string, logger: Logger, @@ -34,30 +34,28 @@ export class WebsocketClient extends websocket.WebsocketClient { this.on('connect', () => { this._logger('Affine channel connected'); this.shouldReconnect = true; - if (this._reconnectInterval) { - window.clearInterval(this._reconnectInterval); - } + this._retryTimes = 0; }); this.on('disconnect', ({ error }: { error: Error }) => { if (error) { - let times = 0; // Try reconnect if connect error has occurred - this._reconnectInterval = window.setInterval(() => { - if (this.shouldReconnect && token.isLogin && !this.connected) { - try { - this.connect(); - this._logger(`try reconnect channel ${++times} times`); - if (times > MAX_RECONNECT_TIMES) { + if (this.shouldReconnect && token.isLogin && !this.connected) { + try { + setTimeout(() => { + if (this._retryTimes <= MAX_RECONNECT_TIMES) { + this.connect(); + this._logger( + `try reconnect channel ${++this._retryTimes} times` + ); + } else { this._logger('reconnect failed, max reconnect times reached'); - this._reconnectInterval && - window.clearInterval(this._reconnectInterval); } - } catch (e) { - this._logger('reconnect failed', e); - } + }, RECONNECT_INTERVAL_TIME); + } catch (e) { + this._logger('reconnect failed', e); } - }, RECONNECT_INTERVAL_TIME); + } } }); } diff --git a/packages/data-center/src/provider/affine/utils.ts b/packages/data-center/src/provider/affine/utils.ts index 93c2f56007..4bb401fbf2 100644 --- a/packages/data-center/src/provider/affine/utils.ts +++ b/packages/data-center/src/provider/affine/utils.ts @@ -1,10 +1,7 @@ -import assert from 'assert'; -import { Workspace as BlocksuiteWorkspace } from '@blocksuite/store'; import { WorkspaceUnit } from '../../workspace-unit.js'; import type { WorkspaceUnitCtorParams } from '../../workspace-unit'; import { createBlocksuiteWorkspace } from '../../utils/index.js'; import type { Apis } from './apis'; -import { WebsocketProvider } from './sync.js'; import { setDefaultAvatar } from '../utils.js'; import { applyUpdate } from '../../utils/index.js'; @@ -42,37 +39,6 @@ export const loadWorkspaceUnit = async ( return workspaceUnit; }; -export const syncToCloud = async ( - blocksuiteWorkspace: BlocksuiteWorkspace, - refreshToken: string -) => { - const workspaceId = blocksuiteWorkspace.room; - assert(workspaceId, 'Blocksuite workspace without room(workspaceId).'); - - const wsUrl = `${window.location.protocol === 'https:' ? 'wss' : 'ws'}://${ - window.location.host - }/api/sync/`; - - const ws = new WebsocketProvider( - wsUrl, - workspaceId, - blocksuiteWorkspace.doc, - { - params: { token: refreshToken }, - } - ); - - await new Promise((resolve, reject) => { - ws.once('synced', () => { - // FIXME: we don't when send local data to cloud successfully, so hack to wait 1s. - // Server will support this by add a new api. - setTimeout(resolve, 1000); - }); - ws.once('lost-connection', () => reject()); - ws.once('connection-error', () => reject()); - }); -}; - export const createWorkspaceUnit = async (params: WorkspaceUnitCtorParams) => { const workspaceUnit = new WorkspaceUnit(params); diff --git a/packages/data-center/src/provider/base.ts b/packages/data-center/src/provider/base.ts index 653efb6bc6..eb9a68d748 100644 --- a/packages/data-center/src/provider/base.ts +++ b/packages/data-center/src/provider/base.ts @@ -4,6 +4,7 @@ import { Logger, User } from '../types'; import type { WorkspaceUnitCollectionScope } from '../workspace-unit-collection'; import type { WorkspaceUnitCtorParams, WorkspaceUnit } from '../workspace-unit'; import { Member } from './affine/apis'; +import { Permission } from './affine/apis/workspace.js'; const defaultLogger = () => { return; @@ -22,10 +23,15 @@ export type UpdateWorkspaceMetaParams = Partial< >; export class BaseProvider { + /** provider id */ public readonly id: string = 'base'; + /** workspace unit collection */ protected _workspaces!: WorkspaceUnitCollectionScope; protected _logger!: Logger; - protected _messageCenter!: MessageCenter; + /** send message with message center */ + protected _sendMessage!: ReturnType< + InstanceType['getMessageSender'] + >; public constructor({ logger, @@ -34,7 +40,7 @@ export class BaseProvider { }: ProviderConstructorParams) { this._logger = (logger || defaultLogger) as Logger; this._workspaces = workspaces; - this._messageCenter = messageCenter; + this._sendMessage = messageCenter.getMessageSender(this.id); } /** @@ -228,8 +234,10 @@ export class BaseProvider { * @param {string} inviteCode * @returns */ - public async acceptInvitation(inviteCode: string): Promise { + public async acceptInvitation( + inviteCode: string + ): Promise { inviteCode; - return; + return null; } } diff --git a/packages/data-center/src/provider/local/indexeddb/utils.ts b/packages/data-center/src/provider/local/indexeddb/utils.ts index 0a83282a6a..68a4172eb3 100644 --- a/packages/data-center/src/provider/local/indexeddb/utils.ts +++ b/packages/data-center/src/provider/local/indexeddb/utils.ts @@ -20,6 +20,7 @@ export const writeUpdatesToLocal = async ( if (updatesStore) { await idb.addAutoKey(updatesStore, currState); } + db.close(); }; export const applyLocalUpdates = async ( diff --git a/packages/data-center/src/provider/local/local.ts b/packages/data-center/src/provider/local/local.ts index 3ecb7ea2e1..f9b819ea40 100644 --- a/packages/data-center/src/provider/local/local.ts +++ b/packages/data-center/src/provider/local/local.ts @@ -8,6 +8,7 @@ import type { import { varStorage as storage } from 'lib0/storage'; import { Workspace as BlocksuiteWorkspace, uuidv4 } from '@blocksuite/store'; import { IndexedDBProvider } from './indexeddb/indexeddb.js'; +import { applyLocalUpdates } from './indexeddb/utils.js'; import assert from 'assert'; import { loadWorkspaceUnit, createWorkspaceUnit } from './utils.js'; import type { WorkspaceUnit } from '../../workspace-unit'; @@ -48,6 +49,7 @@ export class LocalProvider extends BaseProvider { workspace: BlocksuiteWorkspace ): Promise { assert(workspace.room); + await applyLocalUpdates(workspace); await this.linkLocal(workspace); return workspace; } @@ -101,7 +103,7 @@ export class LocalProvider extends BaseProvider { owner: undefined, syncMode: 'core', memberCount: 1, - provider: 'local', + provider: this.id, }); this._workspaces.add(workspaceUnit); this._storeWorkspaces(this._workspaces.list()); diff --git a/packages/data-center/src/types/index.ts b/packages/data-center/src/types/index.ts index 2c29931a0f..568b906652 100644 --- a/packages/data-center/src/types/index.ts +++ b/packages/data-center/src/types/index.ts @@ -32,4 +32,5 @@ export type Logger = ReturnType; export type Message = { code: number; message: string; + provider: string; }; diff --git a/packages/data-center/src/workspace-unit-collection.ts b/packages/data-center/src/workspace-unit-collection.ts index 7d55762560..c44ef3feb0 100644 --- a/packages/data-center/src/workspace-unit-collection.ts +++ b/packages/data-center/src/workspace-unit-collection.ts @@ -8,7 +8,7 @@ export interface WorkspaceUnitCollectionScope { get: (workspaceId: string) => WorkspaceUnit | undefined; list: () => WorkspaceUnit[]; add: (workspace: WorkspaceUnit | WorkspaceUnit[]) => void; - remove: (workspaceId: string) => boolean; + remove: (workspaceId: string | string[]) => boolean; clear: () => void; update: ( workspaceId: string, @@ -18,7 +18,7 @@ export interface WorkspaceUnitCollectionScope { export interface WorkspaceUnitCollectionChangeEvent { added?: WorkspaceUnit[]; - deleted?: WorkspaceUnit; + deleted?: WorkspaceUnit[]; updated?: WorkspaceUnit; } @@ -62,16 +62,22 @@ export class WorkspaceUnitCollection { const workspaceUnits = Array.isArray(workspaceUnit) ? workspaceUnit : [workspaceUnit]; + let added = false; workspaceUnits.forEach(workspaceUnit => { if (this._workspaceUnitMap.has(workspaceUnit.id)) { // FIXME: multiple add same workspace return; } + added = true; this._workspaceUnitMap.set(workspaceUnit.id, workspaceUnit); scopedWorkspaceIds.add(workspaceUnit.id); }); + if (!added) { + return; + } + this._events.emit('change', [ { added: workspaceUnits, @@ -79,34 +85,44 @@ export class WorkspaceUnitCollection { ]); }; - const remove = (workspaceId: string) => { - if (!scopedWorkspaceIds.has(workspaceId)) { - return true; - } + const remove = (workspaceId: string | string[]) => { + const workspaceIds = Array.isArray(workspaceId) + ? workspaceId + : [workspaceId]; + const workspaceUnits: WorkspaceUnit[] = []; - const workspaceUnit = this._workspaceUnitMap.get(workspaceId); - if (workspaceUnit) { - const ret = this._workspaceUnitMap.delete(workspaceId); - // If deletion failed, return. - if (!ret) { - return ret; + workspaceIds.forEach(workspaceId => { + if (!scopedWorkspaceIds.has(workspaceId)) { + return; } + const workspaceUnit = this._workspaceUnitMap.get(workspaceId); + if (workspaceUnit) { + const ret = this._workspaceUnitMap.delete(workspaceId); + // If deletion failed, return. + if (!ret) { + return; + } - scopedWorkspaceIds.delete(workspaceId); + workspaceUnits.push(workspaceUnit); + scopedWorkspaceIds.delete(workspaceId); + } + }); - this._events.emit('change', [ - { - deleted: workspaceUnit, - } as WorkspaceUnitCollectionChangeEvent, - ]); + if (!workspaceUnits.length) { + return false; } + + this._events.emit('change', [ + { + deleted: workspaceUnits, + } as WorkspaceUnitCollectionChangeEvent, + ]); + return true; }; const clear = () => { - scopedWorkspaceIds.forEach(id => { - remove(id); - }); + remove(Array.from(scopedWorkspaceIds)); }; const update = (workspaceId: string, meta: UpdateWorkspaceUnitParams) => { diff --git a/packages/data-center/src/workspace-unit.ts b/packages/data-center/src/workspace-unit.ts index 5bc4bf8aef..1560ec7bf6 100644 --- a/packages/data-center/src/workspace-unit.ts +++ b/packages/data-center/src/workspace-unit.ts @@ -52,7 +52,7 @@ export class WorkspaceUnit { } setBlocksuiteWorkspace(blocksuiteWorkspace: BlocksuiteWorkspace | null) { - if (blocksuiteWorkspace && blocksuiteWorkspace?.room !== this.id) { + if (blocksuiteWorkspace && blocksuiteWorkspace.room !== this.id) { throw new Error('Workspace id inconsistent.'); } this._blocksuiteWorkspace = blocksuiteWorkspace; diff --git a/packages/i18n/README.md b/packages/i18n/README.md new file mode 100644 index 0000000000..ec443f6fc8 --- /dev/null +++ b/packages/i18n/README.md @@ -0,0 +1,62 @@ +# i18n + +## Usages + +- Update missing translations into the base resources, a.k.a the `src/resources/en.json` +- Replace literal text with translation keys + +```tsx +import { useTranslation } from '@affine/i18n'; + +// src/resources/en.json +// { +// 'Text': 'some text', +// 'Switch to language': 'Switch to {{language}}', // <- you can interpolation by curly brackets +// }; + +const App = () => { + const { t } = useTranslation(); + + const changeLanguage = (language: string) => { + i18n.changeLanguage(language); + }; + + return ( +
    +
    {t('Text')}
    + + + +
    + ); +}; +``` + +## How the i18n workflow works? + +- When the `src/resources/en.json`(base language) updated and merged to the develop branch, will trigger the `languages-sync` action. +- The `languages-sync` action will check the base language and add missing translations to the Tolgee platform. +- This way, partners from the community can update the translations. + +## How to sync translations manually + +- Set token as environment variable + +```shell +export TOLGEE_API_KEY=tgpak_XXXXXXX +``` + +- Run the `sync-languages:check` to check all languages +- Run the `sync-languages` script to add new keys to the Tolgee platform +- Run the `download-resources` script to download the latest full-translation translation resources from the Tolgee platform + +## References + +- [AFFiNE | Tolgee](https://i18n.affine.pro/) +- [Tolgee Documentation](https://tolgee.io/docs/) +- [i18next](https://www.i18next.com/) +- [react-i18next](https://react.i18next.com/) diff --git a/packages/i18n/package.json b/packages/i18n/package.json index cc559528e3..eb6c30a1a1 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -10,7 +10,10 @@ ".": "./dist/src/index.js" }, "scripts": { - "build": "tsc --project ./tsconfig.json" + "build": "tsc --project ./tsconfig.json", + "sync-languages": "NODE_OPTIONS=--experimental-fetch ts-node-esm src/scripts/sync.ts", + "sync-languages:check": "pnpm run sync-languages --check", + "download-resources": "NODE_OPTIONS=--experimental-fetch ts-node-esm src/scripts/download.ts" }, "keywords": [], "repository": { @@ -24,6 +27,7 @@ }, "devDependencies": { "@types/prettier": "^2.7.2", + "ts-node": "^10.9.1", "typescript": "^4.8.4" } } diff --git a/packages/i18n/src/index.ts b/packages/i18n/src/index.ts index 714cc40f31..47b5d3251e 100644 --- a/packages/i18n/src/index.ts +++ b/packages/i18n/src/index.ts @@ -15,6 +15,7 @@ declare module 'react-i18next' { // custom namespace type if you changed it // defaultNS: 'ns1'; // custom resources type + allowObjectInHTMLChildren: true; resources: { en: typeof en_US; }; diff --git a/packages/i18n/src/resources/bn.json b/packages/i18n/src/resources/bn.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/packages/i18n/src/resources/bn.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/packages/i18n/src/resources/en.json b/packages/i18n/src/resources/en.json index 761f649c18..97766c8050 100644 --- a/packages/i18n/src/resources/en.json +++ b/packages/i18n/src/resources/en.json @@ -1,11 +1,8 @@ { "Quick search": "Quick search", - "Quick search placeholder": "Quick Search...", - "Quick search placeholder2": "Search in {{workspace}}", "All pages": "All pages", "Favourites": "Favourites", "No item": "No item", - "Settings": "Settings", "Import": "Import", "Trash": "Trash", "New Page": "New Page", @@ -14,13 +11,10 @@ "Find results": "Find {{number}} results", "Collapse sidebar": "Collapse sidebar", "Expand sidebar": "Expand sidebar", - "Removed from Favourites": "Removed from Favourites", - "Remove from favourites": "Remove from favourites", "Added to Favourites": "Added to Favourites", "Add to favourites": "Add to favourites", "Paper": "Paper", "Edgeless": "Edgeless", - "Switch to": "Switch to", "Convert to ": "Convert to ", "Page": "Page", "Export": "Export", @@ -37,7 +31,6 @@ "Delete page?": "Delete page?", "Delete permanently?": "Delete permanently?", "will be moved to Trash": "{{title}} will be moved to Trash", - "Once deleted, you can't undo this action.": "Once deleted, you can't undo this action.", "Moved to Trash": "Moved to Trash", "Permanently deleted": "Permanently deleted", "restored": "{{title}} restored", @@ -57,14 +50,24 @@ "Strikethrough": "Strikethrough", "Inline code": "Inline code", "Code block": "Code block", - "Link": "Hyperlink (with selected text)", "Body text": "Body text", "Heading": "Heading {{number}}", "Increase indent": "Increase indent", "Reduce indent": "Reduce indent", "Markdown Syntax": "Markdown Syntax", "Divider": "Divider", + "Once deleted, you can't undo this action": { + "": "Once deleted, you can't undo this action." + }, + "Remove from favourites": "Remove from favourites", + "Removed from Favourites": "Removed from Favourites", + "Jump to": "Jump to", "404 - Page Not Found": "404 - Page Not Found", + "Once deleted, you can't undo this action": { + "": "Once deleted, you can't undo this action." + }, + "Remove from favourites": "Remove from favourites", + "Removed from Favourites": "Removed from Favourites", "New Workspace": "New Workspace", "Workspace description": "Workspace is your virtual space to capture, create and plan as just one person or together as a team.", "Create": "Create", @@ -79,6 +82,10 @@ "TrashButtonGroupTitle": "Permanently delete", "TrashButtonGroupDescription": "Once deleted, you can't undo this action. Do you confirm?", "Delete permanently": "Delete permanently", + "Link": "Hyperlink (with selected text)", + "Quick search placeholder": "Quick Search...", + "Quick search placeholder2": "Search in {{workspace}}", + "Settings": "Settings", "recommendBrowser": " We recommend the <1>Chrome browser for optimal experience.", "upgradeBrowser": "Please upgrade to the latest version of Chrome for the best experience.", "Invite Members": "Invite Members", @@ -104,19 +111,15 @@ "Create Or Import": "Create Or Import", "Tips": "Tips: ", "login success": "Login success", - "Sign in": "Sign in AFFiNE Cloud", "Sign out": "Sign out of AFFiNE Cloud", "Delete Workspace": "Delete Workspace", - "Delete Workspace Description": "Deleting (<1>{{workspace}}) cannot be undone, please proceed with caution. along with all its content.", "Delete Workspace Description2": "Deleting (<1>{{workspace}}) will delete both local and cloud data, this operation cannot be undone, please proceed with caution.", "Delete Workspace placeholder": "Please type “Delete” to confirm", "Leave Workspace": "Leave Workspace", - "Leave Workspace Description": "After you leave, you will not be able to access all the contents of this workspace.", "Leave": "Leave", "Workspace Icon": "Workspace Icon", "Workspace Name": "Workspace Name", "Workspace Type": "Workspace Type", - "Export Workspace": "Export Workspace <1>{{workspace}} Is Coming", "Users": "Users", "Access level": "Access level", "Pending": "Pending", @@ -132,12 +135,18 @@ "Publishing Description": "After publishing to the web, everyone can view the content of this workspace through the link.", "Stop publishing": "Stop publishing", "Publish to web": "Publish to web", - "Sync Description": "{{workspaceName}} is Local Workspace. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.", - "Sync Description2": "<1>{{workspaceName}} is Cloud Workspace. All data will be synchronized and saved to the AFFiNE", "Download data to device": "Download {{CoreOrAll}} data to device", "General": "General", "Sync": "Sync", "Collaboration": "Collaboration", "Publish": "Publish", - "Workspace Settings": "Workspace Settings" + "Workspace Settings": "Workspace Settings", + "Export Workspace": "Export Workspace <1>{{workspace}} is coming soon", + "Leave Workspace Description": "After you leave, you will no longer be able to access the contents of this workspace.", + "Sign in": "Sign in to AFFiNE Cloud", + "Sync Description": "{{workspaceName}} is a Local Workspace. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.", + "Sync Description2": "<1>{{workspaceName}} is a Cloud Workspace. All data will be synchronised and saved to AFFiNE Cloud.", + "Delete Workspace Description": "Deleting (<1>{{workspace}}) cannot be undone, please proceed with caution. All contents will be lost.", + "core": "core", + "all": "all" } diff --git a/packages/i18n/src/resources/fr.json b/packages/i18n/src/resources/fr.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/packages/i18n/src/resources/fr.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/packages/i18n/src/resources/index.ts b/packages/i18n/src/resources/index.ts index 329fa9c679..cf5c5fc729 100644 --- a/packages/i18n/src/resources/index.ts +++ b/packages/i18n/src/resources/index.ts @@ -1,16 +1,12 @@ // THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. // Run `pnpm run download-resources` to regenerate. -// To overwrite this, please overwrite download.ts +// To overwrite this, please overwrite download.ts script. import en from './en.json'; import zh_Hans from './zh-Hans.json'; -import zh_Hant from './zh-Hant.json'; -import sr from './sr.json'; -import fr from './fr.json'; -import bn from './bn.json'; export const LOCALES = [ { - id: 1000016008, + id: 1000040001, name: 'English', tag: 'en', originalName: 'English', @@ -20,7 +16,7 @@ export const LOCALES = [ res: en, }, { - id: 1000016009, + id: 1000040004, name: 'Simplified Chinese', tag: 'zh-Hans', originalName: '简体中文', @@ -29,44 +25,4 @@ export const LOCALES = [ completeRate: 1, res: zh_Hans, }, - { - id: 1000016012, - name: 'Traditional Chinese', - tag: 'zh-Hant', - originalName: '繁體中文', - flagEmoji: '🇭🇰', - base: false, - completeRate: 1, - res: zh_Hant, - }, - { - id: 1000034005, - name: 'Serbian', - tag: 'sr', - originalName: 'српски', - flagEmoji: '🇷🇸', - base: false, - completeRate: 0.9166666666666666, - res: sr, - }, - { - id: 1000034008, - name: 'French', - tag: 'fr', - originalName: 'français', - flagEmoji: '🇫🇷', - base: false, - completeRate: 1, - res: fr, - }, - { - id: 1000034010, - name: 'Bangla', - tag: 'bn', - originalName: 'বাংলা', - flagEmoji: '🇧🇩', - base: false, - completeRate: 0.7083333333333334, - res: bn, - }, ] as const; diff --git a/packages/i18n/src/resources/sr.json b/packages/i18n/src/resources/sr.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/packages/i18n/src/resources/sr.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/packages/i18n/src/resources/zh-Hans.json b/packages/i18n/src/resources/zh-Hans.json index 0967ef424b..2a2e17c660 100644 --- a/packages/i18n/src/resources/zh-Hans.json +++ b/packages/i18n/src/resources/zh-Hans.json @@ -1 +1,148 @@ -{} +{ + "// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "", + "Quick search": "快速搜索", + "All pages": "全部页面", + "Favourites": "收藏夹", + "No item": "无项目", + "Import": "导入", + "Trash": "垃圾箱", + "New Page": "新建页面", + "New Keyword Page": "新建 “{{query}}“ 为标题的页面 ", + "Find 0 result": "找到 0 个结果", + "Find results": "找到 {{number}} 个结果", + "Collapse sidebar": "折叠侧边栏", + "Expand sidebar": "展开侧边栏", + "Added to Favourites": "已收藏", + "Add to favourites": "加入收藏", + "Paper": "文档", + "Edgeless": "无界", + "Convert to ": "转换为", + "Page": "页面", + "Export": "导出", + "Export to HTML": "导出为 HTML", + "Export to Markdown": "导出为 Markdown", + "Delete": "删除", + "Title": "标题", + "Untitled": "未命名", + "Created": "已创建", + "Updated": "已更新", + "Open in new tab": "在新标签页打开", + "Favourite": "收藏", + "Favourited": "已收藏", + "Delete page?": "确定要删除页面?", + "Delete permanently?": "是否永久删除?", + "will be moved to Trash": "{{title}} 将被移到垃圾箱", + "Once deleted, you can't undo this action": { + "": "一旦删除,将无法撤销!" + }, + "Moved to Trash": "已移到垃圾箱", + "Permanently deleted": "已永久删除", + "restored": "{{title}} 已恢复", + "Cancel": "取消", + "Keyboard Shortcuts": "键盘快捷键", + "Contact Us": "联系我们", + "Official Website": "官网", + "Get in touch!": "保持联络!", + "AFFiNE Community": "AFFiNE 社区", + "How is AFFiNE Alpha different?": "AFFiNE Alpha有何不同?", + "Shortcuts": "快捷键", + "Undo": "撤销", + "Redo": "重做", + "Bold": "粗体", + "Italic": "斜体", + "Underline": "下划线", + "Strikethrough": "删除线", + "Inline code": "行内代码", + "Code block": "代码块", + "Link": "超链接(选定文本)", + "Body text": "正文", + "Heading": "标题 {{number}}", + "Increase indent": "增加缩进", + "Reduce indent": "减少缩进", + "Markdown Syntax": "Markdown 语法", + "Divider": "分割线", + "404 - Page Not Found": "404 - 页面不见了", + "Remove from favourites": "从收藏中移除", + "Removed from Favourites": "已从收藏中移除", + "New Workspace": "新建工作区", + "Workspace description": "工作区是为个人和团队进行引用、创建和规划的虚拟空间。", + "Create": "创建", + "Select": "选择", + "Text": "文本(即将上线)", + "Shape": "图形", + "Sticky": "便利贴(即将上线)", + "Pen": "笔(即将上线)", + "Connector": "链接(即将上线)", + "Upload": "上传", + "Restore it": "恢复TA", + "TrashButtonGroupTitle": "永久删除", + "TrashButtonGroupDescription": "一旦删除,将无法撤消此操作。确定吗?", + "Delete permanently": "永久删除", + "Quick search placeholder": "快速搜索...", + "Quick search placeholder2": "在{{workspace}} 中搜索", + "Settings": "设置", + "recommendBrowser": "建议使用 <1>Chrome 浏览器以获得最佳体验。", + "upgradeBrowser": "请升级到最新版本的 Chrome 以获得最佳体验。", + "Invite Members": "邀请成员", + "Invite placeholder": "搜索邮件(仅支持Gmail)", + "Non-Gmail": "不支持非Gmail邮箱", + "Invite": "邀请", + "Loading": "加载中...", + "NotLoggedIn": "当前未登录", + "ClearData": "清除本地数据", + "Continue with Google": "谷歌登录以继续", + "Set up an AFFiNE account to sync data": "设置AFFiNE帐户以同步数据", + "Stay logged out": "保持登出状态", + "All changes are saved locally": "所有改动已保存到本地", + "Ooops!": "啊哦!", + "mobile device": "貌似你正在移动设备上浏览。", + "mobile device description": "我们仍在进行移动端的支持工作,建议使用桌面设备。", + "Got it": "知道了", + "emptyAllPages": "此工作区为空。创建新页面并开始编辑。", + "emptyFavourite": "单击“添加到收藏夹”,页面将显示在此处。", + "emptyTrash": "单击“添加到垃圾箱”,页面将显示在此处。", + "still designed": "(此页面仍在设计中。)", + "My Workspaces": "我的工作区", + "Create Or Import": "创建或导入", + "Tips": "提示:", + "login success": "登录成功", + "Sign in": "登录 AFFiNE 云", + "Sign out": "登出 AFFiNE 云", + "Delete Workspace": "删除工作空间", + "Delete Workspace Description": "正在删除 (<1>{{workspace}}) ,此操作无法撤销,所有内容将会丢失。", + "Delete Workspace Description2": "正在删除(<1>{{workspace}}),将同时删除本地和云端数据。此操作无法撤消,请谨慎操作。", + "Delete Workspace placeholder": "请输入”Delete“以确认", + "Leave Workspace": "退出工作区", + "Leave Workspace Description": "退出后,您将无法再访问此工作区的内容。", + "Jump to": "跳转到", + "Leave": "退出", + "Workspace Icon": "工作区图标", + "Workspace Name": "工作区名称", + "Workspace Type": "工作区类型", + "Export Workspace": "导出工作区 <1>{{workspace}} 即将上线", + "Users": "用户", + "Access level": "访问权限", + "Pending": "待定", + "Collaboration Description": "与其他成员协作需要AFFiNE云服务支持。", + "Enable AFFiNE Cloud": "启用 AFFiNE 云服务", + "Enable AFFiNE Cloud Description": "如启用,此工作区中的数据将通过AFFiNE Cloud进行备份和同步。", + "Enable": "启动", + "Sign in and Enable": "登录并启用", + "Skip": "跳过", + "Publishing": "发布到web需要AFFiNE云服务。", + "Share with link": "通过链接分享", + "Copy Link": "复制链接", + "Publishing Description": "发布到web后,所有人都可以通过链接查看此工作区的内容。", + "Stop publishing": "中止发布", + "Publish to web": "发布到web", + "Sync Description": "{{workspaceName}}是本地工作区,所有数据都存储在当前设备上。您可以为此工作区启用AFFiNE Cloud,以使数据与云端保持同步。", + "Sync Description2": "<1>{{workspaceName}}是云端工作区。所有数据将同步并保存到AFFiNE Cloud。", + "Download data to device": "下载{{CoreOrAll}}数据到设备", + "General": "常规", + "Sync": "同步", + "Collaboration": "协作", + "Publish": "发布", + "Workspace Settings": "工作区设置", + "core": "核心", + "all": "全部" +} diff --git a/packages/i18n/src/resources/zh-Hant.json b/packages/i18n/src/resources/zh-Hant.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/packages/i18n/src/resources/zh-Hant.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/packages/i18n/src/script/api.ts b/packages/i18n/src/scripts/api.ts similarity index 99% rename from packages/i18n/src/script/api.ts rename to packages/i18n/src/scripts/api.ts index ae286fe584..657e3c245c 100644 --- a/packages/i18n/src/script/api.ts +++ b/packages/i18n/src/scripts/api.ts @@ -1,5 +1,5 @@ // cSpell:ignore Tolgee -import { fetchTolgee } from './request'; +import { fetchTolgee } from './request.js'; /** * Returns all project languages diff --git a/packages/i18n/src/script/download.ts b/packages/i18n/src/scripts/download.ts similarity index 95% rename from packages/i18n/src/script/download.ts rename to packages/i18n/src/scripts/download.ts index a43e84bf22..7aa0740c6e 100644 --- a/packages/i18n/src/script/download.ts +++ b/packages/i18n/src/scripts/download.ts @@ -2,8 +2,8 @@ import fs from 'node:fs/promises'; import path from 'node:path'; import { format } from 'prettier'; -import { getAllProjectLanguages, getRemoteTranslations } from './api'; -import type { TranslationRes } from './utils'; +import { getAllProjectLanguages, getRemoteTranslations } from './api.js'; +import type { TranslationRes } from './utils.js'; const RES_DIR = path.resolve(process.cwd(), 'src', 'resources'); @@ -66,7 +66,7 @@ const main = async () => { ); const availableLanguages = languagesWithTranslations.filter( - language => language.completeRate > 0 + language => language.completeRate === 1 ); availableLanguages @@ -90,7 +90,7 @@ const main = async () => { console.log('Generating meta data...'); const code = `// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. // Run \`pnpm run download-resources\` to regenerate. - // To overwrite this, please overwrite ${path.basename(__filename)} + // To overwrite this, please overwrite download.ts script. ${availableLanguages .map( language => diff --git a/packages/i18n/src/script/request.ts b/packages/i18n/src/scripts/request.ts similarity index 100% rename from packages/i18n/src/script/request.ts rename to packages/i18n/src/scripts/request.ts diff --git a/packages/i18n/src/script/sync.ts b/packages/i18n/src/scripts/sync.ts similarity index 97% rename from packages/i18n/src/script/sync.ts rename to packages/i18n/src/scripts/sync.ts index 80b16a5024..b89734e4c4 100644 --- a/packages/i18n/src/script/sync.ts +++ b/packages/i18n/src/scripts/sync.ts @@ -1,8 +1,8 @@ // cSpell:ignore Tolgee import { readFile } from 'fs/promises'; import path from 'path'; -import { createsNewKey, getRemoteTranslations } from './api'; -import type { TranslationRes } from './utils'; +import { createsNewKey, getRemoteTranslations } from './api.js'; +import type { TranslationRes } from './utils.js'; const BASE_JSON_PATH = path.resolve( process.cwd(), diff --git a/packages/i18n/src/script/utils.ts b/packages/i18n/src/scripts/utils.ts similarity index 100% rename from packages/i18n/src/script/utils.ts rename to packages/i18n/src/scripts/utils.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d0959e92d6..c3ea50ad04 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,8 +11,6 @@ importers: '@types/node': ^18.11.17 '@typescript-eslint/eslint-plugin': ^5.47.0 '@typescript-eslint/parser': ^5.47.0 - concurrently: ^7.6.0 - cross-env: ^7.0.3 eslint: ^8.30.0 eslint-config-next: 12.3.1 eslint-config-prettier: ^8.5.0 @@ -32,8 +30,6 @@ importers: '@types/node': 18.11.18 '@typescript-eslint/eslint-plugin': 5.48.0_wxmz6cyorqfuzhhglktlvr5lve '@typescript-eslint/parser': 5.48.0_p4cjf2r47dnfiqufepc5hp43sq - concurrently: 7.6.0 - cross-env: 7.0.3 eslint: 8.31.0 eslint-config-next: 12.3.1_p4cjf2r47dnfiqufepc5hp43sq eslint-config-prettier: 8.5.0_eslint@8.31.0 @@ -46,113 +42,14 @@ importers: prettier: 2.7.1 typescript: 4.9.3 - client-app: - specifiers: - '@blocksuite/store': ^0.3.1 - '@emotion/react': ^11.10.5 - '@emotion/styled': ^11.10.5 - '@tauri-apps/api': ^1.2.0 - '@tauri-apps/cli': ^1.2.2 - '@types/node': ^18.11.17 - '@types/react': ^18.0.26 - '@types/react-dom': ^18.0.9 - '@typescript-eslint/eslint-plugin': 5.47.0 - '@typescript-eslint/parser': 5.47.0 - cross-env: ^7.0.3 - esbuild: ^0.16.10 - eslint: 8.30.0 - eslint-config-prettier: 8.5.0 - eslint-config-standard: ^17.0.0 - eslint-config-standard-with-typescript: 24.0.0 - eslint-import-resolver-alias: 1.1.2 - eslint-import-resolver-typescript: 3.5.2 - eslint-plugin-autofix: 1.1.0 - eslint-plugin-html: 7.1.0 - eslint-plugin-import: ^2.26.0 - eslint-plugin-n: ^15.6.0 - eslint-plugin-node: 11.1.0 - eslint-plugin-prettier: 4.2.1 - eslint-plugin-promise: ^6.1.1 - eslint-plugin-react: 7.31.11 - eslint-plugin-react-hooks: 4.6.0 - eslint-plugin-security: 1.5.0 - eslint-plugin-security-node: 1.1.1 - eslint-plugin-typescript-sort-keys: 2.1.0 - eslint-plugin-unicorn: 45.0.2 - eslint-plugin-unused-imports: 2.0.0 - json-schema-to-typescript: ^11.0.2 - lib0: ^0.2.58 - prettier: 2.8.1 - react: ^18.2.0 - react-dom: ^18.2.0 - react-is: ^18.2.0 - react-router: ^6.5.0 - react-router-dom: ^6.5.0 - rimraf: ^3.0.2 - typescript: ^4.9.4 - typesync: ^0.9.2 - vite: ^4.0.2 - y-protocols: ^1.0.5 - yjs: ^13.5.43 - zx: ^7.1.1 - dependencies: - '@blocksuite/store': 0.3.1_yjs@13.5.44 - '@emotion/react': 11.10.5_kzbn2opkn2327fwg5yzwzya5o4 - '@emotion/styled': 11.10.5_qvatmowesywn4ye42qoh247szu - '@tauri-apps/api': 1.2.0 - json-schema-to-typescript: 11.0.2 - lib0: 0.2.58 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - react-is: 18.2.0 - react-router: 6.6.2_react@18.2.0 - react-router-dom: 6.6.2_biqbaboplfbrettd7655fr4n2y - y-protocols: 1.0.5 - yjs: 13.5.44 - devDependencies: - '@tauri-apps/cli': 1.2.2 - '@types/node': 18.11.18 - '@types/react': 18.0.26 - '@types/react-dom': 18.0.10 - '@typescript-eslint/eslint-plugin': 5.47.0_ncmi6noazr3nzas7jxykisekym - '@typescript-eslint/parser': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa - cross-env: 7.0.3 - esbuild: 0.16.17 - eslint: 8.30.0 - eslint-config-prettier: 8.5.0_eslint@8.30.0 - eslint-config-standard: 17.0.0_bdcrn6xmt4gzw7vnrxwhbmoneu - eslint-config-standard-with-typescript: 24.0.0_cptoufat74nryxrbzitaihscju - eslint-import-resolver-alias: 1.1.2_fkfqfehjtk7sk2efaqbgxsuasa - eslint-import-resolver-typescript: 3.5.2_2lbwmhbr7bncddqbzzpg77o75m - eslint-plugin-autofix: 1.1.0_eslint@8.30.0 - eslint-plugin-html: 7.1.0 - eslint-plugin-import: 2.26.0_p6eswnf3xl3aaa2djfyukgz5eq - eslint-plugin-n: 15.6.1_eslint@8.30.0 - eslint-plugin-node: 11.1.0_eslint@8.30.0 - eslint-plugin-prettier: 4.2.1_kl4pe43v5b43npmso5hoplpbyi - eslint-plugin-promise: 6.1.1_eslint@8.30.0 - eslint-plugin-react: 7.31.11_eslint@8.30.0 - eslint-plugin-react-hooks: 4.6.0_eslint@8.30.0 - eslint-plugin-security: 1.5.0 - eslint-plugin-security-node: 1.1.1 - eslint-plugin-typescript-sort-keys: 2.1.0_ncmi6noazr3nzas7jxykisekym - eslint-plugin-unicorn: 45.0.2_eslint@8.30.0 - eslint-plugin-unused-imports: 2.0.0_juver2u3xbiwnjfu6d55vmnoem - prettier: 2.8.1 - rimraf: 3.0.2 - typescript: 4.9.4 - typesync: 0.9.2 - vite: 4.0.4_@types+node@18.11.18 - zx: 7.1.1 - packages/app: specifiers: '@affine/datacenter': workspace:* '@affine/i18n': workspace:* - '@blocksuite/blocks': 0.3.1-20230109032243-37ad3ba - '@blocksuite/editor': 0.3.1-20230109032243-37ad3ba + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456 + '@blocksuite/editor': 0.4.0-20230111171650-bc63456 '@blocksuite/icons': ^2.0.2 - '@blocksuite/store': 0.3.1-20230109032243-37ad3ba + '@blocksuite/store': 0.4.0-20230111171650-bc63456 '@emotion/css': ^11.10.0 '@emotion/react': ^11.10.4 '@emotion/server': ^11.10.0 @@ -190,10 +87,10 @@ importers: dependencies: '@affine/datacenter': link:../data-center '@affine/i18n': link:../i18n - '@blocksuite/blocks': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 - '@blocksuite/editor': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456_yjs@13.5.44 + '@blocksuite/editor': 0.4.0-20230111171650-bc63456_yjs@13.5.44 '@blocksuite/icons': 2.0.4_w5j4k42lgipnm43s3brx6h3c34 - '@blocksuite/store': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111171650-bc63456_yjs@13.5.44 '@emotion/css': 11.10.0 '@emotion/react': 11.10.4_w5j4k42lgipnm43s3brx6h3c34 '@emotion/server': 11.10.0_@emotion+css@11.10.0 @@ -232,10 +129,9 @@ importers: packages/data-center: specifiers: - '@blocksuite/blocks': 0.3.1-20230109032243-37ad3ba - '@blocksuite/store': 0.3.1-20230109032243-37ad3ba + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456 + '@blocksuite/store': 0.4.0-20230111171650-bc63456 '@playwright/test': ^1.29.1 - '@tauri-apps/api': ^1.2.0 '@types/debug': ^4.1.7 debug: ^4.3.4 encoding: ^0.1.13 @@ -250,9 +146,8 @@ importers: y-protocols: ^1.0.5 yjs: ^13.5.44 dependencies: - '@blocksuite/blocks': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 - '@blocksuite/store': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 - '@tauri-apps/api': 1.2.0 + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111171650-bc63456_yjs@13.5.44 debug: 4.3.4 encoding: 0.1.13 firebase: 9.15.0_encoding@0.1.13 @@ -262,12 +157,12 @@ importers: lib0: 0.2.58 swr: 2.0.0 y-protocols: 1.0.5 - yjs: 13.5.44 devDependencies: '@playwright/test': 1.29.1 '@types/debug': 4.1.7 fake-indexeddb: 4.0.1 typescript: 4.9.3 + yjs: 13.5.44 packages/i18n: specifiers: @@ -275,6 +170,7 @@ importers: i18next: ^21.9.1 prettier: ^2.7.1 react-i18next: ^11.18.4 + ts-node: ^10.9.1 typescript: ^4.8.4 dependencies: i18next: 21.10.0 @@ -282,6 +178,7 @@ importers: react-i18next: 11.18.6_i18next@21.10.0 devDependencies: '@types/prettier': 2.7.2 + ts-node: 10.9.1_typescript@4.9.3 typescript: 4.9.3 packages/logger: @@ -1602,29 +1499,21 @@ packages: to-fast-properties: 2.0.0 dev: true - /@bcherny/json-schema-ref-parser/9.0.9: - resolution: {integrity: sha512-vmEmnJCfpkLdas++9OYg6riIezTYqTHpqUTODJzHLzs5UnXujbOJW9VwcVCnyo1mVRt32FRr23iXBx/sX8YbeQ==} - dependencies: - '@jsdevtools/ono': 7.1.3 - '@types/json-schema': 7.0.11 - call-me-maybe: 1.0.2 - js-yaml: 4.1.0 - dev: false - /@bcoe/v8-coverage/0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@blocksuite/blocks/0.3.1-20230109032243-37ad3ba_yjs@13.5.44: - resolution: {integrity: sha512-UTlbk0Is7TMRBbvUyM2nivbqM/TLwRj1qArMYbOmvDGUNYadWo68cTwv/Ej2WwiKn22q4/4JHryGsv3gTCRz1Q==} + /@blocksuite/blocks/0.4.0-20230111171650-bc63456_yjs@13.5.44: + resolution: {integrity: sha512-7fpb++pT9laoyLFWl4h09v7TUqZ/9udMrC1qxdX2XFgMPJjg3MJ9RG+Ud2s/zqZ1SkU1+0hMBvJP5ci9vV44gw==} dependencies: - '@blocksuite/phasor': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 - '@blocksuite/store': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 + '@blocksuite/global': 0.4.0-20230111171650-bc63456 + '@blocksuite/phasor': 0.4.0-20230111171650-bc63456_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111171650-bc63456_yjs@13.5.44 '@tldraw/intersect': 1.8.0 autosize: 5.0.2 highlight.js: 11.7.0 hotkeys-js: 3.10.1 - lit: 2.5.0 + lit: 2.6.1 perfect-freehand: 1.2.0 quill: 1.3.7 quill-cursors: 4.0.0 @@ -1635,12 +1524,12 @@ packages: - yjs dev: false - /@blocksuite/editor/0.3.1-20230109032243-37ad3ba_yjs@13.5.44: - resolution: {integrity: sha512-bYbMn4EL/od+xP4K3u2kJT08kJBpK6H7b4cbRb9No3SUwgNHvvVNxia/QH1AQXyKaZQj/DHFgVxrw9GKo2GIPA==} + /@blocksuite/editor/0.4.0-20230111171650-bc63456_yjs@13.5.44: + resolution: {integrity: sha512-NbghDNWDGHXXfEqgnNhbw7zewGRyx9LUzOv1FmY2WVhzDu02MSrTWxMduChH1/tfLHRLe6jusmZKS9BNSUPynA==} dependencies: - '@blocksuite/blocks': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 - '@blocksuite/store': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 - lit: 2.5.0 + '@blocksuite/blocks': 0.4.0-20230111171650-bc63456_yjs@13.5.44 + '@blocksuite/store': 0.4.0-20230111171650-bc63456_yjs@13.5.44 + lit: 2.6.1 marked: 4.2.5 turndown: 7.1.1 transitivePeerDependencies: @@ -1650,6 +1539,10 @@ packages: - yjs dev: false + /@blocksuite/global/0.4.0-20230111171650-bc63456: + resolution: {integrity: sha512-/Kqg73vPLzxiWp6UqRmRoKfYmH4Sij3mU52RJf9adyywZOdM5e9E1gvPP+Eruz/x2jJ1uzR5/ivFqp5t688/tg==} + dev: false + /@blocksuite/icons/2.0.4_w5j4k42lgipnm43s3brx6h3c34: resolution: {integrity: sha512-Ewx30d3W6MXJGPXYvv48UpvAVfDB+gIVu90sHZX5curnSn+e1DdpCVfL0DeZA7Iyq6aLbxnKVzOAewlfoP8kDQ==} peerDependencies: @@ -1660,40 +1553,20 @@ packages: react: 18.2.0 dev: false - /@blocksuite/phasor/0.3.1-20230109032243-37ad3ba_yjs@13.5.44: - resolution: {integrity: sha512-mL1gSQ3rzrjdQSbWPtgyMXpbbl266UUjw26d0aIjkOh+iMMI6rWtmKWDoiDkO7tejIjwSNQ4w5zJOjJRIj+mSA==} + /@blocksuite/phasor/0.4.0-20230111171650-bc63456_yjs@13.5.44: + resolution: {integrity: sha512-fzmrG8KVJXkm5YyvHpPG1RRFhXjzuOey8OIoDu+/z87n9HJc4SkOd9JKH6wEL37F7P5ZoEM9Yl9YHxQjUc4/CA==} peerDependencies: yjs: ^13 dependencies: yjs: 13.5.44 dev: false - /@blocksuite/store/0.3.1-20230109032243-37ad3ba_yjs@13.5.44: - resolution: {integrity: sha512-zOUz19jfhuhsUkx9BGEQPZWbPyD/AgX0LB7ShVRdd3YM73x25hD6tPLLz1HEV2b69XokC0P9oSru4aNomm4jkg==} - peerDependencies: - yjs: ^13 - dependencies: - '@types/flexsearch': 0.7.3 - '@types/quill': 1.3.10 - buffer: 6.0.3 - flexsearch: 0.7.21 - idb-keyval: 6.2.0 - ky: 0.33.1 - lib0: 0.2.58 - y-protocols: 1.0.5 - y-webrtc: 10.2.3 - yjs: 13.5.44 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /@blocksuite/store/0.3.1_yjs@13.5.44: - resolution: {integrity: sha512-kynVTDfNCSChz2JI2rtGHxRIV2YrLzvAgVajcbfDVCuXKG0siBoEjLasG1a0kvevbvW/FabrNAj+xaIplklioA==} + /@blocksuite/store/0.4.0-20230111171650-bc63456_yjs@13.5.44: + resolution: {integrity: sha512-f/PKFPadA0KZq/wSLxxlS29c4SDuMfzHN1/gdrxFEIY0gC8caK2jZnT4K62R9Nquik/mXL60h8fBVAkQ0KbHzg==} peerDependencies: yjs: ^13 dependencies: + '@blocksuite/global': 0.4.0-20230111171650-bc63456 '@types/flexsearch': 0.7.3 '@types/quill': 1.3.10 buffer: 6.0.3 @@ -1723,7 +1596,7 @@ packages: fs-extra: 7.0.1 lodash.startcase: 4.4.0 outdent: 0.5.0 - prettier: 2.8.1 + prettier: 2.7.1 resolve-from: 5.0.0 semver: 5.7.1 dev: true @@ -1891,7 +1764,14 @@ packages: '@changesets/types': 5.2.1 fs-extra: 7.0.1 human-id: 1.0.2 - prettier: 2.8.1 + prettier: 2.7.1 + dev: true + + /@cspotcode/source-map-support/0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 dev: true /@emotion/babel-plugin/11.10.2: @@ -1913,25 +1793,6 @@ packages: stylis: 4.0.13 dev: false - /@emotion/babel-plugin/11.10.5: - resolution: {integrity: sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.18.6 - '@babel/runtime': 7.20.7 - '@emotion/hash': 0.9.0 - '@emotion/memoize': 0.8.0 - '@emotion/serialize': 1.1.1 - babel-plugin-macros: 3.1.0 - convert-source-map: 1.9.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.1.3 - dev: false - /@emotion/cache/11.10.3: resolution: {integrity: sha512-Psmp/7ovAa8appWh3g51goxu/z3iVms7JXOreq136D8Bbn6dYraPnmL6mdM8GThEx9vwSn92Fz+mGSjBzN8UPQ==} dependencies: @@ -1942,16 +1803,6 @@ packages: stylis: 4.0.13 dev: false - /@emotion/cache/11.10.5: - resolution: {integrity: sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==} - dependencies: - '@emotion/memoize': 0.8.0 - '@emotion/sheet': 1.2.1 - '@emotion/utils': 1.2.0 - '@emotion/weak-memoize': 0.3.0 - stylis: 4.1.3 - dev: false - /@emotion/css/11.10.0: resolution: {integrity: sha512-dH9f+kSCucc8ilMg0MUA1AemabcyzYpe5EKX24F528PJjD7HyIY/VBNJHxfUdc8l400h2ncAjR6yEDu+DBj2cg==} peerDependencies: @@ -2005,30 +1856,6 @@ packages: react: 18.2.0 dev: false - /@emotion/react/11.10.5_kzbn2opkn2327fwg5yzwzya5o4: - resolution: {integrity: sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A==} - peerDependencies: - '@babel/core': ^7.0.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@babel/core': - optional: true - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.20.7 - '@emotion/babel-plugin': 11.10.5 - '@emotion/cache': 11.10.5 - '@emotion/serialize': 1.1.1 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.0_react@18.2.0 - '@emotion/utils': 1.2.0 - '@emotion/weak-memoize': 0.3.0 - '@types/react': 18.0.26 - hoist-non-react-statics: 3.3.2 - react: 18.2.0 - dev: false - /@emotion/serialize/1.1.0: resolution: {integrity: sha512-F1ZZZW51T/fx+wKbVlwsfchr5q97iW8brAnXmsskz4d0hVB4O3M/SiA3SaeH06x02lSNzkkQv+n3AX3kCXKSFA==} dependencies: @@ -2039,16 +1866,6 @@ packages: csstype: 3.1.1 dev: false - /@emotion/serialize/1.1.1: - resolution: {integrity: sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==} - dependencies: - '@emotion/hash': 0.9.0 - '@emotion/memoize': 0.8.0 - '@emotion/unitless': 0.8.0 - '@emotion/utils': 1.2.0 - csstype: 3.1.1 - dev: false - /@emotion/server/11.10.0_@emotion+css@11.10.0: resolution: {integrity: sha512-MTvJ21JPo9aS02GdjFW4nhdwOi2tNNpMmAM/YED0pkxzjDNi5WbiTwXqaCnvLc2Lr8NFtjhT0az1vTJyLIHYcw==} peerDependencies: @@ -2068,10 +1885,6 @@ packages: resolution: {integrity: sha512-OiTkRgpxescko+M51tZsMq7Puu/KP55wMT8BgpcXVG2hqXc0Vo0mfymJ/Uj24Hp0i083ji/o0aLddh08UEjq8w==} dev: false - /@emotion/sheet/1.2.1: - resolution: {integrity: sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==} - dev: false - /@emotion/styled/11.10.4_yiaqs725o7pcd7rteavrnhgj4y: resolution: {integrity: sha512-pRl4R8Ez3UXvOPfc2bzIoV8u9P97UedgHS4FPX594ntwEuAMA114wlaHvOK24HB48uqfXiGlYIZYCxVJ1R1ttQ==} peerDependencies: @@ -2096,30 +1909,6 @@ packages: react: 18.2.0 dev: false - /@emotion/styled/11.10.5_qvatmowesywn4ye42qoh247szu: - resolution: {integrity: sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw==} - peerDependencies: - '@babel/core': ^7.0.0 - '@emotion/react': ^11.0.0-rc.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@babel/core': - optional: true - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.20.7 - '@emotion/babel-plugin': 11.10.5 - '@emotion/is-prop-valid': 1.2.0 - '@emotion/react': 11.10.5_kzbn2opkn2327fwg5yzwzya5o4 - '@emotion/serialize': 1.1.1 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.0_react@18.2.0 - '@emotion/utils': 1.2.0 - '@types/react': 18.0.26 - react: 18.2.0 - dev: false - /@emotion/unitless/0.8.0: resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} dev: false @@ -2140,214 +1929,6 @@ packages: resolution: {integrity: sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==} dev: false - /@esbuild/android-arm/0.16.17: - resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64/0.16.17: - resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64/0.16.17: - resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64/0.16.17: - resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64/0.16.17: - resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64/0.16.17: - resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64/0.16.17: - resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm/0.16.17: - resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64/0.16.17: - resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32/0.16.17: - resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64/0.16.17: - resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el/0.16.17: - resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64/0.16.17: - resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64/0.16.17: - resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x/0.16.17: - resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64/0.16.17: - resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64/0.16.17: - resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64/0.16.17: - resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64/0.16.17: - resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64/0.16.17: - resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32/0.16.17: - resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64/0.16.17: - resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@eslint-community/eslint-utils/4.1.2_eslint@8.30.0: - resolution: {integrity: sha512-7qELuQWWjVDdVsFQ5+beUl+KPczrEDA7S3zM4QUd/bJl7oXgsmpXaEVqrRTnOBqenOV4rWf2kVZk2Ot085zPWA==} - 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.30.0 - eslint-visitor-keys: 3.3.0 - dev: true - /@eslint/eslintrc/1.3.2: resolution: {integrity: sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3192,8 +2773,15 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jsdevtools/ono/7.1.3: - resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + /@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@lit-labs/ssr-dom-shim/1.0.0: + resolution: {integrity: sha512-ic93MBXfApIFTrup4a70M/+ddD8xdt2zxxj9sRwHQzhS9ag/syqkD8JPdTXsc1gUy2K8TTirhlCqyTEM/sifNw==} dev: false /@lit/reactive-element/1.4.1: @@ -3204,6 +2792,12 @@ packages: resolution: {integrity: sha512-fQh9FDK0LPTwDk+0HhSZEtb8K0LTN1wXerwpGrWA+a8tWulYRDLI4vQDWp4GOIsewn0572KYV/oZ3+492D7osA==} dev: false + /@lit/reactive-element/1.6.1: + resolution: {integrity: sha512-va15kYZr7KZNNPZdxONGQzpUr+4sxVu7V/VG7a8mRfPPXUyhEYj5RzXCQmGrlP3tAh0L3HHm5AjBMFYRqlM9SA==} + dependencies: + '@lit-labs/ssr-dom-shim': 1.0.0 + dev: false + /@manypkg/find-root/1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: @@ -3336,7 +2930,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.20.7 - '@emotion/cache': 11.10.5 + '@emotion/cache': 11.10.3 '@emotion/react': 11.10.4_w5j4k42lgipnm43s3brx6h3c34 '@emotion/styled': 11.10.4_yiaqs725o7pcd7rteavrnhgj4y csstype: 3.1.1 @@ -3405,6 +2999,7 @@ packages: /@next/env/13.1.0: resolution: {integrity: sha512-6iNixFzCndH+Bl4FetQzOMjxCJqg8fs0LAlZviig1K6mIjOWH2m2oPcHcOg1Ta5VCe7Bx5KG1Hs+NrWDUkBt9A==} + dev: false /@next/eslint-plugin-next/12.3.1: resolution: {integrity: sha512-sw+lTf6r6P0j+g/n9y4qdWWI2syPqZx+uc0+B/fRENqfR3KpSid6MIKqc9gNwGhJASazEQ5b3w8h4cAET213jw==} @@ -3427,6 +3022,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true + dev: false optional: true /@next/swc-android-arm64/12.3.1: @@ -3444,6 +3040,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true + dev: false optional: true /@next/swc-darwin-arm64/12.3.1: @@ -3461,6 +3058,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true + dev: false optional: true /@next/swc-darwin-x64/12.3.1: @@ -3478,6 +3076,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true + dev: false optional: true /@next/swc-freebsd-x64/12.3.1: @@ -3495,6 +3094,7 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true + dev: false optional: true /@next/swc-linux-arm-gnueabihf/12.3.1: @@ -3512,6 +3112,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true + dev: false optional: true /@next/swc-linux-arm64-gnu/12.3.1: @@ -3529,6 +3130,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: false optional: true /@next/swc-linux-arm64-musl/12.3.1: @@ -3546,6 +3148,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: false optional: true /@next/swc-linux-x64-gnu/12.3.1: @@ -3563,6 +3166,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: false optional: true /@next/swc-linux-x64-musl/12.3.1: @@ -3580,6 +3184,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: false optional: true /@next/swc-win32-arm64-msvc/12.3.1: @@ -3597,6 +3202,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true + dev: false optional: true /@next/swc-win32-ia32-msvc/12.3.1: @@ -3614,6 +3220,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true + dev: false optional: true /@next/swc-win32-x64-msvc/12.3.1: @@ -3631,6 +3238,7 @@ packages: cpu: [x64] os: [win32] requiresBuild: true + dev: false optional: true /@nodelib/fs.scandir/2.1.5: @@ -3654,18 +3262,6 @@ packages: fastq: 1.13.0 dev: true - /@pkgr/utils/2.3.1: - resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dependencies: - cross-spawn: 7.0.3 - is-glob: 4.0.3 - open: 8.4.0 - picocolors: 1.0.0 - tiny-glob: 0.2.9 - tslib: 2.4.0 - dev: true - /@playwright/test/1.29.1: resolution: {integrity: sha512-iQxk2DX5U9wOGV3+/Jh9OHPsw5H3mleUL2S4BgQuwtlAfK3PnKvn38m4Rg9zIViGHVW24opSm99HQm/UFLEy6w==} engines: {node: '>=14'} @@ -3907,11 +3503,6 @@ packages: react: 18.2.0 dev: false - /@remix-run/router/1.2.1: - resolution: {integrity: sha512-XiY0IsyHR+DXYS5vBxpoBe/8veTeoRpMHP+vDosLZxL5bnpetzI0igkxkLZS235ldLzyfkxF+2divEwWHP3vMQ==} - engines: {node: '>=14'} - dev: false - /@rollup/plugin-babel/5.3.1_opjstonlpkhafnz76jsxdwq25a: resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} @@ -3997,7 +3588,7 @@ packages: ejs: 3.1.8 json5: 2.2.1 magic-string: 0.25.9 - string.prototype.matchall: 4.0.8 + string.prototype.matchall: 4.0.7 dev: true /@swc/helpers/0.4.11: @@ -4010,6 +3601,7 @@ packages: resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} dependencies: tslib: 2.4.0 + dev: false /@szmarczak/http-timer/5.0.1: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} @@ -4018,108 +3610,6 @@ packages: defer-to-connect: 2.0.1 dev: true - /@tauri-apps/api/1.2.0: - resolution: {integrity: sha512-lsI54KI6HGf7VImuf/T9pnoejfgkNoXveP14pVV7XarrQ46rOejIVJLFqHI9sRReJMGdh2YuCoI3cc/yCWCsrw==} - engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} - dev: false - - /@tauri-apps/cli-darwin-arm64/1.2.2: - resolution: {integrity: sha512-W+Cp2weUMlvmGkRJeUjypbz9Lpl6o98xkgKAtobZSum5SNwpsBQfawJTESakNoD+FXyVg/snIk5sRdHge+tAaA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-darwin-x64/1.2.2: - resolution: {integrity: sha512-vmVAqt+ECH2d6cbcGJ7ddcCAZgmKe5xmxlL5r4xoaphu7OqU4gnv4VFURYkVltOfwzIFQVOPVSqwYyIDToCYNQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-linux-arm-gnueabihf/1.2.2: - resolution: {integrity: sha512-yYTdQurgi4QZR8z+fANjl522jdQz/VtesFpw+C/A0+zXg7tiRjicsywBDdPsvNzCqFeGKKkmTR+Lny5qxhGaeQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-linux-arm64-gnu/1.2.2: - resolution: {integrity: sha512-ZSOVT6Eq1ay2+27B8KfA0MnpO7KYzONU6TjenH7DNcQki6eWGG5JoNu8QQ9Mdn3dAzY0XBP9i1ZHQOFu4iPtEg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-linux-arm64-musl/1.2.2: - resolution: {integrity: sha512-/NHSkqNQ+Pr4PshvyD1CeNFaPCaCpe1OeuAQgVi0rboSecC9fXN96G5dQbSBoxOUcCo6f8aTVE7zkZ4WchFVog==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-linux-x64-gnu/1.2.2: - resolution: {integrity: sha512-4YTmfPuyvlHsvCkATDMwhklfuQm3HKxYXv/IOW9H0ra6pS9efVhrFYIC9Vfv6XaKN85Vnn/FYTEGMJLwCxZw2Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-linux-x64-musl/1.2.2: - resolution: {integrity: sha512-wr46tbscwFuCcA931R+ItOiUTT0djMmgKLd1HFCmFF82V9BKE2reIjr6O9l0NCXCo2WeD4pe3jA/Pt1dxDu+JA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-win32-ia32-msvc/1.2.2: - resolution: {integrity: sha512-6VmbVJOWUZJK5/JKhb3mNFKrKGfq0KV7lJGumfN95WJgkHeyL61p8bZit+o6ZgUGUhrOabkAawhDkrRY+ZQhIw==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli-win32-x64-msvc/1.2.2: - resolution: {integrity: sha512-YRPJguJma+zSuRZpFoSZqls6+laggG1vqG0FPQWQTi+ywATgMpai2b2RZnffDlpHKp9mt4V/s2dtqOy6bpGZHg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@tauri-apps/cli/1.2.2: - resolution: {integrity: sha512-D8zib3A0vWCvPPSyYLxww/OdDlVcY7fpcDVBH6qUvheOjj2aCyU7H9AYMRBwpgCfz8zY5+vomee+laLeB0H13w==} - engines: {node: '>= 10'} - hasBin: true - optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 1.2.2 - '@tauri-apps/cli-darwin-x64': 1.2.2 - '@tauri-apps/cli-linux-arm-gnueabihf': 1.2.2 - '@tauri-apps/cli-linux-arm64-gnu': 1.2.2 - '@tauri-apps/cli-linux-arm64-musl': 1.2.2 - '@tauri-apps/cli-linux-x64-gnu': 1.2.2 - '@tauri-apps/cli-linux-x64-musl': 1.2.2 - '@tauri-apps/cli-win32-ia32-msvc': 1.2.2 - '@tauri-apps/cli-win32-x64-msvc': 1.2.2 - dev: true - /@tldraw/intersect/1.8.0: resolution: {integrity: sha512-0UarshNpyq2+O4o0xHMJIBgF0E630mes5CkMoO+D5xgYppSBIkeqYDcv0ujsmAhMKX1O6Y0ShuuHeflBEULUoQ==} dependencies: @@ -4130,6 +3620,22 @@ packages: resolution: {integrity: sha512-GiS5Df3CzXY/fPBFcM0CKFERZfI4Cg1X33VPZX+NLo7Fwm/h9zu/aU24N1mG75Q9LuMnwKm7woxKr8BiUXGYCg==} dev: false + /@tsconfig/node10/1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12/1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14/1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16/1.0.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + /@types/babel__core/7.1.20: resolution: {integrity: sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==} dependencies: @@ -4180,17 +3686,12 @@ packages: resolution: {integrity: sha512-HXwADeHEP4exXkCIwy2n1+i0f1ilP1ETQOH5KDOugjkTFZPntWo0Gr8stZOaebkxsdx+k0X/K6obU/+it07ocg==} dev: false - /@types/fs-extra/9.0.13: - resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} - dependencies: - '@types/node': 18.11.18 - dev: true - /@types/glob/7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.11.18 + '@types/node': 18.7.18 + dev: true /@types/graceful-fs/4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} @@ -4226,21 +3727,19 @@ packages: /@types/json-schema/7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true /@types/json5/0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/lodash/4.14.191: - resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==} - dev: false - /@types/long/4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false /@types/minimatch/5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true /@types/minimist/1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} @@ -4267,45 +3766,37 @@ packages: /@types/parse-json/4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: false /@types/prettier/2.7.2: resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} + dev: true /@types/prop-types/15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - /@types/ps-tree/1.1.2: - resolution: {integrity: sha512-ZREFYlpUmPQJ0esjxoG1fMvB2HNaD3z+mjqdSosZvd3RalncI9NEur73P8ZJz4YQdL64CmV1w0RuqoRUlhQRBw==} - dev: true - /@types/quill/1.3.10: resolution: {integrity: sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==} dependencies: parchment: 1.1.4 dev: false - /@types/react-dom/18.0.10: - resolution: {integrity: sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==} - dependencies: - '@types/react': 18.0.26 - dev: true - /@types/react-dom/18.0.6: resolution: {integrity: sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==} dependencies: - '@types/react': 18.0.26 + '@types/react': 18.0.20 dev: true /@types/react-is/17.0.3: resolution: {integrity: sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==} dependencies: - '@types/react': 18.0.26 + '@types/react': 18.0.20 dev: false /@types/react-transition-group/4.4.5: resolution: {integrity: sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==} dependencies: - '@types/react': 18.0.26 + '@types/react': 18.0.20 dev: false /@types/react/18.0.20: @@ -4323,17 +3814,10 @@ packages: csstype: 3.1.1 dev: true - /@types/react/18.0.26: - resolution: {integrity: sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==} - dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.2 - csstype: 3.1.1 - /@types/resolve/1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.7.18 dev: true /@types/scheduler/0.16.2: @@ -4354,10 +3838,6 @@ packages: /@types/trusted-types/2.0.2: resolution: {integrity: sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==} - /@types/which/2.0.1: - resolution: {integrity: sha512-Jjakcv8Roqtio6w1gr0D7y6twbhx6gGgFGF5BLwajPpnOIOxFkakFhCq+LmyyeAz7BX6ULrjBOxdKaCDy+4+dQ==} - dev: true - /@types/wicg-file-system-access/2020.9.5: resolution: {integrity: sha512-UYK244awtmcUYQfs7FR8710MJcefL2WvkyHMjA8yJzxd1mo0Gfn88sRZ1Bls7hiUhA2w7ne1gpJ9T5g3G0wOyA==} dev: true @@ -4372,33 +3852,6 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin/5.47.0_ncmi6noazr3nzas7jxykisekym: - resolution: {integrity: sha512-AHZtlXAMGkDmyLuLZsRpH3p4G/1iARIwc/T0vIem2YB+xW6pZaXYXzCBnZSF/5fdM97R9QqZWZ+h3iW10XgevQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/parser': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa - '@typescript-eslint/scope-manager': 5.47.0 - '@typescript-eslint/type-utils': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa - '@typescript-eslint/utils': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa - debug: 4.3.4 - eslint: 8.30.0 - ignore: 5.2.0 - natural-compare-lite: 1.4.0 - regexpp: 3.2.0 - semver: 7.3.7 - tsutils: 3.21.0_typescript@4.9.4 - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/eslint-plugin/5.48.0_wxmz6cyorqfuzhhglktlvr5lve: resolution: {integrity: sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4426,39 +3879,6 @@ packages: - supports-color dev: true - /@typescript-eslint/experimental-utils/5.48.1_lzzuuodtsqwxnvqeq4g4likcqa: - resolution: {integrity: sha512-8OoIZZuOeqsm5cxn2f01qHWtVC3M4iixSsfZXPiQUg4Sl4LiU+b5epcJFwxNfqeoLl+SGncELyi3x99zI6C0ng==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@typescript-eslint/utils': 5.48.1_lzzuuodtsqwxnvqeq4g4likcqa - eslint: 8.30.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/parser/5.47.0_lzzuuodtsqwxnvqeq4g4likcqa: - resolution: {integrity: sha512-udPU4ckK+R1JWCGdQC4Qa27NtBg7w020ffHqGyAK8pAgOVuNw7YaKXGChk+udh+iiGIJf6/E/0xhVXyPAbsczw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.47.0 - '@typescript-eslint/types': 5.47.0 - '@typescript-eslint/typescript-estree': 5.47.0_typescript@4.9.4 - debug: 4.3.4 - eslint: 8.30.0 - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/parser/5.48.0_76twfck5d7crjqrmw4yltga7zm: resolution: {integrity: sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4479,26 +3899,6 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.48.0_lzzuuodtsqwxnvqeq4g4likcqa: - resolution: {integrity: sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.48.0 - '@typescript-eslint/types': 5.48.0 - '@typescript-eslint/typescript-estree': 5.48.0_typescript@4.9.4 - debug: 4.3.4 - eslint: 8.30.0 - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/parser/5.48.0_p4cjf2r47dnfiqufepc5hp43sq: resolution: {integrity: sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4519,14 +3919,6 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager/5.47.0: - resolution: {integrity: sha512-dvJab4bFf7JVvjPuh3sfBUWsiD73aiftKBpWSfi3sUkysDQ4W8x+ZcFpNp7Kgv0weldhpmMOZBjx1wKN8uWvAw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.47.0 - '@typescript-eslint/visitor-keys': 5.47.0 - dev: true - /@typescript-eslint/scope-manager/5.48.0: resolution: {integrity: sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4535,34 +3927,6 @@ packages: '@typescript-eslint/visitor-keys': 5.48.0 dev: true - /@typescript-eslint/scope-manager/5.48.1: - resolution: {integrity: sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.48.1 - '@typescript-eslint/visitor-keys': 5.48.1 - dev: true - - /@typescript-eslint/type-utils/5.47.0_lzzuuodtsqwxnvqeq4g4likcqa: - resolution: {integrity: sha512-1J+DFFrYoDUXQE1b7QjrNGARZE6uVhBqIvdaXTe5IN+NmEyD68qXR1qX1g2u4voA+nCaelQyG8w30SAOihhEYg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.47.0_typescript@4.9.4 - '@typescript-eslint/utils': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa - debug: 4.3.4 - eslint: 8.30.0 - tsutils: 3.21.0_typescript@4.9.4 - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/type-utils/5.48.0_p4cjf2r47dnfiqufepc5hp43sq: resolution: {integrity: sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4583,42 +3947,11 @@ packages: - supports-color dev: true - /@typescript-eslint/types/5.47.0: - resolution: {integrity: sha512-eslFG0Qy8wpGzDdYKu58CEr3WLkjwC5Usa6XbuV89ce/yN5RITLe1O8e+WFEuxnfftHiJImkkOBADj58ahRxSg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@typescript-eslint/types/5.48.0: resolution: {integrity: sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types/5.48.1: - resolution: {integrity: sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/typescript-estree/5.47.0_typescript@4.9.4: - resolution: {integrity: sha512-LxfKCG4bsRGq60Sqqu+34QT5qT2TEAHvSCCJ321uBWywgE2dS0LKcu5u+3sMGo+Vy9UmLOhdTw5JHzePV/1y4Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.47.0 - '@typescript-eslint/visitor-keys': 5.47.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.4 - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/typescript-estree/5.48.0_typescript@4.8.3: resolution: {integrity: sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4661,68 +3994,6 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree/5.48.0_typescript@4.9.4: - resolution: {integrity: sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.48.0 - '@typescript-eslint/visitor-keys': 5.48.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.3.7 - tsutils: 3.21.0_typescript@4.9.4 - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/typescript-estree/5.48.1_typescript@4.9.4: - resolution: {integrity: sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.48.1 - '@typescript-eslint/visitor-keys': 5.48.1 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.4 - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils/5.47.0_lzzuuodtsqwxnvqeq4g4likcqa: - resolution: {integrity: sha512-U9xcc0N7xINrCdGVPwABjbAKqx4GK67xuMV87toI+HUqgXj26m6RBp9UshEXcTrgCkdGYFzgKLt8kxu49RilDw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.11 - '@types/semver': 7.3.13 - '@typescript-eslint/scope-manager': 5.47.0 - '@typescript-eslint/types': 5.47.0 - '@typescript-eslint/typescript-estree': 5.47.0_typescript@4.9.4 - eslint: 8.30.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.30.0 - semver: 7.3.8 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/utils/5.48.0_p4cjf2r47dnfiqufepc5hp43sq: resolution: {integrity: sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4743,34 +4014,6 @@ packages: - typescript dev: true - /@typescript-eslint/utils/5.48.1_lzzuuodtsqwxnvqeq4g4likcqa: - resolution: {integrity: sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.11 - '@types/semver': 7.3.13 - '@typescript-eslint/scope-manager': 5.48.1 - '@typescript-eslint/types': 5.48.1 - '@typescript-eslint/typescript-estree': 5.48.1_typescript@4.9.4 - eslint: 8.30.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.30.0 - semver: 7.3.8 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys/5.47.0: - resolution: {integrity: sha512-ByPi5iMa6QqDXe/GmT/hR6MZtVPi0SqMQPDx15FczCBXJo/7M8T88xReOALAfpBLm+zxpPfmhuEvPb577JRAEg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.47.0 - eslint-visitor-keys: 3.3.0 - dev: true - /@typescript-eslint/visitor-keys/5.48.0: resolution: {integrity: sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4779,14 +4022,6 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@typescript-eslint/visitor-keys/5.48.1: - resolution: {integrity: sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.48.1 - eslint-visitor-keys: 3.3.0 - dev: true - /abort-controller/3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -4802,9 +4037,15 @@ packages: acorn: 8.8.0 dev: true + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + /acorn/8.8.0: resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} engines: {node: '>=0.4.0'} + hasBin: true dev: true /aggregate-error/3.1.0: @@ -4884,10 +4125,6 @@ packages: engines: {node: '>=12'} dev: true - /any-promise/1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false - /anymatch/3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -4896,6 +4133,10 @@ packages: picomatch: 2.3.1 dev: true + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + /argparse/1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: @@ -4904,6 +4145,7 @@ packages: /argparse/2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true /aria-hidden/1.2.2_w5j4k42lgipnm43s3brx6h3c34: resolution: {integrity: sha512-6y/ogyDTk/7YAe91T3E2PR1ALVKyM2QbTio5HwM+N1Q6CMlCKhvClyIjkckBswa0f2xJhjsfzIGa1yVSe1UMVA==} @@ -4939,17 +4181,6 @@ packages: is-string: 1.0.7 dev: true - /array-includes/3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - get-intrinsic: 1.1.3 - is-string: 1.0.7 - dev: true - /array-union/1.0.2: resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} @@ -4987,26 +4218,6 @@ packages: es-shim-unscopables: 1.0.0 dev: true - /array.prototype.flatmap/1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - es-shim-unscopables: 1.0.0 - dev: true - - /array.prototype.tosorted/1.1.1: - resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.1.3 - dev: true - /arrify/1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} @@ -5025,10 +4236,6 @@ packages: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} dev: true - /asynckit/0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true - /at-least-node/1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} @@ -5038,33 +4245,11 @@ packages: resolution: {integrity: sha512-FPVt5ynkqUAA9gcMZnJHka1XfQgr1WNd/yRfIjmj5WGmjua+u5Hl9hn8M2nU5CNy2bEIcj1ZUwXq7IOHsfZG9w==} dev: false - /available-typed-arrays/1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - - /awilix/7.0.3: - resolution: {integrity: sha512-4Nmjyh9qloDwXfDK0DBuWd8WyFApyknoaKbE3leQflGLgNfNsBHy2/VYrlyy/mzMobjJ3J8XtNpbjzG3KRkIFQ==} - engines: {node: '>=12.0.0'} - dependencies: - camel-case: 4.1.2 - fast-glob: 3.2.12 - dev: true - /axe-core/4.4.3: resolution: {integrity: sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==} engines: {node: '>=4'} dev: true - /axios/0.27.2: - resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} - dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 - transitivePeerDependencies: - - debug - dev: true - /axobject-query/2.2.0: resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} dev: true @@ -5201,6 +4386,7 @@ packages: /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true /base64-arraybuffer-es6/0.7.0: resolution: {integrity: sha512-ESyU/U1CFZDJUdr+neHRhNozeCv72Y7Vm0m1DCbjX3KBjT6eYocvAJlSk6+8+HkVwXlT1FNxhGW6q3UKAlCvvw==} @@ -5209,6 +4395,7 @@ packages: /base64-js/1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false /better-path-resolve/1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} @@ -5221,19 +4408,12 @@ packages: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} dev: true - /bl/4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.0 - dev: true - /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 + dev: true /brace-expansion/2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -5279,13 +4459,6 @@ packages: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /buffer/5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - /buffer/6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} dependencies: @@ -5298,12 +4471,6 @@ packages: engines: {node: '>=6'} dev: true - /builtins/5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} - dependencies: - semver: 7.3.8 - dev: true - /cacheable-lookup/7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} @@ -5328,21 +4495,10 @@ packages: function-bind: 1.1.1 get-intrinsic: 1.1.3 - /call-me-maybe/1.0.2: - resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} - dev: false - /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - /camel-case/4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - dependencies: - pascal-case: 3.1.2 - tslib: 2.4.0 - dev: true - /camelcase-keys/6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} @@ -5381,11 +4537,6 @@ packages: supports-color: 7.2.0 dev: true - /chalk/5.2.0: - resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - /char-regex/1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -5404,13 +4555,6 @@ packages: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} dev: true - /clean-regexp/1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - /clean-stack/2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -5425,17 +4569,6 @@ packages: del: 4.1.1 dev: true - /cli-color/2.0.3: - resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} - engines: {node: '>=0.10'} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 - dev: false - /cli-cursor/3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -5443,11 +4576,6 @@ packages: restore-cursor: 3.1.0 dev: true - /cli-spinners/2.7.0: - resolution: {integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==} - engines: {node: '>=6'} - dev: true - /cli-truncate/2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} @@ -5466,6 +4594,7 @@ packages: /client-only/0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false /cliui/6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -5551,13 +4680,6 @@ packages: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: true - /combined-stream/1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true - /command-score/0.1.2: resolution: {integrity: sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==} dev: false @@ -5582,21 +4704,6 @@ packages: /concat-map/0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - - /concurrently/7.6.0: - resolution: {integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==} - engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0} - hasBin: true - dependencies: - chalk: 4.1.2 - date-fns: 2.29.3 - lodash: 4.17.21 - rxjs: 7.8.0 - shell-quote: 1.7.4 - spawn-command: 0.0.2-1 - supports-color: 8.1.1 - tree-kill: 1.2.2 - yargs: 17.6.2 dev: true /convert-source-map/1.9.0: @@ -5630,13 +4737,10 @@ packages: parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 + dev: false - /cross-env/7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - dependencies: - cross-spawn: 7.0.3 + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true /cross-spawn/5.1.0: @@ -5692,13 +4796,6 @@ packages: stream-transform: 2.1.3 dev: true - /d/1.0.1: - resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} - dependencies: - es5-ext: 0.10.62 - type: 1.2.0 - dev: false - /damerau-levenshtein/1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true @@ -5706,11 +4803,7 @@ packages: /data-uri-to-buffer/4.0.0: resolution: {integrity: sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==} engines: {node: '>= 12'} - - /date-fns/2.29.3: - resolution: {integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==} - engines: {node: '>=0.11'} - dev: true + dev: false /dayjs/1.11.7: resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} @@ -5804,11 +4897,6 @@ packages: engines: {node: '>=10'} dev: true - /define-lazy-prop/2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: true - /define-properties/1.1.4: resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} engines: {node: '>= 0.4'} @@ -5829,11 +4917,6 @@ packages: rimraf: 2.7.1 dev: true - /delayed-stream/1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true - /detect-indent/6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -5853,6 +4936,11 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + /dir-glob/3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -5881,47 +4969,16 @@ packages: csstype: 3.1.1 dev: false - /dom-serializer/2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.4.0 - dev: true - - /domelementtype/2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true - /domexception/1.0.1: resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} dependencies: webidl-conversions: 4.0.2 dev: true - /domhandler/5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: true - /domino/2.1.6: resolution: {integrity: sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==} dev: false - /domutils/3.0.1: - resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dev: true - - /duplexer/0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: true - /duplexer2/0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} dependencies: @@ -5967,14 +5024,6 @@ packages: iconv-lite: 0.6.3 dev: false - /enhanced-resolve/5.12.0: - resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.10 - tapable: 2.2.1 - dev: true - /enquirer/2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} @@ -5982,11 +5031,6 @@ packages: ansi-colors: 4.1.3 dev: true - /entities/4.4.0: - resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} - engines: {node: '>=0.12'} - dev: true - /err-code/3.0.1: resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} dev: false @@ -6025,54 +5069,6 @@ packages: unbox-primitive: 1.0.2 dev: true - /es-abstract/1.21.1: - resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} - engines: {node: '>= 0.4'} - dependencies: - 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-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.4 - is-array-buffer: 3.0.1 - 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.10 - is-weakref: 1.0.2 - object-inspect: 1.12.2 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 - safe-regex-test: 1.0.0 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.9 - dev: true - - /es-set-tostringtag/2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.1.3 - has: 1.0.3 - has-tostringtag: 1.0.0 - dev: true - /es-shim-unscopables/1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: @@ -6083,75 +5079,11 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} dependencies: - is-callable: 1.2.7 + is-callable: 1.2.6 is-date-object: 1.0.5 is-symbol: 1.0.4 dev: true - /es5-ext/0.10.62: - resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} - engines: {node: '>=0.10'} - requiresBuild: true - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.3 - next-tick: 1.1.0 - dev: false - - /es6-iterator/2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-symbol: 3.1.3 - dev: false - - /es6-symbol/3.1.3: - resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} - dependencies: - d: 1.0.1 - ext: 1.7.0 - dev: false - - /es6-weak-map/2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-iterator: 2.0.3 - es6-symbol: 3.1.3 - dev: false - - /esbuild/0.16.17: - resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.16.17 - '@esbuild/android-arm64': 0.16.17 - '@esbuild/android-x64': 0.16.17 - '@esbuild/darwin-arm64': 0.16.17 - '@esbuild/darwin-x64': 0.16.17 - '@esbuild/freebsd-arm64': 0.16.17 - '@esbuild/freebsd-x64': 0.16.17 - '@esbuild/linux-arm': 0.16.17 - '@esbuild/linux-arm64': 0.16.17 - '@esbuild/linux-ia32': 0.16.17 - '@esbuild/linux-loong64': 0.16.17 - '@esbuild/linux-mips64el': 0.16.17 - '@esbuild/linux-ppc64': 0.16.17 - '@esbuild/linux-riscv64': 0.16.17 - '@esbuild/linux-s390x': 0.16.17 - '@esbuild/linux-x64': 0.16.17 - '@esbuild/netbsd-x64': 0.16.17 - '@esbuild/openbsd-x64': 0.16.17 - '@esbuild/sunos-x64': 0.16.17 - '@esbuild/win32-arm64': 0.16.17 - '@esbuild/win32-ia32': 0.16.17 - '@esbuild/win32-x64': 0.16.17 - dev: true - /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -6228,15 +5160,6 @@ packages: eslint: 8.22.0 dev: true - /eslint-config-prettier/8.5.0_eslint@8.30.0: - resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.30.0 - dev: true - /eslint-config-prettier/8.5.0_eslint@8.31.0: resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} hasBin: true @@ -6246,51 +5169,6 @@ packages: eslint: 8.31.0 dev: true - /eslint-config-standard-with-typescript/24.0.0_cptoufat74nryxrbzitaihscju: - resolution: {integrity: sha512-vEnGXZ5aiR1enl9652iIP4nTpY3GPcNEwuhrsPbKO3Ce3D6T3yCqZdkUPk8nJetfdL/yO0DLsHg2d/l9iECIdg==} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 - eslint: ^8.0.1 - eslint-plugin-import: ^2.25.2 - eslint-plugin-n: ^15.0.0 - eslint-plugin-promise: ^6.0.0 - typescript: '*' - dependencies: - '@typescript-eslint/eslint-plugin': 5.47.0_ncmi6noazr3nzas7jxykisekym - '@typescript-eslint/parser': 5.48.0_lzzuuodtsqwxnvqeq4g4likcqa - eslint: 8.30.0 - eslint-config-standard: 17.0.0_bdcrn6xmt4gzw7vnrxwhbmoneu - eslint-plugin-import: 2.26.0_p6eswnf3xl3aaa2djfyukgz5eq - eslint-plugin-n: 15.6.1_eslint@8.30.0 - eslint-plugin-promise: 6.1.1_eslint@8.30.0 - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-config-standard/17.0.0_bdcrn6xmt4gzw7vnrxwhbmoneu: - resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} - peerDependencies: - eslint: ^8.0.1 - eslint-plugin-import: ^2.25.2 - eslint-plugin-n: ^15.0.0 - eslint-plugin-promise: ^6.0.0 - dependencies: - eslint: 8.30.0 - eslint-plugin-import: 2.26.0_p6eswnf3xl3aaa2djfyukgz5eq - eslint-plugin-n: 15.6.1_eslint@8.30.0 - eslint-plugin-promise: 6.1.1_eslint@8.30.0 - dev: true - - /eslint-import-resolver-alias/1.1.2_fkfqfehjtk7sk2efaqbgxsuasa: - resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==} - engines: {node: '>= 4'} - peerDependencies: - eslint-plugin-import: '>=1.4.0' - dependencies: - eslint-plugin-import: 2.26.0_p6eswnf3xl3aaa2djfyukgz5eq - dev: true - /eslint-import-resolver-node/0.3.6: resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} dependencies: @@ -6336,26 +5214,6 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript/3.5.2_2lbwmhbr7bncddqbzzpg77o75m: - resolution: {integrity: sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - dependencies: - debug: 4.3.4 - enhanced-resolve: 5.12.0 - eslint: 8.30.0 - eslint-plugin-import: 2.26.0_p6eswnf3xl3aaa2djfyukgz5eq - get-tsconfig: 4.3.0 - globby: 13.1.3 - is-core-module: 2.10.0 - is-glob: 4.0.3 - synckit: 0.8.4 - transitivePeerDependencies: - - supports-color - dev: true - /eslint-module-utils/2.7.4_rwfyzivsgbql5kqdd6lovekmku: resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} @@ -6416,78 +5274,6 @@ packages: - supports-color dev: true - /eslint-module-utils/2.7.4_zdsb5ko3hocyqbh4wogr2krc6u: - resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa - debug: 3.2.7 - eslint: 8.30.0 - eslint-import-resolver-node: 0.3.6 - eslint-import-resolver-typescript: 3.5.2_2lbwmhbr7bncddqbzzpg77o75m - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-autofix/1.1.0_eslint@8.30.0: - resolution: {integrity: sha512-aKQ7s6CTeJRJgnhSlsGI7kQhnNCa1q3UYBM+9PTEgvdC5b+GjV/SZA233VNqkoBldb7/BkeWBRjorUjxeUfrxA==} - engines: {node: '>=8'} - peerDependencies: - eslint: '>= 5.12.1' - dependencies: - eslint: 8.30.0 - eslint-rule-composer: 0.3.0 - espree: 9.4.0 - esutils: 2.0.3 - lodash: 4.17.21 - string-similarity: 4.0.4 - dev: true - - /eslint-plugin-es/3.0.1_eslint@8.30.0: - resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' - dependencies: - eslint: 8.30.0 - eslint-utils: 2.1.0 - regexpp: 3.2.0 - dev: true - - /eslint-plugin-es/4.1.0_eslint@8.30.0: - resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' - dependencies: - eslint: 8.30.0 - eslint-utils: 2.1.0 - regexpp: 3.2.0 - dev: true - - /eslint-plugin-html/7.1.0: - resolution: {integrity: sha512-fNLRraV/e6j8e3XYOC9xgND4j+U7b1Rq+OygMlLcMg+wI/IpVbF+ubQa3R78EjKB9njT6TQOlcK5rFKBVVtdfg==} - dependencies: - htmlparser2: 8.0.1 - dev: true - /eslint-plugin-import/2.26.0_o2ymnzkcx6ynnxgq4q5neiwzpe: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} engines: {node: '>=4'} @@ -6519,37 +5305,6 @@ packages: - supports-color dev: true - /eslint-plugin-import/2.26.0_p6eswnf3xl3aaa2djfyukgz5eq: - resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa - array-includes: 3.1.5 - array.prototype.flat: 1.3.0 - debug: 2.6.9 - doctrine: 2.1.0 - eslint: 8.30.0 - eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.4_zdsb5ko3hocyqbh4wogr2krc6u - has: 1.0.3 - is-core-module: 2.10.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.values: 1.1.5 - resolve: 1.22.1 - tsconfig-paths: 3.14.1 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - /eslint-plugin-import/2.26.0_zznokraecjt4ixvvqcdste35vq: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} engines: {node: '>=4'} @@ -6625,38 +5380,6 @@ packages: semver: 6.3.0 dev: true - /eslint-plugin-n/15.6.1_eslint@8.30.0: - resolution: {integrity: sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==} - engines: {node: '>=12.22.0'} - peerDependencies: - eslint: '>=7.0.0' - dependencies: - builtins: 5.0.1 - eslint: 8.30.0 - eslint-plugin-es: 4.1.0_eslint@8.30.0 - eslint-utils: 3.0.0_eslint@8.30.0 - ignore: 5.2.0 - is-core-module: 2.11.0 - minimatch: 3.1.2 - resolve: 1.22.1 - semver: 7.3.8 - dev: true - - /eslint-plugin-node/11.1.0_eslint@8.30.0: - resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=5.16.0' - dependencies: - eslint: 8.30.0 - eslint-plugin-es: 3.0.1_eslint@8.30.0 - eslint-utils: 2.1.0 - ignore: 5.2.0 - minimatch: 3.1.2 - resolve: 1.22.1 - semver: 6.3.0 - dev: true - /eslint-plugin-prettier/4.2.1_i2cojdczqdiurzgttlwdgf764e: resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} @@ -6674,23 +5397,6 @@ packages: prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-prettier/4.2.1_kl4pe43v5b43npmso5hoplpbyi: - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - eslint: '>=7.28.0' - eslint-config-prettier: '*' - prettier: '>=2.0.0' - peerDependenciesMeta: - eslint-config-prettier: - optional: true - dependencies: - eslint: 8.30.0 - eslint-config-prettier: 8.5.0_eslint@8.30.0 - prettier: 2.8.1 - prettier-linter-helpers: 1.0.0 - dev: true - /eslint-plugin-prettier/4.2.1_vkmhlldugy3fnk7p2bqhsfnaiq: resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} @@ -6708,15 +5414,6 @@ packages: prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-promise/6.1.1_eslint@8.30.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.30.0 - dev: true - /eslint-plugin-react-hooks/4.6.0_eslint@8.22.0: resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} @@ -6726,15 +5423,6 @@ packages: eslint: 8.22.0 dev: true - /eslint-plugin-react-hooks/4.6.0_eslint@8.30.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.30.0 - dev: true - /eslint-plugin-react-hooks/4.6.0_eslint@8.31.0: resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} @@ -6744,30 +5432,6 @@ packages: eslint: 8.31.0 dev: true - /eslint-plugin-react/7.31.11_eslint@8.30.0: - resolution: {integrity: sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - array.prototype.tosorted: 1.1.1 - doctrine: 2.1.0 - eslint: 8.30.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.3 - minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - object.hasown: 1.1.2 - object.values: 1.1.6 - prop-types: 15.8.1 - resolve: 2.0.0-next.4 - semver: 6.3.0 - string.prototype.matchall: 4.0.8 - dev: true - /eslint-plugin-react/7.31.8_eslint@8.22.0: resolution: {integrity: sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==} engines: {node: '>=4'} @@ -6814,80 +5478,6 @@ packages: string.prototype.matchall: 4.0.7 dev: true - /eslint-plugin-security-node/1.1.1: - resolution: {integrity: sha512-PXl5uKQOglpIpU13YIwWhhXK9Sw14KHbzCdVthDWoIsUPOuMYbrGOCWJSEVVuZ1uJK2ciN+45ogPeErrKtNm0Q==} - engines: {node: '>=0.10.0'} - dev: true - - /eslint-plugin-security/1.5.0: - resolution: {integrity: sha512-hAFVwLZ/UeXrlyVD2TDarv/x00CoFVpaY0IUZhKjPjiFxqkuQVixsK4f2rxngeQOqSxi6OUjzJM/jMwKEVjJ8g==} - dependencies: - safe-regex: 2.1.1 - dev: true - - /eslint-plugin-typescript-sort-keys/2.1.0_ncmi6noazr3nzas7jxykisekym: - resolution: {integrity: sha512-ET7ABypdz19m47QnKynzNfWPi4CTNQ5jQQC1X5d0gojIwblkbGiCa5IilsqzBTmqxZ0yXDqKBO/GBkBFQCOFsg==} - engines: {node: 10 - 12 || >= 13.9} - peerDependencies: - '@typescript-eslint/parser': ^1 || ^2 || ^3 || ^4 || ^5 - eslint: ^5 || ^6 || ^7 || ^8 - typescript: ^3 || ^4 - dependencies: - '@typescript-eslint/experimental-utils': 5.48.1_lzzuuodtsqwxnvqeq4g4likcqa - '@typescript-eslint/parser': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa - eslint: 8.30.0 - json-schema: 0.4.0 - natural-compare-lite: 1.4.0 - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-unicorn/45.0.2_eslint@8.30.0: - resolution: {integrity: sha512-Y0WUDXRyGDMcKLiwgL3zSMpHrXI00xmdyixEGIg90gHnj0PcHY4moNv3Ppje/kDivdAy5vUeUr7z211ImPv2gw==} - engines: {node: '>=14.18'} - peerDependencies: - eslint: '>=8.28.0' - dependencies: - '@babel/helper-validator-identifier': 7.19.1 - '@eslint-community/eslint-utils': 4.1.2_eslint@8.30.0 - ci-info: 3.7.0 - clean-regexp: 1.0.0 - eslint: 8.30.0 - esquery: 1.4.0 - indent-string: 4.0.0 - is-builtin-module: 3.2.0 - jsesc: 3.0.2 - lodash: 4.17.21 - pluralize: 8.0.0 - read-pkg-up: 7.0.1 - regexp-tree: 0.1.24 - regjsparser: 0.9.1 - safe-regex: 2.1.1 - semver: 7.3.8 - strip-indent: 3.0.0 - dev: true - - /eslint-plugin-unused-imports/2.0.0_juver2u3xbiwnjfu6d55vmnoem: - resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 - eslint: ^8.0.0 - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - dependencies: - '@typescript-eslint/eslint-plugin': 5.47.0_ncmi6noazr3nzas7jxykisekym - eslint: 8.30.0 - eslint-rule-composer: 0.3.0 - 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'} @@ -6904,13 +5494,6 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} - dependencies: - eslint-visitor-keys: 1.3.0 - dev: true - /eslint-utils/3.0.0_eslint@8.22.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} @@ -6921,16 +5504,6 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /eslint-utils/3.0.0_eslint@8.30.0: - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.30.0 - eslint-visitor-keys: 2.1.0 - dev: true - /eslint-utils/3.0.0_eslint@8.31.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} @@ -6941,11 +5514,6 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /eslint-visitor-keys/1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - dev: true - /eslint-visitor-keys/2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} @@ -7003,54 +5571,6 @@ packages: - supports-color dev: true - /eslint/8.30.0: - resolution: {integrity: sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.11.8 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.30.0 - eslint-visitor-keys: 3.3.0 - espree: 9.4.0 - esquery: 1.4.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.19.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.0 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-sdsl: 4.2.0 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.1 - regexpp: 3.2.0 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - /eslint/8.31.0: resolution: {integrity: sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7147,25 +5667,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /event-emitter/0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - dev: false - - /event-stream/3.3.4: - resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} - dependencies: - duplexer: 0.1.2 - from: 0.1.7 - map-stream: 0.1.0 - pause-stream: 0.0.11 - split: 0.3.3 - stream-combiner: 0.0.4 - through: 2.3.8 - dev: true - /event-target-shim/5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -7221,12 +5722,6 @@ packages: jest-util: 29.3.1 dev: true - /ext/1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - dependencies: - type: 2.7.2 - dev: false - /extend/3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: false @@ -7306,6 +5801,7 @@ packages: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.2.1 + dev: false /file-entry-cache/6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} @@ -7412,54 +5908,17 @@ packages: resolution: {integrity: sha512-W7cHV7Hrwjid6lWmy0IhsWDFQboWSng25U3VVywpHOTJnnAZNPScog67G+cVpeX9f7yDD21ih0WDrMMT+JoaYg==} dev: false - /follow-redirects/1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: true - - /for-each/0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - /form-data-encoder/2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} dev: true - /form-data/4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - /formdata-polyfill/4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} dependencies: fetch-blob: 3.2.0 - - /from/0.1.7: - resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} - dev: true - - /fs-extra/10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - dependencies: - graceful-fs: 4.2.10 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true + dev: false /fs-extra/7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} @@ -7491,6 +5950,7 @@ packages: /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true /fsevents/2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} @@ -7509,7 +5969,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.21.1 + es-abstract: 1.20.2 functions-have-names: 1.2.3 dev: true @@ -7554,11 +6014,6 @@ packages: engines: {node: '>=8.0.0'} dev: true - /get-stdin/8.0.0: - resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} - engines: {node: '>=10'} - dev: false - /get-stream/6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -7572,10 +6027,6 @@ packages: get-intrinsic: 1.1.3 dev: true - /get-tsconfig/4.3.0: - resolution: {integrity: sha512-YCcF28IqSay3fqpIu5y3Krg/utCBHBeoflkZyHj/QcqI2nrLPC3ZegS9CmIo+hJb8K7aiGsuUl7PwWVjNG2HQQ==} - dev: true - /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -7590,16 +6041,6 @@ packages: is-glob: 4.0.3 dev: true - /glob-promise/4.2.2_glob@7.2.3: - resolution: {integrity: sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==} - engines: {node: '>=12'} - peerDependencies: - glob: ^7.1.6 - dependencies: - '@types/glob': 7.2.0 - glob: 7.2.3 - dev: false - /glob/7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} dependencies: @@ -7620,6 +6061,7 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: true /globals/11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} @@ -7640,17 +6082,6 @@ packages: 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.1.4 - dev: true - - /globalyzer/0.1.0: - resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - dev: true - /globby/11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -7663,17 +6094,6 @@ packages: slash: 3.0.0 dev: true - /globby/13.1.3: - resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==} - 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 - merge2: 1.4.1 - slash: 4.0.0 - dev: true - /globby/6.1.0: resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} engines: {node: '>=0.10.0'} @@ -7685,16 +6105,6 @@ packages: pinkie-promise: 2.0.1 dev: true - /globrex/0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - dev: true - - /gopd/1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.1.3 - dev: true - /got/12.5.3: resolution: {integrity: sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==} engines: {node: '>=14.16'} @@ -7743,11 +6153,6 @@ packages: dependencies: get-intrinsic: 1.1.3 - /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: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} @@ -7803,15 +6208,6 @@ packages: through2: 0.4.2 dev: false - /htmlparser2/8.0.1: - resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.0.1 - entities: 4.4.0 - dev: true - /http-cache-semantics/4.1.0: resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} dev: true @@ -7884,6 +6280,7 @@ packages: /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false /ignore/5.2.0: resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} @@ -7921,6 +6318,7 @@ packages: dependencies: once: 1.4.0 wrappy: 1.0.2 + dev: true /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -7934,15 +6332,6 @@ packages: side-channel: 1.0.4 dev: true - /internal-slot/1.0.4: - resolution: {integrity: sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.1.3 - has: 1.0.3 - side-channel: 1.0.4 - dev: true - /invariant/2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: @@ -7957,14 +6346,6 @@ packages: has-tostringtag: 1.0.0 dev: false - /is-array-buffer/3.0.1: - resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.1.3 - is-typed-array: 1.1.10 - dev: true - /is-arrayish/0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -7982,23 +6363,11 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-builtin-module/3.2.0: - resolution: {integrity: sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==} - engines: {node: '>=6'} - dependencies: - builtin-modules: 3.3.0 - dev: true - /is-callable/1.2.6: resolution: {integrity: sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q==} engines: {node: '>= 0.4'} dev: true - /is-callable/1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - /is-ci/3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true @@ -8010,12 +6379,6 @@ packages: resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} dependencies: has: 1.0.3 - dev: true - - /is-core-module/2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} - dependencies: - has: 1.0.3 /is-date-object/1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} @@ -8023,15 +6386,10 @@ packages: dependencies: has-tostringtag: 1.0.0 - /is-docker/2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true - /is-extglob/2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + dev: true /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} @@ -8052,10 +6410,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - - /is-interactive/1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} dev: true /is-module/1.0.0: @@ -8113,10 +6467,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-promise/2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - dev: false - /is-regex/1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -8166,22 +6516,6 @@ packages: has-symbols: 1.0.3 dev: true - /is-typed-array/1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - 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 - - /is-unicode-supported/0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true - /is-weakref/1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: @@ -8193,13 +6527,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-wsl/2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: true - /isarray/0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} dev: false @@ -8214,7 +6541,6 @@ packages: /isomorphic.js/0.2.5: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} - dev: false /istanbul-lib-coverage/3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} @@ -8609,7 +6935,7 @@ packages: jest-util: 29.3.1 natural-compare: 1.4.0 pretty-format: 29.3.1 - semver: 7.3.8 + semver: 7.3.7 transitivePeerDependencies: - supports-color dev: true @@ -8656,7 +6982,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.7.18 merge-stream: 2.0.0 supports-color: 7.2.0 dev: true @@ -8665,7 +6991,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.7.18 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -8719,6 +7045,7 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} dependencies: argparse: 2.0.1 + dev: true /jsesc/0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} @@ -8731,12 +7058,6 @@ packages: hasBin: true dev: true - /jsesc/3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - dev: true - /json-buffer/3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true @@ -8744,27 +7065,6 @@ packages: /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - /json-schema-to-typescript/11.0.2: - resolution: {integrity: sha512-XRyeXBJeo/IH4eTP5D1ptX78vCvH86nMDt2k3AxO28C3uYWEDmy4mgPyMpb8bLJ/pJMElOGuQbnKR5Y6NSh3QQ==} - engines: {node: '>=12.0.0'} - hasBin: true - dependencies: - '@bcherny/json-schema-ref-parser': 9.0.9 - '@types/json-schema': 7.0.11 - '@types/lodash': 4.14.191 - '@types/prettier': 2.7.2 - cli-color: 2.0.3 - get-stdin: 8.0.0 - glob: 7.2.3 - glob-promise: 4.2.2_glob@7.2.3 - is-glob: 4.0.3 - lodash: 4.17.21 - minimist: 1.2.6 - mkdirp: 1.0.4 - mz: 2.7.0 - prettier: 2.8.1 - dev: false - /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true @@ -8817,7 +7117,7 @@ packages: resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} engines: {node: '>=4.0'} dependencies: - array-includes: 3.1.6 + array-includes: 3.1.5 object.assign: 4.1.4 dev: true @@ -8890,7 +7190,6 @@ packages: engines: {node: '>=14'} dependencies: isomorphic.js: 0.2.5 - dev: false /lilconfig/2.0.6: resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} @@ -8961,6 +7260,12 @@ packages: '@types/trusted-types': 2.0.2 dev: false + /lit-html/2.6.1: + resolution: {integrity: sha512-Z3iw+E+3KKFn9t2YKNjsXNEu/LRLI98mtH/C6lnFg7kvaqPIzPn124Yd4eT/43lyqrejpc5Wb6BHq3fdv4S8Rw==} + dependencies: + '@types/trusted-types': 2.0.2 + dev: false + /lit/2.4.0: resolution: {integrity: sha512-fdgzxEtLrZFQU/BqTtxFQCLwlZd9bdat+ltzSFjvWkZrs7eBmeX0L5MHUMb3kYIkuS8Xlfnii/iI5klirF8/Xg==} dependencies: @@ -8969,12 +7274,12 @@ packages: lit-html: 2.4.0 dev: false - /lit/2.5.0: - resolution: {integrity: sha512-DtnUP6vR3l4Q8nRPPNBD+UxbAhwJPeky+OVbi3pdgMqm0g57xFSl1Sj64D1rIB+nVNdiVVg8YxB0hqKjvdadZA==} + /lit/2.6.1: + resolution: {integrity: sha512-DT87LD64f8acR7uVp7kZfhLRrHkfC/N4BVzAtnw9Yg8087mbBJ//qedwdwX0kzDbxgPccWRW6mFwGbRQIxy0pw==} dependencies: - '@lit/reactive-element': 1.5.0 + '@lit/reactive-element': 1.6.1 lit-element: 3.2.2 - lit-html: 2.5.0 + lit-html: 2.6.1 dev: false /load-yaml-file/0.2.0: @@ -9033,14 +7338,6 @@ packages: /lodash/4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /log-symbols/4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: true - /log-update/4.0.0: resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} engines: {node: '>=10'} @@ -9064,12 +7361,6 @@ packages: dependencies: js-tokens: 4.0.0 - /lower-case/2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - dependencies: - tslib: 2.4.0 - dev: true - /lowercase-keys/3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -9095,12 +7386,6 @@ packages: yallist: 4.0.0 dev: true - /lru-queue/0.1.0: - resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} - dependencies: - es5-ext: 0.10.62 - dev: false - /magic-string/0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: @@ -9114,6 +7399,10 @@ packages: semver: 6.3.0 dev: true + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + /makeerror/1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: @@ -9130,29 +7419,12 @@ packages: engines: {node: '>=8'} dev: true - /map-stream/0.1.0: - resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} - dev: true - /marked/4.2.5: resolution: {integrity: sha512-jPueVhumq7idETHkb203WDD4fMA3yV9emQ5vLwop58lu8bTclMghBWcYAavlDqIEMaisADinV1TooIFCfqOsYQ==} engines: {node: '>= 12'} hasBin: true dev: false - /memoizee/0.4.15: - resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-weak-map: 2.0.3 - event-emitter: 0.3.5 - is-promise: 2.2.2 - lru-queue: 0.1.0 - next-tick: 1.1.0 - timers-ext: 0.1.7 - dev: false - /meow/6.1.1: resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} engines: {node: '>=8'} @@ -9187,18 +7459,6 @@ packages: picomatch: 2.3.1 dev: true - /mime-db/1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true - - /mime-types/2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - /mimic-fn/2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -9228,6 +7488,7 @@ packages: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 + dev: true /minimatch/5.1.2: resolution: {integrity: sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==} @@ -9253,12 +7514,6 @@ packages: engines: {node: '>= 8.0.0'} dev: true - /mkdirp/1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: false - /ms/2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: true @@ -9277,18 +7532,11 @@ packages: object-assign: 4.1.1 dev: false - /mz/2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: false - /nanoid/3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 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==} @@ -9324,10 +7572,6 @@ packages: - webpack dev: true - /next-tick/1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - dev: false - /next/12.3.1_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-l7bvmSeIwX5lp07WtIiP9u2ytZMv7jIeB8iacR28PuUEFG5j0HGAPnMqyG5kbZNBG2H7tRsrQ4HCjuMOPnANZw==} engines: {node: '>=12.22.0'} @@ -9415,17 +7659,12 @@ packages: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - - /no-case/3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - dependencies: - lower-case: 2.0.2 - tslib: 2.4.0 - dev: true + dev: false /node-domexception/1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} + dev: false /node-fetch/2.6.7_encoding@0.1.13: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} @@ -9440,15 +7679,6 @@ packages: whatwg-url: 5.0.0 dev: false - /node-fetch/3.2.10: - resolution: {integrity: sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - data-uri-to-buffer: 4.0.0 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: true - /node-fetch/3.3.0: resolution: {integrity: sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -9542,15 +7772,6 @@ packages: es-abstract: 1.20.2 dev: true - /object.entries/1.1.6: - resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - dev: true - /object.fromentries/2.0.5: resolution: {integrity: sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==} engines: {node: '>= 0.4'} @@ -9560,15 +7781,6 @@ packages: es-abstract: 1.20.2 dev: true - /object.fromentries/2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - dev: true - /object.hasown/1.1.1: resolution: {integrity: sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==} dependencies: @@ -9576,13 +7788,6 @@ packages: es-abstract: 1.20.2 dev: true - /object.hasown/1.1.2: - resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} - dependencies: - define-properties: 1.1.4 - es-abstract: 1.21.1 - dev: true - /object.values/1.1.5: resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==} engines: {node: '>= 0.4'} @@ -9592,19 +7797,11 @@ packages: es-abstract: 1.20.2 dev: true - /object.values/1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - dev: true - /once/1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 + dev: true /onetime/5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} @@ -9620,15 +7817,6 @@ packages: mimic-fn: 4.0.0 dev: true - /open/8.4.0: - resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} - engines: {node: '>=12'} - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: true - /optionator/0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} @@ -9641,21 +7829,6 @@ packages: word-wrap: 1.2.3 dev: true - /ora/5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.7.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 - dev: true - /os-tmpdir/1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -9741,13 +7914,6 @@ packages: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /pascal-case/3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - dependencies: - no-case: 3.0.4 - tslib: 2.4.0 - dev: true - /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -9756,6 +7922,7 @@ packages: /path-is-absolute/1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} + dev: true /path-is-inside/1.0.2: resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} @@ -9778,12 +7945,6 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - /pause-stream/0.0.11: - resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} - dependencies: - through: 2.3.8 - dev: true - /perfect-freehand/1.2.0: resolution: {integrity: sha512-h/0ikF1M3phW7CwpZ5MMvKnfpHficWoOEyr//KVNTxV4F6deRK1eYMtHyBKEAKFK0aXIEUK9oBvlF6PNXMDsAw==} dev: false @@ -9842,11 +8003,6 @@ packages: hasBin: true dev: true - /pluralize/8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true - /postcss/8.4.14: resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} engines: {node: ^10 || ^12 || >=14} @@ -9854,15 +8010,7 @@ packages: nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 - - /postcss/8.4.21: - resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.4 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true + dev: false /preferred-pm/3.0.3: resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} @@ -9891,11 +8039,6 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - /prettier/2.8.1: - resolution: {integrity: sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==} - engines: {node: '>=10.13.0'} - hasBin: true - /pretty-bytes/5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} @@ -9968,14 +8111,6 @@ packages: long: 5.2.1 dev: false - /ps-tree/1.2.0: - resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} - engines: {node: '>= 0.10'} - hasBin: true - dependencies: - event-stream: 3.3.4 - dev: true - /pseudomap/1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: true @@ -10045,6 +8180,7 @@ packages: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 + dev: false /react-i18next/11.18.6_i18next@21.10.0: resolution: {integrity: sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA==} @@ -10105,29 +8241,6 @@ packages: use-sidecar: 1.1.2_w5j4k42lgipnm43s3brx6h3c34 dev: false - /react-router-dom/6.6.2_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-6SCDXxRQqW5af8ImOqKza7icmQ47/EMbz572uFjzvcArg3lZ+04PxSPp8qGs+p2Y+q+b+S/AjXv8m8dyLndIIA==} - engines: {node: '>=14'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - dependencies: - '@remix-run/router': 1.2.1 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - react-router: 6.6.2_react@18.2.0 - dev: false - - /react-router/6.6.2_react@18.2.0: - resolution: {integrity: sha512-uJPG55Pek3orClbURDvfljhqFvMgJRo59Pktywkk8hUUkTY2aRfza8Yhl/vZQXs+TNQyr6tu+uqz/fLxPICOGQ==} - engines: {node: '>=14'} - peerDependencies: - react: '>=16.8' - dependencies: - '@remix-run/router': 1.2.1 - react: 18.2.0 - dev: false - /react-style-singleton/2.2.1_w5j4k42lgipnm43s3brx6h3c34: resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} @@ -10164,6 +8277,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + dev: false /read-pkg-up/7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} @@ -10222,6 +8336,7 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + dev: false /realistic-structured-clone/3.0.0: resolution: {integrity: sha512-rOjh4nuWkAqf9PWu6JVpOWD4ndI+JHfgiZeMmujYcPi+fvILUu7g6l26TC1K5aBIp34nV+jE1cDO75EKOfHC5Q==} @@ -10262,11 +8377,6 @@ packages: '@babel/runtime': 7.20.7 dev: true - /regexp-tree/0.1.24: - resolution: {integrity: sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==} - hasBin: true - dev: true - /regexp.prototype.flags/1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} @@ -10345,15 +8455,14 @@ packages: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: - is-core-module: 2.11.0 + is-core-module: 2.10.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 /resolve/2.0.0-next.4: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} - hasBin: true dependencies: - is-core-module: 2.11.0 + is-core-module: 2.10.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -10391,7 +8500,6 @@ packages: /rimraf/3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true dependencies: glob: 7.2.3 dev: true @@ -10417,14 +8525,6 @@ packages: fsevents: 2.3.2 dev: true - /rollup/3.10.0: - resolution: {integrity: sha512-JmRYz44NjC1MjVF2VKxc0M1a97vn+cDxeqWmnwyAF4FvpjK8YFdHpaqvQB+3IxCvX05vJxKZkoMDU8TShhmJVA==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -10448,20 +8548,6 @@ packages: /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /safe-regex-test/1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.1.3 - is-regex: 1.1.4 - dev: true - - /safe-regex/2.1.1: - resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} - dependencies: - regexp-tree: 0.1.24 - dev: true - /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -10469,6 +8555,7 @@ packages: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 + dev: false /schema-utils/2.7.1: resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} @@ -10506,14 +8593,6 @@ packages: lru-cache: 6.0.0 dev: true - /semver/7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - /serialize-javascript/4.0.0: resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} dependencies: @@ -10554,10 +8633,6 @@ packages: engines: {node: '>=8'} dev: true - /shell-quote/1.7.4: - resolution: {integrity: sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==} - dev: true - /side-channel/1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -10593,11 +8668,6 @@ packages: engines: {node: '>=8'} dev: true - /slash/4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true - /slice-ansi/3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} @@ -10644,6 +8714,7 @@ packages: /source-map-js/1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + dev: false /source-map-support/0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} @@ -10681,10 +8752,6 @@ packages: deprecated: Please use @jridgewell/sourcemap-codec instead dev: true - /spawn-command/0.0.2-1: - resolution: {integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==} - dev: true - /spawndamnit/2.0.0: resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} dependencies: @@ -10714,12 +8781,6 @@ packages: resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} dev: true - /split/0.3.3: - resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} - dependencies: - through: 2.3.8 - dev: true - /sprintf-js/1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true @@ -10731,12 +8792,6 @@ packages: escape-string-regexp: 2.0.0 dev: true - /stream-combiner/0.0.4: - resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} - dependencies: - duplexer: 0.1.2 - dev: true - /stream-transform/2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} dependencies: @@ -10756,10 +8811,6 @@ packages: strip-ansi: 6.0.1 dev: true - /string-similarity/4.0.4: - resolution: {integrity: sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==} - dev: true - /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -10790,33 +8841,12 @@ packages: side-channel: 1.0.4 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.21.1 - get-intrinsic: 1.1.3 - has-symbols: 1.0.3 - internal-slot: 1.0.3 - regexp.prototype.flags: 1.4.3 - side-channel: 1.0.4 - dev: true - /string.prototype.trimend/1.0.5: resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.21.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.21.1 + es-abstract: 1.20.2 dev: true /string.prototype.trimstart/1.0.5: @@ -10824,15 +8854,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.21.1 - dev: true - - /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.21.1 + es-abstract: 1.20.2 dev: true /string_decoder/0.10.31: @@ -10849,6 +8871,7 @@ packages: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 + dev: false /stringify-object/3.3.0: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} @@ -10940,15 +8963,12 @@ packages: dependencies: client-only: 0.0.1 react: 18.2.0 + dev: false /stylis/4.0.13: resolution: {integrity: sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==} dev: false - /stylis/4.1.3: - resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} - dev: false - /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -10982,19 +9002,6 @@ packages: use-sync-external-store: 1.2.0 dev: false - /synckit/0.8.4: - resolution: {integrity: sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==} - engines: {node: ^14.18.0 || >=16.0.0} - dependencies: - '@pkgr/utils': 2.3.1 - tslib: 2.4.0 - dev: true - - /tapable/2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true - /temp-dir/2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -11062,19 +9069,6 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /thenify-all/1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - 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 - /through/2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -11085,20 +9079,6 @@ packages: xtend: 2.1.2 dev: false - /timers-ext/0.1.7: - resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} - dependencies: - es5-ext: 0.10.62 - next-tick: 1.1.0 - dev: false - - /tiny-glob/0.2.9: - resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} - dependencies: - globalyzer: 0.1.0 - globrex: 0.1.2 - dev: true - /tmp/0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -11138,16 +9118,41 @@ packages: punycode: 2.1.1 dev: true - /tree-kill/1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true - /trim-newlines/3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} dev: true + /ts-node/10.9.1_typescript@4.9.3: + 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 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + acorn: 8.8.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: 4.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + /tsconfig-paths/3.14.1: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: @@ -11184,16 +9189,6 @@ packages: typescript: 4.9.3 dev: true - /tsutils/3.21.0_typescript@4.9.4: - 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: 4.9.4 - dev: true - /tty-table/4.1.6: resolution: {integrity: sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw==} engines: {node: '>=8.0.0'} @@ -11256,22 +9251,6 @@ packages: engines: {node: '>=8'} dev: true - /type/1.2.0: - resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} - dev: false - - /type/2.7.2: - resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - dev: false - - /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.10 - dev: true - /typescript/4.8.3: resolution: {integrity: sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==} engines: {node: '>=4.2.0'} @@ -11290,12 +9269,6 @@ packages: hasBin: true dev: true - /typescript/4.9.4: - resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - /typeson-registry/1.0.0-alpha.39: resolution: {integrity: sha512-NeGDEquhw+yfwNhguLPcZ9Oj0fzbADiX4R0WxvoY8nGhy98IbzQy1sezjoEFWOywOboj/DWehI+/aUlRVrJnnw==} engines: {node: '>=10.0.0'} @@ -11310,23 +9283,6 @@ packages: engines: {node: '>=0.1.14'} dev: true - /typesync/0.9.2: - resolution: {integrity: sha512-FnHhbgECgkcGOR/DVmE0V9Z81Od7Icu2qkXGM91GFFzVO9HaQ9fYwmSY9ibKoydN4k7IV0hRRKGLLgfenWjRFw==} - engines: {node: '>=10.0.0'} - hasBin: true - dependencies: - awilix: 7.0.3 - axios: 0.27.2 - chalk: 4.1.2 - cosmiconfig: 7.0.1 - detect-indent: 6.1.0 - glob: 7.2.3 - ora: 5.4.1 - semver: 7.3.8 - transitivePeerDependencies: - - debug - dev: true - /unbox-primitive/1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -11445,6 +9401,11 @@ packages: /util-deprecate/1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true /v8-compile-cache/2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} @@ -11466,40 +9427,6 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vite/4.0.4_@types+node@18.11.18: - resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.11.18 - esbuild: 0.16.17 - postcss: 8.4.21 - resolve: 1.22.1 - rollup: 3.10.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - /void-elements/3.1.0: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} @@ -11520,6 +9447,7 @@ packages: /web-streams-polyfill/3.2.1: resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} engines: {node: '>= 8'} + dev: false /webidl-conversions/3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -11601,18 +9529,6 @@ packages: path-exists: 4.0.0 dev: true - /which-typed-array/1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} - 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 - is-typed-array: 1.1.10 - dev: true - /which/1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -11623,7 +9539,6 @@ packages: /which/2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} - hasBin: true dependencies: isexe: 2.0.0 dev: true @@ -11814,6 +9729,7 @@ packages: /wrappy/1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true /write-file-atomic/4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} @@ -11890,6 +9806,7 @@ packages: /yaml/1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + dev: false /yaml/2.2.1: resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} @@ -11961,29 +9878,13 @@ packages: resolution: {integrity: sha512-UL+abIh2lQonqXfaJ+en7z9eGshpY11j1zNLc2kDYs0vrTjee4gZJUXC3ZsuhP6geQt0IRU04epCGRaVPQAVCA==} dependencies: lib0: 0.2.58 - dev: false + + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true /yocto-queue/0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true - - /zx/7.1.1: - resolution: {integrity: sha512-5YlTO2AJ+Ku2YuZKSSSqnUKuagcM/f/j4LmHs15O84Ch80Z9gzR09ZK3gR7GV+rc8IFpz2H/XNFtFVmj31yrZA==} - engines: {node: '>= 16.0.0'} - hasBin: true - dependencies: - '@types/fs-extra': 9.0.13 - '@types/minimist': 1.2.2 - '@types/node': 18.11.18 - '@types/ps-tree': 1.1.2 - '@types/which': 2.0.1 - chalk: 5.2.0 - fs-extra: 10.1.0 - globby: 13.1.3 - minimist: 1.2.6 - node-fetch: 3.2.10 - ps-tree: 1.2.0 - which: 2.0.2 - yaml: 2.2.1 - dev: true diff --git a/tests/local-first-workspace.spec.ts b/tests/local-first-workspace.spec.ts index 39b10c6aea..014b839fc9 100644 --- a/tests/local-first-workspace.spec.ts +++ b/tests/local-first-workspace.spec.ts @@ -12,7 +12,7 @@ test.describe('Local first default workspace', () => { test.skip('Default workspace avatar', async ({ page }) => { const workspaceAvatar = page.getByTestId('workspace-avatar'); expect(await workspaceAvatar.innerHTML()).toBe( - '' + '' ); }); });