From c6657e7a9b8fc5cc588ef2745d2910ae83778def Mon Sep 17 00:00:00 2001 From: DiamondThree Date: Wed, 4 Jan 2023 18:08:11 +0800 Subject: [PATCH 01/60] feat: mock workspace process --- .../src/components/create-workspace/index.tsx | 83 +++++++++++++ .../src/components/workspace-modal/index.tsx | 117 ++++++++++++++++++ .../src/components/workspace-modal/styles.ts | 38 ++++++ packages/app/src/hooks/mock-data/mock.ts | 75 +++++++++++ .../app/src/pages/new-workspace/index.tsx | 47 +++++++ 5 files changed, 360 insertions(+) create mode 100644 packages/app/src/components/create-workspace/index.tsx create mode 100644 packages/app/src/components/workspace-modal/index.tsx create mode 100644 packages/app/src/components/workspace-modal/styles.ts create mode 100644 packages/app/src/hooks/mock-data/mock.ts create mode 100644 packages/app/src/pages/new-workspace/index.tsx diff --git a/packages/app/src/components/create-workspace/index.tsx b/packages/app/src/components/create-workspace/index.tsx new file mode 100644 index 0000000000..1a04d3ce9a --- /dev/null +++ b/packages/app/src/components/create-workspace/index.tsx @@ -0,0 +1,83 @@ +import { styled } from '@/styles'; +import { Modal, ModalWrapper, ModalCloseButton } from '@/ui/modal'; +import { Button } from '@/ui/button'; +import { useState } from 'react'; +import { createWorkspace } from '@/hooks/mock-data/mock'; +import Input from '@/ui/input'; + +interface ModalProps { + open: boolean; + onClose: () => void; +} + +export const CreateWorkspaceModal = ({ open, onClose }: ModalProps) => { + const [workspaceName, setWorkspaceName] = useState(''); + const handleCreateWorkspace = () => { + createWorkspace(workspaceName); + onClose(); + }; + return ( +
+ + +
+ New Workspace + { + onClose(); + }} + /> +
+ +

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

+ { + setWorkspaceName(value); + }} + > + +
+
+
+
+ ); +}; + +const Header = styled('div')({ + position: 'relative', + height: '44px', +}); + +const Content = styled('div')({ + display: 'flex', + padding: '0 48px', + flexDirection: 'column', + alignItems: 'center', + gap: '16px', +}); + +const ContentTitle = styled('span')({ + fontSize: '20px', + lineHeight: '28px', + fontWeight: 600, + textAlign: 'left', + paddingBottom: '16px', +}); + +const Footer = styled('div')({ + height: '70px', + paddingLeft: '24px', + marginTop: '32px', + textAlign: 'center', +}); diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx new file mode 100644 index 0000000000..84e56dd60d --- /dev/null +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -0,0 +1,117 @@ +import { styled } from '@/styles'; +import { Modal, ModalWrapper, ModalCloseButton } from '@/ui/modal'; +import { Button } from '@/ui/button'; +import { useEffect, useState } from 'react'; +import { getWorkspaceList, Workspace } from '@/hooks/mock-data/mock'; +import { CreateWorkspaceModal } from '../create-workspace'; + +interface LoginModalProps { + open: boolean; + onClose: () => void; +} + +export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { + const [workspaceList, setWorkspaceList] = useState([]); + const [createWorkspaceOpen, setCreateWorkspaceOpen] = useState(false); + + useEffect(() => { + getList(); + }, []); + + const getList = () => { + const data = getWorkspaceList(); + setWorkspaceList(data); + }; + return ( +
+ + +
+ My workspace + { + onClose(); + }} + /> +
+ + + {workspaceList.map(item => { + return ( + + + {item.name} + {item.type === 'local' && local} + {item.type === 'share' && share} + {item.isPublish ? 'public' : 'private'} + {item.isLocal ? 'local' : 'local'} + + ); + })} +
  • + +
  • +
    +
    +
    + +
    + { + setCreateWorkspaceOpen(false); + getList(); + }} + > +
    +
    +
    + ); +}; + +const Header = styled('div')({ + position: 'relative', + height: '44px', +}); + +const Content = styled('div')({ + padding: '0 20px', + flexDirection: 'column', + alignItems: 'center', + gap: '16px', +}); + +const ContentTitle = styled('span')({ + fontSize: '20px', + lineHeight: '28px', + fontWeight: 600, + textAlign: 'left', + paddingBottom: '16px', +}); + +const Footer = styled('div')({ + height: '70px', + paddingLeft: '24px', + marginTop: '32px', + textAlign: 'center', +}); + +const WorkspaceList = styled('div')({ + display: 'grid', + gridRowGap: '10px', + gridColumnGap: '10px', + fontSize: '16px', + gridTemplateColumns: 'repeat(2, 1fr)', +}); + +const WorkspaceItem = styled('div')({ + border: '1px solid #e5e5e5', +}); diff --git a/packages/app/src/components/workspace-modal/styles.ts b/packages/app/src/components/workspace-modal/styles.ts new file mode 100644 index 0000000000..40a8bcc375 --- /dev/null +++ b/packages/app/src/components/workspace-modal/styles.ts @@ -0,0 +1,38 @@ +import { displayFlex, styled } from '@/styles'; + +export const StyledTitle = styled.div(() => { + return { + ...displayFlex('center', 'center'), + fontSize: '20px', + fontWeight: 500, + marginTop: '60px', + lineHeight: 1, + }; +}); + +export const StyledContent = styled.div(() => { + return { + padding: '0 40px', + marginTop: '32px', + fontSize: '18px', + lineHeight: '25px', + 'p:not(last-of-type)': { + marginBottom: '10px', + }, + }; +}); + +export const StyledButton = styled.div(({ theme }) => { + return { + width: '146px', + height: '42px', + background: theme.colors.primaryColor, + color: '#FFFFFF', + fontSize: '18px', + fontWeight: 500, + borderRadius: '21px', + margin: '52px auto 0', + cursor: 'pointer', + ...displayFlex('center', 'center'), + }; +}); diff --git a/packages/app/src/hooks/mock-data/mock.ts b/packages/app/src/hooks/mock-data/mock.ts new file mode 100644 index 0000000000..e484dfcc87 --- /dev/null +++ b/packages/app/src/hooks/mock-data/mock.ts @@ -0,0 +1,75 @@ +export interface Workspace { + name: string; // 名称 + id: string; //唯一标识 + isPublish?: boolean; // 是否公开 + isLocal?: boolean; // 是否全部数据都在本地 + avatar?: string; // 封面 + type: 'local' | 'cloud' | 'share'; // cloud: 云端(本次暂不支持),local: 本地,share: 分享 + workspaceOwner?: User; // 本地工作空间的拥有者 +} + +interface User { + name: string; + id: string; + email: string; + avatar: string; +} + +export function getWorkspaceList(): Workspace[] { + const workspacesMeta = JSON.parse( + localStorage.getItem('affine-workspace') ?? '[]' + ); + return workspacesMeta; +} + +export function getPagesByWorkspaceId(workspaceId: string) { + if (!workspaceId) return []; + const workspacesMeta = []; + for (let i = 0; i < 10; i++) { + workspacesMeta.push({ + id: 'page-' + i, + name: 'page ' + i, + }); + } +} + +export function addWorkSpace(workspaceData: Workspace) { + const workspacesMeta = getWorkspaceList(); + workspacesMeta.push(workspaceData); + localStorage.setItem('affine-workspace', JSON.stringify(workspacesMeta)); +} + +export function deleteWorkspaceById(workspaceId: string) { + const workspacesMeta = getWorkspaceList(); + const newWorkspacesMeta = workspacesMeta.filter(() => { + return workspaceId !== workspaceId; + }); + localStorage.setItem('affine-workspace', JSON.stringify(newWorkspacesMeta)); +} + +export function updateWorkspaceById( + workspaceId: string, + workspaceData: Workspace +) { + const workspacesMeta = getWorkspaceList(); + const newWorkspacesMeta = workspacesMeta.map((workspace: Workspace) => { + if (workspace.id === workspaceId) { + return workspaceData; + } + return workspace; + }); + localStorage.setItem('affine-workspace', JSON.stringify(newWorkspacesMeta)); +} +export function createWorkspace(workspaceName: string) { + const workspaceData = { + name: workspaceName, + id: 'workspace-' + Date.now(), + isPublish: false, + isLocal: true, + avatar: '', + type: 'local', + } as Workspace; + const workspacesMeta = getWorkspaceList(); + workspacesMeta.push(workspaceData); + localStorage.setItem('affine-workspace', JSON.stringify(workspacesMeta)); +} diff --git a/packages/app/src/pages/new-workspace/index.tsx b/packages/app/src/pages/new-workspace/index.tsx new file mode 100644 index 0000000000..b46e99d917 --- /dev/null +++ b/packages/app/src/pages/new-workspace/index.tsx @@ -0,0 +1,47 @@ +import { WorkspaceModal } from '@/components/workspace-modal'; +import { getWorkspaceList } from '@/hooks/mock-data/mock'; +import { useEffect, useState } from 'react'; +import { styled } from '@/styles'; +import Button from '@/ui/button/Button'; + +const Page = () => { + const [open, setOpen] = useState(false); + + useEffect(() => { + const data = getWorkspaceList(); + if (!data.length) { + setOpen(true); + } + }, []); + return ( + +
    workspace
    +
    + +
    + { + setOpen(false); + }} + > +
    + ); +}; +export default Page; + +const Workspace = styled.div(({ theme }) => { + return { + height: '100vh', + background: theme.colors.pageBackground, + color: '#FFFFFF', + fontSize: '18px', + fontWeight: 500, + }; +}); From 5f729464a26ecc704813d082f592e0a45a26f6b6 Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Wed, 4 Jan 2023 21:49:56 +0800 Subject: [PATCH 02/60] feat: learn poc --- .../src/components/workspace-modal/index.tsx | 18 ++++++++++++------ packages/app/src/pages/new-workspace/index.tsx | 6 +++--- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 84e56dd60d..f6a2efdb96 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -27,7 +27,7 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => {
    - My workspace + My Workspace List { return ( - {item.name} - {item.type === 'local' && local} - {item.type === 'share' && share} - {item.isPublish ? 'public' : 'private'} - {item.isLocal ? 'local' : 'local'} + {item.name}/ + {item.type === 'local' && local} + {item.type === 'share' && share}/ + {item.isPublish ? 'isPublish' : 'isPrivate'}/ + {item.isLocal ? 'isLocal' : ''}/ ); })}
  • Date: Thu, 5 Jan 2023 16:05:54 +0800 Subject: [PATCH 03/60] feat:mock workspace-setting --- .../src/components/workspace-modal/index.tsx | 20 +++- .../workspace-setting/general/general.tsx | 17 +-- .../workspace-setting/workspace-setting.tsx | 24 ++-- .../SelectorPopperContent.tsx | 18 +-- .../WorkspaceSelector/WorkspaceSelector.tsx | 69 +++++------ .../components/workspace-slider-bar/index.tsx | 16 +++ packages/app/src/hooks/mock-data/mock.ts | 108 ++++++++++++------ .../app/src/pages/new-workspace/index.tsx | 6 +- .../providers/app-state-provider/context.ts | 4 - 9 files changed, 160 insertions(+), 122 deletions(-) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index f6a2efdb96..05b1f6632b 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -2,7 +2,11 @@ import { styled } from '@/styles'; import { Modal, ModalWrapper, ModalCloseButton } from '@/ui/modal'; import { Button } from '@/ui/button'; import { useEffect, useState } from 'react'; -import { getWorkspaceList, Workspace } from '@/hooks/mock-data/mock'; +import { + getWorkspaces, + Workspace, + setActiveWorkspace, +} from '@/hooks/mock-data/mock'; import { CreateWorkspaceModal } from '../create-workspace'; interface LoginModalProps { @@ -19,7 +23,7 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { }, []); const getList = () => { - const data = getWorkspaceList(); + const data = getWorkspaces(); setWorkspaceList(data); }; return ( @@ -40,11 +44,16 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { {workspaceList.map(item => { return ( - - + { + setActiveWorkspace(item); + onClose(); + }} + key={item.id} + > {item.name}/ {item.type === 'local' && local} - {item.type === 'share' && share}/ + {item.type === 'join' && join}/ {item.isPublish ? 'isPublish' : 'isPrivate'}/ {item.isLocal ? 'isLocal' : ''}/ @@ -70,6 +79,7 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { onClose={() => { setCreateWorkspaceOpen(false); getList(); + onClose(); }} > diff --git a/packages/app/src/components/workspace-setting/general/general.tsx b/packages/app/src/components/workspace-setting/general/general.tsx index cef2daccb7..82389370b3 100644 --- a/packages/app/src/components/workspace-setting/general/general.tsx +++ b/packages/app/src/components/workspace-setting/general/general.tsx @@ -9,25 +9,22 @@ import { StyledSettingH2 } from '../style'; import { useState } from 'react'; import { Button } from '@/ui/button'; import Input from '@/ui/input'; -import { getDataCenter, Workspace, WorkspaceType } from '@affine/datacenter'; +import { getDataCenter } from '@affine/datacenter'; import { useAppState } from '@/providers/app-state-provider'; -import { WorkspaceDetails } from '@/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent'; import { WorkspaceDelete } from './delete'; import { Workspace as StoreWorkspace } from '@blocksuite/store'; import { debounce } from '@/utils'; import { WorkspaceLeave } from './leave'; import { Upload } from '@/components/file-upload'; +import { Workspace } from '@/hooks/mock-data/mock'; export const GeneralPage = ({ workspace, - owner, }: { workspace: Workspace; - owner: WorkspaceDetails[string]['owner']; workspaces: Record; }) => { const { - user, currentWorkspace, workspacesMeta, workspaces, @@ -36,14 +33,11 @@ export const GeneralPage = ({ const [showDelete, setShowDelete] = useState(false); const [showLeave, setShowLeave] = useState(false); const [uploading, setUploading] = useState(false); - const [workspaceName, setWorkspaceName] = useState( - workspaces[workspace.id]?.meta.name || - (workspace.type === WorkspaceType.Private && user ? user.name : '') - ); + const [workspaceName, setWorkspaceName] = useState(''); const debouncedRefreshWorkspacesMeta = debounce(() => { refreshWorkspacesMeta(); }, 100); - const isOwner = user && owner.id === user.id; + const isOwner = true; const handleChangeWorkSpaceName = (newName: string) => { setWorkspaceName(newName); currentWorkspace?.meta.setName(newName); @@ -119,7 +113,6 @@ export const GeneralPage = ({ width={327} value={workspaceName} placeholder="Workspace Name" - disabled={!isOwner} maxLength={14} minLength={1} onChange={handleChangeWorkSpaceName} @@ -130,7 +123,7 @@ export const GeneralPage = ({ diff --git a/packages/app/src/components/workspace-setting/workspace-setting.tsx b/packages/app/src/components/workspace-setting/workspace-setting.tsx index c1b07e2441..238ff1f412 100644 --- a/packages/app/src/components/workspace-setting/workspace-setting.tsx +++ b/packages/app/src/components/workspace-setting/workspace-setting.tsx @@ -36,14 +36,14 @@ import { useCallback, useEffect, useState } from 'react'; import { Button, IconButton } from '@/ui/button'; import Input from '@/ui/input'; import { InviteMembers } from '../invite-members/index'; -import { Workspace, Member, getDataCenter } from '@affine/datacenter'; +import { Member, getDataCenter } from '@affine/datacenter'; import { Avatar } from '@mui/material'; import { Menu, MenuItem } from '@/ui/menu'; import { toast } from '@/ui/toast'; import { Empty } from '@/ui/empty'; import { useAppState } from '@/providers/app-state-provider'; -import { WorkspaceDetails } from '../workspace-slider-bar/WorkspaceSelector/SelectorPopperContent'; import { GeneralPage } from './general'; +import { getActiveWorkspace, Workspace } from '@/hooks/mock-data/mock'; enum ActiveTab { 'general' = 'general', @@ -59,8 +59,6 @@ type SettingTabProps = { type WorkspaceSettingProps = { isShow: boolean; onClose?: () => void; - workspace: Workspace; - owner: WorkspaceDetails[string]['owner']; }; const WorkspaceSettingTab = ({ activeTab, onTabChange }: SettingTabProps) => { @@ -106,18 +104,18 @@ const WorkspaceSettingTab = ({ activeTab, onTabChange }: SettingTabProps) => { export const WorkspaceSetting = ({ isShow, onClose, - workspace, - owner, }: WorkspaceSettingProps) => { - const { user, workspaces } = useAppState(); + const { workspaces } = useAppState(); const [activeTab, setActiveTab] = useState(ActiveTab.general); const handleTabChange = (tab: ActiveTab) => { setActiveTab(tab); }; + + const workspace = getActiveWorkspace(); const handleClickClose = () => { onClose && onClose(); }; - const isOwner = user && owner.id === user.id; + const isOwner = true; useEffect(() => { // reset tab when modal is closed if (!isShow) { @@ -125,7 +123,7 @@ export const WorkspaceSetting = ({ } }, [isShow]); return ( - + {isOwner ? ( @@ -141,11 +139,7 @@ export const WorkspaceSetting = ({ ) : null} {activeTab === ActiveTab.general && ( - + )} {activeTab === ActiveTab.members && workspace && ( @@ -295,7 +289,7 @@ const MembersPage = ({ workspace }: { workspace: Workspace }) => { const PublishPage = ({ workspace }: { workspace: Workspace }) => { const shareUrl = window.location.host + '/workspace/' + workspace.id; const [publicStatus, setPublicStatus] = useState( - workspace.public + workspace.isPublish ?? false ); const togglePublic = (flag: boolean) => { getDataCenter() diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx index 8e101307bb..494fdd495d 100644 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx +++ b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx @@ -130,16 +130,16 @@ export const SelectorPopperContent = ({ {settingWorkspace ? ( ) : null} 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 4e0299888f..22013ba674 100644 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx +++ b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx @@ -1,53 +1,46 @@ -import { Popper } from '@/ui/popper'; import { Avatar, WorkspaceName, SelectorWrapper } from './styles'; -import { SelectorPopperContent } from './SelectorPopperContent'; -import { useState } from 'react'; -import { useAppState } from '@/providers/app-state-provider'; -import { WorkspaceType } from '@affine/datacenter'; +import { useEffect, useState } from 'react'; import { AffineIcon } from '../icons/icons'; +import { WorkspaceModal } from '@/components/workspace-modal'; +import { getActiveWorkspace } from '@/hooks/mock-data/mock'; export const WorkspaceSelector = () => { - const [isShow, setIsShow] = useState(false); - const { currentWorkspace, workspacesMeta, currentWorkspaceId, user } = - useAppState(); - const workspaceMeta = workspacesMeta.find( - meta => String(meta.id) === String(currentWorkspaceId) - ); + const [workspaceListShow, setWorkspaceListShow] = useState(false); + const [workspace, setWorkSpace] = useState(getActiveWorkspace()); + useEffect(() => { + getWorkspace(); + }, [workspaceListShow]); + const getWorkspace = () => { + const workspace = getActiveWorkspace(); + setWorkSpace(workspace); + }; + return ( - } - zIndex={1000} - placement="bottom-start" - trigger="click" - onVisibleChange={setIsShow} - > - + <> + { + setWorkspaceListShow(true); + }} + data-testid="current-workspace" + > - {workspaceMeta?.type === WorkspaceType.Private && user ? ( - user?.name[0] - ) : ( - - )} + - {workspaceMeta?.type === WorkspaceType.Private - ? user - ? user.name - : 'AFFiNE' - : currentWorkspace?.meta.name || 'AFFiNE'} + {workspace?.name ?? 'AFFiNE'} - + { + setWorkspaceListShow(false); + getWorkspace(); + }} + > + ); }; diff --git a/packages/app/src/components/workspace-slider-bar/index.tsx b/packages/app/src/components/workspace-slider-bar/index.tsx index 559e0b983a..63305638a5 100644 --- a/packages/app/src/components/workspace-slider-bar/index.tsx +++ b/packages/app/src/components/workspace-slider-bar/index.tsx @@ -21,6 +21,7 @@ import { ImportIcon, TrashIcon, AddIcon, + SettingsIcon, } from '@blocksuite/icons'; import Link from 'next/link'; import { Tooltip } from '@/ui/tooltip'; @@ -31,6 +32,7 @@ import { IconButton } from '@/ui/button'; import useLocalStorage from '@/hooks/use-local-storage'; import usePageMetaList from '@/hooks/use-page-meta-list'; import { usePageHelper } from '@/hooks/use-page-helper'; +import { WorkspaceSetting } from '@/components/workspace-setting'; const FavoriteList = ({ showList }: { showList: boolean }) => { const { openPage } = usePageHelper(); @@ -146,6 +148,20 @@ export const WorkSpaceSliderBar = () => { + { + console.log('ttt'); + }} + > + Setting + + + { + console.log(1231231); + }} + /> { diff --git a/packages/app/src/hooks/mock-data/mock.ts b/packages/app/src/hooks/mock-data/mock.ts index e484dfcc87..91fcfaa85f 100644 --- a/packages/app/src/hooks/mock-data/mock.ts +++ b/packages/app/src/hooks/mock-data/mock.ts @@ -4,7 +4,7 @@ export interface Workspace { isPublish?: boolean; // 是否公开 isLocal?: boolean; // 是否全部数据都在本地 avatar?: string; // 封面 - type: 'local' | 'cloud' | 'share'; // cloud: 云端(本次暂不支持),local: 本地,share: 分享 + type: 'local' | 'cloud' | 'join'; // cloud: 云端(本次暂不支持),local: 本地,join : 加入别人的 workspaceOwner?: User; // 本地工作空间的拥有者 } @@ -15,45 +15,15 @@ interface User { avatar: string; } -export function getWorkspaceList(): Workspace[] { - const workspacesMeta = JSON.parse( - localStorage.getItem('affine-workspace') ?? '[]' - ); - return workspacesMeta; -} - -export function getPagesByWorkspaceId(workspaceId: string) { - if (!workspaceId) return []; - const workspacesMeta = []; - for (let i = 0; i < 10; i++) { - workspacesMeta.push({ - id: 'page-' + i, - name: 'page ' + i, - }); - } -} - -export function addWorkSpace(workspaceData: Workspace) { - const workspacesMeta = getWorkspaceList(); - workspacesMeta.push(workspaceData); - localStorage.setItem('affine-workspace', JSON.stringify(workspacesMeta)); -} - -export function deleteWorkspaceById(workspaceId: string) { - const workspacesMeta = getWorkspaceList(); - const newWorkspacesMeta = workspacesMeta.filter(() => { - return workspaceId !== workspaceId; - }); - localStorage.setItem('affine-workspace', JSON.stringify(newWorkspacesMeta)); -} - -export function updateWorkspaceById( +export function updateWorkspaceMeta( workspaceId: string, workspaceData: Workspace ) { - const workspacesMeta = getWorkspaceList(); + const workspacesMeta = getWorkspaces(); const newWorkspacesMeta = workspacesMeta.map((workspace: Workspace) => { if (workspace.id === workspaceId) { + workspaceData.name && (workspace.name = workspaceData.name); + workspaceData.avatar && (workspace.avatar = workspaceData.avatar); return workspaceData; } return workspace; @@ -69,7 +39,73 @@ export function createWorkspace(workspaceName: string) { avatar: '', type: 'local', } as Workspace; - const workspacesMeta = getWorkspaceList(); + const workspacesMeta = getWorkspaces(); workspacesMeta.push(workspaceData); localStorage.setItem('affine-workspace', JSON.stringify(workspacesMeta)); + setActiveWorkspace(workspaceData); +} + +export function getWorkspaces(): Workspace[] { + const workspacesMeta = JSON.parse( + localStorage.getItem('affine-workspace') ?? '[]' + ); + return workspacesMeta; +} + +export function deleteWorkspace(workspaceId: string) { + const workspacesMeta = getWorkspaces(); + const newWorkspacesMeta = workspacesMeta.filter(() => { + return workspaceId !== workspaceId; + }); + localStorage.setItem('affine-workspace', JSON.stringify(newWorkspacesMeta)); +} + +export function getMembers(id: string): User[] { + const memberMap = JSON.parse(localStorage.getItem('affine-member') ?? '{}'); + return memberMap[id] || []; +} + +export function leaveWorkspace(id: string) { + return true; +} + +export function setWorkspacePublish(id: string, isPublish: boolean): boolean { + const workspacesMeta = getWorkspaces(); + const newWorkspacesMeta = workspacesMeta.map((workspace: Workspace) => { + if (workspace.id === id) { + workspace.isPublish = isPublish; + } + return workspace; + }); + localStorage.setItem('affine-workspace', JSON.stringify(newWorkspacesMeta)); + return isPublish; +} + +export function getWorkspaceById(id: string) { + const workspacesMeta = getWorkspaces(); + return workspacesMeta.find((workspace: Workspace) => { + return workspace.id === id; + }); +} + +export function getPagesByWorkspaceId(workspaceId: string) { + if (!workspaceId) return []; + const workspacesMeta = []; + for (let i = 0; i < 10; i++) { + workspacesMeta.push({ + id: 'page-' + i, + name: 'page ' + i, + }); + } +} + +export function getActiveWorkspace(): Workspace { + return JSON.parse(localStorage.getItem('affine-active-workspace') ?? '{}'); +} + +export function setActiveWorkspace(workspaceData: Workspace) { + localStorage.setItem( + 'affine-active-workspace', + JSON.stringify(workspaceData) + ); } diff --git a/packages/app/src/pages/new-workspace/index.tsx b/packages/app/src/pages/new-workspace/index.tsx index 2b04453508..1a1d9e1a44 100644 --- a/packages/app/src/pages/new-workspace/index.tsx +++ b/packages/app/src/pages/new-workspace/index.tsx @@ -1,14 +1,14 @@ import { WorkspaceModal } from '@/components/workspace-modal'; -import { getWorkspaceList } from '@/hooks/mock-data/mock'; +import { getWorkspaces } from '@/hooks/mock-data/mock'; import { useEffect, useState } from 'react'; import { styled } from '@/styles'; import Button from '@/ui/button/Button'; const Page = () => { - const [open, setOpen] = useState(true); + const [open, setOpen] = useState(false); useEffect(() => { - const data = getWorkspaceList(); + const data = getWorkspaces(); if (!data.length) { setOpen(true); } diff --git a/packages/app/src/providers/app-state-provider/context.ts b/packages/app/src/providers/app-state-provider/context.ts index ee6b41d05a..98e535396e 100644 --- a/packages/app/src/providers/app-state-provider/context.ts +++ b/packages/app/src/providers/app-state-provider/context.ts @@ -40,14 +40,10 @@ export interface AppStateContext extends AppStateValue { export const AppState = createContext({ user: null, workspacesMeta: [], - currentWorkspaceId: '', currentWorkspace: null, - currentPage: null, - editor: null, - // eslint-disable-next-line @typescript-eslint/no-empty-function setState: () => {}, createEditor: undefined, From 55dbc8ad3b2ce69b9e32a17f4b542fc92902512e Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Thu, 5 Jan 2023 17:11:24 +0800 Subject: [PATCH 04/60] feat: adjust modal height --- packages/app/src/components/workspace-modal/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 05b1f6632b..24d9782c06 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -29,7 +29,7 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { return (
    - +
    My Workspace List Date: Thu, 5 Jan 2023 17:32:39 +0800 Subject: [PATCH 05/60] feat: mock login --- .../src/components/workspace-modal/index.tsx | 56 +++++++++++++++++-- .../workspace-setting/general/general.tsx | 7 +-- .../workspace-setting/workspace-setting.tsx | 26 ++++----- .../components/workspace-slider-bar/index.tsx | 8 ++- .../components/workspace-slider-bar/style.ts | 1 + packages/app/src/hooks/mock-data/mock.ts | 22 +++++++- packages/app/src/ui/confirm/Confirm.tsx | 4 +- 7 files changed, 95 insertions(+), 29 deletions(-) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 05b1f6632b..479b22c99e 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -6,8 +6,14 @@ import { getWorkspaces, Workspace, setActiveWorkspace, + Login, + User, + getUserInfo, + SignOut, } from '@/hooks/mock-data/mock'; import { CreateWorkspaceModal } from '../create-workspace'; +import { useConfirm } from '@/providers/confirm-provider'; +import { toast } from '@/ui/toast'; interface LoginModalProps { open: boolean; @@ -16,20 +22,30 @@ interface LoginModalProps { export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { const [workspaceList, setWorkspaceList] = useState([]); + const [user, setUser] = useState(); const [createWorkspaceOpen, setCreateWorkspaceOpen] = useState(false); - + const { confirm } = useConfirm(); useEffect(() => { - getList(); + setList(); + setUserInfo(); }, []); - const getList = () => { + const setList = () => { const data = getWorkspaces(); setWorkspaceList(data); }; + const setUserInfo = () => { + const data = getUserInfo(); + setUser(data); + }; return (
    - +
    My Workspace List {
    - + {!user ? ( + + ) : ( + + )}
    { setCreateWorkspaceOpen(false); - getList(); + setList(); 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 => { + confirm && Login(); + }); }} > @@ -98,6 +141,7 @@ const Content = styled('div')({ flexDirection: 'column', alignItems: 'center', gap: '16px', + flex: 1, }); const ContentTitle = styled('span')({ diff --git a/packages/app/src/components/workspace-setting/general/general.tsx b/packages/app/src/components/workspace-setting/general/general.tsx index 82389370b3..fa72178869 100644 --- a/packages/app/src/components/workspace-setting/general/general.tsx +++ b/packages/app/src/components/workspace-setting/general/general.tsx @@ -16,7 +16,7 @@ import { Workspace as StoreWorkspace } from '@blocksuite/store'; import { debounce } from '@/utils'; import { WorkspaceLeave } from './leave'; import { Upload } from '@/components/file-upload'; -import { Workspace } from '@/hooks/mock-data/mock'; +import { getUserInfo, Workspace } from '@/hooks/mock-data/mock'; export const GeneralPage = ({ workspace, @@ -30,6 +30,7 @@ export const GeneralPage = ({ workspaces, refreshWorkspacesMeta, } = useAppState(); + // const user = getUserInfo(); const [showDelete, setShowDelete] = useState(false); const [showLeave, setShowLeave] = useState(false); const [uploading, setUploading] = useState(false); @@ -38,11 +39,9 @@ export const GeneralPage = ({ refreshWorkspacesMeta(); }, 100); const isOwner = true; + const handleChangeWorkSpaceName = (newName: string) => { setWorkspaceName(newName); - currentWorkspace?.meta.setName(newName); - workspaces[workspace.id]?.meta.setName(newName); - debouncedRefreshWorkspacesMeta(); }; const currentWorkspaceIndex = workspacesMeta.findIndex( meta => meta.id === workspace.id diff --git a/packages/app/src/components/workspace-setting/workspace-setting.tsx b/packages/app/src/components/workspace-setting/workspace-setting.tsx index 238ff1f412..f1a9256dbf 100644 --- a/packages/app/src/components/workspace-setting/workspace-setting.tsx +++ b/packages/app/src/components/workspace-setting/workspace-setting.tsx @@ -43,7 +43,11 @@ import { toast } from '@/ui/toast'; import { Empty } from '@/ui/empty'; import { useAppState } from '@/providers/app-state-provider'; import { GeneralPage } from './general'; -import { getActiveWorkspace, Workspace } from '@/hooks/mock-data/mock'; +import { + getActiveWorkspace, + setWorkspacePublish, + Workspace, +} from '@/hooks/mock-data/mock'; enum ActiveTab { 'general' = 'general', @@ -112,6 +116,7 @@ export const WorkspaceSetting = ({ }; const workspace = getActiveWorkspace(); + console.log('workspace: ', workspace); const handleClickClose = () => { onClose && onClose(); }; @@ -123,7 +128,7 @@ export const WorkspaceSetting = ({ } }, [isShow]); return ( - + {isOwner ? ( @@ -287,23 +292,16 @@ const MembersPage = ({ workspace }: { workspace: Workspace }) => { }; const PublishPage = ({ workspace }: { workspace: Workspace }) => { - const shareUrl = window.location.host + '/workspace/' + workspace.id; + const shareUrl = + window.location.host + '/workspace/' + workspace.id + '?share=true'; const [publicStatus, setPublicStatus] = useState( workspace.isPublish ?? false ); const togglePublic = (flag: boolean) => { - getDataCenter() - .then(dc => - dc.apis.updateWorkspace({ - id: workspace.id, - public: flag, - }) - ) - .then(data => { - setPublicStatus(data?.public); - toast('Updated Public Status Success'); - }); + const isPublic = setWorkspacePublish(workspace.id, flag); + setPublicStatus(isPublic); }; + const copyUrl = () => { navigator.clipboard.writeText(shareUrl); toast('Copied url to clipboard'); diff --git a/packages/app/src/components/workspace-slider-bar/index.tsx b/packages/app/src/components/workspace-slider-bar/index.tsx index 63305638a5..b9132fab52 100644 --- a/packages/app/src/components/workspace-slider-bar/index.tsx +++ b/packages/app/src/components/workspace-slider-bar/index.tsx @@ -76,6 +76,8 @@ export const WorkSpaceSliderBar = () => { const [showTip, setShowTip] = useState(false); const [show, setShow] = useLocalStorage('AFFiNE_SLIDE_BAR', false, true); + const [showWorkspaceSetting, setShowWorkspaceSetting] = useState(false); + const paths = { all: currentWorkspaceId ? `/workspace/${currentWorkspaceId}/all` : '', favorite: currentWorkspaceId @@ -150,16 +152,16 @@ export const WorkSpaceSliderBar = () => { { - console.log('ttt'); + setShowWorkspaceSetting(true); }} > Setting { - console.log(1231231); + setShowWorkspaceSetting(false); }} /> diff --git a/packages/app/src/components/workspace-slider-bar/style.ts b/packages/app/src/components/workspace-slider-bar/style.ts index f29de60a1e..6f380b43e1 100644 --- a/packages/app/src/components/workspace-slider-bar/style.ts +++ b/packages/app/src/components/workspace-slider-bar/style.ts @@ -62,6 +62,7 @@ export const StyledListItem = styled.div<{ color: active ? theme.colors.primaryColor : theme.colors.popoverColor, paddingLeft: '12px', borderRadius: '5px', + cursor: 'pointer', ...displayFlex('flex-start', 'center'), ...(disabled ? { diff --git a/packages/app/src/hooks/mock-data/mock.ts b/packages/app/src/hooks/mock-data/mock.ts index 91fcfaa85f..6f5f5f289c 100644 --- a/packages/app/src/hooks/mock-data/mock.ts +++ b/packages/app/src/hooks/mock-data/mock.ts @@ -8,7 +8,7 @@ export interface Workspace { workspaceOwner?: User; // 本地工作空间的拥有者 } -interface User { +export interface User { name: string; id: string; email: string; @@ -109,3 +109,23 @@ export function setActiveWorkspace(workspaceData: Workspace) { JSON.stringify(workspaceData) ); } + +export function getUserInfo(): User { + return JSON.parse(localStorage.getItem('affine-user') ?? 'null'); +} + +export function Login(): void { + localStorage.setItem( + 'affine-user', + JSON.stringify({ + name: 'Diamond', + id: 'ttt', + email: 'diamond.shx@gmail.com', + avatar: 'string', + }) + ); +} + +export function SignOut(): void { + localStorage.removeItem('affine-user'); +} diff --git a/packages/app/src/ui/confirm/Confirm.tsx b/packages/app/src/ui/confirm/Confirm.tsx index d3de35adb1..7b789c4f89 100644 --- a/packages/app/src/ui/confirm/Confirm.tsx +++ b/packages/app/src/ui/confirm/Confirm.tsx @@ -11,6 +11,7 @@ export type ConfirmProps = { title?: string; content?: string; confirmText?: string; + cancelText?: string; // TODO: Confirm button's color should depend on confirm type confirmType?: 'primary' | 'warning' | 'danger'; onConfirm?: () => void; @@ -24,6 +25,7 @@ export const Confirm = ({ confirmType, onConfirm, onCancel, + cancelText = 'Cancel', }: ConfirmProps) => { const [open, setOpen] = useState(true); return ( @@ -48,7 +50,7 @@ export const Confirm = ({ }} style={{ marginRight: '24px' }} > - Cancel + {cancelText}
  • +

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

    Date: Thu, 5 Jan 2023 17:55:00 +0800 Subject: [PATCH 07/60] feat: add icons --- packages/app/src/components/workspace-modal/index.tsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 46cd1a9182..de0ae36fa3 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -16,10 +16,10 @@ import { CloudUnsyncedIcon, CloudInsyncIcon, UsersIcon, + AddIcon, } from '@blocksuite/icons'; import { useConfirm } from '@/providers/confirm-provider'; import { toast } from '@/ui/toast'; - interface LoginModalProps { open: boolean; onClose: () => void; @@ -76,6 +76,7 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { style={{ float: 'left', marginTop: '6px', + marginLeft: '10px', marginRight: '10px', }} width="24" @@ -122,6 +123,14 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { setCreateWorkspaceOpen(true); }} > + Create Or Import From 27b7c4e8fb5ecb1e996bd2aab098fa4914668e13 Mon Sep 17 00:00:00 2001 From: QiShaoXuan Date: Thu, 5 Jan 2023 18:33:17 +0800 Subject: [PATCH 08/60] chore: remove useless file & code --- .../providers/app-state-provider/context.ts | 4 +- .../app-state-provider/dynamic-blocksuite.tsx | 22 +------ .../src/providers/app-state-provider/hooks.ts | 51 -------------- .../providers/app-state-provider/provider.tsx | 66 ++++--------------- 4 files changed, 18 insertions(+), 125 deletions(-) delete mode 100644 packages/app/src/providers/app-state-provider/hooks.ts diff --git a/packages/app/src/providers/app-state-provider/context.ts b/packages/app/src/providers/app-state-provider/context.ts index 98e535396e..f907246edf 100644 --- a/packages/app/src/providers/app-state-provider/context.ts +++ b/packages/app/src/providers/app-state-provider/context.ts @@ -5,6 +5,7 @@ import type { Workspace as StoreWorkspace, } from '@blocksuite/store'; import type { EditorContainer } from '@blocksuite/editor'; + export type LoadWorkspaceHandler = ( workspaceId: string, user?: AccessTokenMessage | null @@ -20,7 +21,7 @@ export interface AppStateValue { currentPage: StorePage | null; - workspaces: Record; + // workspaces: Record; editor: EditorContainer | null; synced: boolean; @@ -53,7 +54,6 @@ export const AppState = createContext({ synced: false, // eslint-disable-next-line @typescript-eslint/no-empty-function refreshWorkspacesMeta: () => {}, - workspaces: {}, }); export const useAppState = () => { diff --git a/packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx b/packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx index 3a8fb7671c..4b7b876545 100644 --- a/packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx +++ b/packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx @@ -2,31 +2,13 @@ import { useEffect } from 'react'; import type { Page } from '@blocksuite/store'; import '@blocksuite/blocks'; import { EditorContainer } from '@blocksuite/editor'; -import type { LoadWorkspaceHandler, CreateEditorHandler } from './context'; -import { getDataCenter } from '@affine/datacenter'; +import type { CreateEditorHandler } from './context'; interface Props { - setLoadWorkspaceHandler: (handler: LoadWorkspaceHandler) => void; setCreateEditorHandler: (handler: CreateEditorHandler) => void; } -const DynamicBlocksuite = ({ - setLoadWorkspaceHandler, - setCreateEditorHandler, -}: Props) => { - useEffect(() => { - const openWorkspace: LoadWorkspaceHandler = async (workspaceId: string) => { - if (workspaceId) { - const dc = await getDataCenter(); - return dc.load(workspaceId, { providerId: 'affine' }); - } else { - return null; - } - }; - - setLoadWorkspaceHandler(openWorkspace); - }, [setLoadWorkspaceHandler]); - +const DynamicBlocksuite = ({ setCreateEditorHandler }: Props) => { useEffect(() => { const createEditorHandler: CreateEditorHandler = (page: Page) => { const editor = new EditorContainer(); diff --git a/packages/app/src/providers/app-state-provider/hooks.ts b/packages/app/src/providers/app-state-provider/hooks.ts deleted file mode 100644 index 6996bd03ef..0000000000 --- a/packages/app/src/providers/app-state-provider/hooks.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { useEffect } from 'react'; -import { useRouter } from 'next/router'; -import { useAppState } from './context'; -import { usePageHelper } from '@/hooks/use-page-helper'; -export const useLoadWorkspace = () => { - const router = useRouter(); - const { loadWorkspace, currentWorkspace, currentWorkspaceId } = useAppState(); - - const workspaceId = router.query.workspaceId as string; - - useEffect(() => { - loadWorkspace?.(workspaceId); - }, [workspaceId, loadWorkspace]); - - return currentWorkspaceId === workspaceId ? currentWorkspace : null; -}; - -export const useLoadPage = () => { - const router = useRouter(); - const { loadPage, currentPage, currentWorkspaceId } = useAppState(); - const { createPage } = usePageHelper(); - const workspace = useLoadWorkspace(); - - const pageId = router.query.pageId as string; - - useEffect(() => { - if (!workspace) { - return; - } - const page = pageId ? workspace?.getPage(pageId) : null; - if (page) { - loadPage?.(pageId); - return; - } - - const savedPageId = workspace.meta.pageMetas[0]?.id; - if (savedPageId) { - router.push(`/workspace/${currentWorkspaceId}/${savedPageId}`); - return; - } - - createPage().then(async pageId => { - if (!pageId) { - return; - } - router.push(`/workspace/${currentWorkspaceId}/${pageId}`); - }); - }, [workspace, pageId, loadPage, createPage, router, currentWorkspaceId]); - - return currentPage?.id === pageId ? currentPage : null; -}; diff --git a/packages/app/src/providers/app-state-provider/provider.tsx b/packages/app/src/providers/app-state-provider/provider.tsx index daa60ff85e..ce071d8487 100644 --- a/packages/app/src/providers/app-state-provider/provider.tsx +++ b/packages/app/src/providers/app-state-provider/provider.tsx @@ -1,4 +1,4 @@ -import { useMemo, useState, useEffect, useCallback, useRef } from 'react'; +import { useMemo, useState, useCallback, useRef } from 'react'; import type { ReactNode } from 'react'; import dynamic from 'next/dynamic'; import { getDataCenter } from '@affine/datacenter'; @@ -8,12 +8,20 @@ import type { CreateEditorHandler, LoadWorkspaceHandler, } from './context'; -import { Page, Workspace as StoreWorkspace } from '@blocksuite/store'; +import { Page } from '@blocksuite/store'; import { EditorContainer } from '@blocksuite/editor'; const DynamicBlocksuite = dynamic(() => import('./dynamic-blocksuite'), { ssr: false, }); +const loadWorkspaceHandler: LoadWorkspaceHandler = async workspaceId => { + if (workspaceId) { + const dc = await getDataCenter(); + return dc.load(workspaceId, { providerId: 'affine' }); + } else { + return null; + } +}; export const AppStateProvider = ({ children }: { children?: ReactNode }) => { const refreshWorkspacesMeta = async () => { const dc = await getDataCenter(); @@ -30,43 +38,10 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => { currentWorkspace: null, currentPage: null, editor: null, - // Synced is used to ensure that the provider has synced with the server, - // So after Synced set to true, the other state is sure to be set. - synced: false, refreshWorkspacesMeta, - workspaces: {}, + synced: true, }); - useEffect(() => { - (async () => { - const workspacesList = await Promise.all( - state.workspacesMeta.map(async ({ id }) => { - const workspace = - (await loadWorkspaceHandler?.(id, state.user)) || null; - return { id, workspace }; - }) - ); - const workspaces: Record = {}; - workspacesList.forEach(({ id, workspace }) => { - workspaces[id] = workspace; - }); - setState(state => ({ - ...state, - workspaces, - })); - })(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [state.workspacesMeta]); - - const [loadWorkspaceHandler, _setLoadWorkspaceHandler] = - useState(); - const setLoadWorkspaceHandler = useCallback( - (handler: LoadWorkspaceHandler) => { - _setLoadWorkspaceHandler(() => handler); - }, - [_setLoadWorkspaceHandler] - ); - const [createEditorHandler, _setCreateEditorHandler] = useState(); @@ -85,7 +60,7 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => { return state.currentWorkspace; } const workspace = - (await loadWorkspaceHandler?.(workspaceId, state.user)) || null; + (await loadWorkspaceHandler(workspaceId, state.user)) || null; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error @@ -103,6 +78,7 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => { })); return workspace; }; + const loadPage = useRef(() => Promise.resolve(null) ); @@ -147,17 +123,6 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => { setState(state => ({ ...state, editor })); }; - useEffect(() => { - if (!loadWorkspaceHandler) { - return; - } - setState(state => ({ - ...state, - workspacesMeta: [], - synced: true, - })); - }, [loadWorkspaceHandler]); - const context = useMemo( () => ({ ...state, @@ -172,10 +137,7 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => { return ( - + {children} ); From 955558b0d041de48db76d6b8a16eba84d3525ef9 Mon Sep 17 00:00:00 2001 From: DiamondThree Date: Thu, 5 Jan 2023 19:04:16 +0800 Subject: [PATCH 09/60] feat: mock delete --- .../src/components/workspace-modal/index.tsx | 6 +- .../general/delete/delete.tsx | 16 ++++-- .../workspace-setting/general/general.tsx | 56 +++++++++++++++---- .../workspace-setting/general/style.ts | 2 +- .../workspace-setting/workspace-setting.tsx | 1 - .../WorkspaceSelector/WorkspaceSelector.tsx | 6 +- packages/app/src/hooks/mock-data/mock.ts | 6 +- 7 files changed, 71 insertions(+), 22 deletions(-) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 479b22c99e..85fdd461ab 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -121,7 +121,11 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { confirmText: user ? 'Enable' : 'Sign in and Enable', cancelText: 'Skip', }).then(confirm => { - confirm && Login(); + if (user) { + console.log('enable cloud'); + } else { + confirm && Login(); + } }); }} > 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 7fd14ef818..0f972443d7 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 { getDataCenter } from '@affine/datacenter'; import { useRouter } from 'next/router'; import { useAppState } from '@/providers/app-state-provider'; +import { deleteWorkspace, getWorkspaces } from '@/hooks/mock-data/mock'; interface WorkspaceDeleteProps { open: boolean; @@ -31,7 +32,6 @@ export const WorkspaceDelete = ({ nextWorkSpaceId, }: WorkspaceDeleteProps) => { const [deleteStr, setDeleteStr] = useState(''); - const { refreshWorkspacesMeta } = useAppState(); const router = useRouter(); const handlerInputChange = (workspaceName: string) => { @@ -39,10 +39,16 @@ export const WorkspaceDelete = ({ }; const handleDelete = async () => { - const dc = await getDataCenter(); - await dc.apis.deleteWorkspace({ id: workspaceId }); - router.push(`/workspace/${nextWorkSpaceId}`); - refreshWorkspacesMeta(); + // const dc = await getDataCenter(); + // await dc.apis.deleteWorkspace({ id: workspaceId }); + // router.push(`/workspace/${nextWorkSpaceId}`); + deleteWorkspace(workspaceId); + const workspaceList = getWorkspaces(); + if (workspaceList.length) { + router.push(`/workspace/${workspaceList[0].id}`); + } else { + router.push(`/workspace`); + } onClose(); }; diff --git a/packages/app/src/components/workspace-setting/general/general.tsx b/packages/app/src/components/workspace-setting/general/general.tsx index fa72178869..e36bd7db52 100644 --- a/packages/app/src/components/workspace-setting/general/general.tsx +++ b/packages/app/src/components/workspace-setting/general/general.tsx @@ -6,8 +6,8 @@ import { } from './style'; import { StyledSettingH2 } from '../style'; -import { useState } from 'react'; -import { Button } from '@/ui/button'; +import { useEffect, useState } from 'react'; +import { Button, TextButton } from '@/ui/button'; import Input from '@/ui/input'; import { getDataCenter } from '@affine/datacenter'; import { useAppState } from '@/providers/app-state-provider'; @@ -16,7 +16,12 @@ import { Workspace as StoreWorkspace } from '@blocksuite/store'; import { debounce } from '@/utils'; import { WorkspaceLeave } from './leave'; import { Upload } from '@/components/file-upload'; -import { getUserInfo, Workspace } from '@/hooks/mock-data/mock'; +import { + getUserInfo, + updateWorkspaceMeta, + User, + Workspace, +} from '@/hooks/mock-data/mock'; export const GeneralPage = ({ workspace, @@ -30,8 +35,13 @@ export const GeneralPage = ({ workspaces, refreshWorkspacesMeta, } = useAppState(); - // const user = getUserInfo(); + useEffect(() => { + setWorkspaceName(workspace.name); + const user = getUserInfo(); + setUserInfo(user); + }, []); const [showDelete, setShowDelete] = useState(false); + const [userInfo, setUserInfo] = useState(); const [showLeave, setShowLeave] = useState(false); const [uploading, setUploading] = useState(false); const [workspaceName, setWorkspaceName] = useState(''); @@ -63,6 +73,9 @@ export const GeneralPage = ({ const handleCloseLeave = () => { setShowLeave(false); }; + const handleUpdateWorkspaceName = () => { + updateWorkspaceMeta(workspace.id, { name: workspaceName }); + }; const fileChange = async (file: File) => { setUploading(true); @@ -106,7 +119,7 @@ export const GeneralPage = ({ ) : null} */} {/* */} - Workspace Name + Workspace Name + { + handleUpdateWorkspaceName(); + }} + style={{ marginLeft: '10px' }} + > + ✔️ + - Workspace Owner + {userInfo ? ( +
    + Workspace Owner + + + +
    + ) : ( + '' + )} + + Workspace Type - + {workspace.type} {isOwner ? ( diff --git a/packages/app/src/components/workspace-setting/general/style.ts b/packages/app/src/components/workspace-setting/general/style.ts index e4b505f228..739ec24aec 100644 --- a/packages/app/src/components/workspace-setting/general/style.ts +++ b/packages/app/src/components/workspace-setting/general/style.ts @@ -9,7 +9,7 @@ export const StyledSettingInputContainer = styled('div')(() => { export const StyledDeleteButtonContainer = styled('div')(() => { return { - marginTop: '154px', + marginTop: '30px', }; }); diff --git a/packages/app/src/components/workspace-setting/workspace-setting.tsx b/packages/app/src/components/workspace-setting/workspace-setting.tsx index f1a9256dbf..66850cabc7 100644 --- a/packages/app/src/components/workspace-setting/workspace-setting.tsx +++ b/packages/app/src/components/workspace-setting/workspace-setting.tsx @@ -116,7 +116,6 @@ export const WorkspaceSetting = ({ }; const workspace = getActiveWorkspace(); - console.log('workspace: ', workspace); const handleClickClose = () => { onClose && onClose(); }; 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 22013ba674..aa6d532fa3 100644 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx +++ b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx @@ -2,7 +2,7 @@ import { Avatar, WorkspaceName, SelectorWrapper } from './styles'; import { useEffect, useState } from 'react'; import { AffineIcon } from '../icons/icons'; import { WorkspaceModal } from '@/components/workspace-modal'; -import { getActiveWorkspace } from '@/hooks/mock-data/mock'; +import { getActiveWorkspace, getWorkspaces } from '@/hooks/mock-data/mock'; export const WorkspaceSelector = () => { const [workspaceListShow, setWorkspaceListShow] = useState(false); @@ -10,6 +10,10 @@ export const WorkspaceSelector = () => { useEffect(() => { getWorkspace(); }, [workspaceListShow]); + const workspaceList = getWorkspaces(); + if (workspaceList.length === 0) { + setWorkspaceListShow(true); + } const getWorkspace = () => { const workspace = getActiveWorkspace(); setWorkSpace(workspace); diff --git a/packages/app/src/hooks/mock-data/mock.ts b/packages/app/src/hooks/mock-data/mock.ts index 6f5f5f289c..c7180fce58 100644 --- a/packages/app/src/hooks/mock-data/mock.ts +++ b/packages/app/src/hooks/mock-data/mock.ts @@ -17,7 +17,7 @@ export interface User { export function updateWorkspaceMeta( workspaceId: string, - workspaceData: Workspace + workspaceData: { name?: string; avatar?: string } ) { const workspacesMeta = getWorkspaces(); const newWorkspacesMeta = workspacesMeta.map((workspace: Workspace) => { @@ -29,6 +29,10 @@ export function updateWorkspaceMeta( return workspace; }); localStorage.setItem('affine-workspace', JSON.stringify(newWorkspacesMeta)); + const activeWorkspace = getActiveWorkspace(); + workspaceData.name && (activeWorkspace.name = workspaceData.name); + workspaceData.avatar && (activeWorkspace.avatar = workspaceData.avatar); + setActiveWorkspace(activeWorkspace); } export function createWorkspace(workspaceName: string) { const workspaceData = { From 2773b3e489a53db121786b8b577ed5a9e4eddd62 Mon Sep 17 00:00:00 2001 From: DiamondThree Date: Thu, 5 Jan 2023 19:07:14 +0800 Subject: [PATCH 10/60] fix:delete bugs --- .../WorkspaceSelector/WorkspaceSelector.tsx | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) 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 aa6d532fa3..669b927a9e 100644 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx +++ b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx @@ -8,13 +8,16 @@ export const WorkspaceSelector = () => { const [workspaceListShow, setWorkspaceListShow] = useState(false); const [workspace, setWorkSpace] = useState(getActiveWorkspace()); useEffect(() => { - getWorkspace(); + setWorkspace(); }, [workspaceListShow]); - const workspaceList = getWorkspaces(); - if (workspaceList.length === 0) { - setWorkspaceListShow(true); - } - const getWorkspace = () => { + useEffect(() => { + const workspaceList = getWorkspaces(); + if (workspaceList.length === 0) { + setWorkspaceListShow(true); + } + }); + + const setWorkspace = () => { const workspace = getActiveWorkspace(); setWorkSpace(workspace); }; @@ -42,7 +45,7 @@ export const WorkspaceSelector = () => { open={workspaceListShow} onClose={() => { setWorkspaceListShow(false); - getWorkspace(); + setWorkspace(); }} > From 9424cfb86521db6f25b399fd03489b856b3ccb2d Mon Sep 17 00:00:00 2001 From: QiShaoXuan Date: Thu, 5 Jan 2023 19:14:41 +0800 Subject: [PATCH 11/60] feat: add useTemporaryHelper --- .../app/src/hooks/use-temporary-helper.ts | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 packages/app/src/hooks/use-temporary-helper.ts diff --git a/packages/app/src/hooks/use-temporary-helper.ts b/packages/app/src/hooks/use-temporary-helper.ts new file mode 100644 index 0000000000..8de0ef88a0 --- /dev/null +++ b/packages/app/src/hooks/use-temporary-helper.ts @@ -0,0 +1,115 @@ +import { useEffect, useState } from 'react'; +import { getWorkspaces, Workspace, User } from './mock-data/mock'; + +export function getActiveWorkspace(): Workspace { + return JSON.parse(localStorage.getItem('affine-active-workspace') ?? '{}'); +} + +export const useTemporaryHelper = () => { + const [workspaceMetaList, setWorkspaceMetaList] = useState( + getWorkspaces() + ); + const [currentWorkspace, setCurrentWorkspace] = useState( + JSON.parse(localStorage.getItem('affine-active-workspace') ?? '{}') + ); + const [user, setUser] = useState(null); + + return { + updateWorkspaceMeta: (workspaceId: string, workspaceData: Workspace) => { + const workspacesMeta = getWorkspaces(); + const newWorkspacesMeta = workspacesMeta.map((workspace: Workspace) => { + if (workspace.id === workspaceId) { + workspaceData.name && (workspace.name = workspaceData.name); + workspaceData.avatar && (workspace.avatar = workspaceData.avatar); + return workspaceData; + } + return workspace; + }); + localStorage.setItem( + 'affine-workspace', + JSON.stringify(newWorkspacesMeta) + ); + setWorkspaceMetaList(newWorkspacesMeta); + if (workspaceId === currentWorkspace?.id) { + setCurrentWorkspace( + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + newWorkspacesMeta.find(v => v.id === currentWorkspace.id) + ); + } + }, + createWorkspace: (workspaceName: string) => { + const workspaceData = { + name: workspaceName, + id: 'workspace-' + Date.now(), + isPublish: false, + isLocal: true, + avatar: '', + type: 'local', + } as Workspace; + const workspacesMeta = getWorkspaces(); + workspacesMeta.push(workspaceData); + localStorage.setItem('affine-workspace', JSON.stringify(workspacesMeta)); + setWorkspaceMetaList(workspacesMeta); + }, + deleteWorkspace: (workspaceId: string) => { + const workspacesMeta = getWorkspaces(); + const newWorkspacesMeta = workspacesMeta.filter(() => { + return workspaceId !== workspaceId; + }); + localStorage.setItem( + 'affine-workspace', + JSON.stringify(newWorkspacesMeta) + ); + setWorkspaceMetaList(workspacesMeta); + }, + + setWorkspacePublish: (id: string, isPublish: boolean) => { + const workspacesMeta = getWorkspaces(); + const newWorkspacesMeta = workspacesMeta.map((workspace: Workspace) => { + if (workspace.id === id) { + workspace.isPublish = isPublish; + } + return workspace; + }); + localStorage.setItem( + 'affine-workspace', + JSON.stringify(newWorkspacesMeta) + ); + setWorkspaceMetaList(workspacesMeta); + }, + setActiveWorkspace(workspaceData: Workspace) { + localStorage.setItem( + 'affine-active-workspace', + JSON.stringify(workspaceData) + ); + setCurrentWorkspace(workspaceData); + }, + + login: () => { + const userInfo = { + name: 'Diamond', + id: 'ttt', + email: 'diamond.shx@gmail.com', + avatar: 'string', + }; + localStorage.setItem('affine-user', JSON.stringify(userInfo)); + + setUser(userInfo); + }, + getUserInfo: () => { + return user; + }, + + SignOut(): void { + localStorage.removeItem('affine-user'); + setUser(null); + }, + + workspaceMetaList, + currentWorkspace, + user, + }; +}; + +export default useTemporaryHelper; From b6542b02453a80f5a2bcb1ba6ec6eef5c91888b8 Mon Sep 17 00:00:00 2001 From: DiamondThree Date: Thu, 5 Jan 2023 19:21:35 +0800 Subject: [PATCH 12/60] feat: member init --- .../general/delete/delete.tsx | 2 - .../workspace-setting/general/general.tsx | 37 ++------------- .../workspace-setting/general/leave/leave.tsx | 4 +- .../workspace-setting/workspace-setting.tsx | 46 +++++++++++-------- .../WorkspaceSelector/WorkspaceSelector.tsx | 1 - 5 files changed, 32 insertions(+), 58 deletions(-) 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 0f972443d7..f5b9e1e86c 100644 --- a/packages/app/src/components/workspace-setting/general/delete/delete.tsx +++ b/packages/app/src/components/workspace-setting/general/delete/delete.tsx @@ -21,7 +21,6 @@ interface WorkspaceDeleteProps { onClose: () => void; workspaceName: string; workspaceId: string; - nextWorkSpaceId: string; } export const WorkspaceDelete = ({ @@ -29,7 +28,6 @@ export const WorkspaceDelete = ({ onClose, workspaceId, workspaceName, - nextWorkSpaceId, }: WorkspaceDeleteProps) => { const [deleteStr, setDeleteStr] = useState(''); const router = useRouter(); diff --git a/packages/app/src/components/workspace-setting/general/general.tsx b/packages/app/src/components/workspace-setting/general/general.tsx index e36bd7db52..9142b3854f 100644 --- a/packages/app/src/components/workspace-setting/general/general.tsx +++ b/packages/app/src/components/workspace-setting/general/general.tsx @@ -12,7 +12,6 @@ import Input from '@/ui/input'; import { getDataCenter } from '@affine/datacenter'; import { useAppState } from '@/providers/app-state-provider'; import { WorkspaceDelete } from './delete'; -import { Workspace as StoreWorkspace } from '@blocksuite/store'; import { debounce } from '@/utils'; import { WorkspaceLeave } from './leave'; import { Upload } from '@/components/file-upload'; @@ -23,18 +22,8 @@ import { Workspace, } from '@/hooks/mock-data/mock'; -export const GeneralPage = ({ - workspace, -}: { - workspace: Workspace; - workspaces: Record; -}) => { - const { - currentWorkspace, - workspacesMeta, - workspaces, - refreshWorkspacesMeta, - } = useAppState(); +export const GeneralPage = ({ workspace }: { workspace: Workspace }) => { + const { currentWorkspace, refreshWorkspacesMeta } = useAppState(); useEffect(() => { setWorkspaceName(workspace.name); const user = getUserInfo(); @@ -53,13 +42,6 @@ export const GeneralPage = ({ const handleChangeWorkSpaceName = (newName: string) => { setWorkspaceName(newName); }; - const currentWorkspaceIndex = workspacesMeta.findIndex( - meta => meta.id === workspace.id - ); - const nextWorkSpaceId = - currentWorkspaceIndex === workspacesMeta.length - 1 - ? workspacesMeta[currentWorkspaceIndex - 1]?.id - : workspacesMeta[currentWorkspaceIndex + 1]?.id; const handleClickDelete = () => { setShowDelete(true); }; @@ -87,7 +69,7 @@ export const GeneralPage = ({ }); if (blobId) { currentWorkspace?.meta.setAvatar(blobId); - workspaces[workspace.id]?.meta.setAvatar(blobId); + // workspaces[workspace.id]?.meta.setAvatar(blobId); setUploading(false); debouncedRefreshWorkspacesMeta(); } @@ -97,15 +79,8 @@ export const GeneralPage = ({
    Workspace Avatar - - {workspaces[workspace.id]?.meta.name[0]} + + AFFiNE ) : ( @@ -182,7 +156,6 @@ export const GeneralPage = ({ onClose={handleCloseLeave} workspaceName={workspaceName} workspaceId={workspace.id} - nextWorkSpaceId={nextWorkSpaceId} /> )} 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 3c2cf8ce22..79cadd6edb 100644 --- a/packages/app/src/components/workspace-setting/general/leave/leave.tsx +++ b/packages/app/src/components/workspace-setting/general/leave/leave.tsx @@ -16,13 +16,11 @@ interface WorkspaceDeleteProps { onClose: () => void; workspaceName: string; workspaceId: string; - nextWorkSpaceId: string; } export const WorkspaceLeave = ({ open, onClose, - nextWorkSpaceId, workspaceId, }: WorkspaceDeleteProps) => { const router = useRouter(); @@ -30,7 +28,7 @@ export const WorkspaceLeave = ({ const handleLeave = async () => { const dc = await getDataCenter(); await dc.apis.leaveWorkspace({ id: workspaceId }); - router.push(`/workspace/${nextWorkSpaceId}`); + // router.push(`/workspace/${nextWorkSpaceId}`); refreshWorkspacesMeta(); onClose(); }; diff --git a/packages/app/src/components/workspace-setting/workspace-setting.tsx b/packages/app/src/components/workspace-setting/workspace-setting.tsx index 66850cabc7..7d7855aaca 100644 --- a/packages/app/src/components/workspace-setting/workspace-setting.tsx +++ b/packages/app/src/components/workspace-setting/workspace-setting.tsx @@ -45,7 +45,9 @@ import { useAppState } from '@/providers/app-state-provider'; import { GeneralPage } from './general'; import { getActiveWorkspace, + getUserInfo, setWorkspacePublish, + User, Workspace, } from '@/hooks/mock-data/mock'; @@ -109,7 +111,7 @@ export const WorkspaceSetting = ({ isShow, onClose, }: WorkspaceSettingProps) => { - const { workspaces } = useAppState(); + // const { workspaces } = useAppState(); const [activeTab, setActiveTab] = useState(ActiveTab.general); const handleTabChange = (tab: ActiveTab) => { setActiveTab(tab); @@ -143,7 +145,7 @@ export const WorkspaceSetting = ({ ) : null} {activeTab === ActiveTab.general && ( - + )} {activeTab === ActiveTab.members && workspace && ( @@ -160,23 +162,27 @@ export const WorkspaceSetting = ({ const MembersPage = ({ workspace }: { workspace: Workspace }) => { const [isInviteModalShow, setIsInviteModalShow] = useState(false); const [members, setMembers] = useState([]); - const refreshMembers = useCallback(() => { - getDataCenter() - .then(dc => - dc.apis.getWorkspaceMembers({ - id: workspace.id, - }) - ) - .then(data => { - setMembers(data); - }) - .catch(err => { - console.log(err); - }); - }, [workspace.id]); + const [userInfo, setUserInfo] = useState(); + // const refreshMembers = useCallback(() => { + // getDataCenter() + // .then(dc => + // dc.apis.getWorkspaceMembers({ + // id: workspace.id, + // }) + // ) + // .then(data => { + // setMembers(data); + // }) + // .catch(err => { + // console.log(err); + // }); + // }, [workspace.id]); + useEffect(() => { - refreshMembers(); - }, [refreshMembers]); + const user = getUserInfo(); + user && setUserInfo(user); + // refreshMembers(); + }, []); return (
    @@ -240,7 +246,7 @@ const MembersPage = ({ workspace }: { workspace: Workspace }) => { .then(() => { // console.log('data: ', data); toast('Moved to Trash'); - refreshMembers(); + // refreshMembers(); }); // }); }} @@ -280,7 +286,7 @@ const MembersPage = ({ workspace }: { workspace: Workspace }) => { setIsInviteModalShow(false); }} onInviteSuccess={() => { - refreshMembers(); + // refreshMembers(); }} workspaceId={workspace.id} open={isInviteModalShow} 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 669b927a9e..5ccc9a446b 100644 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx +++ b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx @@ -16,7 +16,6 @@ export const WorkspaceSelector = () => { setWorkspaceListShow(true); } }); - const setWorkspace = () => { const workspace = getActiveWorkspace(); setWorkSpace(workspace); From e3c1e6a5da56bd4a543d37b30f1f2e0c838e0291 Mon Sep 17 00:00:00 2001 From: DiamondThree Date: Thu, 5 Jan 2023 19:30:16 +0800 Subject: [PATCH 13/60] fix:member init --- .../workspace-setting/workspace-setting.tsx | 247 ++++++++++-------- 1 file changed, 140 insertions(+), 107 deletions(-) diff --git a/packages/app/src/components/workspace-setting/workspace-setting.tsx b/packages/app/src/components/workspace-setting/workspace-setting.tsx index 7d7855aaca..a905134f76 100644 --- a/packages/app/src/components/workspace-setting/workspace-setting.tsx +++ b/packages/app/src/components/workspace-setting/workspace-setting.tsx @@ -46,6 +46,7 @@ import { GeneralPage } from './general'; import { getActiveWorkspace, getUserInfo, + Login, setWorkspacePublish, User, Workspace, @@ -179,119 +180,151 @@ const MembersPage = ({ workspace }: { workspace: Workspace }) => { // }, [workspace.id]); useEffect(() => { - const user = getUserInfo(); - user && setUserInfo(user); + setUser(); // refreshMembers(); }, []); + const setUser = () => { + const user = getUserInfo(); + user && setUserInfo(user); + }; + return (
    - - - Users({members.length}) - - Access level - - - {members.length === 0 && ( - - )} - {members.length ? ( - members.map(member => { - return ( - - - {member.user.type === 'Registered' ? ( - - ) : ( - - - - )} + {userInfo ? ( + <> + + + Users({members.length}) + + Access level + + + {members.length === 0 && ( + + )} + {members.length ? ( + members.map(member => { + return ( + + + {member.user.type === 'Registered' ? ( + + ) : ( + + + + )} - - {member.user.type === 'Registered' ? ( - {member.user.name} - ) : ( - <> - )} - {member.user.email} - - - - {member.accepted - ? member.type !== 99 - ? 'Member' - : 'Workspace Owner' - : 'Pending'} - - - - { - // confirm({ - // title: 'Delete Member?', - // content: `will delete member`, - // confirmText: 'Delete', - // confirmType: 'danger', - // }).then(confirm => { - getDataCenter() - .then(dc => - dc.apis.removeMember({ - permissionId: member.id, - }) - ) - .then(() => { - // console.log('data: ', data); - toast('Moved to Trash'); - // refreshMembers(); - }); - // }); - }} - icon={} - > - Delete - - - } - placement="bottom-end" - disablePortal={true} - > - - - - - - - ); - }) - ) : ( - <> - )} - - - - { - setIsInviteModalShow(false); - }} - onInviteSuccess={() => { - // refreshMembers(); - }} - workspaceId={workspace.id} - open={isInviteModalShow} - > - + + {member.user.type === 'Registered' ? ( + + {member.user.name} + + ) : ( + <> + )} + + {member.user.email} + + + + + {member.accepted + ? member.type !== 99 + ? 'Member' + : 'Workspace Owner' + : 'Pending'} + + + + { + // confirm({ + // title: 'Delete Member?', + // content: `will delete member`, + // confirmText: 'Delete', + // confirmType: 'danger', + // }).then(confirm => { + getDataCenter() + .then(dc => + dc.apis.removeMember({ + permissionId: member.id, + }) + ) + .then(() => { + // console.log('data: ', data); + toast('Moved to Trash'); + // refreshMembers(); + }); + // }); + }} + icon={} + > + Delete + + + } + placement="bottom-end" + disablePortal={true} + > + + + + + + + ); + }) + ) : ( + <> + )} + + + + { + setIsInviteModalShow(false); + }} + onInviteSuccess={() => { + // refreshMembers(); + }} + workspaceId={workspace.id} + open={isInviteModalShow} + > + + + ) : ( + <> +
    + Collaborating with other members requires AFFiNE Cloud service. +
    +
    + +
    + + )}
    ); }; From c0c167fea870a20c9f3ac1d7eff841b4f8c95b15 Mon Sep 17 00:00:00 2001 From: DiamondThree Date: Thu, 5 Jan 2023 22:32:58 +0800 Subject: [PATCH 14/60] feat: mock invite --- .../src/components/invite-members/index.tsx | 68 +++++++++++-------- .../workspace-setting/workspace-setting.tsx | 63 ++++++++--------- .../SelectorPopperContent.tsx | 11 +-- packages/app/src/hooks/mock-data/mock.ts | 14 ++++ 4 files changed, 87 insertions(+), 69 deletions(-) diff --git a/packages/app/src/components/invite-members/index.tsx b/packages/app/src/components/invite-members/index.tsx index f06674cb6b..44f4f6aaeb 100644 --- a/packages/app/src/components/invite-members/index.tsx +++ b/packages/app/src/components/invite-members/index.tsx @@ -6,6 +6,7 @@ import Input from '@/ui/input'; import { useState } from 'react'; import { getDataCenter } from '@affine/datacenter'; import { Avatar } from '@mui/material'; +import { setMember } from '@/hooks/mock-data/mock'; interface LoginModalProps { open: boolean; onClose: () => void; @@ -54,29 +55,34 @@ export const InviteMembers = ({ // eslint-disable-next-line @typescript-eslint/no-explicit-any const [userData, setUserData] = useState({}); const inputChange = (value: string) => { - setEmail(value); setShowMember(true); if (gmailReg.test(value)) { + setEmail(value); setShowTip(false); - debounce( - () => { - getDataCenter() - .then(dc => - dc.apis.getUserByEmail({ - email: value, - workspace_id: workspaceId, - }) - ) - .then(data => { - if (data?.name) { - setUserData(data); - setShowTip(false); - } - }); - }, - 300, - true - )(); + setUserData({ + name: 'wxl', + avatar: 'https://avatars.githubusercontent.com/u/20501502?v=4', + email: value, + }); + // debounce( + // () => { + // getDataCenter() + // .then(dc => + // dc.apis.getUserByEmail({ + // email: value, + // workspace_id: workspaceId, + // }) + // ) + // .then(data => { + // if (data?.name) { + // setUserData(data); + // setShowTip(false); + // } + // }); + // }, + // 300, + // true + // )(); } else { setShowTip(true); } @@ -134,16 +140,18 @@ export const InviteMembers = ({ shape="circle" type="primary" onClick={() => { - getDataCenter() - .then(dc => dc.apis.inviteMember({ id: workspaceId, email })) - .then(() => { - onClose(); - onInviteSuccess && onInviteSuccess(); - }) - .catch(err => { - // toast('Invite failed'); - console.log(err); - }); + setMember(workspaceId, userData); + onInviteSuccess(); + // getDataCenter() + // .then(dc => dc.apis.inviteMember({ id: workspaceId, email })) + // .then(() => { + // onClose(); + // onInviteSuccess && onInviteSuccess(); + // }) + // .catch(err => { + // // toast('Invite failed'); + // console.log(err); + // }); }} > Invite diff --git a/packages/app/src/components/workspace-setting/workspace-setting.tsx b/packages/app/src/components/workspace-setting/workspace-setting.tsx index a905134f76..f22a736739 100644 --- a/packages/app/src/components/workspace-setting/workspace-setting.tsx +++ b/packages/app/src/components/workspace-setting/workspace-setting.tsx @@ -44,7 +44,9 @@ import { Empty } from '@/ui/empty'; import { useAppState } from '@/providers/app-state-provider'; import { GeneralPage } from './general'; import { + deleteMember, getActiveWorkspace, + getMembers, getUserInfo, Login, setWorkspacePublish, @@ -162,7 +164,7 @@ export const WorkspaceSetting = ({ const MembersPage = ({ workspace }: { workspace: Workspace }) => { const [isInviteModalShow, setIsInviteModalShow] = useState(false); - const [members, setMembers] = useState([]); + const [members, setMembers] = useState([]); const [userInfo, setUserInfo] = useState(); // const refreshMembers = useCallback(() => { // getDataCenter() @@ -181,6 +183,7 @@ const MembersPage = ({ workspace }: { workspace: Workspace }) => { useEffect(() => { setUser(); + setMembersList(); // refreshMembers(); }, []); @@ -188,6 +191,10 @@ const MembersPage = ({ workspace }: { workspace: Workspace }) => { const user = getUserInfo(); user && setUserInfo(user); }; + const setMembersList = () => { + const members = getMembers(workspace.id); + members && setMembers(members); + }; return (
    @@ -212,33 +219,23 @@ const MembersPage = ({ workspace }: { workspace: Workspace }) => { return ( - {member.user.type === 'Registered' ? ( - - ) : ( - - - - )} + + + - {member.user.type === 'Registered' ? ( - - {member.user.name} - - ) : ( - <> - )} - - {member.user.email} - + {member.name} + + {member.email} - {member.accepted + {/* {member.accepted ? member.type !== 99 ? 'Member' : 'Workspace Owner' - : 'Pending'} + : 'Pending'} */} + Pending { <> { + deleteMember(workspace.id, 0); + setMembersList(); // confirm({ // title: 'Delete Member?', // content: `will delete member`, // confirmText: 'Delete', // confirmType: 'danger', // }).then(confirm => { - getDataCenter() - .then(dc => - dc.apis.removeMember({ - permissionId: member.id, - }) - ) - .then(() => { - // console.log('data: ', data); - toast('Moved to Trash'); - // refreshMembers(); - }); + // getDataCenter() + // .then(dc => + // dc.apis.removeMember({ + // permissionId: member.id, + // }) + // ) + // .then(() => { + // // console.log('data: ', data); + // toast('Moved to Trash'); + // // refreshMembers(); + // }); // }); }} icon={} @@ -301,6 +300,8 @@ const MembersPage = ({ workspace }: { workspace: Workspace }) => { setIsInviteModalShow(false); }} onInviteSuccess={() => { + setMembersList(); + setIsInviteModalShow(false); // refreshMembers(); }} workspaceId={workspace.id} diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx index 494fdd495d..db6d4d34f1 100644 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx +++ b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx @@ -27,8 +27,7 @@ type SelectorPopperContentProps = { export const SelectorPopperContent = ({ isShow, }: SelectorPopperContentProps) => { - const { user, workspacesMeta, workspaces, refreshWorkspacesMeta } = - useAppState(); + const { user, workspacesMeta, refreshWorkspacesMeta } = useAppState(); const [settingWorkspaceId, setSettingWorkspaceId] = useState( null ); @@ -115,13 +114,9 @@ export const SelectorPopperContent = ({ type={workspace.type} key={workspace.id} id={workspace.id} - icon={ - (workspaces[workspace.id]?.meta.avatar && - `/api/blob/${workspaces[workspace.id]?.meta.avatar}`) || - `loading...` - } + icon={`loading...`} onClickSetting={handleClickSettingWorkspace} - name={workspaces[workspace.id]?.meta.name || `loading...`} + name={`loading...`} memberCount={workSpaceDetails[workspace.id]?.memberCount || 1} /> ) : null; diff --git a/packages/app/src/hooks/mock-data/mock.ts b/packages/app/src/hooks/mock-data/mock.ts index c7180fce58..24e1427a05 100644 --- a/packages/app/src/hooks/mock-data/mock.ts +++ b/packages/app/src/hooks/mock-data/mock.ts @@ -69,6 +69,20 @@ export function getMembers(id: string): User[] { return memberMap[id] || []; } +export function setMember(workspaceId: string, member: User) { + const memberMap = JSON.parse(localStorage.getItem('affine-member') ?? '{}'); + memberMap[workspaceId] = memberMap[workspaceId] || []; + memberMap[workspaceId].push(member); + localStorage.setItem('affine-member', JSON.stringify(memberMap)); +} + +export function deleteMember(workspaceId: string, index: number) { + const memberMap = JSON.parse(localStorage.getItem('affine-member') ?? '{}'); + const memberList = memberMap[workspaceId]; + memberList.splice(index, 1); + memberMap[workspaceId] = memberList; + localStorage.setItem('affine-member', JSON.stringify(memberMap)); +} export function leaveWorkspace(id: string) { return true; } From dd149474d9432c6e868f12b77079f5c6946f33c7 Mon Sep 17 00:00:00 2001 From: DiamondThree Date: Thu, 5 Jan 2023 23:33:13 +0800 Subject: [PATCH 15/60] feat: mock sync --- .../src/components/workspace-modal/index.tsx | 5 +- .../workspace-setting/workspace-setting.tsx | 97 ++++++++++++++++++- packages/app/src/hooks/mock-data/mock.ts | 13 ++- 3 files changed, 110 insertions(+), 5 deletions(-) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index d562538ffc..3ee9848f2d 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -37,6 +37,7 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { const setList = () => { const data = getWorkspaces(); + console.log('data: ', data); setWorkspaceList(data); }; const setUserInfo = () => { @@ -62,14 +63,14 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => {
    - {workspaceList.map(item => { + {workspaceList.map((item, index) => { return ( { setActiveWorkspace(item); onClose(); }} - key={item.id} + key={index} > { General + + { + onTabChange && onTabChange(ActiveTab.sync); + }} + > + + + + Sync + + { @@ -150,6 +166,7 @@ export const WorkspaceSetting = ({ {activeTab === ActiveTab.general && ( )} + {activeTab === ActiveTab.sync && } {activeTab === ActiveTab.members && workspace && ( )} @@ -215,9 +232,9 @@ const MembersPage = ({ workspace }: { workspace: Workspace }) => { > )} {members.length ? ( - members.map(member => { + members.map((member, index) => { return ( - + @@ -395,3 +412,79 @@ const PublishPage = ({ workspace }: { workspace: Workspace }) => { ); }; +const SyncPage = ({ workspace }: { workspace: Workspace }) => { + const [workspaceType, setWorkspaceType] = useState('local'); + useEffect(() => { + setType(); + }); + const setType = () => { + const ACTIVEworkspace = getActiveWorkspace(); + console.log('ACTIVEworkspace: ', ACTIVEworkspace); + ACTIVEworkspace && setWorkspaceType(ACTIVEworkspace.type); + }; + return ( +
    + + {workspaceType === 'local' ? ( + <> + + {workspace.name} 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 Cloud Workspace. All data will be synchronized + and saved to the AFFiNE account +
    + + { + deleteMember(workspace.id, 0); + }} + icon={} + > + Download core data to device + + { + deleteMember(workspace.id, 0); + }} + icon={} + > + Download all data to device + + + } + placement="bottom-end" + disablePortal={true} + > + + +
    +
    + )} +
    +
    + ); +}; diff --git a/packages/app/src/hooks/mock-data/mock.ts b/packages/app/src/hooks/mock-data/mock.ts index 24e1427a05..510b6dca01 100644 --- a/packages/app/src/hooks/mock-data/mock.ts +++ b/packages/app/src/hooks/mock-data/mock.ts @@ -1,3 +1,5 @@ +import { type } from 'os'; + export interface Workspace { name: string; // 名称 id: string; //唯一标识 @@ -17,13 +19,19 @@ export interface User { export function updateWorkspaceMeta( workspaceId: string, - workspaceData: { name?: string; avatar?: string } + workspaceData: { + name?: string; + avatar?: string; + workspaceType?: 'local' | 'cloud' | 'join'; + } ) { const workspacesMeta = getWorkspaces(); const newWorkspacesMeta = workspacesMeta.map((workspace: Workspace) => { if (workspace.id === workspaceId) { workspaceData.name && (workspace.name = workspaceData.name); workspaceData.avatar && (workspace.avatar = workspaceData.avatar); + workspaceData.workspaceType && + (workspace.type = workspaceData.workspaceType); return workspaceData; } return workspace; @@ -32,6 +40,8 @@ export function updateWorkspaceMeta( const activeWorkspace = getActiveWorkspace(); workspaceData.name && (activeWorkspace.name = workspaceData.name); workspaceData.avatar && (activeWorkspace.avatar = workspaceData.avatar); + workspaceData.workspaceType && + (activeWorkspace.type = workspaceData.workspaceType); setActiveWorkspace(activeWorkspace); } export function createWorkspace(workspaceName: string) { @@ -122,6 +132,7 @@ export function getActiveWorkspace(): Workspace { } export function setActiveWorkspace(workspaceData: Workspace) { + console.log('workspaceData: ', workspaceData); localStorage.setItem( 'affine-active-workspace', JSON.stringify(workspaceData) From 8ebed0b92efea329ed9254ba8b5abd35d7a3fc7a Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Fri, 6 Jan 2023 00:48:09 +0800 Subject: [PATCH 16/60] feat: more fluent --- .../src/components/create-workspace/index.tsx | 9 ++++--- .../src/components/workspace-modal/index.tsx | 27 +++++++++++++++---- packages/app/src/hooks/mock-data/mock.ts | 6 ++++- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/packages/app/src/components/create-workspace/index.tsx b/packages/app/src/components/create-workspace/index.tsx index 9059d9bec1..2faeb60e97 100644 --- a/packages/app/src/components/create-workspace/index.tsx +++ b/packages/app/src/components/create-workspace/index.tsx @@ -4,16 +4,19 @@ import { Button } from '@/ui/button'; import { useState } from 'react'; import { createWorkspace } from '@/hooks/mock-data/mock'; import Input from '@/ui/input'; +interface ICloseParams { + workspaceId?: string; +} interface ModalProps { open: boolean; - onClose: () => void; + onClose: (opts?: ICloseParams) => void; } export const CreateWorkspaceModal = ({ open, onClose }: ModalProps) => { const [workspaceName, setWorkspaceName] = useState(''); const handleCreateWorkspace = () => { - createWorkspace(workspaceName); - onClose(); + const { workspaceId } = createWorkspace(workspaceName); + onClose({ workspaceId }); }; return (
    diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 3ee9848f2d..c2f0581516 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -10,6 +10,7 @@ import { User, getUserInfo, SignOut, + updateWorkspaceMeta, } from '@/hooks/mock-data/mock'; import { CreateWorkspaceModal } from '../create-workspace'; import { @@ -102,13 +103,23 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { fill="#6880FF" /> - {item.name} + + + {item.name || ' undefined'} + - - {item.type === 'local' && ( + + {(item.workspaceType === 'local' || + !item.workspaceType) && ( )} - {item.type === 'cloud' && ( + {item.workspaceType === 'cloud' && ( )} {item.isPublish && } @@ -165,7 +176,7 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { { + onClose={({ workspaceId }) => { setCreateWorkspaceOpen(false); setList(); onClose(); @@ -177,6 +188,12 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { }).then(confirm => { if (user) { console.log('enable cloud'); + workspaceId && + setTimeout(() => { + updateWorkspaceMeta(workspaceId as string, { + workspaceType: 'cloud', + }); + }, 1000); } else { confirm && Login(); } diff --git a/packages/app/src/hooks/mock-data/mock.ts b/packages/app/src/hooks/mock-data/mock.ts index 510b6dca01..1cb4a8cf89 100644 --- a/packages/app/src/hooks/mock-data/mock.ts +++ b/packages/app/src/hooks/mock-data/mock.ts @@ -6,6 +6,7 @@ export interface Workspace { isPublish?: boolean; // 是否公开 isLocal?: boolean; // 是否全部数据都在本地 avatar?: string; // 封面 + workspaceType: 'local' | 'cloud' | 'join'; // cloud: 云端(本次暂不支持),local: 本地,join : 加入别人的 type: 'local' | 'cloud' | 'join'; // cloud: 云端(本次暂不支持),local: 本地,join : 加入别人的 workspaceOwner?: User; // 本地工作空间的拥有者 } @@ -40,14 +41,16 @@ export function updateWorkspaceMeta( const activeWorkspace = getActiveWorkspace(); workspaceData.name && (activeWorkspace.name = workspaceData.name); workspaceData.avatar && (activeWorkspace.avatar = workspaceData.avatar); + workspaceData.workspaceType && (activeWorkspace.type = workspaceData.workspaceType); setActiveWorkspace(activeWorkspace); } export function createWorkspace(workspaceName: string) { + const workspaceId = 'workspace-' + Date.now(); const workspaceData = { name: workspaceName, - id: 'workspace-' + Date.now(), + id: workspaceId, isPublish: false, isLocal: true, avatar: '', @@ -57,6 +60,7 @@ export function createWorkspace(workspaceName: string) { workspacesMeta.push(workspaceData); localStorage.setItem('affine-workspace', JSON.stringify(workspacesMeta)); setActiveWorkspace(workspaceData); + return { workspaceId }; } export function getWorkspaces(): Workspace[] { From 76f75faf6c675a9077fe1dc3bc3538784c0ae703 Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Fri, 6 Jan 2023 00:49:04 +0800 Subject: [PATCH 17/60] feat: more fluent --- packages/app/src/components/workspace-modal/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index c2f0581516..1f332ce904 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -105,7 +105,7 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { - {item.name || ' undefined'} + {item.name || 'untitled'} Date: Fri, 6 Jan 2023 00:51:43 +0800 Subject: [PATCH 18/60] feat: more fluent --- .../app/src/components/workspace-modal/index.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 1f332ce904..c1d4402f92 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -104,7 +104,17 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { /> - + {item.name || 'untitled'} @@ -112,7 +122,6 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { style={{ position: 'relative', top: '6px', - marginLeft: '100px', }} > {(item.workspaceType === 'local' || From eb2d3d5d40d546751ea41edd0ed5b13caf674f83 Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Fri, 6 Jan 2023 01:04:52 +0800 Subject: [PATCH 19/60] feat: add letter avatar --- .../src/components/create-workspace/index.tsx | 4 +- .../src/components/workspace-modal/index.tsx | 63 +++++++++++-------- 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/packages/app/src/components/create-workspace/index.tsx b/packages/app/src/components/create-workspace/index.tsx index 2faeb60e97..3814d2449e 100644 --- a/packages/app/src/components/create-workspace/index.tsx +++ b/packages/app/src/components/create-workspace/index.tsx @@ -9,7 +9,7 @@ interface ICloseParams { } interface ModalProps { open: boolean; - onClose: (opts?: ICloseParams) => void; + onClose: (opts: ICloseParams) => void; } export const CreateWorkspaceModal = ({ open, onClose }: ModalProps) => { @@ -28,7 +28,7 @@ export const CreateWorkspaceModal = ({ open, onClose }: ModalProps) => { top={6} right={6} onClick={() => { - onClose(); + onClose({}); }} /> diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index c1d4402f92..affc9492ec 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -45,6 +45,26 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { const data = getUserInfo(); setUser(data); }; + const stringToColour = function (str: string) { + str = str || 'affine'; + let colour = '#'; + let hash = 0; + // str to hash + for ( + let i = 0; + i < str.length; + hash = str.charCodeAt(i++) + ((hash << 5) - hash) + ); + + // int/hash to hex + for ( + let i = 0; + i < 3; + colour += ('00' + ((hash >> (i++ * 8)) & 0xff).toString(16)).slice(-2) + ); + + return colour; + }; return (
    @@ -74,45 +94,37 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { key={index} > - - - - + {(item.name || 'AFFiNE').substring(0, 1)} +
    {item.name || 'untitled'} @@ -121,7 +133,7 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { {(item.workspaceType === 'local' || @@ -255,7 +267,6 @@ const WorkspaceItem = styled('div')({ cursor: 'pointer', padding: '8px', border: '1px solid #eee', - fontWeight: 'bold', ':hover': { background: '#eee', }, From 40d09357925e3c44ded3f8dd2519d7cf772440cc Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Fri, 6 Jan 2023 01:13:02 +0800 Subject: [PATCH 20/60] feat: global avatar --- .../src/components/workspace-modal/index.tsx | 20 +---------------- .../WorkspaceSelector/WorkspaceSelector.tsx | 22 ++++++++++++++++--- packages/app/src/utils/colors.ts | 20 +++++++++++++++++ packages/app/src/utils/index.ts | 2 ++ 4 files changed, 42 insertions(+), 22 deletions(-) create mode 100644 packages/app/src/utils/colors.ts diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index affc9492ec..caaec6d329 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -21,6 +21,7 @@ import { } from '@blocksuite/icons'; import { useConfirm } from '@/providers/confirm-provider'; import { toast } from '@/ui/toast'; +import { stringToColour } from '@/utils'; interface LoginModalProps { open: boolean; onClose: () => void; @@ -45,26 +46,7 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { const data = getUserInfo(); setUser(data); }; - const stringToColour = function (str: string) { - str = str || 'affine'; - let colour = '#'; - let hash = 0; - // str to hash - for ( - let i = 0; - i < str.length; - hash = str.charCodeAt(i++) + ((hash << 5) - hash) - ); - // int/hash to hex - for ( - let i = 0; - i < 3; - colour += ('00' + ((hash >> (i++ * 8)) & 0xff).toString(16)).slice(-2) - ); - - return colour; - }; return (
    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 5ccc9a446b..9004ef72a9 100644 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx +++ b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx @@ -1,9 +1,9 @@ import { Avatar, WorkspaceName, SelectorWrapper } from './styles'; import { useEffect, useState } from 'react'; -import { AffineIcon } from '../icons/icons'; +// import { AffineIcon } from '../icons/icons'; import { WorkspaceModal } from '@/components/workspace-modal'; import { getActiveWorkspace, getWorkspaces } from '@/hooks/mock-data/mock'; - +import { stringToColour } from '@/utils'; export const WorkspaceSelector = () => { const [workspaceListShow, setWorkspaceListShow] = useState(false); const [workspace, setWorkSpace] = useState(getActiveWorkspace()); @@ -34,7 +34,23 @@ export const WorkspaceSelector = () => { data-testid="workspace-avatar" src={workspace.avatar} > - +
    + {(workspace?.name ?? 'AFFiNE').substring(0, 1)} +
    {workspace?.name ?? 'AFFiNE'} diff --git a/packages/app/src/utils/colors.ts b/packages/app/src/utils/colors.ts new file mode 100644 index 0000000000..431342fbf1 --- /dev/null +++ b/packages/app/src/utils/colors.ts @@ -0,0 +1,20 @@ +export function stringToColour(str: string) { + str = str || 'affine'; + let colour = '#'; + let hash = 0; + // str to hash + for ( + let i = 0; + i < str.length; + hash = str.charCodeAt(i++) + ((hash << 5) - hash) + ); + + // int/hash to hex + for ( + let i = 0; + i < 3; + colour += ('00' + ((hash >> (i++ * 8)) & 0xff).toString(16)).slice(-2) + ); + + return colour; +} diff --git a/packages/app/src/utils/index.ts b/packages/app/src/utils/index.ts index aeeaed611c..2d05a590cd 100644 --- a/packages/app/src/utils/index.ts +++ b/packages/app/src/utils/index.ts @@ -3,3 +3,5 @@ export { isDev } from './env'; export * from './useragent'; export * from './tools'; + +export * from './colors'; From fb292b5423755a975a2ff7ab894065ee8ac356c0 Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Fri, 6 Jan 2023 01:13:57 +0800 Subject: [PATCH 21/60] test: skip avatar test --- tests/local-first-workspace.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/local-first-workspace.spec.ts b/tests/local-first-workspace.spec.ts index f3c1ba9e1c..6c4a948cc4 100644 --- a/tests/local-first-workspace.spec.ts +++ b/tests/local-first-workspace.spec.ts @@ -9,7 +9,7 @@ test.describe('Local first default workspace', () => { expect(await workspaceName.textContent()).toBe('AFFiNE'); }); - test('Default workspace avatar', async ({ page }) => { + test.skip('Default workspace avatar', async ({ page }) => { const workspaceAvatar = page.getByTestId('workspace-avatar'); expect(await workspaceAvatar.innerHTML()).toBe( '' From 67ef5099dd28459334cdfa7f7eb4a80b565e8dee Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Fri, 6 Jan 2023 01:20:51 +0800 Subject: [PATCH 22/60] feat: ui --- .../app/src/components/workspace-modal/index.tsx | 14 ++++++++------ packages/app/src/hooks/mock-data/mock.ts | 9 +++------ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index caaec6d329..e2a3b55f4b 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -109,7 +109,7 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { top: '20px', }} > - {item.name || 'untitled'} + {item.name || 'AFFiNE'} { top: '20px', }} > - {(item.workspaceType === 'local' || - !item.workspaceType) && ( + {(item.type === 'local' || !item.type) && ( )} - {item.workspaceType === 'cloud' && ( + {item.type === 'cloud' && ( )} {item.isPublish && } @@ -133,6 +132,9 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { })}
  • { const { currentWorkspace, refreshWorkspacesMeta } = useAppState(); useEffect(() => { @@ -85,19 +85,11 @@ export const GeneralPage = ({ workspace }: { workspace: Workspace }) => {
    - {(workspace?.name ?? 'AFFiNE').substring(0, 1)} +
    { { - onTabChange && onTabChange(ActiveTab.publish); + onTabChange && onTabChange(ActiveTab.export); }} > 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 affda10fff..2047010e02 100644 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx +++ b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx @@ -2,8 +2,8 @@ import { Avatar, WorkspaceName, SelectorWrapper } from './styles'; import { useEffect, useState } from 'react'; // import { AffineIcon } from '../icons/icons'; import { WorkspaceModal } from '@/components/workspace-modal'; +import { WorkspaceAvatar } from '@/components/workspace-avatar'; import { getActiveWorkspace, getWorkspaces } from '@/hooks/mock-data/mock'; -import { stringToColour } from '@/utils'; export const WorkspaceSelector = () => { const [workspaceListShow, setWorkspaceListShow] = useState(false); const [workspace, setWorkSpace] = useState(getActiveWorkspace()); @@ -37,18 +37,9 @@ export const WorkspaceSelector = () => {
    - {(workspace?.name ?? 'AFFiNE').substring(0, 1)} +
    From 7bbf1d28ea32c24ee7c7a30a6eecd0e7329a248f Mon Sep 17 00:00:00 2001 From: tzhangchi Date: Fri, 6 Jan 2023 09:51:20 +0800 Subject: [PATCH 28/60] feat: add code tag --- .../app/src/components/workspace-setting/general/general.tsx | 2 +- .../src/components/workspace-setting/workspace-setting.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/app/src/components/workspace-setting/general/general.tsx b/packages/app/src/components/workspace-setting/general/general.tsx index b8ecd6fcd0..5d808d839f 100644 --- a/packages/app/src/components/workspace-setting/general/general.tsx +++ b/packages/app/src/components/workspace-setting/general/general.tsx @@ -140,7 +140,7 @@ export const GeneralPage = ({ workspace }: { workspace: Workspace }) => { Workspace Type - {workspace.type} + {workspace.type} {isOwner ? ( diff --git a/packages/app/src/components/workspace-setting/workspace-setting.tsx b/packages/app/src/components/workspace-setting/workspace-setting.tsx index f19a60bd6f..13180a5801 100644 --- a/packages/app/src/components/workspace-setting/workspace-setting.tsx +++ b/packages/app/src/components/workspace-setting/workspace-setting.tsx @@ -466,8 +466,8 @@ const SyncPage = ({ workspace }: { workspace: Workspace }) => { ) : ( - {workspace.name} is Cloud Workspace. All data will be synchronized - and saved to the AFFiNE account + {workspace.name} is Cloud Workspace. All data will be + synchronized and saved to the AFFiNE account
    Date: Fri, 6 Jan 2023 14:26:18 +0800 Subject: [PATCH 29/60] feat: mock sync --- .../src/components/workspace-modal/index.tsx | 14 +- .../general/delete/delete.tsx | 33 ++-- .../workspace-setting/general/delete/style.ts | 7 +- .../workspace-setting/general/general.tsx | 16 +- .../src/components/workspace-setting/style.ts | 7 +- .../workspace-setting/workspace-setting.tsx | 175 +++++++++++------- .../app/src/hooks/use-temporary-helper.ts | 13 +- 7 files changed, 156 insertions(+), 109 deletions(-) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 81293efdbc..eb83c1ab04 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -8,7 +8,6 @@ import { setActiveWorkspace, Login, User, - getUserInfo, SignOut, updateWorkspaceMeta, } from '@/hooks/mock-data/mock'; @@ -22,6 +21,7 @@ import { import { useConfirm } from '@/providers/confirm-provider'; import { toast } from '@/ui/toast'; import { WorkspaceAvatar } from '@/components/workspace-avatar'; +import useTemporaryHelper from '@/hooks/use-temporary-helper'; interface LoginModalProps { open: boolean; onClose: () => void; @@ -29,23 +29,17 @@ interface LoginModalProps { export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { const [workspaceList, setWorkspaceList] = useState([]); - const [user, setUser] = useState(); const [createWorkspaceOpen, setCreateWorkspaceOpen] = useState(false); const { confirm } = useConfirm(); + const { user, login } = useTemporaryHelper(); useEffect(() => { setList(); - setUserInfo(); }, []); const setList = () => { const data = getWorkspaces(); - console.log('data: ', data); setWorkspaceList(data); }; - const setUserInfo = () => { - const data = getUserInfo(); - setUser(data); - }; return (
    @@ -151,9 +145,8 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { {!user ? ( {/* TODO: add upload logic */} - {/* {isOwner ? ( - upload - ) : null} */} - {/* */} Workspace Name @@ -122,7 +115,7 @@ export const GeneralPage = ({ workspace }: { workspace: Workspace }) => { ✔️ - {userInfo ? ( + {/* {userInfo ? (
    Workspace Owner @@ -136,7 +129,7 @@ export const GeneralPage = ({ workspace }: { workspace: Workspace }) => {
    ) : ( '' - )} + )} */} Workspace Type @@ -151,8 +144,7 @@ export const GeneralPage = ({ workspace }: { workspace: Workspace }) => { ) : ( diff --git a/packages/app/src/components/workspace-setting/style.ts b/packages/app/src/components/workspace-setting/style.ts index f59125a9fd..7cf6ac9fc2 100644 --- a/packages/app/src/components/workspace-setting/style.ts +++ b/packages/app/src/components/workspace-setting/style.ts @@ -199,11 +199,12 @@ export const StyledMoreVerticalButton = styled('button')(() => { export const StyledPublishExplanation = styled('div')(() => { return { - marginTop: '56px', paddingRight: '48px', fontWeight: '500', fontSize: '18px', lineHeight: '26px', + flex: 1, + marginTop: '60px', }; }); @@ -213,7 +214,9 @@ export const StyledPublishCopyContainer = styled('div')(() => { display: 'flex', flexDirection: 'row', alignItems: 'center', + height: '38px', + paddingTop: '20px', }; }); @@ -226,5 +229,7 @@ export const StyledCopyButtonContainer = styled('div')(() => { export const StyledPublishContent = styled('div')(() => { return { height: '494px', + display: 'flex', + flexDirection: 'column', }; }); diff --git a/packages/app/src/components/workspace-setting/workspace-setting.tsx b/packages/app/src/components/workspace-setting/workspace-setting.tsx index 13180a5801..7e4ebc7247 100644 --- a/packages/app/src/components/workspace-setting/workspace-setting.tsx +++ b/packages/app/src/components/workspace-setting/workspace-setting.tsx @@ -56,6 +56,8 @@ import { User, Workspace, } from '@/hooks/mock-data/mock'; +import useTemporaryHelper from '@/hooks/use-temporary-helper'; +import { useConfirm } from '@/providers/confirm-provider'; enum ActiveTab { 'general' = 'general', @@ -364,66 +366,108 @@ const MembersPage = ({ workspace }: { workspace: Workspace }) => { const PublishPage = ({ workspace }: { workspace: Workspace }) => { const shareUrl = window.location.host + '/workspace/' + workspace.id + '?share=true'; - const [publicStatus, setPublicStatus] = useState( - workspace.isPublish ?? false - ); + + const { login, updateWorkspaceMeta, user, currentWorkspace } = + useTemporaryHelper(); + const { confirm } = useConfirm(); + const togglePublic = (flag: boolean) => { - const isPublic = setWorkspacePublish(workspace.id, flag); - setPublicStatus(isPublic); + updateWorkspaceMeta(currentWorkspace.id, { isPublish: flag }); }; const copyUrl = () => { navigator.clipboard.writeText(shareUrl); toast('Copied url to clipboard'); }; + + const enableAffineCloud = () => { + 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 (user) { + updateWorkspaceMeta(currentWorkspace.id, { isPublish: true }); + } else { + confirm && login(); + updateWorkspaceMeta(currentWorkspace.id, { isPublish: true }); + } + }); + }; return ( -
    - - {publicStatus ? ( + <> + {user ? ( +
    + + {currentWorkspace?.isPublish ? ( + <> + + Publishing to web requires AFFiNE Cloud service . + + + Share with link + + + + + + + + + ) : ( + + After publishing to the web, everyone can view the content of + this workspace through the link. + + )} + + {!currentWorkspace?.isPublish ? ( + + ) : ( + + )} +
    + ) : ( + <> - The current workspace has been published to the web, everyone can - view the contents of this workspace through the link. + Publishing to web requires AFFiNE Cloud service. - Share with link + - - - - + - ) : ( - - After publishing to the web, everyone can view the content of this - workspace through the link. - - )} - - {!publicStatus ? ( - - ) : ( - +
    )} -
    + ); }; const SyncPage = ({ workspace }: { workspace: Workspace }) => { @@ -433,7 +477,6 @@ const SyncPage = ({ workspace }: { workspace: Workspace }) => { }); const setType = () => { const ACTIVEworkspace = getActiveWorkspace(); - console.log('ACTIVEworkspace: ', ACTIVEworkspace); ACTIVEworkspace && setWorkspaceType(ACTIVEworkspace.type); }; return ( @@ -448,27 +491,27 @@ const SyncPage = ({ workspace }: { workspace: Workspace }) => { - - - + ) : ( - - {workspace.name} is Cloud Workspace. All data will be - synchronized and saved to the AFFiNE account -
    + <> + + {workspace.name} is Cloud Workspace. All data will be + synchronized and saved to the AFFiNE + + @@ -495,8 +538,8 @@ const SyncPage = ({ workspace }: { workspace: Workspace }) => { > -
    -
    + + )}
    diff --git a/packages/app/src/hooks/use-temporary-helper.ts b/packages/app/src/hooks/use-temporary-helper.ts index 8de0ef88a0..c2727f1653 100644 --- a/packages/app/src/hooks/use-temporary-helper.ts +++ b/packages/app/src/hooks/use-temporary-helper.ts @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import { getWorkspaces, Workspace, User } from './mock-data/mock'; export function getActiveWorkspace(): Workspace { @@ -12,16 +12,19 @@ export const useTemporaryHelper = () => { const [currentWorkspace, setCurrentWorkspace] = useState( JSON.parse(localStorage.getItem('affine-active-workspace') ?? '{}') ); - const [user, setUser] = useState(null); + const [user, setUser] = useState(); return { - updateWorkspaceMeta: (workspaceId: string, workspaceData: Workspace) => { + updateWorkspaceMeta: ( + workspaceId: string, + workspaceData: { name?: string; avatar?: string; isPublish?: boolean } + ) => { const workspacesMeta = getWorkspaces(); const newWorkspacesMeta = workspacesMeta.map((workspace: Workspace) => { if (workspace.id === workspaceId) { workspaceData.name && (workspace.name = workspaceData.name); workspaceData.avatar && (workspace.avatar = workspaceData.avatar); - return workspaceData; + return workspace; } return workspace; }); @@ -94,7 +97,7 @@ export const useTemporaryHelper = () => { avatar: 'string', }; localStorage.setItem('affine-user', JSON.stringify(userInfo)); - + console.log('login'); setUser(userInfo); }, getUserInfo: () => { From 97567e2e1fe54bb561c5ce7e9988e7a540f7d0b7 Mon Sep 17 00:00:00 2001 From: DiamondThree Date: Fri, 6 Jan 2023 14:42:19 +0800 Subject: [PATCH 30/60] feat: mock login --- .../workspace-setting/MembersPage.tsx | 198 +++++++++ .../workspace-setting/PublishPage.tsx | 122 ++++++ .../components/workspace-setting/SyncPage.tsx | 91 ++++ .../workspace-setting/workspace-setting.tsx | 397 +----------------- 4 files changed, 415 insertions(+), 393 deletions(-) create mode 100644 packages/app/src/components/workspace-setting/MembersPage.tsx create mode 100644 packages/app/src/components/workspace-setting/PublishPage.tsx create mode 100644 packages/app/src/components/workspace-setting/SyncPage.tsx diff --git a/packages/app/src/components/workspace-setting/MembersPage.tsx b/packages/app/src/components/workspace-setting/MembersPage.tsx new file mode 100644 index 0000000000..7695a43b0c --- /dev/null +++ b/packages/app/src/components/workspace-setting/MembersPage.tsx @@ -0,0 +1,198 @@ +import { + StyledMemberAvatar, + StyledMemberButtonContainer, + StyledMemberEmail, + StyledMemberInfo, + StyledMemberListContainer, + StyledMemberListItem, + StyledMemberName, + StyledMemberNameContainer, + StyledMemberRoleContainer, + StyledMemberTitleContainer, + StyledMoreVerticalButton, +} from './style'; +import { MoreVerticalIcon, EmailIcon, TrashIcon } from '@blocksuite/icons'; +import { useEffect, useState } from 'react'; +import { Button, IconButton } from '@/ui/button'; +import { InviteMembers } from '../invite-members/index'; +// import { Member, getDataCenter } from '@affine/datacenter'; +// import { Avatar } from '@mui/material'; +import { Menu, MenuItem } from '@/ui/menu'; +import { Empty } from '@/ui/empty'; +import { + deleteMember, + getMembers, + getUserInfo, + Login, + User, + Workspace, +} from '@/hooks/mock-data/mock'; + +// import { useAppState } from '@/providers/app-state-provider'; +export const MembersPage = ({ workspace }: { workspace: Workspace }) => { + const [isInviteModalShow, setIsInviteModalShow] = useState(false); + const [members, setMembers] = useState([]); + const [userInfo, setUserInfo] = useState(); + // const refreshMembers = useCallback(() => { + // getDataCenter() + // .then(dc => + // dc.apis.getWorkspaceMembers({ + // id: workspace.id, + // }) + // ) + // .then(data => { + // setMembers(data); + // }) + // .catch(err => { + // console.log(err); + // }); + // }, [workspace.id]); + + useEffect(() => { + setUser(); + setMembersList(); + // refreshMembers(); + }, []); + + const setUser = () => { + const user = getUserInfo(); + user && setUserInfo(user); + }; + const setMembersList = () => { + const members = getMembers(workspace.id); + members && setMembers(members); + }; + + return ( +
    + {userInfo ? ( + <> + + + Users({members.length}) + + Access level + + + {members.length === 0 && ( + + )} + {members.length ? ( + members.map((member, index) => { + return ( + + + + + + + + {member.name} + + {member.email} + + + + {/* {member.accepted + ? member.type !== 99 + ? 'Member' + : 'Workspace Owner' + : 'Pending'} */} + Pending + + + + { + deleteMember(workspace.id, 0); + setMembersList(); + // confirm({ + // title: 'Delete Member?', + // content: `will delete member`, + // confirmText: 'Delete', + // confirmType: 'danger', + // }).then(confirm => { + // getDataCenter() + // .then(dc => + // dc.apis.removeMember({ + // permissionId: member.id, + // }) + // ) + // .then(() => { + // // console.log('data: ', data); + // toast('Moved to Trash'); + // // refreshMembers(); + // }); + // }); + }} + icon={} + > + Delete + + + } + placement="bottom-end" + disablePortal={true} + > + + + + + + + ); + }) + ) : ( + <> + )} + + + + { + setIsInviteModalShow(false); + }} + onInviteSuccess={() => { + setMembersList(); + setIsInviteModalShow(false); + // refreshMembers(); + }} + workspaceId={workspace.id} + open={isInviteModalShow} + > + + + ) : ( + <> +
    + Collaborating with other members requires AFFiNE Cloud service. +
    +
    + +
    + + )} +
    + ); +}; diff --git a/packages/app/src/components/workspace-setting/PublishPage.tsx b/packages/app/src/components/workspace-setting/PublishPage.tsx new file mode 100644 index 0000000000..f5136e76bd --- /dev/null +++ b/packages/app/src/components/workspace-setting/PublishPage.tsx @@ -0,0 +1,122 @@ +import { + StyledCopyButtonContainer, + StyledPublishContent, + StyledPublishCopyContainer, + StyledPublishExplanation, + StyledSettingH2, +} from './style'; + +import { Button } from '@/ui/button'; +import Input from '@/ui/input'; +import { toast } from '@/ui/toast'; +import { Workspace } from '@/hooks/mock-data/mock'; +import useTemporaryHelper from '@/hooks/use-temporary-helper'; +import { useConfirm } from '@/providers/confirm-provider'; + +export const PublishPage = ({ workspace }: { workspace: Workspace }) => { + const shareUrl = + window.location.host + '/workspace/' + workspace.id + '?share=true'; + + const { login, updateWorkspaceMeta, user, currentWorkspace } = + useTemporaryHelper(); + const { confirm } = useConfirm(); + + const togglePublic = (flag: boolean) => { + updateWorkspaceMeta(currentWorkspace.id, { isPublish: flag }); + }; + + const copyUrl = () => { + navigator.clipboard.writeText(shareUrl); + toast('Copied url to clipboard'); + }; + + const enableAffineCloud = () => { + 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 (user) { + updateWorkspaceMeta(currentWorkspace.id, { isPublish: true }); + } else { + confirm && login(); + updateWorkspaceMeta(currentWorkspace.id, { isPublish: true }); + } + }); + }; + return ( + <> + {currentWorkspace.type === 'cloud' ? ( +
    + + {currentWorkspace?.isPublish ? ( + <> + + Publishing to web requires AFFiNE Cloud service . + + + Share with link + + + + + + + + + ) : ( + + After publishing to the web, everyone can view the content of + this workspace through the link. + + )} + + {!currentWorkspace?.isPublish ? ( + + ) : ( + + )} +
    + ) : ( + + <> + + 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 new file mode 100644 index 0000000000..572a67f775 --- /dev/null +++ b/packages/app/src/components/workspace-setting/SyncPage.tsx @@ -0,0 +1,91 @@ +import { + StyledPublishContent, + StyledPublishCopyContainer, + StyledPublishExplanation, +} from './style'; +import { DownloadIcon } from '@blocksuite/icons'; +import { useEffect, useState } from 'react'; +import { Button } from '@/ui/button'; +import { Menu, MenuItem } from '@/ui/menu'; +import { + deleteMember, + getActiveWorkspace, + updateWorkspaceMeta, + Workspace, +} from '@/hooks/mock-data/mock'; + +export const SyncPage = ({ workspace }: { workspace: Workspace }) => { + const [workspaceType, setWorkspaceType] = useState('local'); + useEffect(() => { + setType(); + }); + const setType = () => { + const ACTIVEworkspace = getActiveWorkspace(); + ACTIVEworkspace && setWorkspaceType(ACTIVEworkspace.type); + }; + return ( +
    + + {workspaceType === 'local' ? ( + <> + + {workspace.name} 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 Cloud Workspace. All data will be + synchronized and saved to the AFFiNE + + + + { + deleteMember(workspace.id, 0); + }} + icon={} + > + Download core data to device + + { + deleteMember(workspace.id, 0); + }} + icon={} + > + Download all data to device + + + } + placement="bottom-end" + disablePortal={true} + > + + + + + )} + +
    + ); +}; diff --git a/packages/app/src/components/workspace-setting/workspace-setting.tsx b/packages/app/src/components/workspace-setting/workspace-setting.tsx index 7e4ebc7247..7d292c9b98 100644 --- a/packages/app/src/components/workspace-setting/workspace-setting.tsx +++ b/packages/app/src/components/workspace-setting/workspace-setting.tsx @@ -1,23 +1,7 @@ import Modal, { ModalCloseButton } from '@/ui/modal'; import { - StyledCopyButtonContainer, - StyledMemberAvatar, - StyledMemberButtonContainer, - StyledMemberEmail, - StyledMemberInfo, - StyledMemberListContainer, - StyledMemberListItem, - StyledMemberName, - StyledMemberNameContainer, - StyledMemberRoleContainer, - StyledMemberTitleContainer, - StyledMoreVerticalButton, - StyledPublishContent, - StyledPublishCopyContainer, - StyledPublishExplanation, StyledSettingContainer, StyledSettingContent, - StyledSettingH2, StyledSettingSidebar, StyledSettingSidebarHeader, StyledSettingTabContainer, @@ -28,36 +12,14 @@ import { EditIcon, UsersIcon, PublishIcon, - MoreVerticalIcon, - EmailIcon, - TrashIcon, - DownloadIcon, CloudInsyncIcon, } from '@blocksuite/icons'; import { useEffect, useState } from 'react'; -import { Button, IconButton } from '@/ui/button'; -import Input from '@/ui/input'; -import { InviteMembers } from '../invite-members/index'; -// import { Member, getDataCenter } from '@affine/datacenter'; -// import { Avatar } from '@mui/material'; -import { Menu, MenuItem } from '@/ui/menu'; -import { toast } from '@/ui/toast'; -import { Empty } from '@/ui/empty'; -// import { useAppState } from '@/providers/app-state-provider'; import { GeneralPage } from './general'; -import { - deleteMember, - getActiveWorkspace, - getMembers, - getUserInfo, - Login, - setWorkspacePublish, - updateWorkspaceMeta, - User, - Workspace, -} from '@/hooks/mock-data/mock'; -import useTemporaryHelper from '@/hooks/use-temporary-helper'; -import { useConfirm } from '@/providers/confirm-provider'; +import { getActiveWorkspace } from '@/hooks/mock-data/mock'; +import MembersPage from './MembersPage'; +import PublishPage from './PublishPage'; +import SyncPage from './SyncPage'; enum ActiveTab { 'general' = 'general', @@ -194,354 +156,3 @@ export const WorkspaceSetting = ({ ); }; - -const MembersPage = ({ workspace }: { workspace: Workspace }) => { - const [isInviteModalShow, setIsInviteModalShow] = useState(false); - const [members, setMembers] = useState([]); - const [userInfo, setUserInfo] = useState(); - // const refreshMembers = useCallback(() => { - // getDataCenter() - // .then(dc => - // dc.apis.getWorkspaceMembers({ - // id: workspace.id, - // }) - // ) - // .then(data => { - // setMembers(data); - // }) - // .catch(err => { - // console.log(err); - // }); - // }, [workspace.id]); - - useEffect(() => { - setUser(); - setMembersList(); - // refreshMembers(); - }, []); - - const setUser = () => { - const user = getUserInfo(); - user && setUserInfo(user); - }; - const setMembersList = () => { - const members = getMembers(workspace.id); - members && setMembers(members); - }; - - return ( -
    - {userInfo ? ( - <> - - - Users({members.length}) - - Access level - - - {members.length === 0 && ( - - )} - {members.length ? ( - members.map((member, index) => { - return ( - - - - - - - - {member.name} - - {member.email} - - - - {/* {member.accepted - ? member.type !== 99 - ? 'Member' - : 'Workspace Owner' - : 'Pending'} */} - Pending - - - - { - deleteMember(workspace.id, 0); - setMembersList(); - // confirm({ - // title: 'Delete Member?', - // content: `will delete member`, - // confirmText: 'Delete', - // confirmType: 'danger', - // }).then(confirm => { - // getDataCenter() - // .then(dc => - // dc.apis.removeMember({ - // permissionId: member.id, - // }) - // ) - // .then(() => { - // // console.log('data: ', data); - // toast('Moved to Trash'); - // // refreshMembers(); - // }); - // }); - }} - icon={} - > - Delete - - - } - placement="bottom-end" - disablePortal={true} - > - - - - - - - ); - }) - ) : ( - <> - )} - - - - { - setIsInviteModalShow(false); - }} - onInviteSuccess={() => { - setMembersList(); - setIsInviteModalShow(false); - // refreshMembers(); - }} - workspaceId={workspace.id} - open={isInviteModalShow} - > - - - ) : ( - <> -
    - Collaborating with other members requires AFFiNE Cloud service. -
    -
    - -
    - - )} -
    - ); -}; - -const PublishPage = ({ workspace }: { workspace: Workspace }) => { - const shareUrl = - window.location.host + '/workspace/' + workspace.id + '?share=true'; - - const { login, updateWorkspaceMeta, user, currentWorkspace } = - useTemporaryHelper(); - const { confirm } = useConfirm(); - - const togglePublic = (flag: boolean) => { - updateWorkspaceMeta(currentWorkspace.id, { isPublish: flag }); - }; - - const copyUrl = () => { - navigator.clipboard.writeText(shareUrl); - toast('Copied url to clipboard'); - }; - - const enableAffineCloud = () => { - 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 (user) { - updateWorkspaceMeta(currentWorkspace.id, { isPublish: true }); - } else { - confirm && login(); - updateWorkspaceMeta(currentWorkspace.id, { isPublish: true }); - } - }); - }; - return ( - <> - {user ? ( -
    - - {currentWorkspace?.isPublish ? ( - <> - - Publishing to web requires AFFiNE Cloud service . - - - Share with link - - - - - - - - - ) : ( - - After publishing to the web, everyone can view the content of - this workspace through the link. - - )} - - {!currentWorkspace?.isPublish ? ( - - ) : ( - - )} -
    - ) : ( - - <> - - Publishing to web requires AFFiNE Cloud service. - - - - - - - - )} - - ); -}; -const SyncPage = ({ workspace }: { workspace: Workspace }) => { - const [workspaceType, setWorkspaceType] = useState('local'); - useEffect(() => { - setType(); - }); - const setType = () => { - const ACTIVEworkspace = getActiveWorkspace(); - ACTIVEworkspace && setWorkspaceType(ACTIVEworkspace.type); - }; - return ( -
    - - {workspaceType === 'local' ? ( - <> - - {workspace.name} 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 Cloud Workspace. All data will be - synchronized and saved to the AFFiNE - - - - { - deleteMember(workspace.id, 0); - }} - icon={} - > - Download core data to device - - { - deleteMember(workspace.id, 0); - }} - icon={} - > - Download all data to device - - - } - placement="bottom-end" - disablePortal={true} - > - - - - - )} - -
    - ); -}; From 3d5f239e4e84d5c8a9e15d389b35ac6ce2ad4eac Mon Sep 17 00:00:00 2001 From: JimmFly Date: Fri, 6 Jan 2023 15:00:42 +0800 Subject: [PATCH 31/60] feat: add language switch --- .../src/components/workspace-modal/index.tsx | 2 + .../workspace-modal/languageMenu.tsx | 95 +++++++++++++++++++ .../src/components/workspace-modal/styles.ts | 20 ++++ packages/app/src/libs/i18n/resources/bn.json | 23 +---- packages/app/src/libs/i18n/resources/fr.json | 30 +----- packages/app/src/libs/i18n/resources/sr.json | 28 +----- .../app/src/libs/i18n/resources/zh-Hans.json | 88 ++++++++++++----- .../app/src/libs/i18n/resources/zh-Hant.json | 30 +----- packages/app/src/ui/confirm/Confirm.tsx | 2 +- 9 files changed, 184 insertions(+), 134 deletions(-) create mode 100644 packages/app/src/components/workspace-modal/languageMenu.tsx diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 81293efdbc..b86cb67ad6 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -2,6 +2,7 @@ import { styled } from '@/styles'; import { Modal, ModalWrapper, ModalCloseButton } from '@/ui/modal'; import { Button } from '@/ui/button'; import { useEffect, useState } from 'react'; +import { LanguageMenu } from './languageMenu'; import { getWorkspaces, Workspace, @@ -56,6 +57,7 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { >
    My Workspaces + { + const { i18n } = useTranslation(); + const changeLanguage = (event: string) => { + i18n.changeLanguage(event); + }; + const [show, setShow] = useState(false); + const currentLanguage = LOCALES.find(item => item.tag === i18n.language); + const [languageName, setLanguageName] = useState( + currentLanguage?.originalName + ); + return ( + + {LOCALES.map(option => { + return ( + { + changeLanguage(option.tag); + setShow(false); + setLanguageName(option.originalName); + }} + > + {option.originalName} + + ); + })} + + } + open={show} + > + { + setShow(!show); + }} + > + + {languageName} + + + + + ); +}; + +const StyledContainer = styled('div')(() => ({ + display: 'flex', + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', +})); + +const StyledText = styled('span')(({ theme }) => ({ + marginRight: '4px', + marginLeft: '16px', + fontSize: theme.font.sm, + fontWeight: '500', + textTransform: 'capitalize', +})); +const StyledTooltip = styled(({ className, ...props }: TooltipProps) => ( + +))(({ theme }) => ({ + zIndex: theme.zIndex.modal, + '& .MuiTooltip-tooltip': { + backgroundColor: theme.colors.popoverBackground, + boxShadow: theme.shadow.modal, + color: theme.colors.popoverColor, + }, +})); + +const ListItem = styled(Button)(({ theme }) => ({ + display: 'block', + width: '100%', + color: theme.colors.popoverColor, + fontSize: theme.font.sm, + textTransform: 'capitalize', +})); + +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-modal/styles.ts b/packages/app/src/components/workspace-modal/styles.ts index 40a8bcc375..a54b191fce 100644 --- a/packages/app/src/components/workspace-modal/styles.ts +++ b/packages/app/src/components/workspace-modal/styles.ts @@ -1,4 +1,7 @@ import { displayFlex, styled } from '@/styles'; +import MenuItem from '@mui/material/MenuItem'; +import FormControl from '@mui/material/FormControl'; +import Select from '@mui/material/Select'; export const StyledTitle = styled.div(() => { return { @@ -36,3 +39,20 @@ export const StyledButton = styled.div(({ theme }) => { ...displayFlex('center', 'center'), }; }); +export const StyledFormControl = styled(FormControl)(({ theme }) => { + return { + position: 'absolute', + minWidth: '100px', + right: '50px', + backgroundColor: theme.colors.popoverBackground, + }; +}); +export const StyledSelect = styled(Select)(({ theme }) => { + return { + backgroundColor: theme.colors.popoverBackground, + color: theme.colors.popoverColor, + }; +}); +export const StyledMenuItem = styled(MenuItem)(() => { + return {}; +}); diff --git a/packages/app/src/libs/i18n/resources/bn.json b/packages/app/src/libs/i18n/resources/bn.json index 5eb50f8cdf..0967ef424b 100644 --- a/packages/app/src/libs/i18n/resources/bn.json +++ b/packages/app/src/libs/i18n/resources/bn.json @@ -1,22 +1 @@ -{ - "// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "", - "Add A Below Block": "নীচে একটি ব্লক যোগ করুন", - "WarningTips": { - "IsNotfsApiSupported": "অ্যাফাইন ডেমোতে স্বাগতম। পরিবর্তনগুলি সংরক্ষণ করা শুরু করতে আপনি Chrome/Edge এর মতো ক্রোমিয়াম ভিত্তিক ব্রাউজারের সর্বশেষ সংস্করণের মাধ্যমে ডিস্কে ডেটা সিঙ্ক করতে পারেন", - "DoNotStore": "অ্যাফাইন সক্রিয় ডেভেলপমেন্ট এর অধীনে এবং বর্তমান সংস্করণটি অস্থিতিশীল। দয়া করে কোন তথ্য বা ডেটা সঞ্চয় করবেন না" - }, - "Language": "ভাষা", - "Settings": "সেটিংস", - "Share": "শেয়ার করুন", - "Comment": "মন্তব্য", - "Delete": "মুছে ফেলুন", - "Copy Page Link": "পেজ লিংক কপি করুন", - "Duplicate Page": "সদৃশ পৃষ্ঠা তৈরি করুন", - "Logout": "লগআউট", - "Divide Here As A New Group": "একটি নতুন গ্রুপ হিসেবে বিভক্ত করুন", - "ComingSoon": "লেআউট সেটিংস শীঘ্রই আসছে...", - "Clear Workspace": "ওয়ার্কস্পেস পরিষ্কার করুন", - "Layout": "লেআউট", - "Turn into": "রূপান্তর করুন", - "Sync to Disk": "ডিস্ক এ সিঙ্ক করুন" -} +{} diff --git a/packages/app/src/libs/i18n/resources/fr.json b/packages/app/src/libs/i18n/resources/fr.json index d30fdcb133..0967ef424b 100644 --- a/packages/app/src/libs/i18n/resources/fr.json +++ b/packages/app/src/libs/i18n/resources/fr.json @@ -1,29 +1 @@ -{ - "// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "", - "ComingSoon": "Bientôt disponible", - "Duplicate Page": "Dupliquer la page", - "Copy Page Link": "Copier le lien de la page", - "Delete": "Supprimer", - "Comment": "Commentaire", - "Export As HTML": "Exporter en HTML", - "Export As Markdown": "Exporter en Markdown", - "Export As PDF (Unsupported)": "exporter en PDF (non supporté)", - "Logout": "Déconnexion", - "Export Workspace": "Exporter l'espace de travail", - "Import Workspace": "Importer l'espace de travail", - "Language": "Langue", - "Last edited by": "Dernière édition par {{name}}", - "Layout": "Mise en forme", - "Settings": "Réglages", - "Share": "Partager", - "Sync to Disk": "Synchroniser sur le disque", - "Turn into": "Transformer en", - "WarningTips": { - "DoNotStore": "Affine est en développement actif ; la version actuelle est INSTABLE. Veuillez NE PAS stocker d'informations ou de données", - "IsNotLocalWorkspace": "Bienvenue sur la démo d'AFFiNE. Pour commencer à sauvegarder vos modifications, vous pouvez SYNCHRONISER SUR LE DISQUE", - "IsNotfsApiSupported": "Bienvenue sur la démo d'AFFiNE. Pour commencer à sauvegarder vos modifications, vous pouvez SYNCHRONISER SUR LE DISQUE\navec la dernière version d'un navigateur basé sur Chromium tel que Chrome ou Edge." - }, - "Add A Below Block": "Ajouter un bloc en-dessous", - "Divide Here As A New Group": "Séparer ici en un nouveau groupe", - "Clear Workspace": "Vider l'espace de travail" -} +{} diff --git a/packages/app/src/libs/i18n/resources/sr.json b/packages/app/src/libs/i18n/resources/sr.json index edc6c32f2c..0967ef424b 100644 --- a/packages/app/src/libs/i18n/resources/sr.json +++ b/packages/app/src/libs/i18n/resources/sr.json @@ -1,27 +1 @@ -{ - "// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "", - "Clear Workspace": "Očisti radni prostor", - "ComingSoon": "Podešavanja za izgled dolaze", - "Comment": "Komentar", - "Copy Page Link": "Kopiraj link stranice", - "Delete": "Obriši", - "Duplicate Page": "Dupliraj stranicu", - "Export As HTML": "Izvezi kao HTML", - "Export As Markdown": "Izvezi kao Markdown", - "Export As PDF (Unsupported)": "Izvezi kao PDF (nepodržano)", - "Export Workspace": "Izvezi radnu površinu", - "Import Workspace": "Poboljšaj radnu površinu", - "Language": "Jezik", - "Last edited by": "Zadnju promenu uradio {{ime}}", - "Layout": "Izgled", - "Logout": "Odjava", - "Settings": "Podešavanja", - "Share": "Podeli", - "Sync to Disk": "Sinhroniziraj sa diskom", - "Turn into": "Promeni u", - "WarningTips": { - "DoNotStore": "AFFiNE je u stanju aktivnog razvoja i trenutna verzija je NESTABILNA. Molimo vas, NEMOJTE čuvati informacije ili podatke.", - "IsNotLocalWorkspace": "Dobrodošli u AFFiNE demo. Da bi započeli proces čuvanja promena možete kliknuti SINHRONIZUJ SA DISKOM.", - "IsNotfsApiSupported": "Dobrodošli u AFFiNE demo. Da bi započeli proces čuvanja promena možete SINHRONIZOVATI NA DISK sa poslednjom verzijom pretraživača tipa Chromium, kao što su Chrome/Edge." - } -} +{} diff --git a/packages/app/src/libs/i18n/resources/zh-Hans.json b/packages/app/src/libs/i18n/resources/zh-Hans.json index 14786dcb7e..47095233d9 100644 --- a/packages/app/src/libs/i18n/resources/zh-Hans.json +++ b/packages/app/src/libs/i18n/resources/zh-Hans.json @@ -1,29 +1,65 @@ { - "// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "", - "Sync to Disk": "同步到磁盘", - "Share": "分享", - "WarningTips": { - "IsNotfsApiSupported": "欢迎来到AFFiNE 的演示界面。您可以使用最新版本的基于Chrome的浏览器(如Chrome/Edge)将数据同步到磁盘来进行保存", - "IsNotLocalWorkspace": "欢迎来到AFFiNE 的演示界面,您可以同步到磁盘来进行保存操作。", - "DoNotStore": "AFFiNE 正在积极开发中,当前版本不稳定。请不要存储信息或数据。" - }, - "ComingSoon": "布局设置即将到来", - "Layout": "布局", - "Comment": "评论", - "Settings": "设置", - "Duplicate Page": "复制页面", - "Copy Page Link": "复制页面链接", - "Language": "当前语言", - "Clear Workspace": "清空工作区域", - "Export As Markdown": "导出 markdown", - "Export As HTML": "导出 HTML", - "Export As PDF (Unsupported)": "导出 PDF (暂不支持)", - "Import Workspace": "导入 Workspace", - "Export Workspace": "导出 Workspace", - "Last edited by": "最后编辑者为 {{name}}", - "Logout": "退出登录", + "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": "展开侧边栏", + "Removed from Favourites": "已从收藏中移除", + "Remove from favourites": "从收藏中移除", + "Added to Favourites": "已添加到收藏", + "Add to favourites": "添加到收藏", + "Paper": "文章", + "Edgeless": "无边模式", + "Switch to": "跳转到", + "Convert to ": "转换成 ", + "Page": "文章", + "Export": "导出", + "Export to HTML": "导出到 HTML", + "Export to Markdown": "导出到 Markdown", "Delete": "删除", - "Turn into": "转换为", - "Add A Below Block": "在下方添加一个新块", - "Divide Here As A New Group": "从这里划分一个新组" + "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!": "Get in touch!", + "AFFiNE Community": "AFFiNE Community", + "How is AFFiNE Alpha different?": "How is AFFiNE Alpha different?", + "Shortcuts": "Shortcuts", + "Undo": "Undo", + "Redo": "Redo", + "Bold": "Bold", + "Italic": "Italic", + "Underline": "Underline", + "Strikethrough": "Strikethrough", + "Inline code": "Inline code", + "Code block": "Code block", + "Link": "Link", + "Body text": "Body text", + "Heading": "Heading {{number}}", + "Increase indent": "Increase indent", + "Reduce indent": "Reduce indent", + "Markdown Syntax": "Markdown Syntax", + "Divider": "Divider", + "404 - Page Not Found": "404 - Page Not Found" } diff --git a/packages/app/src/libs/i18n/resources/zh-Hant.json b/packages/app/src/libs/i18n/resources/zh-Hant.json index 4d0f28c9cd..0967ef424b 100644 --- a/packages/app/src/libs/i18n/resources/zh-Hant.json +++ b/packages/app/src/libs/i18n/resources/zh-Hant.json @@ -1,29 +1 @@ -{ - "// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "", - "Add A Below Block": "在下方新添塊", - "Clear Workspace": "清空工作區", - "ComingSoon": "自定義佈局功能即將與您見面", - "Comment": "評論", - "Copy Page Link": "拷貝頁面鏈接", - "Delete": "刪除", - "Divide Here As A New Group": "從此地劃分成新組", - "Duplicate Page": "複製界面", - "Export As HTML": "導出 HTML", - "Export As Markdown": "以 Markdown 導出", - "Export As PDF (Unsupported)": "導出為 PDF(即將可用)", - "Export Workspace": "導出 Workspace", - "Import Workspace": "導入 Workspace", - "Language": "語言", - "Last edited by": "最後編輯者為 {{name}}", - "Layout": "佈局", - "Logout": "退出登錄", - "Settings": "設置", - "Share": "分享", - "Sync to Disk": "同步到磁盤", - "Turn into": "轉換為", - "WarningTips": { - "DoNotStore": "我們正在積極開發 AFFiNE,目前版本尚不穩定,請避免存儲信息或數據。", - "IsNotLocalWorkspace": "歡迎來到 AFFiNE 演示界面。您可以通過「同步到磁盤」來保存更改。", - "IsNotfsApiSupported": "歡迎進入AFFiNE演示!使用最新版本的基於 Chromium 內核的瀏覽器如Chrome/Edge,您可以通過「同步到磁盤」來保存更改" - } -} +{} diff --git a/packages/app/src/ui/confirm/Confirm.tsx b/packages/app/src/ui/confirm/Confirm.tsx index 872a43624e..dee4953812 100644 --- a/packages/app/src/ui/confirm/Confirm.tsx +++ b/packages/app/src/ui/confirm/Confirm.tsx @@ -52,7 +52,7 @@ export const Confirm = ({ }} style={{ marginRight: '24px' }} > - {cancelText} + {cancelText === 'Cancel' ? t('Cancel') : cancelText}
    - {workspaceList.map((item, index) => { + {workspaceMetaList.map((item, index) => { return ( { @@ -165,7 +155,6 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { open={createWorkspaceOpen} onClose={({ workspaceId }) => { setCreateWorkspaceOpen(false); - setList(); onClose(); confirm({ title: 'Enable AFFiNE Cloud?', @@ -182,7 +171,7 @@ export const WorkspaceModal = ({ open, onClose }: LoginModalProps) => { }); }, 1000); } else { - confirm && Login(); + confirm && login(); } }); }} diff --git a/packages/app/src/components/workspace-setting/MembersPage.tsx b/packages/app/src/components/workspace-setting/MembersPage.tsx index 7695a43b0c..b69c89b6f1 100644 --- a/packages/app/src/components/workspace-setting/MembersPage.tsx +++ b/packages/app/src/components/workspace-setting/MembersPage.tsx @@ -15,24 +15,21 @@ import { MoreVerticalIcon, EmailIcon, TrashIcon } from '@blocksuite/icons'; import { useEffect, useState } from 'react'; import { Button, IconButton } from '@/ui/button'; import { InviteMembers } from '../invite-members/index'; -// import { Member, getDataCenter } from '@affine/datacenter'; -// import { Avatar } from '@mui/material'; import { Menu, MenuItem } from '@/ui/menu'; import { Empty } from '@/ui/empty'; import { deleteMember, getMembers, - getUserInfo, - Login, User, Workspace, } from '@/hooks/mock-data/mock'; +import useTemporaryHelper from '@/hooks/use-temporary-helper'; // import { useAppState } from '@/providers/app-state-provider'; export const MembersPage = ({ workspace }: { workspace: Workspace }) => { const [isInviteModalShow, setIsInviteModalShow] = useState(false); const [members, setMembers] = useState([]); - const [userInfo, setUserInfo] = useState(); + const { user, login } = useTemporaryHelper(); // const refreshMembers = useCallback(() => { // getDataCenter() // .then(dc => @@ -49,15 +46,10 @@ export const MembersPage = ({ workspace }: { workspace: Workspace }) => { // }, [workspace.id]); useEffect(() => { - setUser(); setMembersList(); // refreshMembers(); }, []); - const setUser = () => { - const user = getUserInfo(); - user && setUserInfo(user); - }; const setMembersList = () => { const members = getMembers(workspace.id); members && setMembers(members); @@ -65,7 +57,7 @@ export const MembersPage = ({ workspace }: { workspace: Workspace }) => { return (
    - {userInfo ? ( + {user ? ( <> @@ -184,8 +176,7 @@ export const MembersPage = ({ workspace }: { workspace: Workspace }) => {
    - + )}
    ); diff --git a/packages/app/src/components/workspace-setting/PublishPage.tsx b/packages/app/src/components/workspace-setting/PublishPage.tsx index 0e8a9b5cf3..f09cb3e11c 100644 --- a/packages/app/src/components/workspace-setting/PublishPage.tsx +++ b/packages/app/src/components/workspace-setting/PublishPage.tsx @@ -14,15 +14,15 @@ import { useTemporaryHelper } from '@/providers/temporary-helper-provider'; import { useConfirm } from '@/providers/confirm-provider'; export const PublishPage = ({ workspace }: { workspace: Workspace }) => { + console.log('workspace: ', workspace); const shareUrl = window.location.host + '/workspace/' + workspace.id + '?share=true'; - const { login, updateWorkspaceMeta, user, currentWorkspace } = - useTemporaryHelper(); + const { login, updateWorkspaceMeta, user } = useTemporaryHelper(); const { confirm } = useConfirm(); const togglePublic = (flag: boolean) => { - updateWorkspaceMeta(currentWorkspace.id, { isPublish: flag }); + updateWorkspaceMeta(workspace.id, { isPublish: flag }); }; const copyUrl = () => { @@ -37,20 +37,22 @@ export const PublishPage = ({ workspace }: { workspace: Workspace }) => { confirmText: user ? 'Enable' : 'Sign in and Enable', cancelText: 'Skip', }).then(confirm => { - if (user) { - updateWorkspaceMeta(currentWorkspace.id, { isPublish: true }); - } else { - confirm && login(); - updateWorkspaceMeta(currentWorkspace.id, { isPublish: true }); + if (confirm) { + if (user) { + updateWorkspaceMeta(workspace.id, { isPublish: true }); + } else { + login(); + updateWorkspaceMeta(workspace.id, { isPublish: true }); + } } }); }; return ( <> - {currentWorkspace.type === 'cloud' ? ( + {workspace.type === 'cloud' ? (
    - {currentWorkspace?.isPublish ? ( + {workspace?.isPublish ? ( <> Publishing to web requires AFFiNE Cloud service . @@ -74,7 +76,7 @@ export const PublishPage = ({ workspace }: { workspace: Workspace }) => { )} - {!currentWorkspace?.isPublish ? ( + {!workspace.isPublish ? ( - ) : ( + {workspace.isPublish ? ( + ) : ( + )}
    ) : ( diff --git a/packages/app/src/components/workspace-setting/style.ts b/packages/app/src/components/workspace-setting/style.ts index af2e03def1..7b4e645526 100644 --- a/packages/app/src/components/workspace-setting/style.ts +++ b/packages/app/src/components/workspace-setting/style.ts @@ -215,8 +215,7 @@ export const StyledPublishCopyContainer = styled('div')(() => { display: 'flex', flexDirection: 'row', alignItems: 'center', - - height: '38px', + marginBottom: '20px', paddingTop: '20px', }; }); diff --git a/packages/app/src/providers/temporary-helper-provider.tsx b/packages/app/src/providers/temporary-helper-provider.tsx index fa80a8a435..c0a4e939a0 100644 --- a/packages/app/src/providers/temporary-helper-provider.tsx +++ b/packages/app/src/providers/temporary-helper-provider.tsx @@ -156,7 +156,6 @@ export const TemporaryHelperProvider = ({ setWorkspaceMetaList(workspacesMeta); }, setActiveWorkspace(workspaceData) { - console.log('workspaceData: ', workspaceData); localStorage.setItem( 'affine-active-workspace', JSON.stringify(workspaceData) From e0d31659d9a9039ccfc9fab99ab0bbc78b2db123 Mon Sep 17 00:00:00 2001 From: DiamondThree Date: Sun, 8 Jan 2023 19:15:25 +0800 Subject: [PATCH 42/60] fix: hooks error --- packages/app/src/providers/temporary-helper-provider.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/app/src/providers/temporary-helper-provider.tsx b/packages/app/src/providers/temporary-helper-provider.tsx index c0a4e939a0..5731646a15 100644 --- a/packages/app/src/providers/temporary-helper-provider.tsx +++ b/packages/app/src/providers/temporary-helper-provider.tsx @@ -84,13 +84,8 @@ export const TemporaryHelperProvider = ({ const newWorkspacesMeta = workspacesMeta.map( (workspace: Workspace) => { if (workspace.id === workspaceId) { - workspaceData.name && (workspace.name = workspaceData.name); - workspaceData.avatar && - (workspace.avatar = workspaceData.avatar); - workspaceData.type && (workspace.type = workspaceData.type); - workspaceData.isPublish && - (workspace.isPublish = workspaceData.isPublish); - return workspace; + const workspaceObj = Object.assign(workspace, workspaceData); + return workspaceObj; } return workspace; } From 231615b134b3d00ed7021d2881f1ad548f216efd Mon Sep 17 00:00:00 2001 From: DiamondThree Date: Sun, 8 Jan 2023 19:25:12 +0800 Subject: [PATCH 43/60] fix: lint error --- .../components/workspace-setting/MembersPage.tsx | 2 +- packages/app/src/ui/input/Input.tsx | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/app/src/components/workspace-setting/MembersPage.tsx b/packages/app/src/components/workspace-setting/MembersPage.tsx index 61fb80c75e..8b5210653b 100644 --- a/packages/app/src/components/workspace-setting/MembersPage.tsx +++ b/packages/app/src/components/workspace-setting/MembersPage.tsx @@ -54,7 +54,7 @@ export const MembersPage = ({ workspace }: { workspace: Workspace }) => { useEffect(() => { setMembersList(); // refreshMembers(); - }, [setMembersList]); + }); return (
    diff --git a/packages/app/src/ui/input/Input.tsx b/packages/app/src/ui/input/Input.tsx index 718eb70034..c4fe7600ca 100644 --- a/packages/app/src/ui/input/Input.tsx +++ b/packages/app/src/ui/input/Input.tsx @@ -1,4 +1,10 @@ -import { InputHTMLAttributes, useEffect, useState } from 'react'; +import { + InputHTMLAttributes, + useEffect, + useState, + FocusEventHandler, + KeyboardEventHandler, +} from 'react'; import { StyledInput } from './style'; type inputProps = { @@ -9,9 +15,8 @@ type inputProps = { maxLength?: number; minLength?: number; onChange?: (value: string) => void; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onBlur?: (e: any) => void; - onKeyDown?: (e: any) => void; + onBlur?: FocusEventHandler; + onKeyDown?: KeyboardEventHandler; }; export const Input = (props: inputProps) => { From 090890a94d27248bec71ec0a264e3c31ba210657 Mon Sep 17 00:00:00 2001 From: DiamondThree Date: Sun, 8 Jan 2023 19:37:15 +0800 Subject: [PATCH 44/60] fix: build lint error --- packages/app/src/components/create-workspace/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/app/src/components/create-workspace/index.tsx b/packages/app/src/components/create-workspace/index.tsx index 8f8ce49d1c..d2decdfe4e 100644 --- a/packages/app/src/components/create-workspace/index.tsx +++ b/packages/app/src/components/create-workspace/index.tsx @@ -4,6 +4,7 @@ import { Button } from '@/ui/button'; import { useState } from 'react'; import Input from '@/ui/input'; import { useTemporaryHelper } from '@/providers/temporary-helper-provider'; +import { KeyboardEvent } from 'react'; interface ICloseParams { workspaceId?: string; } @@ -20,7 +21,7 @@ export const CreateWorkspaceModal = ({ open, onClose }: ModalProps) => { onClose({ workspaceId: workspace.id }); setActiveWorkspace(workspace); }; - const handleKeyDown = (event: KeyboardEvent) => { + const handleKeyDown = (event: KeyboardEvent) => { if (event.key === 'Enter') { // 👇 Get input value handleCreateWorkspace(); From 4684548ad81a277e44120a2cb2ad5e545010162a Mon Sep 17 00:00:00 2001 From: x1a0t <405028157@qq.com> Date: Mon, 9 Jan 2023 11:18:00 +0800 Subject: [PATCH 45/60] feat: update landing page --- packages/app/src/components/shortcuts-modal/config.ts | 6 ++++-- packages/app/src/libs/i18n/resources/en.json | 2 +- packages/app/src/templates/Welcome-to-AFFiNE-Alpha-v2.0.md | 5 ++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/app/src/components/shortcuts-modal/config.ts b/packages/app/src/components/shortcuts-modal/config.ts index 7749209fe9..01740539fd 100644 --- a/packages/app/src/components/shortcuts-modal/config.ts +++ b/packages/app/src/components/shortcuts-modal/config.ts @@ -13,7 +13,8 @@ export const useMacKeyboardShortcuts = (): ShortcutTip => { [t('Strikethrough')]: '⌘+⇧+S', [t('Inline code')]: ' ⌘+E', [t('Code block')]: '⌘+⌥+C', - [t('Link')]: '⌘+K', + [t('Hyperlink')]: '⌘+K', + [t('Quick search')]: '⌘+K', [t('Body text')]: '⌘+⌥+0', [t('Heading', { number: '1' })]: '⌘+⌥+1', [t('Heading', { number: '2' })]: '⌘+⌥+2', @@ -56,7 +57,8 @@ export const useWindowsKeyboardShortcuts = (): ShortcutTip => { [t('Strikethrough')]: 'Ctrl+Shift+S', [t('Inline code')]: ' Ctrl+E', [t('Code block')]: 'Ctrl+Alt+C', - [t('Link')]: 'Ctrl+K', + [t('Hyperlink')]: 'Ctrl+K', + [t('Quick search')]: 'Ctrl+K', [t('Body text')]: 'Ctrl+Shift+0', [t('Heading', { number: '1' })]: 'Ctrl+Shift+1', [t('Heading', { number: '2' })]: 'Ctrl+Shift+2', diff --git a/packages/app/src/libs/i18n/resources/en.json b/packages/app/src/libs/i18n/resources/en.json index 9ce5282e71..7f9acabc64 100644 --- a/packages/app/src/libs/i18n/resources/en.json +++ b/packages/app/src/libs/i18n/resources/en.json @@ -54,7 +54,7 @@ "Strikethrough": "Strikethrough", "Inline code": "Inline code", "Code block": "Code block", - "Link": "Link", + "Hyperlink": "Hyperlink", "Body text": "Body text", "Heading": "Heading {{number}}", "Increase indent": "Increase indent", diff --git a/packages/app/src/templates/Welcome-to-AFFiNE-Alpha-v2.0.md b/packages/app/src/templates/Welcome-to-AFFiNE-Alpha-v2.0.md index 6495135903..130b2918b8 100644 --- a/packages/app/src/templates/Welcome-to-AFFiNE-Alpha-v2.0.md +++ b/packages/app/src/templates/Welcome-to-AFFiNE-Alpha-v2.0.md @@ -13,7 +13,7 @@ Let us know what you think of this latest version. 5. You can self-host locally with Docker. ```basic -docker run -d -v [YOUR_PATH]:/app/data -p 3000:3000 ghcr.io/toeverything/affine-self-hosted:alpha-abbey-wood +docker run -it --name affine -d -v [YOUR_PATH]:/app/data -p 3000:3000 ghcr.io/toeverything/affine-self-hosted:alpha-abbey-wood ``` **Looking for Markdown syntax or keyboard shortcuts?** @@ -24,6 +24,9 @@ docker run -d -v [YOUR_PATH]:/app/data -p 3000:3000 ghcr.io/toeverything/affine- - Manage your pages from the collapsible **sidebar**, which allows you to add **favourites** and restore deleted files from the **trash** - Search through all your content with the quick search - activate with `Ctrl/⌘ + K` + - A friendly Reminder: + - In the case of unselected text, `Ctrl/⌘ + K` activates quick search; + - In the case of selected text, `Ctrl/⌘ + K` will firstly ask to add a hyperlink, and then using `Ctrl/⌘ + K` again activates the quick search - Quickly format text with the **pop-up toolbar** (highlight any text to give it a try) - Copy and paste **images** into your pages, resize them and add captions - Add horizontal line dividers to your text with `---` and `***` From cc5c16623a2c2214d12350d470c181e2f4b78342 Mon Sep 17 00:00:00 2001 From: alt0 Date: Mon, 9 Jan 2023 11:18:47 +0800 Subject: [PATCH 46/60] chore: remove jest; using playwright over whole project --- jest.config.js | 19 - package.json | 6 +- .../app/scripts/__tests__/printer.spec.ts | 4 +- .../src/utils/__tests__/get-is-mobile.spec.ts | 4 +- packages/data-center/package.json | 4 +- ...ght.config.ts => playwright.config.unit.ts | 5 +- pnpm-lock.yaml | 1215 +---------------- 7 files changed, 13 insertions(+), 1244 deletions(-) delete mode 100644 jest.config.js rename packages/data-center/playwright.config.ts => playwright.config.unit.ts (92%) diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 4423f5ad0b..0000000000 --- a/jest.config.js +++ /dev/null @@ -1,19 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - projects: ['/packages/app'], - preset: 'ts-jest', - testEnvironment: 'node', - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - }, - transform: { - // '^.+\\.[tj]sx?$' to process js/ts with `ts-jest` - // '^.+\\.m?[tj]sx?$' to process js/ts/mjs/mts with `ts-jest` - '^.+\\.tsx?$': [ - 'ts-jest', - { - useESM: true, - }, - ], - }, -}; diff --git a/package.json b/package.json index 7c9ac38d11..26bbc2fb1f 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "private": true, "author": "toeverything", "license": "MPL-2.0", + "type": "module", "scripts": { "dev": "pnpm --filter=!@affine/app build && pnpm --filter @affine/app dev", "dev:ac": "pnpm --filter=!@affine/app build && NODE_API_SERVER=ac pnpm --filter @affine/app dev", @@ -15,7 +16,7 @@ "test": "playwright test", "test:dc": "pnpm --filter @affine/datacenter test", "test:e2e:codegen": "npx playwright codegen http://localhost:8080", - "test:unit": "jest", + "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" @@ -25,7 +26,6 @@ "*.{ts,tsx,js,jsx}": "npx eslint --cache --fix" }, "devDependencies": { - "@jest/globals": "^29.3.1", "@playwright/test": "^1.29.1", "@typescript-eslint/eslint-plugin": "^5.47.0", "@typescript-eslint/parser": "^5.47.0", @@ -36,9 +36,7 @@ "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.2.1", "got": "^12.5.3", - "jest": "^29.3.1", "prettier": "^2.7.1", - "ts-jest": "^29.0.3", "typescript": "^4.9.3", "lint-staged": "^13.1.0", "husky": "^8.0.2", diff --git a/packages/app/scripts/__tests__/printer.spec.ts b/packages/app/scripts/__tests__/printer.spec.ts index beb14114e6..c3f1d27fcc 100644 --- a/packages/app/scripts/__tests__/printer.spec.ts +++ b/packages/app/scripts/__tests__/printer.spec.ts @@ -1,7 +1,7 @@ -import { describe, test, expect } from '@jest/globals'; +import { test, expect } from '@playwright/test'; import { printer } from './../printer'; const chalk = require('chalk'); -describe('printer', () => { +test.describe('printer', () => { test('test debug', () => { expect(printer.debug('test debug')).toBe( chalk.green`debug` + chalk.white(' - test debug') diff --git a/packages/app/src/utils/__tests__/get-is-mobile.spec.ts b/packages/app/src/utils/__tests__/get-is-mobile.spec.ts index bef77b03ba..53bf52bc87 100644 --- a/packages/app/src/utils/__tests__/get-is-mobile.spec.ts +++ b/packages/app/src/utils/__tests__/get-is-mobile.spec.ts @@ -1,7 +1,7 @@ -import { describe, test, expect } from '@jest/globals'; +import { test, expect } from '@playwright/test'; import { isMobile } from '../get-is-mobile'; -describe('get-is-mobile', () => { +test.describe('get-is-mobile', () => { test('get-is-mobile', () => { expect( isMobile( diff --git a/packages/data-center/package.json b/packages/data-center/package.json index fe639b306e..d8558dc6c2 100644 --- a/packages/data-center/package.json +++ b/packages/data-center/package.json @@ -10,8 +10,8 @@ ".": "./dist/src/index.js" }, "scripts": { - "build": "tsc --project ./tsconfig.json", - "test": "playwright test" + "dev": "tsc --project ./tsconfig.json -w", + "build": "tsc --project ./tsconfig.json" }, "keywords": [], "author": "", diff --git a/packages/data-center/playwright.config.ts b/playwright.config.unit.ts similarity index 92% rename from packages/data-center/playwright.config.ts rename to playwright.config.unit.ts index a8e718991a..7a5651b631 100644 --- a/packages/data-center/playwright.config.ts +++ b/playwright.config.unit.ts @@ -1,7 +1,10 @@ +/** + * For unit tests. + */ import type { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { - testDir: './tests', + testDir: './packages/', timeout: 30 * 1000, expect: { /** diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 26f0cce6b1..4a6ca6cc7e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,6 @@ importers: .: specifiers: '@changesets/cli': ^2.26.0 - '@jest/globals': ^29.3.1 '@playwright/test': ^1.29.1 '@types/eslint': ^8.4.10 '@types/node': ^18.11.17 @@ -17,14 +16,11 @@ importers: eslint-plugin-prettier: ^4.2.1 got: ^12.5.3 husky: ^8.0.2 - jest: ^29.3.1 lint-staged: ^13.1.0 prettier: ^2.7.1 - ts-jest: ^29.0.3 typescript: ^4.9.3 devDependencies: '@changesets/cli': 2.26.0 - '@jest/globals': 29.3.1 '@playwright/test': 1.29.1 '@types/eslint': 8.4.10 '@types/node': 18.11.18 @@ -36,10 +32,8 @@ importers: eslint-plugin-prettier: 4.2.1_vkmhlldugy3fnk7p2bqhsfnaiq got: 12.5.3 husky: 8.0.2 - jest: 29.3.1_@types+node@18.11.18 lint-staged: 13.1.0 prettier: 2.7.1 - ts-jest: 29.0.3_4f6uxrzmuwipl5rr3bcogf6k74 typescript: 4.9.3 packages/app: @@ -755,15 +749,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.5: - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.5: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -811,15 +796,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.5: - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.5: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -838,16 +814,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: false - /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.5: - resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.5: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -922,16 +888,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.5: - resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.5 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.20.5: resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} engines: {node: '>=6.9.0'} @@ -1466,15 +1422,6 @@ packages: - supports-color dev: true - /@babel/types/7.19.4: - resolution: {integrity: sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - dev: true - /@babel/types/7.20.5: resolution: {integrity: sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==} engines: {node: '>=6.9.0'} @@ -1492,10 +1439,6 @@ packages: to-fast-properties: 2.0.0 dev: true - /@bcoe/v8-coverage/0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - /@blocksuite/blocks/0.3.1-20230106060050-1aad55d_yjs@13.5.44: resolution: {integrity: sha512-qRNXmhjw+GAGsV1mI2XXPxYTlHfsFHv9ttTCNQ6IIcxvc5Hh6lWmdwVibxvlpYUkgEc1zv3/GxOEsR/ngpZXzQ==} dependencies: @@ -2479,235 +2422,6 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@istanbuljs/load-nyc-config/1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - - /@istanbuljs/schema/0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - - /@jest/console/29.3.1: - resolution: {integrity: sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.3.1 - '@types/node': 18.11.18 - chalk: 4.1.2 - jest-message-util: 29.3.1 - jest-util: 29.3.1 - slash: 3.0.0 - dev: true - - /@jest/core/29.3.1: - resolution: {integrity: sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.3.1 - '@jest/reporters': 29.3.1 - '@jest/test-result': 29.3.1 - '@jest/transform': 29.3.1 - '@jest/types': 29.3.1 - '@types/node': 18.11.18 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.7.0 - exit: 0.1.2 - graceful-fs: 4.2.10 - jest-changed-files: 29.2.0 - jest-config: 29.3.1_@types+node@18.11.18 - jest-haste-map: 29.3.1 - jest-message-util: 29.3.1 - jest-regex-util: 29.2.0 - jest-resolve: 29.3.1 - jest-resolve-dependencies: 29.3.1 - jest-runner: 29.3.1 - jest-runtime: 29.3.1 - jest-snapshot: 29.3.1 - jest-util: 29.3.1 - jest-validate: 29.3.1 - jest-watcher: 29.3.1 - micromatch: 4.0.5 - pretty-format: 29.3.1 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - - /@jest/environment/29.3.1: - resolution: {integrity: sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/fake-timers': 29.3.1 - '@jest/types': 29.3.1 - '@types/node': 18.11.18 - jest-mock: 29.3.1 - dev: true - - /@jest/expect-utils/29.3.1: - resolution: {integrity: sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.2.0 - dev: true - - /@jest/expect/29.3.1: - resolution: {integrity: sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - expect: 29.3.1 - jest-snapshot: 29.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/fake-timers/29.3.1: - resolution: {integrity: sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.3.1 - '@sinonjs/fake-timers': 9.1.2 - '@types/node': 18.11.18 - jest-message-util: 29.3.1 - jest-mock: 29.3.1 - jest-util: 29.3.1 - dev: true - - /@jest/globals/29.3.1: - resolution: {integrity: sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.3.1 - '@jest/expect': 29.3.1 - '@jest/types': 29.3.1 - jest-mock: 29.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/reporters/29.3.1: - resolution: {integrity: sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.3.1 - '@jest/test-result': 29.3.1 - '@jest/transform': 29.3.1 - '@jest/types': 29.3.1 - '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 18.11.18 - chalk: 4.1.2 - collect-v8-coverage: 1.0.1 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.10 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 - jest-message-util: 29.3.1 - jest-util: 29.3.1 - jest-worker: 29.3.1 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/schemas/29.0.0: - resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.24.51 - dev: true - - /@jest/source-map/29.2.0: - resolution: {integrity: sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jridgewell/trace-mapping': 0.3.17 - callsites: 3.1.0 - graceful-fs: 4.2.10 - dev: true - - /@jest/test-result/29.3.1: - resolution: {integrity: sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.3.1 - '@jest/types': 29.3.1 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 - dev: true - - /@jest/test-sequencer/29.3.1: - resolution: {integrity: sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.3.1 - graceful-fs: 4.2.10 - jest-haste-map: 29.3.1 - slash: 3.0.0 - dev: true - - /@jest/transform/29.3.1: - resolution: {integrity: sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.20.5 - '@jest/types': 29.3.1 - '@jridgewell/trace-mapping': 0.3.17 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.10 - jest-haste-map: 29.3.1 - jest-regex-util: 29.2.0 - jest-util: 29.3.1 - micromatch: 4.0.5 - pirates: 4.0.5 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types/29.3.1: - resolution: {integrity: sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.0.0 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 18.11.18 - '@types/yargs': 17.0.15 - chalk: 4.1.2 - dev: true - /@jridgewell/gen-mapping/0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} @@ -3510,27 +3224,11 @@ packages: resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} dev: true - /@sinclair/typebox/0.24.51: - resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} - dev: true - /@sindresorhus/is/5.3.0: resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==} engines: {node: '>=14.16'} dev: true - /@sinonjs/commons/1.8.6: - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers/9.1.2: - resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} - dependencies: - '@sinonjs/commons': 1.8.6 - dev: true - /@surma/rollup-plugin-off-main-thread/2.2.3: resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} dependencies: @@ -3568,35 +3266,6 @@ packages: resolution: {integrity: sha512-GiS5Df3CzXY/fPBFcM0CKFERZfI4Cg1X33VPZX+NLo7Fwm/h9zu/aU24N1mG75Q9LuMnwKm7woxKr8BiUXGYCg==} dev: false - /@types/babel__core/7.1.20: - resolution: {integrity: sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==} - dependencies: - '@babel/parser': 7.20.5 - '@babel/types': 7.20.5 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.18.3 - dev: true - - /@types/babel__generator/7.6.4: - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} - dependencies: - '@babel/types': 7.20.5 - dev: true - - /@types/babel__template/7.4.1: - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} - dependencies: - '@babel/parser': 7.20.5 - '@babel/types': 7.20.5 - dev: true - - /@types/babel__traverse/7.18.3: - resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} - dependencies: - '@babel/types': 7.20.5 - dev: true - /@types/debug/4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: @@ -3625,12 +3294,6 @@ packages: '@types/node': 18.7.18 dev: true - /@types/graceful-fs/4.1.5: - resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} - dependencies: - '@types/node': 18.11.18 - dev: true - /@types/http-cache-semantics/4.0.1: resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} dev: true @@ -3641,22 +3304,6 @@ packages: ci-info: 3.7.0 dev: true - /@types/istanbul-lib-coverage/2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true - - /@types/istanbul-lib-report/3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - dev: true - - /@types/istanbul-reports/3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - dependencies: - '@types/istanbul-lib-report': 3.0.0 - dev: true - /@types/json-schema/7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true @@ -3700,10 +3347,6 @@ packages: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: false - /@types/prettier/2.7.1: - resolution: {integrity: sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==} - dev: true - /@types/prop-types/15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} @@ -3763,10 +3406,6 @@ packages: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true - /@types/stack-utils/2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - dev: true - /@types/trusted-types/2.0.2: resolution: {integrity: sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==} @@ -3774,16 +3413,6 @@ packages: resolution: {integrity: sha512-UYK244awtmcUYQfs7FR8710MJcefL2WvkyHMjA8yJzxd1mo0Gfn88sRZ1Bls7hiUhA2w7ne1gpJ9T5g3G0wOyA==} dev: true - /@types/yargs-parser/21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: true - - /@types/yargs/17.0.15: - resolution: {integrity: sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg==} - dependencies: - '@types/yargs-parser': 21.0.0 - 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} @@ -4041,24 +3670,11 @@ packages: dependencies: color-convert: 2.0.1 - /ansi-styles/5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - /ansi-styles/6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} dev: true - /anymatch/3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - /argparse/1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: @@ -4176,24 +3792,6 @@ packages: resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} dev: true - /babel-jest/29.3.1_@babel+core@7.20.5: - resolution: {integrity: sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.20.5 - '@jest/transform': 29.3.1 - '@types/babel__core': 7.1.20 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.2.0_@babel+core@7.20.5 - chalk: 4.1.2 - graceful-fs: 4.2.10 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /babel-loader/8.3.0: resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} @@ -4207,29 +3805,6 @@ packages: schema-utils: 2.7.1 dev: true - /babel-plugin-istanbul/6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.19.0 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-jest-hoist/29.2.0: - resolution: {integrity: sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.20.5 - '@types/babel__core': 7.1.20 - '@types/babel__traverse': 7.18.3 - dev: true - /babel-plugin-macros/3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -4275,37 +3850,6 @@ packages: - supports-color dev: true - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.20.5: - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.20.5 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.5 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.5 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.20.5 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.5 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.5 - dev: true - - /babel-preset-jest/29.2.0_@babel+core@7.20.5: - resolution: {integrity: sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.20.5 - babel-plugin-jest-hoist: 29.2.0 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.5 - dev: true - /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -4367,19 +3911,6 @@ packages: update-browserslist-db: 1.0.10_browserslist@4.21.4 dev: true - /bs-logger/0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - - /bser/2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true - /buffer-from/0.1.2: resolution: {integrity: sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==} dev: false @@ -4442,11 +3973,6 @@ packages: engines: {node: '>=6'} dev: true - /camelcase/6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - /caniuse-lite/1.0.30001419: resolution: {integrity: sha512-aFO1r+g6R7TW+PNQxKzjITwLOyDhVRLjW0LcwS/HCZGUUKTGNp9+IwLC4xyDSZBygVL/mxaFR3HIV6wEKQuSzw==} @@ -4466,11 +3992,6 @@ packages: supports-color: 7.2.0 dev: true - /char-regex/1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - dev: true - /chardet/0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true @@ -4480,10 +4001,6 @@ packages: engines: {node: '>=8'} dev: true - /cjs-module-lexer/1.2.2: - resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} - dev: true - /clean-stack/2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -4578,15 +4095,6 @@ packages: - '@types/react' dev: false - /co/4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - - /collect-v8-coverage/1.0.1: - resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} - dev: true - /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -4637,10 +4145,6 @@ packages: /convert-source-map/1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - /convert-source-map/2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - /core-js-compat/3.27.1: resolution: {integrity: sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==} dependencies: @@ -4786,10 +4290,6 @@ packages: mimic-response: 3.1.0 dev: true - /dedent/0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true - /deep-equal/1.1.1: resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} dependencies: @@ -4846,20 +4346,10 @@ packages: engines: {node: '>=8'} dev: true - /detect-newline/3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true - /detect-node-es/1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false - /diff-sequences/29.3.1: - resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - /dir-glob/3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -4920,11 +4410,6 @@ packages: resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} dev: true - /emittery/0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - dev: true - /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -5011,11 +4496,6 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - /escape-string-regexp/2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true - /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -5595,21 +5075,6 @@ packages: resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==} dev: false - /execa/5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - /execa/6.1.0: resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5625,22 +5090,6 @@ packages: strip-final-newline: 3.0.0 dev: true - /exit/0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - dev: true - - /expect/29.3.1: - resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': 29.3.1 - jest-get-type: 29.2.0 - jest-matcher-utils: 29.3.1 - jest-message-util: 29.3.1 - jest-util: 29.3.1 - dev: true - /extend/3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: false @@ -5708,12 +5157,6 @@ packages: websocket-driver: 0.7.4 dev: false - /fb-watchman/2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 - dev: true - /fetch-blob/3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} @@ -5928,11 +5371,6 @@ packages: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} dev: true - /get-package-type/0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - /get-stream/6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -6107,10 +5545,6 @@ packages: resolution: {integrity: sha512-mshqjgTqx8ee0qryHvRgZaZDxTwxam/2yTQmQlqAWS3+twnq1jsY9Yng9zB7lWq6WRrjTbTOc7knNwccXQiAjQ==} dev: false - /html-escaper/2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - /html-parse-stringify/3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} dependencies: @@ -6147,11 +5581,6 @@ packages: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} dev: true - /human-signals/2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - /human-signals/3.0.1: resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} engines: {node: '>=12.20.0'} @@ -6213,15 +5642,6 @@ packages: parent-module: 1.0.1 resolve-from: 4.0.0 - /import-local/3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - /imurmurhash/0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -6319,11 +5739,6 @@ packages: engines: {node: '>=12'} dev: true - /is-generator-fn/2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true - /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -6462,52 +5877,6 @@ packages: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} dev: false - /istanbul-lib-coverage/3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-instrument/5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.20.5 - '@babel/parser': 7.20.5 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-report/3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 - supports-color: 7.2.0 - dev: true - - /istanbul-lib-source-maps/4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports/3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 - dev: true - /jake/10.8.5: resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} engines: {node: '>=10'} @@ -6519,385 +5888,6 @@ packages: minimatch: 3.1.2 dev: true - /jest-changed-files/29.2.0: - resolution: {integrity: sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - execa: 5.1.1 - p-limit: 3.1.0 - dev: true - - /jest-circus/29.3.1: - resolution: {integrity: sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.3.1 - '@jest/expect': 29.3.1 - '@jest/test-result': 29.3.1 - '@jest/types': 29.3.1 - '@types/node': 18.11.18 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - is-generator-fn: 2.1.0 - jest-each: 29.3.1 - jest-matcher-utils: 29.3.1 - jest-message-util: 29.3.1 - jest-runtime: 29.3.1 - jest-snapshot: 29.3.1 - jest-util: 29.3.1 - p-limit: 3.1.0 - pretty-format: 29.3.1 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-cli/29.3.1_@types+node@18.11.18: - resolution: {integrity: sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.3.1 - '@jest/test-result': 29.3.1 - '@jest/types': 29.3.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.10 - import-local: 3.1.0 - jest-config: 29.3.1_@types+node@18.11.18 - jest-util: 29.3.1 - jest-validate: 29.3.1 - prompts: 2.4.2 - yargs: 17.6.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - - /jest-config/29.3.1_@types+node@18.11.18: - resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.20.5 - '@jest/test-sequencer': 29.3.1 - '@jest/types': 29.3.1 - '@types/node': 18.11.18 - babel-jest: 29.3.1_@babel+core@7.20.5 - chalk: 4.1.2 - ci-info: 3.7.0 - deepmerge: 4.2.2 - glob: 7.2.3 - graceful-fs: 4.2.10 - jest-circus: 29.3.1 - jest-environment-node: 29.3.1 - jest-get-type: 29.2.0 - jest-regex-util: 29.2.0 - jest-resolve: 29.3.1 - jest-runner: 29.3.1 - jest-util: 29.3.1 - jest-validate: 29.3.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.3.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-diff/29.3.1: - resolution: {integrity: sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.3.1 - jest-get-type: 29.2.0 - pretty-format: 29.3.1 - dev: true - - /jest-docblock/29.2.0: - resolution: {integrity: sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - detect-newline: 3.1.0 - dev: true - - /jest-each/29.3.1: - resolution: {integrity: sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.3.1 - chalk: 4.1.2 - jest-get-type: 29.2.0 - jest-util: 29.3.1 - pretty-format: 29.3.1 - dev: true - - /jest-environment-node/29.3.1: - resolution: {integrity: sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.3.1 - '@jest/fake-timers': 29.3.1 - '@jest/types': 29.3.1 - '@types/node': 18.11.18 - jest-mock: 29.3.1 - jest-util: 29.3.1 - dev: true - - /jest-get-type/29.2.0: - resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-haste-map/29.3.1: - resolution: {integrity: sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.3.1 - '@types/graceful-fs': 4.1.5 - '@types/node': 18.11.18 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.10 - jest-regex-util: 29.2.0 - jest-util: 29.3.1 - jest-worker: 29.3.1 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /jest-leak-detector/29.3.1: - resolution: {integrity: sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.2.0 - pretty-format: 29.3.1 - dev: true - - /jest-matcher-utils/29.3.1: - resolution: {integrity: sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 29.3.1 - jest-get-type: 29.2.0 - pretty-format: 29.3.1 - dev: true - - /jest-message-util/29.3.1: - resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.18.6 - '@jest/types': 29.3.1 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.10 - micromatch: 4.0.5 - pretty-format: 29.3.1 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - - /jest-mock/29.3.1: - resolution: {integrity: sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.3.1 - '@types/node': 18.11.18 - jest-util: 29.3.1 - dev: true - - /jest-pnp-resolver/1.2.3_jest-resolve@29.3.1: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 29.3.1 - dev: true - - /jest-regex-util/29.2.0: - resolution: {integrity: sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-resolve-dependencies/29.3.1: - resolution: {integrity: sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-regex-util: 29.2.0 - jest-snapshot: 29.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-resolve/29.3.1: - resolution: {integrity: sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.10 - jest-haste-map: 29.3.1 - jest-pnp-resolver: 1.2.3_jest-resolve@29.3.1 - jest-util: 29.3.1 - jest-validate: 29.3.1 - resolve: 1.22.1 - resolve.exports: 1.1.0 - slash: 3.0.0 - dev: true - - /jest-runner/29.3.1: - resolution: {integrity: sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.3.1 - '@jest/environment': 29.3.1 - '@jest/test-result': 29.3.1 - '@jest/transform': 29.3.1 - '@jest/types': 29.3.1 - '@types/node': 18.11.18 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.10 - jest-docblock: 29.2.0 - jest-environment-node: 29.3.1 - jest-haste-map: 29.3.1 - jest-leak-detector: 29.3.1 - jest-message-util: 29.3.1 - jest-resolve: 29.3.1 - jest-runtime: 29.3.1 - jest-util: 29.3.1 - jest-watcher: 29.3.1 - jest-worker: 29.3.1 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-runtime/29.3.1: - resolution: {integrity: sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.3.1 - '@jest/fake-timers': 29.3.1 - '@jest/globals': 29.3.1 - '@jest/source-map': 29.2.0 - '@jest/test-result': 29.3.1 - '@jest/transform': 29.3.1 - '@jest/types': 29.3.1 - '@types/node': 18.11.18 - chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 - glob: 7.2.3 - graceful-fs: 4.2.10 - jest-haste-map: 29.3.1 - jest-message-util: 29.3.1 - jest-mock: 29.3.1 - jest-regex-util: 29.2.0 - jest-resolve: 29.3.1 - jest-snapshot: 29.3.1 - jest-util: 29.3.1 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-snapshot/29.3.1: - resolution: {integrity: sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.20.5 - '@babel/generator': 7.20.5 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.5 - '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.5 - '@babel/traverse': 7.20.5 - '@babel/types': 7.19.4 - '@jest/expect-utils': 29.3.1 - '@jest/transform': 29.3.1 - '@jest/types': 29.3.1 - '@types/babel__traverse': 7.18.3 - '@types/prettier': 2.7.1 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.5 - chalk: 4.1.2 - expect: 29.3.1 - graceful-fs: 4.2.10 - jest-diff: 29.3.1 - jest-get-type: 29.2.0 - jest-haste-map: 29.3.1 - jest-matcher-utils: 29.3.1 - jest-message-util: 29.3.1 - jest-util: 29.3.1 - natural-compare: 1.4.0 - pretty-format: 29.3.1 - semver: 7.3.7 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-util/29.3.1: - resolution: {integrity: sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.3.1 - '@types/node': 18.11.18 - chalk: 4.1.2 - ci-info: 3.7.0 - graceful-fs: 4.2.10 - picomatch: 2.3.1 - dev: true - - /jest-validate/29.3.1: - resolution: {integrity: sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.3.1 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.2.0 - leven: 3.1.0 - pretty-format: 29.3.1 - dev: true - - /jest-watcher/29.3.1: - resolution: {integrity: sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.3.1 - '@jest/types': 29.3.1 - '@types/node': 18.11.18 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.3.1 - string-length: 4.0.2 - dev: true - /jest-worker/26.6.2: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} @@ -6916,36 +5906,6 @@ packages: supports-color: 8.1.1 dev: true - /jest-worker/29.3.1: - resolution: {integrity: sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@types/node': 18.11.18 - jest-util: 29.3.1 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest/29.3.1_@types+node@18.11.18: - resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.3.1 - '@jest/types': 29.3.1 - import-local: 3.1.0 - jest-cli: 29.3.1_@types+node@18.11.18 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - dev: true - /js-sdsl/4.2.0: resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==} dev: true @@ -7052,11 +6012,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /kleur/3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true - /kleur/4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -7245,10 +6200,6 @@ packages: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true - /lodash.memoize/4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true - /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -7325,16 +6276,6 @@ 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: - tmpl: 1.0.5 - dev: true - /map-obj/1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} @@ -7612,10 +6553,6 @@ packages: formdata-polyfill: 4.0.10 dev: false - /node-int64/0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true - /node-releases/2.0.6: resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} dev: true @@ -7639,13 +6576,6 @@ packages: engines: {node: '>=14.16'} dev: true - /npm-run-path/4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - /npm-run-path/5.1.0: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7909,11 +6839,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /pirates/4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} - engines: {node: '>= 6'} - dev: true - /pkg-dir/4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -7966,27 +6891,10 @@ packages: engines: {node: '>=6'} dev: true - /pretty-format/29.3.1: - resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.0.0 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - /process-nextick-args/2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false - /prompts/2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: true - /prop-types/15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: @@ -8128,6 +7036,7 @@ packages: /react-is/18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: false /react-remove-scroll-bar/2.3.4_w5j4k42lgipnm43s3brx6h3c34: resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} @@ -8352,13 +7261,6 @@ packages: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} dev: true - /resolve-cwd/3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - dependencies: - resolve-from: 5.0.0 - dev: true - /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -8368,11 +7270,6 @@ packages: engines: {node: '>=8'} dev: true - /resolve.exports/1.1.0: - resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} - engines: {node: '>=10'} - dev: true - /resolve/1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} dependencies: @@ -8579,10 +7476,6 @@ packages: - supports-color dev: false - /sisteransi/1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true - /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -8635,13 +7528,6 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - /source-map-support/0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - /source-map-support/0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: @@ -8704,13 +7590,6 @@ packages: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true - /stack-utils/2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - dev: true - /stream-transform/2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} dependencies: @@ -8722,14 +7601,6 @@ packages: engines: {node: '>=0.6.19'} dev: true - /string-length/4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: true - /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -8819,21 +7690,11 @@ packages: engines: {node: '>=4'} dev: true - /strip-bom/4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - /strip-comments/2.0.1: resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} engines: {node: '>=10'} dev: true - /strip-final-newline/2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - /strip-final-newline/3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -8974,15 +7835,6 @@ packages: source-map-support: 0.5.21 dev: true - /test-exclude/6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - /text-table/0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -9004,10 +7856,6 @@ packages: os-tmpdir: 1.0.2 dev: true - /tmpl/1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true - /to-fast-properties/2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -9041,39 +7889,6 @@ packages: engines: {node: '>=8'} dev: true - /ts-jest/29.0.3_4f6uxrzmuwipl5rr3bcogf6k74: - resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.3.1_@types+node@18.11.18 - jest-util: 29.3.1 - json5: 2.2.1 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.3.7 - typescript: 4.9.3 - yargs-parser: 21.1.1 - dev: true - /tsconfig-paths/3.14.1: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: @@ -9137,11 +7952,6 @@ packages: prelude-ls: 1.2.1 dev: true - /type-detect/4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - /type-fest/0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} @@ -9328,15 +8138,6 @@ packages: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /v8-to-istanbul/9.0.1: - resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.17 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - dev: true - /validate-npm-package-license/3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -9349,12 +8150,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /walker/1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - /wcwidth/1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: @@ -9648,14 +8443,6 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /write-file-atomic/4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - /ws/7.5.9: resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} From 0179ad567ea00b809da6d5a1c2fce64c5f0a5277 Mon Sep 17 00:00:00 2001 From: alt0 Date: Mon, 9 Jan 2023 11:32:00 +0800 Subject: [PATCH 47/60] chore: move ci.js to ci.cjs --- .github/workflows/build-test-version.yml | 2 +- .github/workflows/build.yml | 2 +- .github/workflows/tests.yml | 2 +- .gitignore | 1 + .pnpmfile.cjs | 4 ++-- scripts/module-resolve/{ci.js => ci.cjs} | 7 ++----- 6 files changed, 8 insertions(+), 10 deletions(-) rename scripts/module-resolve/{ci.js => ci.cjs} (81%) diff --git a/.github/workflows/build-test-version.yml b/.github/workflows/build-test-version.yml index 3862fefa32..9eb1aaf6d4 100644 --- a/.github/workflows/build-test-version.yml +++ b/.github/workflows/build-test-version.yml @@ -36,7 +36,7 @@ jobs: scope: '@toeverything' cache: 'pnpm' - - run: node scripts/module-resolve/ci.js + - run: node scripts/module-resolve/ci.cjs - name: Restore cache uses: actions/cache@v3 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bcc0166423..6d0c262639 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -244,7 +244,7 @@ jobs: scope: '@toeverything' cache: 'pnpm' - - run: node scripts/module-resolve/ci.js + - run: node scripts/module-resolve/ci.cjs - name: Restore cache uses: actions/cache@v3 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 94d64c8f46..00ce55b51c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -23,7 +23,7 @@ jobs: scope: '@toeverything' cache: 'pnpm' - - run: node scripts/module-resolve/ci.js + - run: node scripts/module-resolve/ci.cjs - name: Install dependencies run: pnpm install --no-frozen-lockfile diff --git a/.gitignore b/.gitignore index 24bb279128..f9333264dc 100644 --- a/.gitignore +++ b/.gitignore @@ -48,6 +48,7 @@ Thumbs.db out/ module-resolve.js +module-resolve.cjs /test-results/ /playwright-report/ /playwright/.cache/ diff --git a/.pnpmfile.cjs b/.pnpmfile.cjs index 4873d9492c..d2541eb7e9 100644 --- a/.pnpmfile.cjs +++ b/.pnpmfile.cjs @@ -1,11 +1,11 @@ const fs = require('fs'); function getCustomize() { - const customed = fs.existsSync('./module-resolve.js'); + const customed = fs.existsSync('./module-resolve.cjs'); if (!customed) { return null; } - const script = require('./module-resolve.js'); + const script = require('./module-resolve.cjs'); return script && script.resolve; } diff --git a/scripts/module-resolve/ci.js b/scripts/module-resolve/ci.cjs similarity index 81% rename from scripts/module-resolve/ci.js rename to scripts/module-resolve/ci.cjs index 44c57a08d8..05b8b4c19f 100644 --- a/scripts/module-resolve/ci.js +++ b/scripts/module-resolve/ci.cjs @@ -2,12 +2,9 @@ const fs = require('fs'); const path = require('path'); const templatePath = path.resolve(__dirname, 'module-resolve.tmpl.js'); -const destinationPath = path.resolve(__dirname, '../../module-resolve.js'); +const destinationPath = path.resolve(__dirname, '../../module-resolve.cjs'); console.log('template path', templatePath); console.log('destination path', destinationPath); -fs.copyFileSync( - templatePath, - destinationPath -); +fs.copyFileSync(templatePath, destinationPath); From c8dde3b3cae33c0eb57b1e6da932f57344d3841b Mon Sep 17 00:00:00 2001 From: x1a0t <405028157@qq.com> Date: Mon, 9 Jan 2023 11:32:33 +0800 Subject: [PATCH 48/60] feat: update Hyperlink prompt --- packages/app/src/components/shortcuts-modal/config.ts | 4 ++-- packages/app/src/libs/i18n/resources/en.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/app/src/components/shortcuts-modal/config.ts b/packages/app/src/components/shortcuts-modal/config.ts index 01740539fd..95dd4c5b63 100644 --- a/packages/app/src/components/shortcuts-modal/config.ts +++ b/packages/app/src/components/shortcuts-modal/config.ts @@ -13,7 +13,7 @@ export const useMacKeyboardShortcuts = (): ShortcutTip => { [t('Strikethrough')]: '⌘+⇧+S', [t('Inline code')]: ' ⌘+E', [t('Code block')]: '⌘+⌥+C', - [t('Hyperlink')]: '⌘+K', + [t('Hyperlink(with selected text)')]: '⌘+K', [t('Quick search')]: '⌘+K', [t('Body text')]: '⌘+⌥+0', [t('Heading', { number: '1' })]: '⌘+⌥+1', @@ -57,7 +57,7 @@ export const useWindowsKeyboardShortcuts = (): ShortcutTip => { [t('Strikethrough')]: 'Ctrl+Shift+S', [t('Inline code')]: ' Ctrl+E', [t('Code block')]: 'Ctrl+Alt+C', - [t('Hyperlink')]: 'Ctrl+K', + [t('Hyperlink(with selected text)')]: 'Ctrl+K', [t('Quick search')]: 'Ctrl+K', [t('Body text')]: 'Ctrl+Shift+0', [t('Heading', { number: '1' })]: 'Ctrl+Shift+1', diff --git a/packages/app/src/libs/i18n/resources/en.json b/packages/app/src/libs/i18n/resources/en.json index 7f9acabc64..af7d5c03d4 100644 --- a/packages/app/src/libs/i18n/resources/en.json +++ b/packages/app/src/libs/i18n/resources/en.json @@ -54,7 +54,7 @@ "Strikethrough": "Strikethrough", "Inline code": "Inline code", "Code block": "Code block", - "Hyperlink": "Hyperlink", + "Hyperlink(with selected text)": "Hyperlink(with selected text)", "Body text": "Body text", "Heading": "Heading {{number}}", "Increase indent": "Increase indent", From 974fabb2af9ec0fcf42cbfd2f814de681aaa8f9e Mon Sep 17 00:00:00 2001 From: alt0 Date: Mon, 9 Jan 2023 11:45:56 +0800 Subject: [PATCH 49/60] chore: move i18n ci scripts to scripts --- {packages/app/src/libs/i18n/scripts => scripts/i18n}/api.ts | 0 {packages/app/src/libs/i18n/scripts => scripts/i18n}/download.ts | 0 {packages/app/src/libs/i18n/scripts => scripts/i18n}/request.ts | 0 {packages/app/src/libs/i18n/scripts => scripts/i18n}/sync.ts | 0 {packages/app/src/libs/i18n/scripts => scripts/i18n}/utils.ts | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {packages/app/src/libs/i18n/scripts => scripts/i18n}/api.ts (100%) rename {packages/app/src/libs/i18n/scripts => scripts/i18n}/download.ts (100%) rename {packages/app/src/libs/i18n/scripts => scripts/i18n}/request.ts (100%) rename {packages/app/src/libs/i18n/scripts => scripts/i18n}/sync.ts (100%) rename {packages/app/src/libs/i18n/scripts => scripts/i18n}/utils.ts (100%) diff --git a/packages/app/src/libs/i18n/scripts/api.ts b/scripts/i18n/api.ts similarity index 100% rename from packages/app/src/libs/i18n/scripts/api.ts rename to scripts/i18n/api.ts diff --git a/packages/app/src/libs/i18n/scripts/download.ts b/scripts/i18n/download.ts similarity index 100% rename from packages/app/src/libs/i18n/scripts/download.ts rename to scripts/i18n/download.ts diff --git a/packages/app/src/libs/i18n/scripts/request.ts b/scripts/i18n/request.ts similarity index 100% rename from packages/app/src/libs/i18n/scripts/request.ts rename to scripts/i18n/request.ts diff --git a/packages/app/src/libs/i18n/scripts/sync.ts b/scripts/i18n/sync.ts similarity index 100% rename from packages/app/src/libs/i18n/scripts/sync.ts rename to scripts/i18n/sync.ts diff --git a/packages/app/src/libs/i18n/scripts/utils.ts b/scripts/i18n/utils.ts similarity index 100% rename from packages/app/src/libs/i18n/scripts/utils.ts rename to scripts/i18n/utils.ts From 7a5786f2a2a248f6d0f91ce010eb80249984ea17 Mon Sep 17 00:00:00 2001 From: DarkSky Date: Mon, 9 Jan 2023 11:49:37 +0800 Subject: [PATCH 50/60] feat: update deps --- package.json | 12 +++---- packages/app/package.json | 8 ++--- pnpm-lock.yaml | 73 ++++++++++++++++++++++++++++++++------- 3 files changed, 71 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 7c9ac38d11..7af0aa43a4 100644 --- a/package.json +++ b/package.json @@ -25,24 +25,24 @@ "*.{ts,tsx,js,jsx}": "npx eslint --cache --fix" }, "devDependencies": { + "@changesets/cli": "^2.26.0", "@jest/globals": "^29.3.1", "@playwright/test": "^1.29.1", - "@typescript-eslint/eslint-plugin": "^5.47.0", - "@typescript-eslint/parser": "^5.47.0", "@types/eslint": "^8.4.10", "@types/node": "^18.11.17", + "@typescript-eslint/eslint-plugin": "^5.47.0", + "@typescript-eslint/parser": "^5.47.0", "eslint": "^8.30.0", "eslint-config-next": "12.3.1", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.2.1", "got": "^12.5.3", + "husky": "^8.0.2", "jest": "^29.3.1", + "lint-staged": "^13.1.0", "prettier": "^2.7.1", "ts-jest": "^29.0.3", - "typescript": "^4.9.3", - "lint-staged": "^13.1.0", - "husky": "^8.0.2", - "@changesets/cli": "^2.26.0" + "typescript": "^4.9.3" }, "eslintConfig": { "root": true, diff --git a/packages/app/package.json b/packages/app/package.json index 3ba74e2712..16fd889fd7 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -10,10 +10,10 @@ }, "dependencies": { "@affine/datacenter": "workspace:*", - "@blocksuite/blocks": "=0.3.1-20230106060050-1aad55d", - "@blocksuite/editor": "=0.3.1-20230106060050-1aad55d", + "@blocksuite/blocks": "0.3.1-20230109032243-37ad3ba", + "@blocksuite/editor": "0.3.1-20230109032243-37ad3ba", "@blocksuite/icons": "^2.0.2", - "@blocksuite/store": "=0.3.1-20230106060050-1aad55d", + "@blocksuite/store": "0.3.1-20230109032243-37ad3ba", "@emotion/css": "^11.10.0", "@emotion/react": "^11.10.4", "@emotion/server": "^11.10.0", @@ -49,8 +49,8 @@ "eslint-config-next": "12.3.1", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.2.1", - "raw-loader": "^4.0.2", "next-pwa": "^5.6.0", + "raw-loader": "^4.0.2", "typescript": "4.8.3" }, "eslintConfig": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 26f0cce6b1..5e5b9dbf96 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,10 +45,10 @@ importers: packages/app: specifiers: '@affine/datacenter': workspace:* - '@blocksuite/blocks': '=0.3.1-20230106060050-1aad55d' - '@blocksuite/editor': '=0.3.1-20230106060050-1aad55d' + '@blocksuite/blocks': 0.3.1-20230109032243-37ad3ba + '@blocksuite/editor': 0.3.1-20230109032243-37ad3ba '@blocksuite/icons': ^2.0.2 - '@blocksuite/store': '=0.3.1-20230106060050-1aad55d' + '@blocksuite/store': 0.3.1-20230109032243-37ad3ba '@emotion/css': ^11.10.0 '@emotion/react': ^11.10.4 '@emotion/server': ^11.10.0 @@ -87,10 +87,10 @@ importers: yjs: ^13.5.44 dependencies: '@affine/datacenter': link:../data-center - '@blocksuite/blocks': 0.3.1-20230106060050-1aad55d_yjs@13.5.44 - '@blocksuite/editor': 0.3.1-20230106060050-1aad55d_yjs@13.5.44 + '@blocksuite/blocks': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 + '@blocksuite/editor': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 '@blocksuite/icons': 2.0.4_w5j4k42lgipnm43s3brx6h3c34 - '@blocksuite/store': 0.3.1-20230106060050-1aad55d_yjs@13.5.44 + '@blocksuite/store': 0.3.1-20230109032243-37ad3ba_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 @@ -1516,11 +1516,31 @@ packages: - yjs dev: false - /@blocksuite/editor/0.3.1-20230106060050-1aad55d_yjs@13.5.44: - resolution: {integrity: sha512-wSlAF9XVxIkHFJ1qCzn7oQ/gwXybFYMrzRl35UTJV509D+DuWZefRZWvpdIDCOUJ24uQscr1HxwsON11ltfWgA==} + /@blocksuite/blocks/0.3.1-20230109032243-37ad3ba_yjs@13.5.44: + resolution: {integrity: sha512-UTlbk0Is7TMRBbvUyM2nivbqM/TLwRj1qArMYbOmvDGUNYadWo68cTwv/Ej2WwiKn22q4/4JHryGsv3gTCRz1Q==} dependencies: - '@blocksuite/blocks': 0.3.1-20230106060050-1aad55d_yjs@13.5.44 - '@blocksuite/store': 0.3.1-20230106060050-1aad55d_yjs@13.5.44 + '@blocksuite/phasor': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 + '@blocksuite/store': 0.3.1-20230109032243-37ad3ba_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 + perfect-freehand: 1.2.0 + quill: 1.3.7 + quill-cursors: 4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + - yjs + dev: false + + /@blocksuite/editor/0.3.1-20230109032243-37ad3ba_yjs@13.5.44: + resolution: {integrity: sha512-bYbMn4EL/od+xP4K3u2kJT08kJBpK6H7b4cbRb9No3SUwgNHvvVNxia/QH1AQXyKaZQj/DHFgVxrw9GKo2GIPA==} + 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 marked: 4.2.5 turndown: 7.1.1 @@ -1541,6 +1561,14 @@ packages: react: 18.2.0 dev: false + /@blocksuite/phasor/0.3.1-20230109032243-37ad3ba_yjs@13.5.44: + resolution: {integrity: sha512-mL1gSQ3rzrjdQSbWPtgyMXpbbl266UUjw26d0aIjkOh+iMMI6rWtmKWDoiDkO7tejIjwSNQ4w5zJOjJRIj+mSA==} + peerDependencies: + yjs: ^13 + dependencies: + yjs: 13.5.44 + dev: false + /@blocksuite/phasor/0.3.1_yjs@13.5.44: resolution: {integrity: sha512-aJmAQn2qoF6HxFZWgq7xa/pWVyzg3MmD6dynIHAKdfN7rBdKk3PNA+lRX919QkD2e270N/zgHEGFFQI1Nj5xrA==} peerDependencies: @@ -1570,6 +1598,27 @@ packages: - utf-8-validate 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 + /@changesets/apply-release-plan/6.1.3: resolution: {integrity: sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg==} dependencies: @@ -7172,8 +7221,8 @@ packages: /lit-element/3.2.2: resolution: {integrity: sha512-6ZgxBR9KNroqKb6+htkyBwD90XGRiqKDHVrW/Eh0EZ+l+iC+u+v+w3/BA5NGi4nizAVHGYvQBHUDuSmLjPp7NQ==} dependencies: - '@lit/reactive-element': 1.4.1 - lit-html: 2.4.0 + '@lit/reactive-element': 1.5.0 + lit-html: 2.5.0 dev: false /lit-html/2.4.0: From 225dc61521e4e38f99c97bf6cca8b7186f77aa05 Mon Sep 17 00:00:00 2001 From: DarkSky Date: Mon, 9 Jan 2023 11:52:28 +0800 Subject: [PATCH 51/60] chore: cleanup jest config --- .eslintignore | 1 - packages/app/jest.config.js | 5 ----- 2 files changed, 6 deletions(-) delete mode 100644 packages/app/jest.config.js diff --git a/.eslintignore b/.eslintignore index f2e3541e4c..4e1862166b 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,5 +1,4 @@ **/webpack.config.js -**/jest.config.js **/scripts/*.js **/node_modules/** .github/** diff --git a/packages/app/jest.config.js b/packages/app/jest.config.js deleted file mode 100644 index 3745fc2237..0000000000 --- a/packages/app/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', -}; From c7409bef84c70c1a1611fd8ffc2e60d63b3a03bd Mon Sep 17 00:00:00 2001 From: DarkSky Date: Mon, 9 Jan 2023 12:00:16 +0800 Subject: [PATCH 52/60] fix: deps --- packages/data-center/package.json | 8 +++-- pnpm-lock.yaml | 57 +++---------------------------- 2 files changed, 10 insertions(+), 55 deletions(-) diff --git a/packages/data-center/package.json b/packages/data-center/package.json index d8558dc6c2..9f9fc2d860 100644 --- a/packages/data-center/package.json +++ b/packages/data-center/package.json @@ -26,8 +26,8 @@ "typescript": "^4.8.4" }, "dependencies": { - "@blocksuite/blocks": "=0.3.1-20230106060050-1aad55d", - "@blocksuite/store": "=0.3.1-20230106060050-1aad55d", + "@blocksuite/blocks": "^0.3.1-20230109032243-37ad3ba", + "@blocksuite/store": "^0.3.1-20230109032243-37ad3ba", "debug": "^4.3.4", "encoding": "^0.1.13", "firebase": "^9.15.0", @@ -38,5 +38,9 @@ "swr": "^2.0.0", "yjs": "^13.5.44", "y-protocols": "^1.0.5" + }, + "peerDependencies": { + "@blocksuite/blocks": "0.3.1-*", + "@blocksuite/store": "0.3.1-*" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ce47beaee7..f12779edb4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -125,8 +125,8 @@ importers: packages/data-center: specifiers: - '@blocksuite/blocks': '=0.3.1-20230106060050-1aad55d' - '@blocksuite/store': '=0.3.1-20230106060050-1aad55d' + '@blocksuite/blocks': ^0.3.1-20230109032243-37ad3ba + '@blocksuite/store': ^0.3.1-20230109032243-37ad3ba '@playwright/test': ^1.29.1 '@types/debug': ^4.1.7 debug: ^4.3.4 @@ -142,8 +142,8 @@ importers: y-protocols: ^1.0.5 yjs: ^13.5.44 dependencies: - '@blocksuite/blocks': 0.3.1-20230106060050-1aad55d_yjs@13.5.44 - '@blocksuite/store': 0.3.1-20230106060050-1aad55d_yjs@13.5.44 + '@blocksuite/blocks': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 + '@blocksuite/store': 0.3.1-20230109032243-37ad3ba_yjs@13.5.44 debug: 4.3.4 encoding: 0.1.13 firebase: 9.15.0_encoding@0.1.13 @@ -1439,26 +1439,6 @@ packages: to-fast-properties: 2.0.0 dev: true - /@blocksuite/blocks/0.3.1-20230106060050-1aad55d_yjs@13.5.44: - resolution: {integrity: sha512-qRNXmhjw+GAGsV1mI2XXPxYTlHfsFHv9ttTCNQ6IIcxvc5Hh6lWmdwVibxvlpYUkgEc1zv3/GxOEsR/ngpZXzQ==} - dependencies: - '@blocksuite/phasor': 0.3.1_yjs@13.5.44 - '@blocksuite/store': 0.3.1-20230106060050-1aad55d_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 - perfect-freehand: 1.2.0 - quill: 1.3.7 - quill-cursors: 4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - yjs - dev: false - /@blocksuite/blocks/0.3.1-20230109032243-37ad3ba_yjs@13.5.44: resolution: {integrity: sha512-UTlbk0Is7TMRBbvUyM2nivbqM/TLwRj1qArMYbOmvDGUNYadWo68cTwv/Ej2WwiKn22q4/4JHryGsv3gTCRz1Q==} dependencies: @@ -1512,35 +1492,6 @@ packages: yjs: 13.5.44 dev: false - /@blocksuite/phasor/0.3.1_yjs@13.5.44: - resolution: {integrity: sha512-aJmAQn2qoF6HxFZWgq7xa/pWVyzg3MmD6dynIHAKdfN7rBdKk3PNA+lRX919QkD2e270N/zgHEGFFQI1Nj5xrA==} - peerDependencies: - yjs: ^13 - dependencies: - yjs: 13.5.44 - dev: false - - /@blocksuite/store/0.3.1-20230106060050-1aad55d_yjs@13.5.44: - resolution: {integrity: sha512-dRy+YzlWMwiYq0Im9NogK/NTkV+NKK+lgejYq56m6nH2m16/G9AMODqP0oQy/XeYFevUpL9i9RdV0rHsJ2gc0Q==} - 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-20230109032243-37ad3ba_yjs@13.5.44: resolution: {integrity: sha512-zOUz19jfhuhsUkx9BGEQPZWbPyD/AgX0LB7ShVRdd3YM73x25hD6tPLLz1HEV2b69XokC0P9oSru4aNomm4jkg==} peerDependencies: From 7f8a577bd2984880ad302364aaa4bfec3e028dba Mon Sep 17 00:00:00 2001 From: JimmFly Date: Mon, 9 Jan 2023 12:07:17 +0800 Subject: [PATCH 53/60] chore: update i18n keys --- .../src/components/create-workspace/index.tsx | 11 +- .../src/components/edgeless-toolbar/index.tsx | 124 +++++++++--------- .../app/src/components/file-upload/index.tsx | 4 +- .../header-right-items/trash-button-group.tsx | 14 +- packages/app/src/libs/i18n/resources/en.json | 18 ++- 5 files changed, 95 insertions(+), 76 deletions(-) diff --git a/packages/app/src/components/create-workspace/index.tsx b/packages/app/src/components/create-workspace/index.tsx index d2decdfe4e..05c37f9900 100644 --- a/packages/app/src/components/create-workspace/index.tsx +++ b/packages/app/src/components/create-workspace/index.tsx @@ -5,6 +5,7 @@ import { useState } from 'react'; import Input from '@/ui/input'; import { useTemporaryHelper } from '@/providers/temporary-helper-provider'; import { KeyboardEvent } from 'react'; +import { useTranslation } from 'react-i18next'; interface ICloseParams { workspaceId?: string; } @@ -27,12 +28,13 @@ export const CreateWorkspaceModal = ({ open, onClose }: ModalProps) => { handleCreateWorkspace(); } }; + const { t } = useTranslation(); return (
    - New Workspace + {t('New Workspace')} { />
    -

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

    +

    {t('Workspace description')}

    { @@ -57,7 +56,7 @@ export const CreateWorkspaceModal = ({ open, onClose }: ModalProps) => { handleCreateWorkspace(); }} > - Create + {t('Create')}
    diff --git a/packages/app/src/components/edgeless-toolbar/index.tsx b/packages/app/src/components/edgeless-toolbar/index.tsx index c44f6396ca..697c5a6261 100644 --- a/packages/app/src/components/edgeless-toolbar/index.tsx +++ b/packages/app/src/components/edgeless-toolbar/index.tsx @@ -19,73 +19,77 @@ import Slide from '@mui/material/Slide'; import useCurrentPageMeta from '@/hooks/use-current-page-meta'; import { useAppState } from '@/providers/app-state-provider'; import useHistoryUpdated from '@/hooks/use-history-update'; +import { useTranslation } from 'react-i18next'; -const toolbarList1 = [ - { - flavor: 'select', - icon: , - toolTip: 'Select', - disable: false, - callback: () => { - window.dispatchEvent( - new CustomEvent('affine.switch-mouse-mode', { - detail: { - type: 'default', - }, - }) - ); +const useToolbarList1 = () => { + const { t } = useTranslation(); + return [ + { + flavor: 'select', + icon: , + toolTip: t('Select'), + disable: false, + callback: () => { + window.dispatchEvent( + new CustomEvent('affine.switch-mouse-mode', { + detail: { + type: 'default', + }, + }) + ); + }, }, - }, - { - flavor: 'text', - icon: , - toolTip: 'Text (coming soon)', - disable: true, - }, - { - flavor: 'shape', - icon: , - toolTip: 'Shape', - disable: false, - callback: () => { - window.dispatchEvent( - new CustomEvent('affine.switch-mouse-mode', { - detail: { - type: 'shape', - color: 'black', - shape: 'rectangle', - }, - }) - ); + { + flavor: 'text', + icon: , + toolTip: t('Text'), + disable: true, + }, + { + flavor: 'shape', + icon: , + toolTip: t('Shape'), + disable: false, + callback: () => { + window.dispatchEvent( + new CustomEvent('affine.switch-mouse-mode', { + detail: { + type: 'shape', + color: 'black', + shape: 'rectangle', + }, + }) + ); + }, + }, + { + flavor: 'sticky', + icon: , + toolTip: t('Sticky'), + disable: true, + }, + { + flavor: 'pen', + icon: , + toolTip: t('Pen'), + disable: true, }, - }, - { - flavor: 'sticky', - icon: , - toolTip: 'Sticky (coming soon)', - disable: true, - }, - { - flavor: 'pen', - icon: , - toolTip: 'Pen (coming soon)', - disable: true, - }, - { - flavor: 'connector', - icon: , - toolTip: 'Connector (coming soon)', - disable: true, - }, -]; + { + flavor: 'connector', + icon: , + toolTip: t('Connector'), + disable: true, + }, + ]; +}; const UndoRedo = () => { const [canUndo, setCanUndo] = useState(false); const [canRedo, setCanRedo] = useState(false); const { currentPage } = useAppState(); const onHistoryUpdated = useHistoryUpdated(); - + const { t } = useTranslation(); useEffect(() => { onHistoryUpdated(page => { setCanUndo(page.canUndo); @@ -95,7 +99,7 @@ const UndoRedo = () => { return ( - + { @@ -105,7 +109,7 @@ const UndoRedo = () => { - + { @@ -131,7 +135,7 @@ export const EdgelessToolbar = () => { > - {toolbarList1.map( + {useToolbarList1().map( ({ icon, toolTip, flavor, disable, callback }, index) => { return ( diff --git a/packages/app/src/components/file-upload/index.tsx b/packages/app/src/components/file-upload/index.tsx index 25d91fb06d..090d628b22 100644 --- a/packages/app/src/components/file-upload/index.tsx +++ b/packages/app/src/components/file-upload/index.tsx @@ -1,6 +1,7 @@ import { Button } from '@/ui/button'; import { FC, useRef, ChangeEvent, ReactElement } from 'react'; import { styled } from '@/styles'; +import { useTranslation } from 'react-i18next'; interface Props { uploadType?: string; children?: ReactElement; @@ -9,6 +10,7 @@ interface Props { } export const Upload: FC = props => { const { fileChange, accept } = props; + const { t } = useTranslation(); const input_ref = useRef(null); const _chooseFile = () => { if (input_ref.current) { @@ -28,7 +30,7 @@ export const Upload: FC = props => { }; return ( - {props.children ?? } + {props.children ?? } { const { permanentlyDeletePage } = usePageHelper(); @@ -12,7 +13,7 @@ export const TrashButtonGroup = () => { const { confirm } = useConfirm(); const router = useRouter(); const { id = '' } = useCurrentPageMeta() || {}; - + const { t } = useTranslation(); return ( <> ); diff --git a/packages/app/src/libs/i18n/resources/en.json b/packages/app/src/libs/i18n/resources/en.json index 9ce5282e71..a4be5ecf05 100644 --- a/packages/app/src/libs/i18n/resources/en.json +++ b/packages/app/src/libs/i18n/resources/en.json @@ -34,7 +34,7 @@ "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.", + "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", @@ -61,5 +61,19 @@ "Reduce indent": "Reduce indent", "Markdown Syntax": "Markdown Syntax", "Divider": "Divider", - "404 - Page Not Found": "404 - Page Not Found" + "404 - Page Not Found": "404 - Page Not Found", + "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", + "Select": "Select", + "Text": "Text (coming soon)", + "Shape": "Shape", + "Sticky": "Sticky (coming soon)", + "Pen": "Pen (coming soon)", + "Connector": "Connector (coming soon)", + "Upload": "Upload", + "Restore it": "Restore it", + "TrashButtonGroupTitle": "Permanently delete", + "TrashButtonGroupDescription": "Once deleted, you can't undo this action. Do you confirm?", + "Delete permanently": "Delete permanently" } From 1cb83e4bdbd065699d3f0d156461986775e69403 Mon Sep 17 00:00:00 2001 From: DarkSky Date: Mon, 9 Jan 2023 12:20:53 +0800 Subject: [PATCH 54/60] fix: esm test case --- tests/change-page-mode.spec.ts | 4 ++-- tests/console.spec.ts | 12 +++++++++--- tests/contact-us.spec.ts | 2 +- tests/exception-page.spec.ts | 2 +- tests/invite-code-page.spec.ts | 2 +- tests/layout.spec.ts | 2 +- tests/local-first-delete-page.spec.ts | 4 ++-- tests/local-first-export-page.spec.ts | 4 ++-- tests/local-first-favorite-page.spec.ts | 4 ++-- tests/local-first-favorites-items.spec.ts | 4 ++-- tests/local-first-new-page.spec.ts | 4 ++-- tests/local-first-openpage-newtab.spec.ts | 4 ++-- tests/local-first-restore-page.spec.ts | 4 ++-- tests/local-first-show-delete-modal.spec.ts | 4 ++-- tests/local-first-trash-page.spec.ts | 4 ++-- tests/local-first-workspace.spec.ts | 2 +- tests/login.spec.ts | 2 +- tests/quick-search.spec.ts | 6 +++--- tests/shortcuts.spec.ts | 2 +- tests/theme.spec.ts | 2 +- 20 files changed, 40 insertions(+), 34 deletions(-) diff --git a/tests/change-page-mode.spec.ts b/tests/change-page-mode.spec.ts index 02e2e128f0..1ff308879c 100644 --- a/tests/change-page-mode.spec.ts +++ b/tests/change-page-mode.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; -import { clickPageMoreActions } from './libs/page-logic'; +import { loadPage } from './libs/load-page.js'; +import { clickPageMoreActions } from './libs/page-logic.js'; loadPage(); test.describe('Change page mode(Paper or Edgeless)', () => { diff --git a/tests/console.spec.ts b/tests/console.spec.ts index 62df984d49..19234e3749 100644 --- a/tests/console.spec.ts +++ b/tests/console.spec.ts @@ -1,11 +1,17 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; -import pkg from './../packages/app/package.json'; +import { loadPage } from './libs/load-page.js'; loadPage(); test.describe('web console', () => { - test('editor version', async ({ page }) => { + // TODO: playwright need to support json import in esm + test.skip('editor version', async ({ page }) => { + // TODO: playwright need to support json import in esm + // const pkg = await import('./../packages/app/package.json', { + // assert: { type: 'json' }, + // }); + const pkg = {} as any; + // https://playwright.dev/docs/evaluating // https://github.com/microsoft/playwright/issues/13059 // Get the handle to a specific function. diff --git a/tests/contact-us.spec.ts b/tests/contact-us.spec.ts index 447aea1e02..798b75608f 100644 --- a/tests/contact-us.spec.ts +++ b/tests/contact-us.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; +import { loadPage } from './libs/load-page.js'; loadPage(); diff --git a/tests/exception-page.spec.ts b/tests/exception-page.spec.ts index 5cf5ea9f4e..c86a8e2a19 100644 --- a/tests/exception-page.spec.ts +++ b/tests/exception-page.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; +import { loadPage } from './libs/load-page.js'; loadPage(); diff --git a/tests/invite-code-page.spec.ts b/tests/invite-code-page.spec.ts index 9cb7ba09ac..212061dd46 100644 --- a/tests/invite-code-page.spec.ts +++ b/tests/invite-code-page.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; +import { loadPage } from './libs/load-page.js'; loadPage(); diff --git a/tests/layout.spec.ts b/tests/layout.spec.ts index b817713871..8087aa7580 100644 --- a/tests/layout.spec.ts +++ b/tests/layout.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; +import { loadPage } from './libs/load-page.js'; loadPage(); diff --git a/tests/local-first-delete-page.spec.ts b/tests/local-first-delete-page.spec.ts index 814ba9548b..efc6297b0b 100644 --- a/tests/local-first-delete-page.spec.ts +++ b/tests/local-first-delete-page.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; -import { newPage } from './libs/page-logic'; +import { loadPage } from './libs/load-page.js'; +import { newPage } from './libs/page-logic.js'; loadPage(); diff --git a/tests/local-first-export-page.spec.ts b/tests/local-first-export-page.spec.ts index 5a9e245086..090974ea86 100644 --- a/tests/local-first-export-page.spec.ts +++ b/tests/local-first-export-page.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; -import { newPage, clickPageMoreActions } from './libs/page-logic'; +import { loadPage } from './libs/load-page.js'; +import { newPage, clickPageMoreActions } from './libs/page-logic.js'; loadPage(); test.describe('Local first export page', () => { diff --git a/tests/local-first-favorite-page.spec.ts b/tests/local-first-favorite-page.spec.ts index 75eb312e24..6f1193065e 100644 --- a/tests/local-first-favorite-page.spec.ts +++ b/tests/local-first-favorite-page.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; -import { newPage, clickPageMoreActions } from './libs/page-logic'; +import { loadPage } from './libs/load-page.js'; +import { newPage, clickPageMoreActions } from './libs/page-logic.js'; loadPage(); test.describe('Local first favorite and cancel favorite page', () => { diff --git a/tests/local-first-favorites-items.spec.ts b/tests/local-first-favorites-items.spec.ts index bf05995abd..6dcc3c3073 100644 --- a/tests/local-first-favorites-items.spec.ts +++ b/tests/local-first-favorites-items.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; -import { newPage, clickPageMoreActions } from './libs/page-logic'; +import { loadPage } from './libs/load-page.js'; +import { newPage, clickPageMoreActions } from './libs/page-logic.js'; loadPage(); test.describe('Local first favorite items ui', () => { diff --git a/tests/local-first-new-page.spec.ts b/tests/local-first-new-page.spec.ts index 7a4f5bd698..418bcc0413 100644 --- a/tests/local-first-new-page.spec.ts +++ b/tests/local-first-new-page.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; -import { newPage } from './libs/page-logic'; +import { loadPage } from './libs/load-page.js'; +import { newPage } from './libs/page-logic.js'; loadPage(); test.describe('local first new page', () => { diff --git a/tests/local-first-openpage-newtab.spec.ts b/tests/local-first-openpage-newtab.spec.ts index 0375bbed88..5ca02dc764 100644 --- a/tests/local-first-openpage-newtab.spec.ts +++ b/tests/local-first-openpage-newtab.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; -import { newPage } from './libs/page-logic'; +import { loadPage } from './libs/load-page.js'; +import { newPage } from './libs/page-logic.js'; loadPage(); test.describe('local first new page', () => { diff --git a/tests/local-first-restore-page.spec.ts b/tests/local-first-restore-page.spec.ts index b750931433..89bda15a98 100644 --- a/tests/local-first-restore-page.spec.ts +++ b/tests/local-first-restore-page.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; -import { newPage } from './libs/page-logic'; +import { loadPage } from './libs/load-page.js'; +import { newPage } from './libs/page-logic.js'; loadPage(); test.describe('Local first delete page', () => { diff --git a/tests/local-first-show-delete-modal.spec.ts b/tests/local-first-show-delete-modal.spec.ts index 902f89d535..59c24ce4ed 100644 --- a/tests/local-first-show-delete-modal.spec.ts +++ b/tests/local-first-show-delete-modal.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; -import { newPage, clickPageMoreActions } from './libs/page-logic'; +import { loadPage } from './libs/load-page.js'; +import { newPage, clickPageMoreActions } from './libs/page-logic.js'; loadPage(); test.describe('Local first delete page', () => { diff --git a/tests/local-first-trash-page.spec.ts b/tests/local-first-trash-page.spec.ts index 093c51cc83..9acce37bea 100644 --- a/tests/local-first-trash-page.spec.ts +++ b/tests/local-first-trash-page.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; -import { newPage } from './libs/page-logic'; +import { loadPage } from './libs/load-page.js'; +import { newPage } from './libs/page-logic.js'; loadPage(); test.describe('Local first trash page', () => { diff --git a/tests/local-first-workspace.spec.ts b/tests/local-first-workspace.spec.ts index f3c1ba9e1c..344f2baaf1 100644 --- a/tests/local-first-workspace.spec.ts +++ b/tests/local-first-workspace.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; +import { loadPage } from './libs/load-page.js'; loadPage(); diff --git a/tests/login.spec.ts b/tests/login.spec.ts index 39cda40b09..629a657b85 100644 --- a/tests/login.spec.ts +++ b/tests/login.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; +import { loadPage } from './libs/load-page.js'; loadPage(); diff --git a/tests/quick-search.spec.ts b/tests/quick-search.spec.ts index 1fd1b1efb9..9d4dbf2add 100644 --- a/tests/quick-search.spec.ts +++ b/tests/quick-search.spec.ts @@ -1,7 +1,7 @@ import { test, expect, type Page } from '@playwright/test'; -import { loadPage } from './libs/load-page'; -import { withCtrlOrMeta } from './libs/keyboard'; -import { newPage } from './libs/page-logic'; +import { loadPage } from './libs/load-page.js'; +import { withCtrlOrMeta } from './libs/keyboard.js'; +import { newPage } from './libs/page-logic.js'; loadPage(); const openQuickSearchByShortcut = async (page: Page) => diff --git a/tests/shortcuts.spec.ts b/tests/shortcuts.spec.ts index f8546eeb02..c763fb7f82 100644 --- a/tests/shortcuts.spec.ts +++ b/tests/shortcuts.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; +import { loadPage } from './libs/load-page.js'; loadPage(); diff --git a/tests/theme.spec.ts b/tests/theme.spec.ts index b92514860b..c6e7641047 100644 --- a/tests/theme.spec.ts +++ b/tests/theme.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { loadPage } from './libs/load-page'; +import { loadPage } from './libs/load-page.js'; loadPage(); From 92d5f8f7c9cb0608aea955fc0da510e827a95617 Mon Sep 17 00:00:00 2001 From: han Date: Mon, 9 Jan 2023 13:50:27 +0800 Subject: [PATCH 55/60] chore: components file name unify --- .../src/components/contact-modal/{icons.tsx => Icons.tsx} | 0 packages/app/src/components/contact-modal/index.tsx | 2 +- .../components/edgeless-toolbar/{icons.tsx => Icons.tsx} | 0 packages/app/src/components/edgeless-toolbar/index.tsx | 2 +- .../editor-mode-switch/{icons.tsx => Icons.tsx} | 0 packages/app/src/components/editor-mode-switch/index.tsx | 4 ++-- .../header/{editor-header.tsx => EditorHeader.tsx} | 4 ++-- .../app/src/components/header/{header.tsx => Header.tsx} | 6 +++--- .../header/{page-list-header.tsx => PageListHeader.tsx} | 4 ++-- .../{quick-search-button.tsx => QuickSearchButton.tsx} | 2 +- .../{editor-option-menu.tsx => EditorOptionMenu.tsx} | 2 +- .../header-right-items/{sync-user.tsx => SyncUser.tsx} | 2 +- .../{trash-button-group.tsx => TrashButtonGroup.tsx} | 2 +- .../theme-mode-switch/{icons.tsx => Icons.tsx} | 0 .../header/header-right-items/theme-mode-switch/index.tsx | 4 ++-- packages/app/src/components/header/index.tsx | 6 +++--- .../src/components/help-island/{icons.tsx => Icons.tsx} | 0 packages/app/src/components/help-island/index.tsx | 6 +++--- .../src/components/loading/{loading.tsx => Loading.tsx} | 0 .../loading/{page-loading.tsx => PageLoading.tsx} | 2 +- packages/app/src/components/loading/index.tsx | 4 ++-- .../src/components/login-modal/{icons.tsx => Icons.tsx} | 0 .../app/src/components/login-modal/LoginOptionButton.tsx | 4 ++-- .../components/page-list/{date-cell.tsx => DateCell.tsx} | 0 .../app/src/components/page-list/{empty.tsx => Empty.tsx} | 0 .../page-list/{operation-cell.tsx => OperationCell.tsx} | 2 +- packages/app/src/components/page-list/index.tsx | 8 ++++---- .../components/quick-search/{footer.tsx => Footer.tsx} | 2 +- .../src/components/quick-search/{input.tsx => Input.tsx} | 0 .../quick-search/{noResultSVG.tsx => NoResultSVG.tsx} | 0 .../components/quick-search/{results.tsx => Results.tsx} | 4 ++-- packages/app/src/components/quick-search/index.tsx | 8 ++++---- .../components/shortcuts-modal/{icons.tsx => Icons.tsx} | 0 packages/app/src/components/shortcuts-modal/index.tsx | 2 +- .../{workspace-setting.tsx => WorkspaceSetting.tsx} | 0 .../general/{general.tsx => General.tsx} | 0 .../general/delete/{delete.tsx => Delete.tsx} | 0 .../components/workspace-setting/general/delete/index.ts | 2 +- .../app/src/components/workspace-setting/general/index.ts | 2 +- .../general/leave/{leave.tsx => Leave.tsx} | 0 .../components/workspace-setting/general/leave/index.ts | 2 +- packages/app/src/components/workspace-setting/index.ts | 2 +- .../WorkspaceSelector/SelectorPopperContent.tsx | 2 +- .../{workspace-create.tsx => WorkspaceCreate.tsx} | 0 .../CreateWorkspaceItem/workspace-create/index.ts | 2 +- .../WorkspaceSelector/WorkspaceItem/LoginItem.tsx | 4 ++-- .../WorkspaceSelector/WorkspaceSelector.tsx | 2 +- .../workspace-slider-bar/icons/{icons.tsx => Icons.tsx} | 0 .../app/src/components/workspace-slider-bar/index.tsx | 2 +- packages/app/src/pages/_app.tsx | 8 ++++---- .../{confirm-provider.tsx => ConfirmProvider.tsx} | 0 ...{global-modal-provider.tsx => GlobalModalProvider.tsx} | 0 .../providers/{themeProvider.tsx => ThemeProvider.tsx} | 0 .../{dynamic-blocksuite.tsx => DynamicBlocksuite.tsx} | 0 .../app-state-provider/{provider.tsx => Provider.tsx} | 2 +- 55 files changed, 56 insertions(+), 56 deletions(-) rename packages/app/src/components/contact-modal/{icons.tsx => Icons.tsx} (100%) rename packages/app/src/components/edgeless-toolbar/{icons.tsx => Icons.tsx} (100%) rename packages/app/src/components/editor-mode-switch/{icons.tsx => Icons.tsx} (100%) rename packages/app/src/components/header/{editor-header.tsx => EditorHeader.tsx} (96%) rename packages/app/src/components/header/{header.tsx => Header.tsx} (90%) rename packages/app/src/components/header/{page-list-header.tsx => PageListHeader.tsx} (85%) rename packages/app/src/components/header/{quick-search-button.tsx => QuickSearchButton.tsx} (92%) rename packages/app/src/components/header/header-right-items/{editor-option-menu.tsx => EditorOptionMenu.tsx} (98%) rename packages/app/src/components/header/header-right-items/{sync-user.tsx => SyncUser.tsx} (90%) rename packages/app/src/components/header/header-right-items/{trash-button-group.tsx => TrashButtonGroup.tsx} (96%) rename packages/app/src/components/header/header-right-items/theme-mode-switch/{icons.tsx => Icons.tsx} (100%) rename packages/app/src/components/help-island/{icons.tsx => Icons.tsx} (100%) rename packages/app/src/components/loading/{loading.tsx => Loading.tsx} (100%) rename packages/app/src/components/loading/{page-loading.tsx => PageLoading.tsx} (95%) rename packages/app/src/components/login-modal/{icons.tsx => Icons.tsx} (100%) rename packages/app/src/components/page-list/{date-cell.tsx => DateCell.tsx} (100%) rename packages/app/src/components/page-list/{empty.tsx => Empty.tsx} (100%) rename packages/app/src/components/page-list/{operation-cell.tsx => OperationCell.tsx} (98%) rename packages/app/src/components/quick-search/{footer.tsx => Footer.tsx} (94%) rename packages/app/src/components/quick-search/{input.tsx => Input.tsx} (100%) rename packages/app/src/components/quick-search/{noResultSVG.tsx => NoResultSVG.tsx} (100%) rename packages/app/src/components/quick-search/{results.tsx => Results.tsx} (97%) rename packages/app/src/components/shortcuts-modal/{icons.tsx => Icons.tsx} (100%) rename packages/app/src/components/workspace-setting/{workspace-setting.tsx => WorkspaceSetting.tsx} (100%) rename packages/app/src/components/workspace-setting/general/{general.tsx => General.tsx} (100%) rename packages/app/src/components/workspace-setting/general/delete/{delete.tsx => Delete.tsx} (100%) rename packages/app/src/components/workspace-setting/general/leave/{leave.tsx => Leave.tsx} (100%) rename packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/{workspace-create.tsx => WorkspaceCreate.tsx} (100%) rename packages/app/src/components/workspace-slider-bar/icons/{icons.tsx => Icons.tsx} (100%) rename packages/app/src/providers/{confirm-provider.tsx => ConfirmProvider.tsx} (100%) rename packages/app/src/providers/{global-modal-provider.tsx => GlobalModalProvider.tsx} (100%) rename packages/app/src/providers/{themeProvider.tsx => ThemeProvider.tsx} (100%) rename packages/app/src/providers/app-state-provider/{dynamic-blocksuite.tsx => DynamicBlocksuite.tsx} (100%) rename packages/app/src/providers/app-state-provider/{provider.tsx => Provider.tsx} (98%) diff --git a/packages/app/src/components/contact-modal/icons.tsx b/packages/app/src/components/contact-modal/Icons.tsx similarity index 100% rename from packages/app/src/components/contact-modal/icons.tsx rename to packages/app/src/components/contact-modal/Icons.tsx diff --git a/packages/app/src/components/contact-modal/index.tsx b/packages/app/src/components/contact-modal/index.tsx index 921b34ba65..0cb97f1176 100644 --- a/packages/app/src/components/contact-modal/index.tsx +++ b/packages/app/src/components/contact-modal/index.tsx @@ -8,7 +8,7 @@ import { TelegramIcon, RedditIcon, LinkIcon, -} from './icons'; +} from './Icons'; import logo from './affine-text-logo.png'; import { StyledBigLink, diff --git a/packages/app/src/components/edgeless-toolbar/icons.tsx b/packages/app/src/components/edgeless-toolbar/Icons.tsx similarity index 100% rename from packages/app/src/components/edgeless-toolbar/icons.tsx rename to packages/app/src/components/edgeless-toolbar/Icons.tsx diff --git a/packages/app/src/components/edgeless-toolbar/index.tsx b/packages/app/src/components/edgeless-toolbar/index.tsx index c44f6396ca..c6f880146d 100644 --- a/packages/app/src/components/edgeless-toolbar/index.tsx +++ b/packages/app/src/components/edgeless-toolbar/index.tsx @@ -13,7 +13,7 @@ import { ConnectorIcon, UndoIcon, RedoIcon, -} from './icons'; +} from './Icons'; import { Tooltip } from '@/ui/tooltip'; import Slide from '@mui/material/Slide'; import useCurrentPageMeta from '@/hooks/use-current-page-meta'; diff --git a/packages/app/src/components/editor-mode-switch/icons.tsx b/packages/app/src/components/editor-mode-switch/Icons.tsx similarity index 100% rename from packages/app/src/components/editor-mode-switch/icons.tsx rename to packages/app/src/components/editor-mode-switch/Icons.tsx diff --git a/packages/app/src/components/editor-mode-switch/index.tsx b/packages/app/src/components/editor-mode-switch/index.tsx index 86a54d8606..2e8ccfdcf2 100644 --- a/packages/app/src/components/editor-mode-switch/index.tsx +++ b/packages/app/src/components/editor-mode-switch/index.tsx @@ -11,8 +11,8 @@ import type { AnimateRadioProps, AnimateRadioItemProps, } from './type'; -import { useTheme } from '@/providers/themeProvider'; -import { EdgelessIcon, PaperIcon } from './icons'; +import { useTheme } from '@/providers/ThemeProvider'; +import { EdgelessIcon, PaperIcon } from './Icons'; import useCurrentPageMeta from '@/hooks/use-current-page-meta'; import { usePageHelper } from '@/hooks/use-page-helper'; import { useTranslation } from 'react-i18next'; diff --git a/packages/app/src/components/header/editor-header.tsx b/packages/app/src/components/header/EditorHeader.tsx similarity index 96% rename from packages/app/src/components/header/editor-header.tsx rename to packages/app/src/components/header/EditorHeader.tsx index 7f433de467..b343179496 100644 --- a/packages/app/src/components/header/editor-header.tsx +++ b/packages/app/src/components/header/EditorHeader.tsx @@ -8,8 +8,8 @@ import { import { Content } from '@/ui/layout'; import { useAppState } from '@/providers/app-state-provider/context'; import EditorModeSwitch from '@/components/editor-mode-switch'; -import QuickSearchButton from './quick-search-button'; -import Header from './header'; +import QuickSearchButton from './QuickSearchButton'; +import Header from './Header'; import usePropsUpdated from '@/hooks/use-props-updated'; import useCurrentPageMeta from '@/hooks/use-current-page-meta'; diff --git a/packages/app/src/components/header/header.tsx b/packages/app/src/components/header/Header.tsx similarity index 90% rename from packages/app/src/components/header/header.tsx rename to packages/app/src/components/header/Header.tsx index 919d89d7be..9db8149d5e 100644 --- a/packages/app/src/components/header/header.tsx +++ b/packages/app/src/components/header/Header.tsx @@ -8,10 +8,10 @@ import { } from './styles'; import CloseIcon from '@mui/icons-material/Close'; import { getWarningMessage, shouldShowWarning } from './utils'; -import EditorOptionMenu from './header-right-items/editor-option-menu'; -import TrashButtonGroup from './header-right-items/trash-button-group'; +import EditorOptionMenu from './header-right-items/EditorOptionMenu'; +import TrashButtonGroup from './header-right-items/TrashButtonGroup'; import ThemeModeSwitch from './header-right-items/theme-mode-switch'; -import SyncUser from './header-right-items/sync-user'; +import SyncUser from './header-right-items/SyncUser'; const BrowserWarning = ({ show, diff --git a/packages/app/src/components/header/page-list-header.tsx b/packages/app/src/components/header/PageListHeader.tsx similarity index 85% rename from packages/app/src/components/header/page-list-header.tsx rename to packages/app/src/components/header/PageListHeader.tsx index 452061fbd4..43a1c976b9 100644 --- a/packages/app/src/components/header/page-list-header.tsx +++ b/packages/app/src/components/header/PageListHeader.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren, ReactNode } from 'react'; -import Header from './header'; +import Header from './Header'; import { StyledPageListTittleWrapper } from './styles'; -import QuickSearchButton from './quick-search-button'; +import QuickSearchButton from './QuickSearchButton'; export type PageListHeaderProps = PropsWithChildren<{ icon?: ReactNode; diff --git a/packages/app/src/components/header/quick-search-button.tsx b/packages/app/src/components/header/QuickSearchButton.tsx similarity index 92% rename from packages/app/src/components/header/quick-search-button.tsx rename to packages/app/src/components/header/QuickSearchButton.tsx index e45e78fed4..0c1732adb1 100644 --- a/packages/app/src/components/header/quick-search-button.tsx +++ b/packages/app/src/components/header/QuickSearchButton.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { IconButton, IconButtonProps } from '@/ui/button'; import { Tooltip } from '@/ui/tooltip'; import { ArrowDownIcon } from '@blocksuite/icons'; -import { useModal } from '@/providers/global-modal-provider'; +import { useModal } from '@/providers/GlobalModalProvider'; import { useTranslation } from 'react-i18next'; export const QuickSearchButton = ({ onClick, diff --git a/packages/app/src/components/header/header-right-items/editor-option-menu.tsx b/packages/app/src/components/header/header-right-items/EditorOptionMenu.tsx similarity index 98% rename from packages/app/src/components/header/header-right-items/editor-option-menu.tsx rename to packages/app/src/components/header/header-right-items/EditorOptionMenu.tsx index cfd2813de5..db3e1751f4 100644 --- a/packages/app/src/components/header/header-right-items/editor-option-menu.tsx +++ b/packages/app/src/components/header/header-right-items/EditorOptionMenu.tsx @@ -13,7 +13,7 @@ import { } from '@blocksuite/icons'; import { useAppState } from '@/providers/app-state-provider'; import { usePageHelper } from '@/hooks/use-page-helper'; -import { useConfirm } from '@/providers/confirm-provider'; +import { useConfirm } from '@/providers/ConfirmProvider'; import useCurrentPageMeta from '@/hooks/use-current-page-meta'; import { toast } from '@/ui/toast'; import { useTranslation } from 'react-i18next'; diff --git a/packages/app/src/components/header/header-right-items/sync-user.tsx b/packages/app/src/components/header/header-right-items/SyncUser.tsx similarity index 90% rename from packages/app/src/components/header/header-right-items/sync-user.tsx rename to packages/app/src/components/header/header-right-items/SyncUser.tsx index 3d7fba5299..86c85926bf 100644 --- a/packages/app/src/components/header/header-right-items/sync-user.tsx +++ b/packages/app/src/components/header/header-right-items/SyncUser.tsx @@ -1,5 +1,5 @@ import { CloudUnsyncedIcon, CloudInsyncIcon } from '@blocksuite/icons'; -import { useModal } from '@/providers/global-modal-provider'; +import { useModal } from '@/providers/GlobalModalProvider'; import { useAppState } from '@/providers/app-state-provider/context'; import { IconButton } from '@/ui/button'; diff --git a/packages/app/src/components/header/header-right-items/trash-button-group.tsx b/packages/app/src/components/header/header-right-items/TrashButtonGroup.tsx similarity index 96% rename from packages/app/src/components/header/header-right-items/trash-button-group.tsx rename to packages/app/src/components/header/header-right-items/TrashButtonGroup.tsx index 02345e9680..df12327131 100644 --- a/packages/app/src/components/header/header-right-items/trash-button-group.tsx +++ b/packages/app/src/components/header/header-right-items/TrashButtonGroup.tsx @@ -1,7 +1,7 @@ import { Button } from '@/ui/button'; import { usePageHelper } from '@/hooks/use-page-helper'; import { useAppState } from '@/providers/app-state-provider'; -import { useConfirm } from '@/providers/confirm-provider'; +import { useConfirm } from '@/providers/ConfirmProvider'; import { useRouter } from 'next/router'; import useCurrentPageMeta from '@/hooks/use-current-page-meta'; diff --git a/packages/app/src/components/header/header-right-items/theme-mode-switch/icons.tsx b/packages/app/src/components/header/header-right-items/theme-mode-switch/Icons.tsx similarity index 100% rename from packages/app/src/components/header/header-right-items/theme-mode-switch/icons.tsx rename to packages/app/src/components/header/header-right-items/theme-mode-switch/Icons.tsx diff --git a/packages/app/src/components/header/header-right-items/theme-mode-switch/index.tsx b/packages/app/src/components/header/header-right-items/theme-mode-switch/index.tsx index 20f6c86bdb..c1d842e23f 100644 --- a/packages/app/src/components/header/header-right-items/theme-mode-switch/index.tsx +++ b/packages/app/src/components/header/header-right-items/theme-mode-switch/index.tsx @@ -1,6 +1,6 @@ import { useState } from 'react'; -import { useTheme } from '@/providers/themeProvider'; -import { MoonIcon, SunIcon } from './icons'; +import { useTheme } from '@/providers/ThemeProvider'; +import { MoonIcon, SunIcon } from './Icons'; import { StyledThemeModeSwitch, StyledSwitchItem } from './style'; export const ThemeModeSwitch = () => { diff --git a/packages/app/src/components/header/index.tsx b/packages/app/src/components/header/index.tsx index d31b8f7abb..8af7382af6 100644 --- a/packages/app/src/components/header/index.tsx +++ b/packages/app/src/components/header/index.tsx @@ -1,3 +1,3 @@ -export * from './header'; -export * from './editor-header'; -export * from './page-list-header'; +export * from './Header'; +export * from './EditorHeader'; +export * from './PageListHeader'; diff --git a/packages/app/src/components/help-island/icons.tsx b/packages/app/src/components/help-island/Icons.tsx similarity index 100% rename from packages/app/src/components/help-island/icons.tsx rename to packages/app/src/components/help-island/Icons.tsx diff --git a/packages/app/src/components/help-island/index.tsx b/packages/app/src/components/help-island/index.tsx index 64ef678d8c..b904cefb5c 100644 --- a/packages/app/src/components/help-island/index.tsx +++ b/packages/app/src/components/help-island/index.tsx @@ -5,12 +5,12 @@ import { StyledIslandWrapper, StyledTransformIcon, } from './style'; -import { CloseIcon, ContactIcon, HelpIcon, KeyboardIcon } from './icons'; +import { CloseIcon, ContactIcon, HelpIcon, KeyboardIcon } from './Icons'; import Grow from '@mui/material/Grow'; import { Tooltip } from '@/ui/tooltip'; import { useTranslation } from 'react-i18next'; -import { useModal } from '@/providers/global-modal-provider'; -import { useTheme } from '@/providers/themeProvider'; +import { useModal } from '@/providers/GlobalModalProvider'; +import { useTheme } from '@/providers/ThemeProvider'; import useCurrentPageMeta from '@/hooks/use-current-page-meta'; export type IslandItemNames = 'contact' | 'shortcuts'; export const HelpIsland = ({ diff --git a/packages/app/src/components/loading/loading.tsx b/packages/app/src/components/loading/Loading.tsx similarity index 100% rename from packages/app/src/components/loading/loading.tsx rename to packages/app/src/components/loading/Loading.tsx diff --git a/packages/app/src/components/loading/page-loading.tsx b/packages/app/src/components/loading/PageLoading.tsx similarity index 95% rename from packages/app/src/components/loading/page-loading.tsx rename to packages/app/src/components/loading/PageLoading.tsx index e4a802fa62..025eba7687 100644 --- a/packages/app/src/components/loading/page-loading.tsx +++ b/packages/app/src/components/loading/PageLoading.tsx @@ -1,5 +1,5 @@ import { styled } from '@/styles'; -import Loading from './loading'; +import Loading from './Loading'; // Used for the full page loading const StyledLoadingContainer = styled('div')(() => { diff --git a/packages/app/src/components/loading/index.tsx b/packages/app/src/components/loading/index.tsx index d435470de9..49aaacec80 100644 --- a/packages/app/src/components/loading/index.tsx +++ b/packages/app/src/components/loading/index.tsx @@ -1,3 +1,3 @@ -import Loading from './loading'; -export * from './page-loading'; +import Loading from './Loading'; +export * from './PageLoading'; export default Loading; diff --git a/packages/app/src/components/login-modal/icons.tsx b/packages/app/src/components/login-modal/Icons.tsx similarity index 100% rename from packages/app/src/components/login-modal/icons.tsx rename to packages/app/src/components/login-modal/Icons.tsx diff --git a/packages/app/src/components/login-modal/LoginOptionButton.tsx b/packages/app/src/components/login-modal/LoginOptionButton.tsx index e04d8fecc7..48c19b0fb5 100644 --- a/packages/app/src/components/login-modal/LoginOptionButton.tsx +++ b/packages/app/src/components/login-modal/LoginOptionButton.tsx @@ -1,8 +1,8 @@ import { getDataCenter } from '@affine/datacenter'; import { styled } from '@/styles'; import { Button } from '@/ui/button'; -import { useModal } from '@/providers/global-modal-provider'; -import { GoogleIcon, StayLogOutIcon } from './icons'; +import { useModal } from '@/providers/GlobalModalProvider'; +import { GoogleIcon, StayLogOutIcon } from './Icons'; export const GoogleLoginButton = () => { const { triggerLoginModal } = useModal(); diff --git a/packages/app/src/components/page-list/date-cell.tsx b/packages/app/src/components/page-list/DateCell.tsx similarity index 100% rename from packages/app/src/components/page-list/date-cell.tsx rename to packages/app/src/components/page-list/DateCell.tsx diff --git a/packages/app/src/components/page-list/empty.tsx b/packages/app/src/components/page-list/Empty.tsx similarity index 100% rename from packages/app/src/components/page-list/empty.tsx rename to packages/app/src/components/page-list/Empty.tsx diff --git a/packages/app/src/components/page-list/operation-cell.tsx b/packages/app/src/components/page-list/OperationCell.tsx similarity index 98% rename from packages/app/src/components/page-list/operation-cell.tsx rename to packages/app/src/components/page-list/OperationCell.tsx index 1b4ec7434a..d72b99b518 100644 --- a/packages/app/src/components/page-list/operation-cell.tsx +++ b/packages/app/src/components/page-list/OperationCell.tsx @@ -1,4 +1,4 @@ -import { useConfirm } from '@/providers/confirm-provider'; +import { useConfirm } from '@/providers/ConfirmProvider'; import { PageMeta } from '@/providers/app-state-provider'; import { Menu, MenuItem } from '@/ui/menu'; import { Wrapper } from '@/ui/layout'; diff --git a/packages/app/src/components/page-list/index.tsx b/packages/app/src/components/page-list/index.tsx index 604d71000f..2d5f13ed58 100644 --- a/packages/app/src/components/page-list/index.tsx +++ b/packages/app/src/components/page-list/index.tsx @@ -12,18 +12,18 @@ import { StyledTitleWrapper, } from './styles'; import { Table, TableBody, TableCell, TableHead, TableRow } from '@/ui/table'; -import { OperationCell, TrashOperationCell } from './operation-cell'; -import Empty from './empty'; +import { OperationCell, TrashOperationCell } from './OperationCell'; +import Empty from './Empty'; import { Content } from '@/ui/layout'; import React from 'react'; -import DateCell from '@/components/page-list/date-cell'; +import DateCell from '@/components/page-list/DateCell'; import { IconButton } from '@/ui/button'; import { Tooltip } from '@/ui/tooltip'; import { useRouter } from 'next/router'; import { useAppState } from '@/providers/app-state-provider/context'; import { toast } from '@/ui/toast'; import { usePageHelper } from '@/hooks/use-page-helper'; -import { useTheme } from '@/providers/themeProvider'; +import { useTheme } from '@/providers/ThemeProvider'; import { useTranslation } from 'react-i18next'; const FavoriteTag = ({ pageMeta: { favorite, id }, diff --git a/packages/app/src/components/quick-search/footer.tsx b/packages/app/src/components/quick-search/Footer.tsx similarity index 94% rename from packages/app/src/components/quick-search/footer.tsx rename to packages/app/src/components/quick-search/Footer.tsx index 48914cda73..59680216f8 100644 --- a/packages/app/src/components/quick-search/footer.tsx +++ b/packages/app/src/components/quick-search/Footer.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { AddIcon } from '@blocksuite/icons'; import { StyledModalFooterContent } from './style'; -import { useModal } from '@/providers/global-modal-provider'; +import { useModal } from '@/providers/GlobalModalProvider'; import { Command } from 'cmdk'; import { usePageHelper } from '@/hooks/use-page-helper'; import { useTranslation } from 'react-i18next'; diff --git a/packages/app/src/components/quick-search/input.tsx b/packages/app/src/components/quick-search/Input.tsx similarity index 100% rename from packages/app/src/components/quick-search/input.tsx rename to packages/app/src/components/quick-search/Input.tsx diff --git a/packages/app/src/components/quick-search/noResultSVG.tsx b/packages/app/src/components/quick-search/NoResultSVG.tsx similarity index 100% rename from packages/app/src/components/quick-search/noResultSVG.tsx rename to packages/app/src/components/quick-search/NoResultSVG.tsx diff --git a/packages/app/src/components/quick-search/results.tsx b/packages/app/src/components/quick-search/Results.tsx similarity index 97% rename from packages/app/src/components/quick-search/results.tsx rename to packages/app/src/components/quick-search/Results.tsx index eeb9fc2d44..fc22e97136 100644 --- a/packages/app/src/components/quick-search/results.tsx +++ b/packages/app/src/components/quick-search/Results.tsx @@ -1,12 +1,12 @@ import { Command } from 'cmdk'; import { StyledListItem, StyledNotFound } from './style'; -import { useModal } from '@/providers/global-modal-provider'; +import { useModal } from '@/providers/GlobalModalProvider'; import { PaperIcon, EdgelessIcon } from '@blocksuite/icons'; import { Dispatch, SetStateAction, useEffect, useState } from 'react'; import { useAppState } from '@/providers/app-state-provider'; import { useRouter } from 'next/router'; import { useSwitchToConfig } from './config'; -import { NoResultSVG } from './noResultSVG'; +import { NoResultSVG } from './NoResultSVG'; import { useTranslation } from 'react-i18next'; import usePageHelper from '@/hooks/use-page-helper'; import usePageMetaList from '@/hooks/use-page-meta-list'; diff --git a/packages/app/src/components/quick-search/index.tsx b/packages/app/src/components/quick-search/index.tsx index 7475d97567..b08f69196e 100644 --- a/packages/app/src/components/quick-search/index.tsx +++ b/packages/app/src/components/quick-search/index.tsx @@ -6,12 +6,12 @@ import { StyledModalDivider, StyledShortcut, } from './style'; -import { Input } from './input'; -import { Results } from './results'; -import { Footer } from './footer'; +import { Input } from './Input'; +import { Results } from './Results'; +import { Footer } from './Footer'; import { Command } from 'cmdk'; import { useEffect, useState } from 'react'; -import { useModal } from '@/providers/global-modal-provider'; +import { useModal } from '@/providers/GlobalModalProvider'; import { getUaHelper } from '@/utils'; import { useAppState } from '@/providers/app-state-provider'; type TransitionsModalProps = { diff --git a/packages/app/src/components/shortcuts-modal/icons.tsx b/packages/app/src/components/shortcuts-modal/Icons.tsx similarity index 100% rename from packages/app/src/components/shortcuts-modal/icons.tsx rename to packages/app/src/components/shortcuts-modal/Icons.tsx diff --git a/packages/app/src/components/shortcuts-modal/index.tsx b/packages/app/src/components/shortcuts-modal/index.tsx index 4f28b0ecec..980f281d78 100644 --- a/packages/app/src/components/shortcuts-modal/index.tsx +++ b/packages/app/src/components/shortcuts-modal/index.tsx @@ -1,5 +1,5 @@ import { createPortal } from 'react-dom'; -import { KeyboardIcon } from './icons'; +import { KeyboardIcon } from './Icons'; import { StyledListItem, StyledModalHeader, diff --git a/packages/app/src/components/workspace-setting/workspace-setting.tsx b/packages/app/src/components/workspace-setting/WorkspaceSetting.tsx similarity index 100% rename from packages/app/src/components/workspace-setting/workspace-setting.tsx rename to packages/app/src/components/workspace-setting/WorkspaceSetting.tsx diff --git a/packages/app/src/components/workspace-setting/general/general.tsx b/packages/app/src/components/workspace-setting/general/General.tsx similarity index 100% rename from packages/app/src/components/workspace-setting/general/general.tsx rename to packages/app/src/components/workspace-setting/general/General.tsx diff --git a/packages/app/src/components/workspace-setting/general/delete/delete.tsx b/packages/app/src/components/workspace-setting/general/delete/Delete.tsx similarity index 100% rename from packages/app/src/components/workspace-setting/general/delete/delete.tsx rename to packages/app/src/components/workspace-setting/general/delete/Delete.tsx diff --git a/packages/app/src/components/workspace-setting/general/delete/index.ts b/packages/app/src/components/workspace-setting/general/delete/index.ts index 2a41f028d2..69b5324048 100644 --- a/packages/app/src/components/workspace-setting/general/delete/index.ts +++ b/packages/app/src/components/workspace-setting/general/delete/index.ts @@ -1 +1 @@ -export * from './delete'; +export * from './Delete'; diff --git a/packages/app/src/components/workspace-setting/general/index.ts b/packages/app/src/components/workspace-setting/general/index.ts index 12bc2fe54d..0ab02c523e 100644 --- a/packages/app/src/components/workspace-setting/general/index.ts +++ b/packages/app/src/components/workspace-setting/general/index.ts @@ -1 +1 @@ -export * from './general'; +export * from './General'; diff --git a/packages/app/src/components/workspace-setting/general/leave/leave.tsx b/packages/app/src/components/workspace-setting/general/leave/Leave.tsx similarity index 100% rename from packages/app/src/components/workspace-setting/general/leave/leave.tsx rename to packages/app/src/components/workspace-setting/general/leave/Leave.tsx diff --git a/packages/app/src/components/workspace-setting/general/leave/index.ts b/packages/app/src/components/workspace-setting/general/leave/index.ts index ae98410fad..c3bfa43ca5 100644 --- a/packages/app/src/components/workspace-setting/general/leave/index.ts +++ b/packages/app/src/components/workspace-setting/general/leave/index.ts @@ -1 +1 @@ -export * from './leave'; +export * from './Leave'; diff --git a/packages/app/src/components/workspace-setting/index.ts b/packages/app/src/components/workspace-setting/index.ts index eda9c6aebd..db995db5e4 100644 --- a/packages/app/src/components/workspace-setting/index.ts +++ b/packages/app/src/components/workspace-setting/index.ts @@ -1 +1 @@ -export * from './workspace-setting'; +export * from './WorkspaceSetting'; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx index 8e101307bb..a07f847277 100644 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx +++ b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/SelectorPopperContent.tsx @@ -13,7 +13,7 @@ import { import { WorkspaceSetting } from '@/components/workspace-setting'; import { useCallback, useEffect, useState } from 'react'; import { getDataCenter, WorkspaceType } from '@affine/datacenter'; -import { useModal } from '@/providers/global-modal-provider'; +import { useModal } from '@/providers/GlobalModalProvider'; export type WorkspaceDetails = Record< string, diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/workspace-create.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/WorkspaceCreate.tsx similarity index 100% rename from packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/workspace-create.tsx rename to packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/CreateWorkspaceItem/workspace-create/WorkspaceCreate.tsx 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 index 38645e20c1..85746bc70d 100644 --- 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 @@ -1 +1 @@ -export * from './workspace-create'; +export * from './WorkspaceCreate'; diff --git a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/LoginItem.tsx b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/LoginItem.tsx index 66b093e64c..d7771f1ac8 100644 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/LoginItem.tsx +++ b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceItem/LoginItem.tsx @@ -1,6 +1,6 @@ -import { useModal } from '@/providers/global-modal-provider'; +import { useModal } from '@/providers/GlobalModalProvider'; import { styled } from '@/styles'; -import { AffineIcon } from '../../icons/icons'; +import { AffineIcon } from '../../icons/Icons'; import { WorkspaceItemAvatar, LoginItemWrapper, 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 4e0299888f..7ecb47d721 100644 --- a/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx +++ b/packages/app/src/components/workspace-slider-bar/WorkspaceSelector/WorkspaceSelector.tsx @@ -4,7 +4,7 @@ import { SelectorPopperContent } from './SelectorPopperContent'; import { useState } from 'react'; import { useAppState } from '@/providers/app-state-provider'; import { WorkspaceType } from '@affine/datacenter'; -import { AffineIcon } from '../icons/icons'; +import { AffineIcon } from '../icons/Icons'; export const WorkspaceSelector = () => { const [isShow, setIsShow] = useState(false); diff --git a/packages/app/src/components/workspace-slider-bar/icons/icons.tsx b/packages/app/src/components/workspace-slider-bar/icons/Icons.tsx similarity index 100% rename from packages/app/src/components/workspace-slider-bar/icons/icons.tsx rename to packages/app/src/components/workspace-slider-bar/icons/Icons.tsx diff --git a/packages/app/src/components/workspace-slider-bar/index.tsx b/packages/app/src/components/workspace-slider-bar/index.tsx index 61e81cb3ed..533ea42927 100644 --- a/packages/app/src/components/workspace-slider-bar/index.tsx +++ b/packages/app/src/components/workspace-slider-bar/index.tsx @@ -24,7 +24,7 @@ import { } from '@blocksuite/icons'; import Link from 'next/link'; import { Tooltip } from '@/ui/tooltip'; -import { useModal } from '@/providers/global-modal-provider'; +import { useModal } from '@/providers/GlobalModalProvider'; import { useAppState } from '@/providers/app-state-provider/context'; import { IconButton } from '@/ui/button'; import useLocalStorage from '@/hooks/use-local-storage'; diff --git a/packages/app/src/pages/_app.tsx b/packages/app/src/pages/_app.tsx index c7cbd78d4b..179cae802d 100644 --- a/packages/app/src/pages/_app.tsx +++ b/packages/app/src/pages/_app.tsx @@ -10,9 +10,9 @@ import '../utils/print-build-info'; import ProviderComposer from '@/components/provider-composer'; import type { PropsWithChildren, ReactElement, ReactNode } from 'react'; import type { NextPage } from 'next'; -import { AppStateProvider } from '@/providers/app-state-provider/provider'; -import ConfirmProvider from '@/providers/confirm-provider'; -import { ModalProvider } from '@/providers/global-modal-provider'; +import { AppStateProvider } from '@/providers/app-state-provider/Provider'; +import ConfirmProvider from '@/providers/ConfirmProvider'; +import { ModalProvider } from '@/providers/GlobalModalProvider'; import { useRouter } from 'next/router'; import { useEffect } from 'react'; import { useAppState } from '@/providers/app-state-provider'; @@ -20,7 +20,7 @@ import { PageLoading } from '@/components/loading'; import Head from 'next/head'; import '@/libs/i18n'; -const ThemeProvider = dynamic(() => import('@/providers/themeProvider'), { +const ThemeProvider = dynamic(() => import('@/providers/ThemeProvider'), { ssr: false, }); diff --git a/packages/app/src/providers/confirm-provider.tsx b/packages/app/src/providers/ConfirmProvider.tsx similarity index 100% rename from packages/app/src/providers/confirm-provider.tsx rename to packages/app/src/providers/ConfirmProvider.tsx diff --git a/packages/app/src/providers/global-modal-provider.tsx b/packages/app/src/providers/GlobalModalProvider.tsx similarity index 100% rename from packages/app/src/providers/global-modal-provider.tsx rename to packages/app/src/providers/GlobalModalProvider.tsx diff --git a/packages/app/src/providers/themeProvider.tsx b/packages/app/src/providers/ThemeProvider.tsx similarity index 100% rename from packages/app/src/providers/themeProvider.tsx rename to packages/app/src/providers/ThemeProvider.tsx diff --git a/packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx b/packages/app/src/providers/app-state-provider/DynamicBlocksuite.tsx similarity index 100% rename from packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx rename to packages/app/src/providers/app-state-provider/DynamicBlocksuite.tsx diff --git a/packages/app/src/providers/app-state-provider/provider.tsx b/packages/app/src/providers/app-state-provider/Provider.tsx similarity index 98% rename from packages/app/src/providers/app-state-provider/provider.tsx rename to packages/app/src/providers/app-state-provider/Provider.tsx index daa60ff85e..9e22634639 100644 --- a/packages/app/src/providers/app-state-provider/provider.tsx +++ b/packages/app/src/providers/app-state-provider/Provider.tsx @@ -10,7 +10,7 @@ import type { } from './context'; import { Page, Workspace as StoreWorkspace } from '@blocksuite/store'; import { EditorContainer } from '@blocksuite/editor'; -const DynamicBlocksuite = dynamic(() => import('./dynamic-blocksuite'), { +const DynamicBlocksuite = dynamic(() => import('./DynamicBlocksuite'), { ssr: false, }); From 2ff46fa831ffa08ed89006175b8c152fae4cefb9 Mon Sep 17 00:00:00 2001 From: MingLiang Wang Date: Mon, 9 Jan 2023 13:58:53 +0800 Subject: [PATCH 56/60] feat: fix type problem --- .../src/provider/local/local.spec.ts | 3 + .../src/provider/selfhosted/index.ts | 63 ------------------- .../src/provider/selfhosted/index.ts.bk | 63 +++++++++++++++++++ 3 files changed, 66 insertions(+), 63 deletions(-) delete mode 100644 packages/data-center/src/provider/selfhosted/index.ts create mode 100644 packages/data-center/src/provider/selfhosted/index.ts.bk diff --git a/packages/data-center/src/provider/local/local.spec.ts b/packages/data-center/src/provider/local/local.spec.ts index 442263c070..72803370ba 100644 --- a/packages/data-center/src/provider/local/local.spec.ts +++ b/packages/data-center/src/provider/local/local.spec.ts @@ -2,11 +2,13 @@ import { describe, test, expect } from 'vitest'; import { Workspaces } from '../../workspaces'; import { LocalProvider } from './local'; import 'fake-indexeddb/auto'; +import { BlobStorage } from '@blocksuite/store'; describe('local provider', () => { const workspaces = new Workspaces(); const provider = new LocalProvider({ workspaces: workspaces.createScope(), + blobs: new BlobStorage(), }); const workspaceName = 'workspace-test'; @@ -27,6 +29,7 @@ describe('local provider', () => { const workspaces1 = new Workspaces(); const provider1 = new LocalProvider({ workspaces: workspaces1.createScope(), + blobs: new BlobStorage(), }); await provider1.loadWorkspaces(); expect(workspaces1.workspaces.length).toEqual(1); diff --git a/packages/data-center/src/provider/selfhosted/index.ts b/packages/data-center/src/provider/selfhosted/index.ts deleted file mode 100644 index 48632480ef..0000000000 --- a/packages/data-center/src/provider/selfhosted/index.ts +++ /dev/null @@ -1,63 +0,0 @@ -import assert from 'assert'; - -import { LocalProvider } from '../local/index.js'; -import { WebsocketProvider } from './sync.js'; - -export class SelfHostedProvider extends LocalProvider { - static id = 'selfhosted'; - private _ws?: WebsocketProvider; - - constructor() { - super(); - } - - async destroy() { - this._ws?.disconnect(); - } - - async initData() { - const databases = await indexedDB.databases(); - await super.initData( - // set locally to true if exists a same name db - databases - .map(db => db.name) - .filter(v => v) - .includes(this._workspace.room) - ); - - const workspace = this._workspace; - const doc = workspace.doc; - - if (workspace.room) { - try { - // Wait for ws synchronization to complete, otherwise the data will be modified in reverse, which can be optimized later - this._ws = new WebsocketProvider(this.host, workspace.room, doc); - await new Promise((resolve, reject) => { - // TODO: synced will also be triggered on reconnection after losing sync - // There needs to be an event mechanism to emit the synchronization state to the upper layer - assert(this._ws); - this._ws.once('synced', () => resolve()); - this._ws.once('lost-connection', () => resolve()); - this._ws.once('connection-error', () => reject()); - }); - this._signals.listAdd.emit({ - workspace: workspace.room, - provider: this.id, - locally: true, - }); - } catch (e) { - this._logger('Failed to init cloud workspace', e); - } - } - - // if after update, the space:meta is empty - // then we need to get map with doc - // just a workaround for yjs - doc.getMap('space:meta'); - } - - private get host() { - const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:'; - return `${protocol}//${location.host}/collaboration/`; - } -} diff --git a/packages/data-center/src/provider/selfhosted/index.ts.bk b/packages/data-center/src/provider/selfhosted/index.ts.bk new file mode 100644 index 0000000000..c74a13cf81 --- /dev/null +++ b/packages/data-center/src/provider/selfhosted/index.ts.bk @@ -0,0 +1,63 @@ +// import assert from 'assert'; + +// import { LocalProvider } from '../local/index.js'; +// import { WebsocketProvider } from './sync.js'; + +// export class SelfHostedProvider extends LocalProvider { +// static id = 'selfhosted'; +// private _ws?: WebsocketProvider; + +// constructor() { +// super(); +// } + +// async destroy() { +// this._ws?.disconnect(); +// } + +// async initData() { +// const databases = await indexedDB.databases(); +// await super.initData( +// // set locally to true if exists a same name db +// databases +// .map(db => db.name) +// .filter(v => v) +// .includes(this._workspace.room) +// ); + +// const workspace = this._workspace; +// const doc = workspace.doc; + +// if (workspace.room) { +// try { +// // Wait for ws synchronization to complete, otherwise the data will be modified in reverse, which can be optimized later +// this._ws = new WebsocketProvider(this.host, workspace.room, doc); +// await new Promise((resolve, reject) => { +// // TODO: synced will also be triggered on reconnection after losing sync +// // There needs to be an event mechanism to emit the synchronization state to the upper layer +// assert(this._ws); +// this._ws.once('synced', () => resolve()); +// this._ws.once('lost-connection', () => resolve()); +// this._ws.once('connection-error', () => reject()); +// }); +// this._signals.listAdd.emit({ +// workspace: workspace.room, +// provider: this.id, +// locally: true, +// }); +// } catch (e) { +// this._logger('Failed to init cloud workspace', e); +// } +// } + +// // if after update, the space:meta is empty +// // then we need to get map with doc +// // just a workaround for yjs +// doc.getMap('space:meta'); +// } + +// private get host() { +// const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:'; +// return `${protocol}//${location.host}/collaboration/`; +// } +// } From 20cef6e54adc75defac1d3782e788c5575a4be71 Mon Sep 17 00:00:00 2001 From: DarkSky Date: Mon, 9 Jan 2023 14:08:11 +0800 Subject: [PATCH 57/60] fix: skip some test for outdated ux --- .../src/providers/app-state-provider/DynamicBlocksuite.tsx | 2 +- tests/contact-us.spec.ts | 2 +- tests/local-first-workspace.spec.ts | 4 ++-- tests/login.spec.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/app/src/providers/app-state-provider/DynamicBlocksuite.tsx b/packages/app/src/providers/app-state-provider/DynamicBlocksuite.tsx index 1875a35557..83d081f0c8 100644 --- a/packages/app/src/providers/app-state-provider/DynamicBlocksuite.tsx +++ b/packages/app/src/providers/app-state-provider/DynamicBlocksuite.tsx @@ -18,7 +18,7 @@ const DynamicBlocksuite = ({ const openWorkspace: LoadWorkspaceHandler = async (workspaceId: string) => { if (workspaceId) { const dc = await getDataCenter(); - return dc.load(workspaceId, { providerId: 'selfhosted' }); + return dc.load(workspaceId, { providerId: 'local' }); } else { return null; } diff --git a/tests/contact-us.spec.ts b/tests/contact-us.spec.ts index 798b75608f..370ed144b7 100644 --- a/tests/contact-us.spec.ts +++ b/tests/contact-us.spec.ts @@ -4,7 +4,7 @@ import { loadPage } from './libs/load-page.js'; loadPage(); test.describe('Open contact us', () => { - test('Click about us', async ({ page }) => { + test.skip('Click about us', async ({ page }) => { const currentWorkspace = page.getByTestId('current-workspace'); await currentWorkspace.click(); // await page.waitForTimeout(1000); diff --git a/tests/local-first-workspace.spec.ts b/tests/local-first-workspace.spec.ts index 344f2baaf1..39b10c6aea 100644 --- a/tests/local-first-workspace.spec.ts +++ b/tests/local-first-workspace.spec.ts @@ -4,12 +4,12 @@ import { loadPage } from './libs/load-page.js'; loadPage(); test.describe('Local first default workspace', () => { - test('Default workspace name', async ({ page }) => { + test.skip('Default workspace name', async ({ page }) => { const workspaceName = page.getByTestId('workspace-name'); expect(await workspaceName.textContent()).toBe('AFFiNE'); }); - test('Default workspace avatar', async ({ page }) => { + test.skip('Default workspace avatar', async ({ page }) => { const workspaceAvatar = page.getByTestId('workspace-avatar'); expect(await workspaceAvatar.innerHTML()).toBe( '' diff --git a/tests/login.spec.ts b/tests/login.spec.ts index 629a657b85..ed7185259f 100644 --- a/tests/login.spec.ts +++ b/tests/login.spec.ts @@ -4,7 +4,7 @@ import { loadPage } from './libs/load-page.js'; loadPage(); test.describe('Login Flow', () => { - test('Open login modal by click current workspace', async ({ page }) => { + test.skip('Open login modal by click current workspace', async ({ page }) => { await page.getByTestId('current-workspace').click(); await page.waitForTimeout(800); // why don't we use waitForSelector, It seems that waitForSelector not stable? From 20e2984c04bc6c6a76d92aeb155c4044e3d5e7c1 Mon Sep 17 00:00:00 2001 From: DarkSky Date: Mon, 9 Jan 2023 14:11:19 +0800 Subject: [PATCH 58/60] feat: add extensions recommendations --- .vscode/extensions.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index f192bb1ba6..bbe3b2cbf8 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,3 +1,8 @@ { - "recommendations": ["ms-playwright.playwright", "esbenp.prettier-vscode"] + "recommendations": [ + "ms-playwright.playwright", + "esbenp.prettier-vscode", + "deepscan.vscode-deepscan", + "streetsidesoftware.code-spell-checker" + ] } From ae88dbd7171264d7055ae9a82edcad07e95e19bd Mon Sep 17 00:00:00 2001 From: QiShaoXuan Date: Mon, 9 Jan 2023 14:23:01 +0800 Subject: [PATCH 59/60] feat: add pacakge module --- packages/data-center/package.json | 5 +- pnpm-lock.yaml | 1449 ++++++++++++++++++++++++++--- 2 files changed, 1325 insertions(+), 129 deletions(-) diff --git a/packages/data-center/package.json b/packages/data-center/package.json index fe639b306e..76d234439e 100644 --- a/packages/data-center/package.json +++ b/packages/data-center/package.json @@ -36,7 +36,8 @@ "ky-universal": "^0.11.0", "lib0": "^0.2.58", "swr": "^2.0.0", - "yjs": "^13.5.44", - "y-protocols": "^1.0.5" + "vitest": "^0.26.3", + "y-protocols": "^1.0.5", + "yjs": "^13.5.44" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 55cf7d85c1..7af385e9a0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,7 @@ importers: .: specifiers: '@changesets/cli': ^2.26.0 + '@jest/globals': ^29.3.1 '@playwright/test': ^1.29.1 '@types/eslint': ^8.4.10 '@types/node': ^18.11.17 @@ -17,12 +18,14 @@ importers: fake-indexeddb: 4.0.1 got: ^12.5.3 husky: ^8.0.2 + jest: ^29.3.1 lint-staged: ^13.1.0 prettier: ^2.7.1 + ts-jest: ^29.0.3 typescript: ^4.9.3 - vitest: ^0.26.3 devDependencies: '@changesets/cli': 2.26.0 + '@jest/globals': 29.3.1 '@playwright/test': 1.29.1 '@types/eslint': 8.4.10 '@types/node': 18.11.18 @@ -35,10 +38,11 @@ importers: fake-indexeddb: 4.0.1 got: 12.5.3 husky: 8.0.2 + jest: 29.3.1_@types+node@18.11.18 lint-staged: 13.1.0 prettier: 2.7.1 + ts-jest: 29.0.3_4f6uxrzmuwipl5rr3bcogf6k74 typescript: 4.9.3 - vitest: 0.26.3 packages/app: specifiers: @@ -143,6 +147,7 @@ importers: lib0: ^0.2.58 swr: ^2.0.0 typescript: ^4.8.4 + vitest: ^0.26.3 y-protocols: ^1.0.5 yjs: ^13.5.44 dependencies: @@ -156,6 +161,7 @@ importers: ky-universal: 0.11.0_ky@0.33.1 lib0: 0.2.58 swr: 2.0.0 + vitest: 0.26.3 y-protocols: 1.0.5 yjs: 13.5.44 devDependencies: @@ -753,6 +759,15 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.5: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.5 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.5: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -800,6 +815,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.5: + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.5 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.5: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -818,6 +842,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: false + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.5: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.5 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.5: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -892,6 +926,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.5: + resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.5 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.20.5: resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} engines: {node: '>=6.9.0'} @@ -1443,6 +1487,10 @@ packages: to-fast-properties: 2.0.0 dev: true + /@bcoe/v8-coverage/0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + /@blocksuite/blocks/0.3.1-20230106060050-1aad55d_yjs@13.5.44: resolution: {integrity: sha512-qRNXmhjw+GAGsV1mI2XXPxYTlHfsFHv9ttTCNQ6IIcxvc5Hh6lWmdwVibxvlpYUkgEc1zv3/GxOEsR/ngpZXzQ==} dependencies: @@ -1905,202 +1953,202 @@ packages: resolution: {integrity: sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==} dev: false - /@esbuild/android-arm/0.16.15: - resolution: {integrity: sha512-JsJtmadyWcR+DEtHLixM7bAQsfi1s0Xotv9kVOoXbCLyhKPOHvMEyh3kJBuTbCPSE4c2jQkQVmarwc9Mg9k3bA==} + /@esbuild/android-arm/0.16.16: + resolution: {integrity: sha512-BUuWMlt4WSXod1HSl7aGK8fJOsi+Tab/M0IDK1V1/GstzoOpqc/v3DqmN8MkuapPKQ9Br1WtLAN4uEgWR8x64A==} engines: {node: '>=12'} cpu: [arm] os: [android] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/android-arm64/0.16.15: - resolution: {integrity: sha512-OdbkUv7468dSsgoFtHIwTaYAuI5lDEv/v+dlfGBUbVa2xSDIIuSOHXawynw5N9+5lygo/JdXa5/sgGjiEU18gQ==} + /@esbuild/android-arm64/0.16.16: + resolution: {integrity: sha512-hFHVAzUKp9Tf8psGq+bDVv+6hTy1bAOoV/jJMUWwhUnIHsh6WbFMhw0ZTkqDuh7TdpffFoHOiIOIxmHc7oYRBQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/android-x64/0.16.15: - resolution: {integrity: sha512-dPUOBiNNWAm+/bxoA75o7R7qqqfcEzXaYlb5uJk2xGHmUMNKSAnDCtRYLgx9/wfE4sXyn8H948OrDyUAHhPOuA==} + /@esbuild/android-x64/0.16.16: + resolution: {integrity: sha512-9WhxJpeb6XumlfivldxqmkJepEcELekmSw3NkGrs+Edq6sS5KRxtUBQuKYDD7KqP59dDkxVbaoPIQFKWQG0KLg==} engines: {node: '>=12'} cpu: [x64] os: [android] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/darwin-arm64/0.16.15: - resolution: {integrity: sha512-AksarYV85Hxgwh5/zb6qGl4sYWxIXPQGBAZ+jUro1ZpINy3EWumK+/4DPOKUBPnsrOIvnNXy7Rq4mTeCsMQDNA==} + /@esbuild/darwin-arm64/0.16.16: + resolution: {integrity: sha512-8Z+wld+vr/prHPi2O0X7o1zQOfMbXWGAw9hT0jEyU/l/Yrg+0Z3FO9pjPho72dVkZs4ewZk0bDOFLdZHm8jEfw==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/darwin-x64/0.16.15: - resolution: {integrity: sha512-qqrKJxoohceZGGP+sZ5yXkzW9ZiyFZJ1gWSEfuYdOWzBSL18Uy3w7s/IvnDYHo++/cxwqM0ch3HQVReSZy7/4Q==} + /@esbuild/darwin-x64/0.16.16: + resolution: {integrity: sha512-CYkxVvkZzGCqFrt7EgjFxQKhlUPyDkuR9P0Y5wEcmJqVI8ncerOIY5Kej52MhZyzOBXkYrJgZeVZC9xXXoEg9A==} engines: {node: '>=12'} cpu: [x64] os: [darwin] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/freebsd-arm64/0.16.15: - resolution: {integrity: sha512-LBWaep6RvJm5KnsKkocdVEzuwnGMjz54fcRVZ9d3R7FSEWOtPBxMhuxeA1n98JVbCLMkTPFmKN6xSnfhnM9WXQ==} + /@esbuild/freebsd-arm64/0.16.16: + resolution: {integrity: sha512-fxrw4BYqQ39z/3Ja9xj/a1gMsVq0xEjhSyI4a9MjfvDDD8fUV8IYliac96i7tzZc3+VytyXX+XNsnpEk5sw5Wg==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/freebsd-x64/0.16.15: - resolution: {integrity: sha512-LE8mKC6JPR04kPLRP9A6k7ZmG0k2aWF4ru79Sde6UeWCo7yDby5f48uJNFQ2pZqzUUkLrHL8xNdIHerJeZjHXg==} + /@esbuild/freebsd-x64/0.16.16: + resolution: {integrity: sha512-8p3v1D+du2jiDvSoNVimHhj7leSfST9YlKsAEO7etBfuqjaBMndo0fmjNLp0JCMld+XIx9L80tooOkyUv1a1PQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/linux-arm/0.16.15: - resolution: {integrity: sha512-+1sGlqtMJTOnJUXwLUGnDhPaGRKqxT0UONtYacS+EjdDOrSgpQ/1gUXlnze45Z/BogwYaswQM19Gu1YD1T19/w==} + /@esbuild/linux-arm/0.16.16: + resolution: {integrity: sha512-bYaocE1/PTMRmkgSckZ0D0Xn2nox8v2qlk+MVVqm+VECNKDdZvghVZtH41dNtBbwADSvA6qkCHGYeWm9LrNCBw==} engines: {node: '>=12'} cpu: [arm] os: [linux] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/linux-arm64/0.16.15: - resolution: {integrity: sha512-mRYpuQGbzY+XLczy3Sk7fMJ3DRKLGDIuvLKkkUkyecDGQMmil6K/xVKP9IpKO7JtNH477qAiMjjX7jfKae8t4g==} + /@esbuild/linux-arm64/0.16.16: + resolution: {integrity: sha512-N3u6BBbCVY3xeP2D8Db7QY8I+nZ+2AgOopUIqk+5yCoLnsWkcVxD2ay5E9iIdvApFi1Vg1lZiiwaVp8bOpAc4A==} engines: {node: '>=12'} cpu: [arm64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/linux-ia32/0.16.15: - resolution: {integrity: sha512-puXVFvY4m8EB6/fzu3LdgjiNnEZ3gZMSR7NmKoQe51l3hyQalvTjab3Dt7aX4qGf+8Pj7dsCOBNzNzkSlr/4Aw==} + /@esbuild/linux-ia32/0.16.16: + resolution: {integrity: sha512-dxjqLKUW8GqGemoRT9v8IgHk+T4tRm1rn1gUcArsp26W9EkK/27VSjBVUXhEG5NInHZ92JaQ3SSMdTwv/r9a2A==} engines: {node: '>=12'} cpu: [ia32] os: [linux] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/linux-loong64/0.16.15: - resolution: {integrity: sha512-ATMGb3eg8T6ZTGZFldlGeFEcevBiVq6SBHvRAO04HMfUjZWneZ/U+JJb3YzlNZxuscJ4Tmzq+JrYxlk7ro4dRg==} + /@esbuild/linux-loong64/0.16.16: + resolution: {integrity: sha512-MdUFggHjRiCCwNE9+1AibewoNq6wf94GLB9Q9aXwl+a75UlRmbRK3h6WJyrSGA6ZstDJgaD2wiTSP7tQNUYxwA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/linux-mips64el/0.16.15: - resolution: {integrity: sha512-3SEA4L82OnoSATW+Ve8rPgLaKjC8WMt8fnx7De9kvi/NcVbkj8W+J7qnu/tK2P9pUPQP7Au/0sjPEqZtFeyKQQ==} + /@esbuild/linux-mips64el/0.16.16: + resolution: {integrity: sha512-CO3YmO7jYMlGqGoeFeKzdwx/bx8Vtq/SZaMAi+ZLDUnDUdfC7GmGwXzIwDJ70Sg+P9pAemjJyJ1icKJ9R3q/Fg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/linux-ppc64/0.16.15: - resolution: {integrity: sha512-8PgbeX+N6vmqeySzyxO0NyDOltCEW13OS5jUHTvCHmCgf4kNXZtAWJ+zEfJxjRGYhVezQ1FdIm7WfN1R27uOyg==} + /@esbuild/linux-ppc64/0.16.16: + resolution: {integrity: sha512-DSl5Czh5hCy/7azX0Wl9IdzPHX2H8clC6G87tBnZnzUpNgRxPFhfmArbaHoAysu4JfqCqbB/33u/GL9dUgCBAw==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/linux-riscv64/0.16.15: - resolution: {integrity: sha512-U+coqH+89vbPVoU30no1Fllrn6gvEeO5tfEArBhjYZ+dQ3Gv7ciQXYf5nrT1QdlIFwEjH4Is1U1iiaGWW+tGpQ==} + /@esbuild/linux-riscv64/0.16.16: + resolution: {integrity: sha512-sSVVMEXsqf1fQu0j7kkhXMViroixU5XoaJXl1u/u+jbXvvhhCt9YvA/B6VM3aM/77HuRQ94neS5bcisijGnKFQ==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/linux-s390x/0.16.15: - resolution: {integrity: sha512-M0nKLFMdyFGBoitxG42kq6Xap0CPeDC6gfF9lg7ZejzGF6kqYUGT+pQGl2QCQoxJBeat/LzTma1hG8C3dq2ocg==} + /@esbuild/linux-s390x/0.16.16: + resolution: {integrity: sha512-jRqBCre9gZGoCdCN/UWCCMwCMsOg65IpY9Pyj56mKCF5zXy9d60kkNRdDN6YXGjr3rzcC4DXnS/kQVCGcC4yPQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/linux-x64/0.16.15: - resolution: {integrity: sha512-t7/fOXBUKfigvhJLGKZ9TPHHgqNgpIpYaAbcXQk1X+fPeUG7x0tpAbXJ2wST9F/gJ02+CLETPMnhG7Tra2wqsQ==} + /@esbuild/linux-x64/0.16.16: + resolution: {integrity: sha512-G1+09TopOzo59/55lk5Q0UokghYLyHTKKzD5lXsAOOlGDbieGEFJpJBr3BLDbf7cz89KX04sBeExAR/pL/26sA==} engines: {node: '>=12'} cpu: [x64] os: [linux] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/netbsd-x64/0.16.15: - resolution: {integrity: sha512-0k0Nxi6DOJmTnLtKD/0rlyqOPpcqONXY53vpkoAsue8CfyhNPWtwzba1ICFNCfCY1dqL3Ho/xEzujJhmdXq1rg==} + /@esbuild/netbsd-x64/0.16.16: + resolution: {integrity: sha512-xwjGJB5wwDEujLaJIrSMRqWkbigALpBNcsF9SqszoNKc+wY4kPTdKrSxiY5ik3IatojePP+WV108MvF6q6np4w==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/openbsd-x64/0.16.15: - resolution: {integrity: sha512-3SkckazfIbdSjsGpuIYT3d6n2Hx0tck3MS1yVsbahhWiLvdy4QozTpvlbjqO3GmvtvhxY4qdyhFOO2wiZKeTAQ==} + /@esbuild/openbsd-x64/0.16.16: + resolution: {integrity: sha512-yeERkoxG2nR2oxO5n+Ms7MsCeNk23zrby2GXCqnfCpPp7KNc0vxaaacIxb21wPMfXXRhGBrNP4YLIupUBrWdlg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/sunos-x64/0.16.15: - resolution: {integrity: sha512-8PNvBC+O8X5EnyIGqE8St2bOjjrXMR17NOLenIrzolvwWnJXvwPo0tE/ahOeiAJmTOS/eAcN8b4LAZcn17Uj7w==} + /@esbuild/sunos-x64/0.16.16: + resolution: {integrity: sha512-nHfbEym0IObXPhtX6Va3H5GaKBty2kdhlAhKmyCj9u255ktAj0b1YACUs9j5H88NRn9cJCthD1Ik/k9wn8YKVg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/win32-arm64/0.16.15: - resolution: {integrity: sha512-YPaSgm/mm7kNcATB53OxVGVfn6rDNbImTn330ZlF3hKej1e9ktCaljGjn2vH08z2dlHEf3kdt57tNjE6zs8SzA==} + /@esbuild/win32-arm64/0.16.16: + resolution: {integrity: sha512-pdD+M1ZOFy4hE15ZyPX09fd5g4DqbbL1wXGY90YmleVS6Y5YlraW4BvHjim/X/4yuCpTsAFvsT4Nca2lbyDH/A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/win32-ia32/0.16.15: - resolution: {integrity: sha512-0movUXbSNrTeNf5ZXT0avklEvlJD0hNGZsrrXHfsp9z4tK5xC+apCqmUEZeE9mqrb84Z8XbgGr/MS9LqafTP2A==} + /@esbuild/win32-ia32/0.16.16: + resolution: {integrity: sha512-IPEMfU9p0c3Vb8PqxaPX6BM9rYwlTZGYOf9u+kMdhoILZkVKEjq6PKZO0lB+isojWwAnAqh4ZxshD96njTXajg==} engines: {node: '>=12'} cpu: [ia32] os: [win32] requiresBuild: true - dev: true + dev: false optional: true - /@esbuild/win32-x64/0.16.15: - resolution: {integrity: sha512-27h5GCcbfomVAqAnMJWvR1LqEY0dFqIq4vTe5nY3becnZNu0SX8F0+gTk3JPvgWQHzaGc6VkPzlOiMkdSUunUA==} + /@esbuild/win32-x64/0.16.16: + resolution: {integrity: sha512-1YYpoJ39WV/2bnShPwgdzJklc+XS0bysN6Tpnt1cWPdeoKOG4RMEY1g7i534QxXX/rPvNx/NLJQTTCeORYzipg==} engines: {node: '>=12'} cpu: [x64] os: [win32] requiresBuild: true - dev: true + dev: false optional: true /@eslint/eslintrc/1.3.2: @@ -2673,6 +2721,235 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true + /@istanbuljs/load-nyc-config/1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema/0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console/29.3.1: + resolution: {integrity: sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + '@types/node': 18.11.18 + chalk: 4.1.2 + jest-message-util: 29.3.1 + jest-util: 29.3.1 + slash: 3.0.0 + dev: true + + /@jest/core/29.3.1: + resolution: {integrity: sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.3.1 + '@jest/reporters': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.18 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.7.0 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-changed-files: 29.2.0 + jest-config: 29.3.1_@types+node@18.11.18 + jest-haste-map: 29.3.1 + jest-message-util: 29.3.1 + jest-regex-util: 29.2.0 + jest-resolve: 29.3.1 + jest-resolve-dependencies: 29.3.1 + jest-runner: 29.3.1 + jest-runtime: 29.3.1 + jest-snapshot: 29.3.1 + jest-util: 29.3.1 + jest-validate: 29.3.1 + jest-watcher: 29.3.1 + micromatch: 4.0.5 + pretty-format: 29.3.1 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/environment/29.3.1: + resolution: {integrity: sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.18 + jest-mock: 29.3.1 + dev: true + + /@jest/expect-utils/29.3.1: + resolution: {integrity: sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.2.0 + dev: true + + /@jest/expect/29.3.1: + resolution: {integrity: sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.3.1 + jest-snapshot: 29.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers/29.3.1: + resolution: {integrity: sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + '@sinonjs/fake-timers': 9.1.2 + '@types/node': 18.11.18 + jest-message-util: 29.3.1 + jest-mock: 29.3.1 + jest-util: 29.3.1 + dev: true + + /@jest/globals/29.3.1: + resolution: {integrity: sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.3.1 + '@jest/expect': 29.3.1 + '@jest/types': 29.3.1 + jest-mock: 29.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters/29.3.1: + resolution: {integrity: sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@jridgewell/trace-mapping': 0.3.17 + '@types/node': 18.11.18 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + jest-message-util: 29.3.1 + jest-util: 29.3.1 + jest-worker: 29.3.1 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas/29.0.0: + resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.24.51 + dev: true + + /@jest/source-map/29.2.0: + resolution: {integrity: sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + callsites: 3.1.0 + graceful-fs: 4.2.10 + dev: true + + /@jest/test-result/29.3.1: + resolution: {integrity: sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.3.1 + '@jest/types': 29.3.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + dev: true + + /@jest/test-sequencer/29.3.1: + resolution: {integrity: sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.3.1 + graceful-fs: 4.2.10 + jest-haste-map: 29.3.1 + slash: 3.0.0 + dev: true + + /@jest/transform/29.3.1: + resolution: {integrity: sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.20.5 + '@jest/types': 29.3.1 + '@jridgewell/trace-mapping': 0.3.17 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.10 + jest-haste-map: 29.3.1 + jest-regex-util: 29.2.0 + jest-util: 29.3.1 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types/29.3.1: + resolution: {integrity: sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.0.0 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.11.18 + '@types/yargs': 17.0.19 + chalk: 4.1.2 + dev: true + /@jridgewell/gen-mapping/0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} @@ -3475,11 +3752,27 @@ packages: resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} dev: true + /@sinclair/typebox/0.24.51: + resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + dev: true + /@sindresorhus/is/5.3.0: resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==} engines: {node: '>=14.16'} dev: true + /@sinonjs/commons/1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers/9.1.2: + resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + /@surma/rollup-plugin-off-main-thread/2.2.3: resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} dependencies: @@ -3517,15 +3810,44 @@ packages: resolution: {integrity: sha512-GiS5Df3CzXY/fPBFcM0CKFERZfI4Cg1X33VPZX+NLo7Fwm/h9zu/aU24N1mG75Q9LuMnwKm7woxKr8BiUXGYCg==} dev: false + /@types/babel__core/7.1.20: + resolution: {integrity: sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==} + dependencies: + '@babel/parser': 7.20.7 + '@babel/types': 7.20.7 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.18.3 + dev: true + + /@types/babel__generator/7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.20.7 + dev: true + + /@types/babel__template/7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.20.7 + '@babel/types': 7.20.7 + dev: true + + /@types/babel__traverse/7.18.3: + resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} + dependencies: + '@babel/types': 7.20.7 + dev: true + /@types/chai-subset/1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: '@types/chai': 4.3.4 - dev: true + dev: false /@types/chai/4.3.4: resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} - dev: true + dev: false /@types/debug/4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} @@ -3555,6 +3877,12 @@ packages: '@types/node': 18.7.18 dev: true + /@types/graceful-fs/4.1.6: + resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + dependencies: + '@types/node': 18.11.18 + dev: true + /@types/http-cache-semantics/4.0.1: resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} dev: true @@ -3565,6 +3893,22 @@ packages: ci-info: 3.7.0 dev: true + /@types/istanbul-lib-coverage/2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + dev: true + + /@types/istanbul-reports/3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: true + /@types/json-schema/7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true @@ -3608,6 +3952,10 @@ packages: 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==} @@ -3667,6 +4015,10 @@ packages: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true + /@types/stack-utils/2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true + /@types/trusted-types/2.0.2: resolution: {integrity: sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==} @@ -3674,6 +4026,16 @@ packages: resolution: {integrity: sha512-UYK244awtmcUYQfs7FR8710MJcefL2WvkyHMjA8yJzxd1mo0Gfn88sRZ1Bls7hiUhA2w7ne1gpJ9T5g3G0wOyA==} dev: true + /@types/yargs-parser/21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: true + + /@types/yargs/17.0.19: + resolution: {integrity: sha512-cAx3qamwaYX9R0fzOIZAlFpo4A+1uBVCxqpKz9D26uTF4srRXaGTTsikQmaotCtNdbhzyUH7ft6p9ktz9s6UNQ==} + dependencies: + '@types/yargs-parser': 21.0.0 + 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} @@ -3862,7 +4224,7 @@ packages: /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} - dev: true + dev: false /acorn/8.8.0: resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} @@ -3873,7 +4235,7 @@ packages: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} hasBin: true - dev: true + dev: false /aggregate-error/3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} @@ -3942,11 +4304,24 @@ packages: dependencies: color-convert: 2.0.1 + /ansi-styles/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + /ansi-styles/6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} dev: true + /anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + /argparse/1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: @@ -4035,7 +4410,7 @@ packages: /assertion-error/1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true + dev: false /ast-types-flow/0.0.7: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} @@ -4068,6 +4443,24 @@ packages: resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} dev: true + /babel-jest/29.3.1_@babel+core@7.20.5: + resolution: {integrity: sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.20.5 + '@jest/transform': 29.3.1 + '@types/babel__core': 7.1.20 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.2.0_@babel+core@7.20.5 + chalk: 4.1.2 + graceful-fs: 4.2.10 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-loader/8.3.0: resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} @@ -4081,6 +4474,29 @@ packages: schema-utils: 2.7.1 dev: true + /babel-plugin-istanbul/6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.20.2 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist/29.2.0: + resolution: {integrity: sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.20.7 + '@babel/types': 7.20.7 + '@types/babel__core': 7.1.20 + '@types/babel__traverse': 7.18.3 + dev: true + /babel-plugin-macros/3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -4126,6 +4542,37 @@ packages: - supports-color dev: true + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.20.5: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.5 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.5 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.20.5 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.5 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.20.5 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.5 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.5 + dev: true + + /babel-preset-jest/29.2.0_@babel+core@7.20.5: + resolution: {integrity: sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.5 + babel-plugin-jest-hoist: 29.2.0 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.5 + dev: true + /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -4187,13 +4634,25 @@ packages: update-browserslist-db: 1.0.10_browserslist@4.21.4 dev: true + /bs-logger/0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser/2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + /buffer-from/0.1.2: resolution: {integrity: sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==} dev: false /buffer-from/1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true /buffer/6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -4249,6 +4708,11 @@ packages: engines: {node: '>=6'} dev: true + /camelcase/6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + /caniuse-lite/1.0.30001419: resolution: {integrity: sha512-aFO1r+g6R7TW+PNQxKzjITwLOyDhVRLjW0LcwS/HCZGUUKTGNp9+IwLC4xyDSZBygVL/mxaFR3HIV6wEKQuSzw==} @@ -4263,7 +4727,7 @@ packages: loupe: 2.3.6 pathval: 1.1.1 type-detect: 4.0.8 - dev: true + dev: false /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -4281,19 +4745,28 @@ packages: supports-color: 7.2.0 dev: true + /char-regex/1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + /chardet/0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true /check-error/1.0.2: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - dev: true + dev: false /ci-info/3.7.0: resolution: {integrity: sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==} engines: {node: '>=8'} dev: true + /cjs-module-lexer/1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + dev: true + /clean-stack/2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -4388,6 +4861,15 @@ packages: - '@types/react' dev: false + /co/4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /collect-v8-coverage/1.0.1: + resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} + dev: true + /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -4438,6 +4920,10 @@ packages: /convert-source-map/1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + /convert-source-map/2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + /core-js-compat/3.27.1: resolution: {integrity: sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==} dependencies: @@ -4583,12 +5069,16 @@ packages: mimic-response: 3.1.0 dev: true + /dedent/0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true + /deep-eql/4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} dependencies: type-detect: 4.0.8 - dev: true + dev: false /deep-equal/1.1.1: resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} @@ -4646,10 +5136,20 @@ packages: engines: {node: '>=8'} dev: true + /detect-newline/3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + /detect-node-es/1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false + /diff-sequences/29.3.1: + resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /dir-glob/3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -4710,6 +5210,11 @@ packages: resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} dev: true + /emittery/0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + dev: true + /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -4788,35 +5293,35 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild/0.16.15: - resolution: {integrity: sha512-v+3ozjy9wyj8cOElzx3//Lsb4TCxPfZxRmdsfm0YaEkvZu7y6rKH7Zi1UpDx4JI7dSQui+U1Qxhfij9KBbHfrA==} + /esbuild/0.16.16: + resolution: {integrity: sha512-24JyKq10KXM5EBIgPotYIJ2fInNWVVqflv3gicIyQqfmUqi4HvDW1VR790cBgLJHCl96Syy7lhoz7tLFcmuRmg==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.16.15 - '@esbuild/android-arm64': 0.16.15 - '@esbuild/android-x64': 0.16.15 - '@esbuild/darwin-arm64': 0.16.15 - '@esbuild/darwin-x64': 0.16.15 - '@esbuild/freebsd-arm64': 0.16.15 - '@esbuild/freebsd-x64': 0.16.15 - '@esbuild/linux-arm': 0.16.15 - '@esbuild/linux-arm64': 0.16.15 - '@esbuild/linux-ia32': 0.16.15 - '@esbuild/linux-loong64': 0.16.15 - '@esbuild/linux-mips64el': 0.16.15 - '@esbuild/linux-ppc64': 0.16.15 - '@esbuild/linux-riscv64': 0.16.15 - '@esbuild/linux-s390x': 0.16.15 - '@esbuild/linux-x64': 0.16.15 - '@esbuild/netbsd-x64': 0.16.15 - '@esbuild/openbsd-x64': 0.16.15 - '@esbuild/sunos-x64': 0.16.15 - '@esbuild/win32-arm64': 0.16.15 - '@esbuild/win32-ia32': 0.16.15 - '@esbuild/win32-x64': 0.16.15 - dev: true + '@esbuild/android-arm': 0.16.16 + '@esbuild/android-arm64': 0.16.16 + '@esbuild/android-x64': 0.16.16 + '@esbuild/darwin-arm64': 0.16.16 + '@esbuild/darwin-x64': 0.16.16 + '@esbuild/freebsd-arm64': 0.16.16 + '@esbuild/freebsd-x64': 0.16.16 + '@esbuild/linux-arm': 0.16.16 + '@esbuild/linux-arm64': 0.16.16 + '@esbuild/linux-ia32': 0.16.16 + '@esbuild/linux-loong64': 0.16.16 + '@esbuild/linux-mips64el': 0.16.16 + '@esbuild/linux-ppc64': 0.16.16 + '@esbuild/linux-riscv64': 0.16.16 + '@esbuild/linux-s390x': 0.16.16 + '@esbuild/linux-x64': 0.16.16 + '@esbuild/netbsd-x64': 0.16.16 + '@esbuild/openbsd-x64': 0.16.16 + '@esbuild/sunos-x64': 0.16.16 + '@esbuild/win32-arm64': 0.16.16 + '@esbuild/win32-ia32': 0.16.16 + '@esbuild/win32-x64': 0.16.16 + dev: false /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -4826,6 +5331,11 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + /escape-string-regexp/2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -5405,6 +5915,21 @@ packages: resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==} dev: false + /execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + /execa/6.1.0: resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5420,6 +5945,22 @@ packages: strip-final-newline: 3.0.0 dev: true + /exit/0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expect/29.3.1: + resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.3.1 + jest-get-type: 29.2.0 + jest-matcher-utils: 29.3.1 + jest-message-util: 29.3.1 + jest-util: 29.3.1 + dev: true + /extend/3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: false @@ -5487,6 +6028,12 @@ packages: websocket-driver: 0.7.4 dev: false + /fb-watchman/2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + /fetch-blob/3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} @@ -5649,7 +6196,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true - dev: true optional: true /function-bind/1.1.1: @@ -5687,7 +6233,7 @@ packages: /get-func-name/2.0.0: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - dev: true + dev: false /get-intrinsic/1.1.3: resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} @@ -5705,6 +6251,11 @@ packages: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} dev: true + /get-package-type/0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + /get-stream/6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -5879,6 +6430,10 @@ packages: resolution: {integrity: sha512-mshqjgTqx8ee0qryHvRgZaZDxTwxam/2yTQmQlqAWS3+twnq1jsY9Yng9zB7lWq6WRrjTbTOc7knNwccXQiAjQ==} dev: false + /html-escaper/2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + /html-parse-stringify/3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} dependencies: @@ -5915,6 +6470,11 @@ packages: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} dev: true + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + /human-signals/3.0.1: resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} engines: {node: '>=12.20.0'} @@ -5976,6 +6536,15 @@ packages: parent-module: 1.0.1 resolve-from: 4.0.0 + /import-local/3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + /imurmurhash/0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -6073,6 +6642,11 @@ packages: engines: {node: '>=12'} dev: true + /is-generator-fn/2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -6211,6 +6785,52 @@ packages: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} dev: false + /istanbul-lib-coverage/3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument/5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.20.5 + '@babel/parser': 7.20.7 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps/4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports/3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + /jake/10.8.5: resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} engines: {node: '>=10'} @@ -6222,6 +6842,385 @@ packages: minimatch: 3.1.2 dev: true + /jest-changed-files/29.2.0: + resolution: {integrity: sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + p-limit: 3.1.0 + dev: true + + /jest-circus/29.3.1: + resolution: {integrity: sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.3.1 + '@jest/expect': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.18 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 29.3.1 + jest-matcher-utils: 29.3.1 + jest-message-util: 29.3.1 + jest-runtime: 29.3.1 + jest-snapshot: 29.3.1 + jest-util: 29.3.1 + p-limit: 3.1.0 + pretty-format: 29.3.1 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli/29.3.1_@types+node@18.11.18: + resolution: {integrity: sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/types': 29.3.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + import-local: 3.1.0 + jest-config: 29.3.1_@types+node@18.11.18 + jest-util: 29.3.1 + jest-validate: 29.3.1 + prompts: 2.4.2 + yargs: 17.6.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-config/29.3.1_@types+node@18.11.18: + resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.20.5 + '@jest/test-sequencer': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.18 + babel-jest: 29.3.1_@babel+core@7.20.5 + chalk: 4.1.2 + ci-info: 3.7.0 + deepmerge: 4.2.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-circus: 29.3.1 + jest-environment-node: 29.3.1 + jest-get-type: 29.2.0 + jest-regex-util: 29.2.0 + jest-resolve: 29.3.1 + jest-runner: 29.3.1 + jest-util: 29.3.1 + jest-validate: 29.3.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.3.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-diff/29.3.1: + resolution: {integrity: sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.3.1 + jest-get-type: 29.2.0 + pretty-format: 29.3.1 + dev: true + + /jest-docblock/29.2.0: + resolution: {integrity: sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each/29.3.1: + resolution: {integrity: sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + chalk: 4.1.2 + jest-get-type: 29.2.0 + jest-util: 29.3.1 + pretty-format: 29.3.1 + dev: true + + /jest-environment-node/29.3.1: + resolution: {integrity: sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.3.1 + '@jest/fake-timers': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.18 + jest-mock: 29.3.1 + jest-util: 29.3.1 + dev: true + + /jest-get-type/29.2.0: + resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map/29.3.1: + resolution: {integrity: sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + '@types/graceful-fs': 4.1.6 + '@types/node': 18.11.18 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.10 + jest-regex-util: 29.2.0 + jest-util: 29.3.1 + jest-worker: 29.3.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /jest-leak-detector/29.3.1: + resolution: {integrity: sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.2.0 + pretty-format: 29.3.1 + dev: true + + /jest-matcher-utils/29.3.1: + resolution: {integrity: sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.3.1 + jest-get-type: 29.2.0 + pretty-format: 29.3.1 + dev: true + + /jest-message-util/29.3.1: + resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.18.6 + '@jest/types': 29.3.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.10 + micromatch: 4.0.5 + pretty-format: 29.3.1 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock/29.3.1: + resolution: {integrity: sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + '@types/node': 18.11.18 + jest-util: 29.3.1 + dev: true + + /jest-pnp-resolver/1.2.3_jest-resolve@29.3.1: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.3.1 + dev: true + + /jest-regex-util/29.2.0: + resolution: {integrity: sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-resolve-dependencies/29.3.1: + resolution: {integrity: sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.2.0 + jest-snapshot: 29.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve/29.3.1: + resolution: {integrity: sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.10 + jest-haste-map: 29.3.1 + jest-pnp-resolver: 1.2.3_jest-resolve@29.3.1 + jest-util: 29.3.1 + jest-validate: 29.3.1 + resolve: 1.22.1 + resolve.exports: 1.1.0 + slash: 3.0.0 + dev: true + + /jest-runner/29.3.1: + resolution: {integrity: sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.3.1 + '@jest/environment': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.18 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.10 + jest-docblock: 29.2.0 + jest-environment-node: 29.3.1 + jest-haste-map: 29.3.1 + jest-leak-detector: 29.3.1 + jest-message-util: 29.3.1 + jest-resolve: 29.3.1 + jest-runtime: 29.3.1 + jest-util: 29.3.1 + jest-watcher: 29.3.1 + jest-worker: 29.3.1 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime/29.3.1: + resolution: {integrity: sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.3.1 + '@jest/fake-timers': 29.3.1 + '@jest/globals': 29.3.1 + '@jest/source-map': 29.2.0 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.18 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-haste-map: 29.3.1 + jest-message-util: 29.3.1 + jest-mock: 29.3.1 + jest-regex-util: 29.2.0 + jest-resolve: 29.3.1 + jest-snapshot: 29.3.1 + jest-util: 29.3.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-snapshot/29.3.1: + resolution: {integrity: sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.20.5 + '@babel/generator': 7.20.7 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.5 + '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.5 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 + '@jest/expect-utils': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@types/babel__traverse': 7.18.3 + '@types/prettier': 2.7.2 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.5 + chalk: 4.1.2 + expect: 29.3.1 + graceful-fs: 4.2.10 + jest-diff: 29.3.1 + jest-get-type: 29.2.0 + jest-haste-map: 29.3.1 + jest-matcher-utils: 29.3.1 + jest-message-util: 29.3.1 + jest-util: 29.3.1 + natural-compare: 1.4.0 + pretty-format: 29.3.1 + semver: 7.3.7 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util/29.3.1: + resolution: {integrity: sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + '@types/node': 18.11.18 + chalk: 4.1.2 + ci-info: 3.7.0 + graceful-fs: 4.2.10 + picomatch: 2.3.1 + dev: true + + /jest-validate/29.3.1: + resolution: {integrity: sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.2.0 + leven: 3.1.0 + pretty-format: 29.3.1 + dev: true + + /jest-watcher/29.3.1: + resolution: {integrity: sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.18 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.3.1 + string-length: 4.0.2 + dev: true + /jest-worker/26.6.2: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} @@ -6240,6 +7239,36 @@ packages: supports-color: 8.1.1 dev: true + /jest-worker/29.3.1: + resolution: {integrity: sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 18.11.18 + jest-util: 29.3.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest/29.3.1_@types+node@18.11.18: + resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.3.1 + '@jest/types': 29.3.1 + import-local: 3.1.0 + jest-cli: 29.3.1_@types+node@18.11.18 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /js-sdsl/4.2.0: resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==} dev: true @@ -6310,7 +7339,7 @@ packages: /jsonc-parser/3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true + dev: false /jsonfile/4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -6350,6 +7379,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /kleur/3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + /kleur/4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -6519,7 +7553,7 @@ packages: /local-pkg/0.4.2: resolution: {integrity: sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==} engines: {node: '>=14'} - dev: true + dev: false /locate-path/5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} @@ -6543,6 +7577,10 @@ packages: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true + /lodash.memoize/4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -6585,7 +7623,7 @@ packages: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} dependencies: get-func-name: 2.0.0 - dev: true + dev: false /lowercase-keys/3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} @@ -6625,6 +7663,16 @@ 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: + tmpl: 1.0.5 + dev: true + /map-obj/1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} @@ -6737,7 +7785,7 @@ packages: pathe: 1.0.0 pkg-types: 1.0.1 ufo: 1.0.1 - dev: true + dev: false /ms/2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -6911,6 +7959,10 @@ packages: formdata-polyfill: 4.0.10 dev: false + /node-int64/0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + /node-releases/2.0.6: resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} dev: true @@ -6934,6 +7986,13 @@ packages: engines: {node: '>=14.16'} dev: true + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + /npm-run-path/5.1.0: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7159,15 +8218,15 @@ packages: /pathe/0.2.0: resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} - dev: true + dev: false /pathe/1.0.0: resolution: {integrity: sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==} - dev: true + dev: false /pathval/1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + dev: false /perfect-freehand/1.2.0: resolution: {integrity: sha512-h/0ikF1M3phW7CwpZ5MMvKnfpHficWoOEyr//KVNTxV4F6deRK1eYMtHyBKEAKFK0aXIEUK9oBvlF6PNXMDsAw==} @@ -7209,6 +8268,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /pirates/4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + dev: true + /pkg-dir/4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -7222,7 +8286,7 @@ packages: jsonc-parser: 3.2.0 mlly: 1.0.0 pathe: 1.0.0 - dev: true + dev: false /playwright-core/1.29.1: resolution: {integrity: sha512-20Ai3d+lMkWpI9YZYlxk8gxatfgax5STW8GaMozAHwigLiyiKQrdkt7gaoT9UQR8FIVDg6qVXs9IoZUQrDjIIg==} @@ -7245,7 +8309,7 @@ packages: 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==} @@ -7278,10 +8342,27 @@ packages: engines: {node: '>=6'} dev: true + /pretty-format/29.3.1: + resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.0.0 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + /process-nextick-args/2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false + /prompts/2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + /prop-types/15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: @@ -7423,7 +8504,6 @@ packages: /react-is/18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: false /react-remove-scroll-bar/2.3.4_w5j4k42lgipnm43s3brx6h3c34: resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} @@ -7648,6 +8728,13 @@ packages: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} dev: true + /resolve-cwd/3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -7657,8 +8744,14 @@ packages: engines: {node: '>=8'} dev: true + /resolve.exports/1.1.0: + resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} + engines: {node: '>=10'} + dev: true + /resolve/1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true dependencies: is-core-module: 2.10.0 path-parse: 1.0.7 @@ -7736,7 +8829,7 @@ packages: hasBin: true optionalDependencies: fsevents: 2.3.2 - dev: true + dev: false /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -7871,6 +8964,10 @@ packages: - supports-color dev: false + /sisteransi/1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -7923,12 +9020,18 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + /source-map-support/0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + /source-map-support/0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true /source-map/0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} @@ -7938,7 +9041,6 @@ packages: /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: true /source-map/0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} @@ -7985,6 +9087,13 @@ packages: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true + /stack-utils/2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + /stream-transform/2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} dependencies: @@ -7996,6 +9105,14 @@ packages: engines: {node: '>=0.6.19'} dev: true + /string-length/4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -8085,11 +9202,21 @@ packages: engines: {node: '>=4'} dev: true + /strip-bom/4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + /strip-comments/2.0.1: resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} engines: {node: '>=10'} dev: true + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + /strip-final-newline/3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -8111,7 +9238,7 @@ packages: resolution: {integrity: sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==} dependencies: acorn: 8.8.1 - dev: true + dev: false /styled-jsx/5.0.7_react@18.2.0: resolution: {integrity: sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA==} @@ -8236,6 +9363,15 @@ packages: source-map-support: 0.5.21 dev: true + /test-exclude/6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + /text-table/0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -8252,17 +9388,17 @@ packages: /tinybench/2.3.1: resolution: {integrity: sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==} - dev: true + dev: false /tinypool/0.3.0: resolution: {integrity: sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==} engines: {node: '>=14.0.0'} - dev: true + dev: false /tinyspy/1.0.2: resolution: {integrity: sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==} engines: {node: '>=14.0.0'} - dev: true + dev: false /tmp/0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} @@ -8271,6 +9407,10 @@ packages: os-tmpdir: 1.0.2 dev: true + /tmpl/1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + /to-fast-properties/2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -8304,6 +9444,39 @@ packages: engines: {node: '>=8'} dev: true + /ts-jest/29.0.3_4f6uxrzmuwipl5rr3bcogf6k74: + resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.3.1_@types+node@18.11.18 + jest-util: 29.3.1 + json5: 2.2.1 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.3.7 + typescript: 4.9.3 + yargs-parser: 21.1.1 + dev: true + /tsconfig-paths/3.14.1: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: @@ -8370,7 +9543,6 @@ packages: /type-detect/4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - dev: true /type-fest/0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} @@ -8436,7 +9608,7 @@ packages: /ufo/1.0.1: resolution: {integrity: sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==} - dev: true + dev: false /unbox-primitive/1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -8562,6 +9734,15 @@ packages: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true + /v8-to-istanbul/9.0.1: + resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + /validate-npm-package-license/3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -8588,7 +9769,7 @@ packages: - sugarss - supports-color - terser - dev: true + dev: false /vite/4.0.4_@types+node@18.11.18: resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==} @@ -8616,13 +9797,13 @@ packages: optional: true dependencies: '@types/node': 18.11.18 - esbuild: 0.16.15 + esbuild: 0.16.16 postcss: 8.4.21 resolve: 1.22.1 rollup: 3.9.1 optionalDependencies: fsevents: 2.3.2 - dev: true + dev: false /vitest/0.26.3: resolution: {integrity: sha512-FmHxU9aUCxTi23keF3vxb/Qp0lYXaaJ+jRLGOUmMS3qVTOJvgGE+f1VArupA6pEhaG2Ans4X+zV9dqM5WISMbg==} @@ -8668,13 +9849,19 @@ packages: - sugarss - supports-color - terser - dev: true + dev: false /void-elements/3.1.0: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} dev: false + /walker/1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + /wcwidth/1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: @@ -8968,6 +10155,14 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true + /write-file-atomic/4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + /ws/7.5.9: resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} From 761345a226d271ad51f19caccaea2b533f6c8569 Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Mon, 9 Jan 2023 14:56:14 +0800 Subject: [PATCH 60/60] fix: reference file name --- packages/app/src/components/workspace-setting/MembersPage.tsx | 2 +- packages/app/src/components/workspace-setting/PublishPage.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/app/src/components/workspace-setting/MembersPage.tsx b/packages/app/src/components/workspace-setting/MembersPage.tsx index 8b5210653b..0d45f4afae 100644 --- a/packages/app/src/components/workspace-setting/MembersPage.tsx +++ b/packages/app/src/components/workspace-setting/MembersPage.tsx @@ -25,7 +25,7 @@ import { } from '@/hooks/mock-data/mock'; import { useTemporaryHelper } from '@/providers/temporary-helper-provider'; import { StyledMemberWarp } from './general/style'; -import { useConfirm } from '@/providers/confirm-provider'; +import { useConfirm } from '@/providers/ConfirmProvider'; // import { useAppState } from '@/providers/app-state-provider'; export const MembersPage = ({ workspace }: { workspace: Workspace }) => { diff --git a/packages/app/src/components/workspace-setting/PublishPage.tsx b/packages/app/src/components/workspace-setting/PublishPage.tsx index 33a0e55961..2e0105214b 100644 --- a/packages/app/src/components/workspace-setting/PublishPage.tsx +++ b/packages/app/src/components/workspace-setting/PublishPage.tsx @@ -11,7 +11,7 @@ import Input from '@/ui/input'; import { toast } from '@/ui/toast'; import { Workspace } from '@/hooks/mock-data/mock'; import { useTemporaryHelper } from '@/providers/temporary-helper-provider'; -import { useConfirm } from '@/providers/confirm-provider'; +import { useConfirm } from '@/providers/ConfirmProvider'; export const PublishPage = ({ workspace }: { workspace: Workspace }) => { console.log('workspace: ', workspace);