diff --git a/apps/desktop/package.json b/apps/desktop/package.json
index 084b70fed8..74cc50fedd 100644
--- a/apps/desktop/package.json
+++ b/apps/desktop/package.json
@@ -16,7 +16,7 @@
},
"dependencies": {
"@blocksuite/icons": "^2.0.14",
- "@blocksuite/store": "0.4.0-20230216011811-2776d93",
+ "@blocksuite/store": "0.4.0-20230217095654-a561b36",
"@emotion/react": "^11.10.5",
"@emotion/styled": "^11.10.5",
"@tauri-apps/api": "^1.2.0",
diff --git a/apps/web/package.json b/apps/web/package.json
index 279cb11b95..26128b13dc 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -11,10 +11,11 @@
"dependencies": {
"@affine/component": "workspace:*",
"@affine/datacenter": "workspace:*",
+ "@affine/store": "workspace:*",
"@affine/i18n": "workspace:*",
"@blocksuite/blocks": "0.4.0-20230217095654-a561b36",
"@blocksuite/editor": "0.4.0-20230217095654-a561b36",
- "@blocksuite/global": "0.4.0-20230216011811-2776d93",
+ "@blocksuite/global": "0.4.0-20230217095654-a561b36",
"@blocksuite/icons": "^2.0.14",
"@blocksuite/store": "0.4.0-20230217095654-a561b36",
"@emotion/css": "^11.10.5",
diff --git a/apps/web/src/components/logout-modal/index.tsx b/apps/web/src/components/logout-modal/index.tsx
index 4028df3c1a..616d51cf47 100644
--- a/apps/web/src/components/logout-modal/index.tsx
+++ b/apps/web/src/components/logout-modal/index.tsx
@@ -2,10 +2,9 @@ import { styled } from '@affine/component';
import { Modal, ModalCloseButton, ModalWrapper } from '@affine/component';
import { Button } from '@affine/component';
import { useTranslation } from '@affine/i18n';
+import { useGlobalState } from '@affine/store';
import { useState } from 'react';
-import { useAppState } from '@/providers/app-state-provider';
-
import { Check, UnCheck } from './icon';
interface LoginModalProps {
open: boolean;
@@ -14,7 +13,7 @@ interface LoginModalProps {
export const LogoutModal = ({ open, onClose }: LoginModalProps) => {
const [localCache, setLocalCache] = useState(true);
- const { blobDataSynced } = useAppState();
+ const blobDataSynced = useGlobalState(store => store.blobDataSynced);
const { t } = useTranslation();
return (
diff --git a/apps/web/src/components/page-list/DateCell.tsx b/apps/web/src/components/page-list/DateCell.tsx
index acd184286d..e06fb6a87b 100644
--- a/apps/web/src/components/page-list/DateCell.tsx
+++ b/apps/web/src/components/page-list/DateCell.tsx
@@ -1,10 +1,9 @@
import { TableCell } from '@affine/component';
+import type { PageMeta } from '@affine/store';
import dayjs from 'dayjs';
import localizedFormat from 'dayjs/plugin/localizedFormat';
import React from 'react';
-import { PageMeta } from '@/providers/app-state-provider';
-
dayjs.extend(localizedFormat);
export const DateCell = ({
diff --git a/apps/web/src/components/page-list/OperationCell.tsx b/apps/web/src/components/page-list/OperationCell.tsx
index b70fec319e..9ad7c1f89e 100644
--- a/apps/web/src/components/page-list/OperationCell.tsx
+++ b/apps/web/src/components/page-list/OperationCell.tsx
@@ -7,6 +7,7 @@ import {
} from '@affine/component';
import { toast } from '@affine/component';
import { useTranslation } from '@affine/i18n';
+import { PageMeta } from '@affine/store';
import {
DeleteForeverIcon,
FavouritedIcon,
@@ -18,7 +19,6 @@ import {
} from '@blocksuite/icons';
import { usePageHelper } from '@/hooks/use-page-helper';
-import { PageMeta } from '@/providers/app-state-provider';
import { useConfirm } from '@/providers/ConfirmProvider';
export const OperationCell = ({ pageMeta }: { pageMeta: PageMeta }) => {
diff --git a/apps/web/src/components/page-list/index.tsx b/apps/web/src/components/page-list/index.tsx
index bcaeecaa05..cccb9b25e6 100644
--- a/apps/web/src/components/page-list/index.tsx
+++ b/apps/web/src/components/page-list/index.tsx
@@ -10,6 +10,7 @@ import { IconButton } from '@affine/component';
import { Tooltip } from '@affine/component';
import { toast } from '@affine/component';
import { useTranslation } from '@affine/i18n';
+import { PageMeta } from '@affine/store';
import {
EdgelessIcon,
FavouritedIcon,
@@ -21,7 +22,6 @@ import React, { useCallback } from 'react';
import DateCell from '@/components/page-list/DateCell';
import { usePageHelper } from '@/hooks/use-page-helper';
-import { PageMeta } from '@/providers/app-state-provider';
import { useTheme } from '@/providers/ThemeProvider';
import { useGlobalState } from '@/store/app';
diff --git a/apps/web/src/components/quick-search/PublishedResults.tsx b/apps/web/src/components/quick-search/PublishedResults.tsx
index 7f2bd6ff01..63c5c23623 100644
--- a/apps/web/src/components/quick-search/PublishedResults.tsx
+++ b/apps/web/src/components/quick-search/PublishedResults.tsx
@@ -1,4 +1,5 @@
import { useTranslation } from '@affine/i18n';
+import { PageMeta } from '@affine/store';
import { EdgelessIcon, PaperIcon } from '@blocksuite/icons';
import { Workspace } from '@blocksuite/store';
import { Command } from 'cmdk';
@@ -6,7 +7,6 @@ import { useRouter } from 'next/router';
import { Dispatch, SetStateAction, useEffect, useState } from 'react';
import usePageHelper from '@/hooks/use-page-helper';
-import { PageMeta } from '@/providers/app-state-provider';
import { useGlobalState } from '@/store/app';
import { NoResultSVG } from './NoResultSVG';
diff --git a/apps/web/src/components/workspace-setting/general/leave/Leave.tsx b/apps/web/src/components/workspace-setting/general/leave/Leave.tsx
index 3389fc794c..c10f551a29 100644
--- a/apps/web/src/components/workspace-setting/general/leave/Leave.tsx
+++ b/apps/web/src/components/workspace-setting/general/leave/Leave.tsx
@@ -11,8 +11,6 @@ import {
StyledModalWrapper,
StyledTextContent,
} from './style';
-// import { getDataCenter } from '@affine/datacenter';
-// import { useAppState } from '@/providers/app-state-provider';
interface WorkspaceDeleteProps {
open: boolean;
diff --git a/apps/web/src/hooks/use-change-page-meta.ts b/apps/web/src/hooks/use-change-page-meta.ts
index 8ec2a8782f..fe0f79653f 100644
--- a/apps/web/src/hooks/use-change-page-meta.ts
+++ b/apps/web/src/hooks/use-change-page-meta.ts
@@ -1,6 +1,6 @@
+import { PageMeta } from '@affine/store';
import { useCallback } from 'react';
-import { PageMeta } from '@/providers/app-state-provider';
import { useGlobalState } from '@/store/app';
export type ChangePageMeta = (
diff --git a/apps/web/src/hooks/use-current-page-meta.ts b/apps/web/src/hooks/use-current-page-meta.ts
index 6f5102eabd..c6defabffc 100644
--- a/apps/web/src/hooks/use-current-page-meta.ts
+++ b/apps/web/src/hooks/use-current-page-meta.ts
@@ -1,6 +1,6 @@
+import { PageMeta } from '@affine/store';
import { useCallback, useEffect, useState } from 'react';
-import { PageMeta } from '@/providers/app-state-provider';
import { useGlobalState } from '@/store/app';
export const useCurrentPageMeta = (): PageMeta | null => {
diff --git a/apps/web/src/hooks/use-page-helper.ts b/apps/web/src/hooks/use-page-helper.ts
index be269623cb..26056691ca 100644
--- a/apps/web/src/hooks/use-page-helper.ts
+++ b/apps/web/src/hooks/use-page-helper.ts
@@ -1,4 +1,5 @@
import { WorkspaceUnit } from '@affine/datacenter';
+import { PageMeta } from '@affine/store';
import { EditorContainer } from '@blocksuite/editor';
import { uuidv4, Workspace } from '@blocksuite/store';
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
@@ -7,7 +8,6 @@ import { useRouter } from 'next/router';
import { useCallback } from 'react';
import { useChangePageMeta } from '@/hooks/use-change-page-meta';
-import { PageMeta } from '@/providers/app-state-provider';
import { useGlobalState } from '@/store/app';
export type EditorHandlers = {
diff --git a/apps/web/src/pages/_app.tsx b/apps/web/src/pages/_app.tsx
index 721f1f2102..26f6fb3d36 100644
--- a/apps/web/src/pages/_app.tsx
+++ b/apps/web/src/pages/_app.tsx
@@ -6,6 +6,7 @@ import '../utils/print-build-info';
import '@affine/i18n';
import { useTranslation } from '@affine/i18n';
+import { DataCenterPreloader } from '@affine/store';
import { Logger } from '@toeverything/pathfinder-logger';
import type { NextPage } from 'next';
import type { AppProps } from 'next/app';
@@ -19,11 +20,9 @@ import React from 'react';
import { PageLoading } from '@/components/loading';
import { MessageCenterHandler } from '@/components/message-center-handler';
import ProviderComposer from '@/components/provider-composer';
-import { AppStateProvider } from '@/providers/app-state-provider';
import ConfirmProvider from '@/providers/ConfirmProvider';
import { ThemeProvider } from '@/providers/ThemeProvider';
import { GlobalAppProvider } from '@/store/app';
-import { DataCenterPreloader } from '@/store/app/datacenter';
import { ModalProvider } from '@/store/globalModal';
export type NextPageWithLayout
, IP = P> = NextPage<
@@ -65,30 +64,28 @@ const App = ({ Component, pageProps }: AppPropsWithLayout) => {
AFFiNE
-
- ,
- ,
- ,
- ,
- ]}
- >
- {NoNeedAppStatePageList.includes(router.route) ? (
- getLayout()
- ) : (
- }>
-
-
-
- {getLayout()}
-
-
-
-
- )}
-
-
+ ,
+ ,
+ ,
+ ,
+ ]}
+ >
+ {NoNeedAppStatePageList.includes(router.route) ? (
+ getLayout()
+ ) : (
+ }>
+
+
+
+ {getLayout()}
+
+
+
+
+ )}
+
>
);
};
diff --git a/apps/web/src/pages/public-workspace/[workspaceId]/index.tsx b/apps/web/src/pages/public-workspace/[workspaceId]/index.tsx
index 522933714f..9040365310 100644
--- a/apps/web/src/pages/public-workspace/[workspaceId]/index.tsx
+++ b/apps/web/src/pages/public-workspace/[workspaceId]/index.tsx
@@ -1,4 +1,5 @@
import { Breadcrumbs } from '@affine/component';
+import { PageMeta } from '@affine/store';
import { SearchIcon } from '@blocksuite/icons';
import { useRouter } from 'next/router';
import { ReactElement, useEffect, useMemo } from 'react';
@@ -7,7 +8,6 @@ import { PageLoading } from '@/components/loading';
import { PageList } from '@/components/page-list';
import { WorkspaceUnitAvatar } from '@/components/workspace-avatar';
import { useLoadPublicWorkspace } from '@/hooks/use-load-public-workspace';
-import { PageMeta } from '@/providers/app-state-provider';
import { useModal } from '@/store/globalModal';
import {
diff --git a/apps/web/src/providers/app-state-provider/Provider.tsx b/apps/web/src/providers/app-state-provider/Provider.tsx
deleted file mode 100644
index 6916a8caaa..0000000000
--- a/apps/web/src/providers/app-state-provider/Provider.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import type { Disposable } from '@blocksuite/global/utils';
-import type { PropsWithChildren } from 'react';
-import { createContext, useContext, useEffect, useState } from 'react';
-
-import { useGlobalState } from '@/store/app';
-
-import { AppStateContext } from './interface';
-
-type AppStateContextProps = PropsWithChildren>;
-
-export const AppState = createContext({} as AppStateContext);
-
-export const useAppState = () => useContext(AppState);
-export const AppStateProvider = ({
- children,
-}: PropsWithChildren) => {
- const currentDataCenterWorkspace = useGlobalState(
- store => store.currentDataCenterWorkspace
- );
- const [blobState, setBlobState] = useState(false);
-
- useEffect(() => {
- let syncChangeDisposable: Disposable | undefined;
- const currentWorkspace = currentDataCenterWorkspace;
- if (!currentWorkspace) {
- return;
- }
- const getBlobStorage = async () => {
- const blobStorage = await currentWorkspace?.blocksuiteWorkspace?.blobs;
- syncChangeDisposable = blobStorage?.signals.onBlobSyncStateChange.on(
- () => {
- setBlobState(blobStorage?.uploading);
- }
- );
- };
- getBlobStorage();
- return () => {
- syncChangeDisposable?.dispose();
- };
- }, [currentDataCenterWorkspace]);
-
- return (
-
- {children}
-
- );
-};
diff --git a/apps/web/src/providers/app-state-provider/index.ts b/apps/web/src/providers/app-state-provider/index.ts
deleted file mode 100644
index 0668aac381..0000000000
--- a/apps/web/src/providers/app-state-provider/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './interface';
-export * from './Provider';
diff --git a/apps/web/src/providers/app-state-provider/interface.ts b/apps/web/src/providers/app-state-provider/interface.ts
deleted file mode 100644
index d4c6226f97..0000000000
--- a/apps/web/src/providers/app-state-provider/interface.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import type { EditorContainer } from '@blocksuite/editor';
-import type {
- Page as StorePage,
- PageMeta as StorePageMeta,
-} from '@blocksuite/store';
-
-export interface PageMeta extends StorePageMeta {
- favorite: boolean;
- trash: boolean;
- trashDate: number;
- updatedDate: number;
- mode: 'edgeless' | 'page';
-}
-
-export type AppStateValue = {
- blobDataSynced: boolean;
-};
-
-/**
- * @deprecated
- */
-export type AppStateFunction = {
- // todo: remove this in the future
-};
-
-export type AppStateContext = AppStateValue & AppStateFunction;
-
-export type CreateEditorHandler = (page: StorePage) => EditorContainer | null;
diff --git a/apps/web/src/providers/app-state-provider/utils.ts b/apps/web/src/providers/app-state-provider/utils.ts
deleted file mode 100644
index 4e4130f8c9..0000000000
--- a/apps/web/src/providers/app-state-provider/utils.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { DataCenter } from '@affine/datacenter';
-
-const DEFAULT_WORKSPACE_NAME = 'Demo Workspace';
-
-export const createDefaultWorkspace = async (dataCenter: DataCenter) => {
- return dataCenter.createWorkspace({
- name: DEFAULT_WORKSPACE_NAME,
- });
-};
diff --git a/apps/web/src/store/app/index.tsx b/apps/web/src/store/app/index.tsx
index 9d9b48c4f8..295c4d7a70 100644
--- a/apps/web/src/store/app/index.tsx
+++ b/apps/web/src/store/app/index.tsx
@@ -1,90 +1 @@
-import type React from 'react';
-import { createContext, useContext, useMemo } from 'react';
-import { createStore, StateCreator, useStore } from 'zustand';
-import { combine, subscribeWithSelector } from 'zustand/middleware';
-import type { UseBoundStore } from 'zustand/react';
-
-import {
- BlockSuiteActions,
- BlockSuiteState,
- createBlockSuiteActions,
- createBlockSuiteState,
-} from '@/store/app/blocksuite';
-import {
- createDataCenterActions,
- createDataCenterState,
- DataCenterActions,
- DataCenterState,
-} from '@/store/app/datacenter';
-import {
- createUserActions,
- createUserState,
- UserActions,
- UserState,
-} from '@/store/app/user';
-
-export type GlobalActionsCreator = StateCreator<
- Store,
- [['zustand/subscribeWithSelector', unknown]],
- [],
- Actions
->;
-
-export interface GlobalState
- extends BlockSuiteState,
- UserState,
- DataCenterState {}
-
-export interface GlobalActions
- extends BlockSuiteActions,
- UserActions,
- DataCenterActions {}
-
-const create = () =>
- createStore(
- subscribeWithSelector(
- combine(
- {
- ...createBlockSuiteState(),
- ...createUserState(),
- ...createDataCenterState(),
- },
- /* deepscan-disable TOO_MANY_ARGS */
- (set, get, api) => ({
- ...createBlockSuiteActions(set, get, api),
- ...createUserActions(set, get, api),
- ...createDataCenterActions(set, get, api),
- })
- /* deepscan-enable TOO_MANY_ARGS */
- )
- )
- );
-type Store = ReturnType;
-
-const GlobalStateContext = createContext(null);
-
-export const useGlobalStateApi = () => {
- const api = useContext(GlobalStateContext);
- if (!api) {
- throw new Error('cannot find modal context');
- }
- return api;
-};
-
-export const useGlobalState: UseBoundStore = ((
- selector: Parameters>[0],
- equals: Parameters>[1]
-) => {
- const api = useGlobalStateApi();
- return useStore(api, selector, equals);
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
-}) as any;
-
-export const GlobalAppProvider: React.FC =
- function ModelProvider({ children }) {
- return (
- create(), [])}>
- {children}
-
- );
- };
+export * from '@affine/store';
diff --git a/package.json b/package.json
index f2d99159a4..8076c38e48 100644
--- a/package.json
+++ b/package.json
@@ -30,10 +30,12 @@
"devDependencies": {
"@changesets/cli": "^2.26.0",
"@playwright/test": "^1.29.1",
+ "@testing-library/react": "^14.0.0",
"@types/eslint": "^8.4.10",
"@types/node": "^18.11.17",
"@typescript-eslint/eslint-plugin": "^5.47.0",
"@typescript-eslint/parser": "^5.47.0",
+ "@vitejs/plugin-react": "^3.1.0",
"@vitest/coverage-istanbul": "^0.28.5",
"concurrently": "^7.6.0",
"cross-env": "^7.0.3",
@@ -46,11 +48,15 @@
"eslint-plugin-unused-imports": "^2.0.0",
"fake-indexeddb": "4.0.1",
"got": "^12.5.3",
+ "happy-dom": "^8.4.4",
"husky": "^8.0.2",
"lint-staged": "^13.1.0",
"nyc": "^15.1.0",
"prettier": "^2.7.1",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
"typescript": "^4.9.5",
+ "vite": "^4.1.2",
"vitest": "^0.28.5"
},
"pnpm": {
diff --git a/packages/component/package.json b/packages/component/package.json
index 9f1ace77fe..36bd0cf828 100644
--- a/packages/component/package.json
+++ b/packages/component/package.json
@@ -9,12 +9,12 @@
},
"dependencies": {
"@affine/i18n": "workspace:*",
- "@blocksuite/blocks": "0.4.0-20230216011811-2776d93",
- "@blocksuite/editor": "0.4.0-20230216011811-2776d93",
- "@blocksuite/global": "0.4.0-20230216011811-2776d93",
+ "@blocksuite/blocks": "0.4.0-20230217095654-a561b36",
+ "@blocksuite/editor": "0.4.0-20230217095654-a561b36",
+ "@blocksuite/global": "0.4.0-20230217095654-a561b36",
"@blocksuite/icons": "^2.0.2",
- "@blocksuite/react": "0.4.0-20230216011811-2776d93",
- "@blocksuite/store": "0.4.0-20230216011811-2776d93",
+ "@blocksuite/react": "0.4.0-20230217095654-a561b36",
+ "@blocksuite/store": "0.4.0-20230217095654-a561b36",
"@emotion/react": "^11.10.5",
"@emotion/styled": "^11.10.5",
"@mui/base": "=5.0.0-alpha.117",
diff --git a/packages/data-center/src/datacenter.ts b/packages/data-center/src/datacenter.ts
index b2b8441075..7d2d3b7043 100644
--- a/packages/data-center/src/datacenter.ts
+++ b/packages/data-center/src/datacenter.ts
@@ -32,11 +32,14 @@ export class DataCenter {
private _mainProvider?: BaseProvider;
providerMap: Map = new Map();
- constructor(debug: boolean) {
+ private constructor(debug: boolean) {
this._logger.enabled = debug;
}
- static async init(debug: boolean): Promise {
+ static async init(
+ debug: boolean,
+ exclude: 'affine'[] = []
+ ): Promise {
const dc = new DataCenter(debug);
const getInitParams = () => {
return {
@@ -56,7 +59,9 @@ export class DataCenter {
} else {
await dc.registerProvider(new LocalProvider(getInitParams()));
}
- await dc.registerProvider(new AffineProvider(getInitParams()));
+ if (!exclude.includes('affine')) {
+ await dc.registerProvider(new AffineProvider(getInitParams()));
+ }
for (const provider of dc.providerMap.values()) {
await provider.loadWorkspaces();
diff --git a/packages/data-center/src/index.ts b/packages/data-center/src/index.ts
index 0d39aa2a3a..f76bebce53 100644
--- a/packages/data-center/src/index.ts
+++ b/packages/data-center/src/index.ts
@@ -25,7 +25,7 @@ const _initializeDataCenter = () => {
export const getDataCenter = _initializeDataCenter();
-export type { DataCenter };
+export { DataCenter };
export { getLogger } from './logger';
export * from './message';
export { AffineProvider } from './provider/affine';
diff --git a/packages/data-center/src/provider/utils.ts b/packages/data-center/src/provider/utils.ts
index aac7c86da1..f158fb3db8 100644
--- a/packages/data-center/src/provider/utils.ts
+++ b/packages/data-center/src/provider/utils.ts
@@ -10,6 +10,9 @@ export const setDefaultAvatar = async (
return;
}
const blob = await getDefaultHeadImgBlob(blocksuiteWorkspace.meta.name);
+ if (!blob) {
+ return;
+ }
const blobStorage = await blocksuiteWorkspace.blobs;
assert(blobStorage, 'No blob storage');
const avatar = await blobStorage.set(blob);
diff --git a/packages/data-center/src/utils/index.ts b/packages/data-center/src/utils/index.ts
index 2b34f2819f..e7d4087d87 100644
--- a/packages/data-center/src/utils/index.ts
+++ b/packages/data-center/src/utils/index.ts
@@ -28,10 +28,13 @@ const DefaultHeadImgColors = [
export async function getDefaultHeadImgBlob(
workspaceName: string
-): Promise {
+): Promise {
const canvas = document.createElement('canvas');
canvas.height = 100;
canvas.width = 100;
+ if (!canvas.getContext) {
+ return Promise.resolve(null);
+ }
const ctx = canvas.getContext('2d');
return new Promise((resolve, reject) => {
if (ctx) {
diff --git a/packages/store/package.json b/packages/store/package.json
new file mode 100644
index 0000000000..262bc0331d
--- /dev/null
+++ b/packages/store/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "@affine/store",
+ "private": true,
+ "main": "./src/index.ts",
+ "dependencies": {
+ "@affine/datacenter": "workspace:*",
+ "@blocksuite/blocks": "0.4.0-20230217095654-a561b36",
+ "@blocksuite/editor": "0.4.0-20230217095654-a561b36",
+ "@blocksuite/global": "0.4.0-20230217095654-a561b36",
+ "@blocksuite/react": "0.4.0-20230217095654-a561b36",
+ "@blocksuite/store": "0.4.0-20230217095654-a561b36",
+ "react": "^18.2.0",
+ "zustand": "^4.3.3"
+ },
+ "devDependencies": {
+ "@types/react": "^18.0.28"
+ }
+}
diff --git a/apps/web/src/store/app/blocksuite/index.ts b/packages/store/src/app/blocksuite/index.ts
similarity index 96%
rename from apps/web/src/store/app/blocksuite/index.ts
rename to packages/store/src/app/blocksuite/index.ts
index 8d12e7cab6..884f63e110 100644
--- a/apps/web/src/store/app/blocksuite/index.ts
+++ b/packages/store/src/app/blocksuite/index.ts
@@ -2,7 +2,7 @@ import { BlockHub } from '@blocksuite/blocks';
import { EditorContainer } from '@blocksuite/editor';
import { Page, Workspace } from '@blocksuite/store';
-import { GlobalActionsCreator } from '@/store/app';
+import { GlobalActionsCreator } from '..';
export interface BlockSuiteState {
currentWorkspace: Workspace | null;
diff --git a/apps/web/src/store/app/datacenter/index.tsx b/packages/store/src/app/datacenter/index.tsx
similarity index 66%
rename from apps/web/src/store/app/datacenter/index.tsx
rename to packages/store/src/app/datacenter/index.tsx
index ea55fddd96..a3f7de91ff 100644
--- a/apps/web/src/store/app/datacenter/index.tsx
+++ b/packages/store/src/app/datacenter/index.tsx
@@ -1,21 +1,32 @@
-import type { DataCenter } from '@affine/datacenter';
import { getDataCenter, WorkspaceUnit } from '@affine/datacenter';
-import { DisposableGroup } from '@blocksuite/global/utils';
+import { DataCenter } from '@affine/datacenter';
+import { Disposable, DisposableGroup } from '@blocksuite/global/utils';
+import type { PageMeta as StorePageMeta } from '@blocksuite/store';
import React, { useCallback, useEffect } from 'react';
+const DEFAULT_WORKSPACE_NAME = 'Demo Workspace';
-import { PageMeta } from '@/providers/app-state-provider';
-import { createDefaultWorkspace } from '@/providers/app-state-provider/utils';
-import {
- GlobalActionsCreator,
- useGlobalState,
- useGlobalStateApi,
-} from '@/store/app';
+export const createDefaultWorkspace = async (dataCenter: DataCenter) => {
+ return dataCenter.createWorkspace({
+ name: DEFAULT_WORKSPACE_NAME,
+ });
+};
+
+export interface PageMeta extends StorePageMeta {
+ favorite: boolean;
+ trash: boolean;
+ trashDate: number;
+ updatedDate: number;
+ mode: 'edgeless' | 'page';
+}
+
+import { GlobalActionsCreator, useGlobalState, useGlobalStateApi } from '..';
export type DataCenterState = {
readonly dataCenter: DataCenter;
readonly dataCenterPromise: Promise;
currentDataCenterWorkspace: WorkspaceUnit | null;
dataCenterPageList: PageMeta[];
+ blobDataSynced: boolean;
};
export type DataCenterActions = {
@@ -32,7 +43,9 @@ export const createDataCenterState = (): DataCenterState => ({
dataCenterPromise: null!,
currentDataCenterWorkspace: null,
dataCenterPageList: [],
+ blobDataSynced: false,
});
+
export const createDataCenterActions: GlobalActionsCreator<
DataCenterActions
> = (set, get) => ({
@@ -57,7 +70,7 @@ export const createDataCenterActions: GlobalActionsCreator<
isOwner = true;
} else {
const userInfo = get().user; // We must ensure workspace.owner exists, then ensure id same.
- isOwner = isOwner = userInfo?.id === workspace?.owner?.id;
+ isOwner = userInfo?.id === workspace?.owner?.id;
}
const pageList =
@@ -67,11 +80,9 @@ export const createDataCenterActions: GlobalActionsCreator<
currentWorkspace: workspace.blocksuiteWorkspace,
});
}
- set({
- isOwner,
- });
set({
+ isOwner,
currentDataCenterWorkspace: workspace,
dataCenterPageList: pageList,
});
@@ -113,6 +124,45 @@ export function DataCenterPreloader({ children }: React.PropsWithChildren) {
);
}, [api]);
//# endregion
+ //# region effect for blobDataSynced
+ useEffect(
+ () =>
+ api.subscribe(
+ store => store.currentDataCenterWorkspace,
+ workspace => {
+ if (!workspace?.blocksuiteWorkspace) {
+ return;
+ }
+ const controller = new AbortController();
+ const blocksuiteWorkspace = workspace.blocksuiteWorkspace;
+ let syncChangeDisposable: Disposable | undefined;
+ async function subscribe() {
+ const blobStorage = await blocksuiteWorkspace.blobs;
+ if (controller.signal.aborted) {
+ return;
+ }
+ syncChangeDisposable =
+ blobStorage?.signals.onBlobSyncStateChange.on(() => {
+ if (controller.signal.aborted) {
+ syncChangeDisposable?.dispose();
+ return;
+ } else {
+ api.setState({
+ blobDataSynced: blobStorage?.uploading,
+ });
+ }
+ });
+ }
+ subscribe();
+ return () => {
+ controller.abort();
+ syncChangeDisposable?.dispose();
+ };
+ }
+ ),
+ [api]
+ );
+ //# endregion
if (!dataCenter && !dataCenterPromise) {
const promise = getDataCenter();
diff --git a/packages/store/src/app/index.tsx b/packages/store/src/app/index.tsx
new file mode 100644
index 0000000000..3564b4454e
--- /dev/null
+++ b/packages/store/src/app/index.tsx
@@ -0,0 +1,90 @@
+import type React from 'react';
+import { createContext, useContext, useMemo } from 'react';
+import { createStore, StateCreator, useStore } from 'zustand';
+import { combine, subscribeWithSelector } from 'zustand/middleware';
+import type { UseBoundStore } from 'zustand/react';
+
+import {
+ BlockSuiteActions,
+ BlockSuiteState,
+ createBlockSuiteActions,
+ createBlockSuiteState,
+} from './blocksuite';
+import {
+ createDataCenterActions,
+ createDataCenterState,
+ DataCenterActions,
+ DataCenterState,
+} from './datacenter';
+import {
+ createUserActions,
+ createUserState,
+ UserActions,
+ UserState,
+} from './user';
+
+export type GlobalActionsCreator = StateCreator<
+ Store,
+ [['zustand/subscribeWithSelector', unknown]],
+ [],
+ Actions
+>;
+
+export interface GlobalState
+ extends BlockSuiteState,
+ UserState,
+ DataCenterState {}
+
+export interface GlobalActions
+ extends BlockSuiteActions,
+ UserActions,
+ DataCenterActions {}
+
+const create = () =>
+ createStore(
+ subscribeWithSelector(
+ combine(
+ {
+ ...createBlockSuiteState(),
+ ...createUserState(),
+ ...createDataCenterState(),
+ },
+ /* deepscan-disable TOO_MANY_ARGS */
+ (set, get, api) => ({
+ ...createBlockSuiteActions(set, get, api),
+ ...createUserActions(set, get, api),
+ ...createDataCenterActions(set, get, api),
+ })
+ /* deepscan-enable TOO_MANY_ARGS */
+ )
+ )
+ );
+type Store = ReturnType;
+
+const GlobalStateContext = createContext(null);
+
+export const useGlobalStateApi = () => {
+ const api = useContext(GlobalStateContext);
+ if (!api) {
+ throw new Error('cannot find modal context');
+ }
+ return api;
+};
+
+export const useGlobalState: UseBoundStore = ((
+ selector: Parameters>[0],
+ equals: Parameters>[1]
+) => {
+ const api = useGlobalStateApi();
+ return useStore(api, selector, equals);
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+}) as any;
+
+export const GlobalAppProvider: React.FC =
+ function ModelProvider({ children }) {
+ return (
+ create(), [])}>
+ {children}
+
+ );
+ };
diff --git a/apps/web/src/store/app/user/index.ts b/packages/store/src/app/user/index.ts
similarity index 92%
rename from apps/web/src/store/app/user/index.ts
rename to packages/store/src/app/user/index.ts
index dd3809b78b..6a76f0bc2e 100644
--- a/apps/web/src/store/app/user/index.ts
+++ b/packages/store/src/app/user/index.ts
@@ -1,6 +1,6 @@
import { User } from '@affine/datacenter';
-import { GlobalActionsCreator } from '@/store/app';
+import { GlobalActionsCreator } from '..';
export interface UserState {
user: User | null;
@@ -39,7 +39,7 @@ export const createUserActions: GlobalActionsCreator = (
// isOwner is useful only in the cloud
isOwner = true;
} else {
- isOwner = user?.id === workspace?.owner?.id;
+ isOwner = user.id === workspace?.owner?.id;
}
set({ user, isOwner });
diff --git a/packages/store/src/index.ts b/packages/store/src/index.ts
new file mode 100644
index 0000000000..066cecc163
--- /dev/null
+++ b/packages/store/src/index.ts
@@ -0,0 +1,3 @@
+export * from './app';
+export type { PageMeta } from './app/datacenter';
+export { createDefaultWorkspace, DataCenterPreloader } from './app/datacenter';
diff --git a/packages/store/tests/app.spec.tsx b/packages/store/tests/app.spec.tsx
new file mode 100644
index 0000000000..fee98eaff4
--- /dev/null
+++ b/packages/store/tests/app.spec.tsx
@@ -0,0 +1,53 @@
+/**
+ * @vitest-environment happy-dom
+ */
+import 'fake-indexeddb/auto';
+
+import { DataCenter, getDataCenter } from '@affine/datacenter';
+import {
+ createDefaultWorkspace,
+ DataCenterPreloader,
+ GlobalAppProvider,
+ useGlobalState,
+ useGlobalStateApi,
+} from '@affine/store';
+import { render } from '@testing-library/react';
+import React from 'react';
+import { describe, expect, test } from 'vitest';
+
+describe('App Store', () => {
+ test('init', async () => {
+ const dataCenterPromise = getDataCenter();
+ const dataCenter = await dataCenterPromise;
+ await createDefaultWorkspace(dataCenter);
+ const Inner = () => {
+ const state = useGlobalState();
+ expect(state).toBeTypeOf('object');
+ expect(state.dataCenter).toBeInstanceOf(DataCenter);
+ expect(state.dataCenterPromise).toBeInstanceOf(Promise);
+ state.dataCenterPromise.then(dc => expect(dc).toBe(state.dataCenter));
+ return Test2
;
+ };
+
+ const Loader = ({ children }: React.PropsWithChildren) => {
+ const api = useGlobalStateApi();
+ if (!api.getState().dataCenter) {
+ api.setState({
+ dataCenter,
+ dataCenterPromise,
+ });
+ }
+ return <>{children}>;
+ };
+ const App = () => (
+
+ Test1
+
+
+
+
+ );
+ const app = render();
+ app.getByText('Test2');
+ });
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2621c93fb9..e02b4531dc 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -14,10 +14,12 @@ importers:
specifiers:
'@changesets/cli': ^2.26.0
'@playwright/test': ^1.29.1
+ '@testing-library/react': ^14.0.0
'@types/eslint': ^8.4.10
'@types/node': ^18.11.17
'@typescript-eslint/eslint-plugin': ^5.47.0
'@typescript-eslint/parser': ^5.47.0
+ '@vitejs/plugin-react': ^3.1.0
'@vitest/coverage-istanbul': ^0.28.5
concurrently: ^7.6.0
cross-env: ^7.0.3
@@ -30,20 +32,26 @@ importers:
eslint-plugin-unused-imports: ^2.0.0
fake-indexeddb: 4.0.1
got: ^12.5.3
+ happy-dom: ^8.4.4
husky: ^8.0.2
lint-staged: ^13.1.0
nyc: ^15.1.0
prettier: ^2.7.1
+ react: ^18.2.0
+ react-dom: ^18.2.0
typescript: ^4.9.5
+ vite: ^4.1.2
vitest: ^0.28.5
devDependencies:
'@changesets/cli': 2.26.0
'@playwright/test': 1.29.1
+ '@testing-library/react': 14.0.0_biqbaboplfbrettd7655fr4n2y
'@types/eslint': 8.4.10
'@types/node': 18.11.18
'@typescript-eslint/eslint-plugin': 5.48.0_ddfje6clmktndfpbpk5swat3gi
'@typescript-eslint/parser': 5.48.0_7kw3g6rralp5ps6mg3uyzz6azm
- '@vitest/coverage-istanbul': 0.28.5
+ '@vitejs/plugin-react': 3.1.0_vite@4.1.2
+ '@vitest/coverage-istanbul': 0.28.5_happy-dom@8.4.4
concurrently: 7.6.0
cross-env: 7.0.3
eslint: 8.34.0
@@ -55,17 +63,21 @@ importers:
eslint-plugin-unused-imports: 2.0.0_3p5c3yu7rnlwfc7nnagwrjhciu
fake-indexeddb: 4.0.1
got: 12.5.3
+ happy-dom: 8.4.4
husky: 8.0.2
lint-staged: 13.1.0
nyc: 15.1.0
prettier: 2.7.1
+ react: 18.2.0
+ react-dom: 18.2.0_react@18.2.0
typescript: 4.9.5
- vitest: 0.28.5
+ vite: 4.1.2_@types+node@18.11.18
+ vitest: 0.28.5_happy-dom@8.4.4
apps/desktop:
specifiers:
'@blocksuite/icons': ^2.0.14
- '@blocksuite/store': 0.4.0-20230216011811-2776d93
+ '@blocksuite/store': 0.4.0-20230217095654-a561b36
'@emotion/react': ^11.10.5
'@emotion/styled': ^11.10.5
'@tauri-apps/api': ^1.2.0
@@ -94,7 +106,7 @@ importers:
zx: ^7.1.1
dependencies:
'@blocksuite/icons': 2.0.14_3stiutgnnbnfnf3uowm5cip22i
- '@blocksuite/store': 0.4.0-20230216011811-2776d93_yjs@13.5.45
+ '@blocksuite/store': 0.4.0-20230217095654-a561b36_yjs@13.5.45
'@emotion/react': 11.10.5_3stiutgnnbnfnf3uowm5cip22i
'@emotion/styled': 11.10.5_jrh5enlbqfbnumycmktdqgd6se
'@tauri-apps/api': 1.2.0_nb4isgkwd3sres4g7j7rgtldsu
@@ -128,9 +140,10 @@ importers:
'@affine/component': workspace:*
'@affine/datacenter': workspace:*
'@affine/i18n': workspace:*
+ '@affine/store': workspace:*
'@blocksuite/blocks': 0.4.0-20230217095654-a561b36
'@blocksuite/editor': 0.4.0-20230217095654-a561b36
- '@blocksuite/global': 0.4.0-20230216011811-2776d93
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36
'@blocksuite/icons': ^2.0.14
'@blocksuite/store': 0.4.0-20230217095654-a561b36
'@emotion/css': ^11.10.5
@@ -168,9 +181,10 @@ importers:
'@affine/component': link:../../packages/component
'@affine/datacenter': link:../../packages/data-center
'@affine/i18n': link:../../packages/i18n
+ '@affine/store': link:../../packages/store
'@blocksuite/blocks': 0.4.0-20230217095654-a561b36_fgkxp4oo2deujekqkhva3c3mgq
'@blocksuite/editor': 0.4.0-20230217095654-a561b36_s2lgz6fjlafla2itashgrkrf5u
- '@blocksuite/global': 0.4.0-20230216011811-2776d93_lit@2.6.1
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36_lit@2.6.1
'@blocksuite/icons': 2.0.14_w5j4k42lgipnm43s3brx6h3c34
'@blocksuite/store': 0.4.0-20230217095654-a561b36_lit@2.6.1+yjs@13.5.45
'@emotion/css': 11.10.5
@@ -209,12 +223,12 @@ importers:
packages/component:
specifiers:
'@affine/i18n': workspace:*
- '@blocksuite/blocks': 0.4.0-20230216011811-2776d93
- '@blocksuite/editor': 0.4.0-20230216011811-2776d93
- '@blocksuite/global': 0.4.0-20230216011811-2776d93
+ '@blocksuite/blocks': 0.4.0-20230217095654-a561b36
+ '@blocksuite/editor': 0.4.0-20230217095654-a561b36
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36
'@blocksuite/icons': ^2.0.2
- '@blocksuite/react': 0.4.0-20230216011811-2776d93
- '@blocksuite/store': 0.4.0-20230216011811-2776d93
+ '@blocksuite/react': 0.4.0-20230217095654-a561b36
+ '@blocksuite/store': 0.4.0-20230217095654-a561b36
'@emotion/react': ^11.10.5
'@emotion/styled': ^11.10.5
'@mui/base': '=5.0.0-alpha.117'
@@ -240,12 +254,12 @@ importers:
webpack: ^5.75.0
dependencies:
'@affine/i18n': link:../i18n
- '@blocksuite/blocks': 0.4.0-20230216011811-2776d93_agtz32e5txbljk4aobo36wfrpe
- '@blocksuite/editor': 0.4.0-20230216011811-2776d93_6yfgczikbxxddpvfspgrnx2z2q
- '@blocksuite/global': 0.4.0-20230216011811-2776d93_lit@2.6.1
+ '@blocksuite/blocks': 0.4.0-20230217095654-a561b36_dtmhin5qsbpe5id5qeimghpavm
+ '@blocksuite/editor': 0.4.0-20230217095654-a561b36_s2lgz6fjlafla2itashgrkrf5u
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36_lit@2.6.1
'@blocksuite/icons': 2.0.4_3stiutgnnbnfnf3uowm5cip22i
- '@blocksuite/react': 0.4.0-20230216011811-2776d93_lq2prkv6yrdmxppjpam6ud3g7y
- '@blocksuite/store': 0.4.0-20230216011811-2776d93_lit@2.6.1
+ '@blocksuite/react': 0.4.0-20230217095654-a561b36_wqt5vgiwk2wcrkromazh2p2frm
+ '@blocksuite/store': 0.4.0-20230217095654-a561b36_lit@2.6.1
'@emotion/react': 11.10.5_3stiutgnnbnfnf3uowm5cip22i
'@emotion/styled': 11.10.5_jrh5enlbqfbnumycmktdqgd6se
'@mui/base': 5.0.0-alpha.117_5ndqzdd6t4rivxsukjv3i3ak2q
@@ -344,6 +358,29 @@ importers:
'@types/react': 18.0.21
typescript: 4.9.5
+ packages/store:
+ specifiers:
+ '@affine/datacenter': workspace:*
+ '@blocksuite/blocks': 0.4.0-20230217095654-a561b36
+ '@blocksuite/editor': 0.4.0-20230217095654-a561b36
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36
+ '@blocksuite/react': 0.4.0-20230217095654-a561b36
+ '@blocksuite/store': 0.4.0-20230217095654-a561b36
+ '@types/react': ^18.0.28
+ react: ^18.2.0
+ zustand: ^4.3.3
+ dependencies:
+ '@affine/datacenter': link:../data-center
+ '@blocksuite/blocks': 0.4.0-20230217095654-a561b36_dtmhin5qsbpe5id5qeimghpavm
+ '@blocksuite/editor': 0.4.0-20230217095654-a561b36_s2lgz6fjlafla2itashgrkrf5u
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36
+ '@blocksuite/react': 0.4.0-20230217095654-a561b36_egd6bp35mqm7gvicj7jxwytmcu
+ '@blocksuite/store': 0.4.0-20230217095654-a561b36
+ react: 18.2.0
+ zustand: 4.3.3_react@18.2.0
+ devDependencies:
+ '@types/react': 18.0.28
+
packages:
/@ampproject/remapping/2.2.0:
@@ -2579,15 +2616,15 @@ packages:
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
dev: true
- /@blocksuite/blocks/0.4.0-20230216011811-2776d93_agtz32e5txbljk4aobo36wfrpe:
- resolution: {integrity: sha512-OCbf+nbxZyjWcXfRqBMVKUpFUXSj5HY2BpWMNN68IsbAI09zFiNPH0KuMi72uHyFN+/NucoZGwZH21EgXB+s7g==}
+ /@blocksuite/blocks/0.4.0-20230217095654-a561b36_dtmhin5qsbpe5id5qeimghpavm:
+ resolution: {integrity: sha512-ulCIGxbPCRr061Va69KlcVHROU3PdOaVXZoz/R8CIaBZmtWOdV3yiYxcQTQdPW1Ll8muxEOouueZuiZx/lExYg==}
peerDependencies:
- '@blocksuite/store': 0.4.0-20230216011811-2776d93
+ '@blocksuite/store': 0.4.0-20230217095654-a561b36
dependencies:
- '@blocksuite/global': 0.4.0-20230216011811-2776d93_lit@2.6.1
- '@blocksuite/phasor': 0.4.0-20230216011811-2776d93_lit@2.6.1
- '@blocksuite/store': 0.4.0-20230216011811-2776d93_lit@2.6.1
- '@blocksuite/virgo': 0.4.0-20230216011811-2776d93_lit@2.6.1
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36_lit@2.6.1
+ '@blocksuite/phasor': 0.4.0-20230217095654-a561b36_lit@2.6.1
+ '@blocksuite/store': 0.4.0-20230217095654-a561b36_lit@2.6.1
+ '@blocksuite/virgo': 0.4.0-20230217095654-a561b36_lit@2.6.1
'@popperjs/core': 2.11.6
autosize: 6.0.1
highlight.js: 11.7.0
@@ -2621,20 +2658,6 @@ packages:
- yjs
dev: false
- /@blocksuite/editor/0.4.0-20230216011811-2776d93_6yfgczikbxxddpvfspgrnx2z2q:
- resolution: {integrity: sha512-BCwMPRG8NQg7gZZfiFgr+TSC7C0qZRYVqIaqRJHaB08ZK9E5pC+y6ya0T9NFmIFGHHq79GdAe5IzNdzckdh0Ow==}
- peerDependencies:
- '@blocksuite/blocks': 0.4.0-20230216011811-2776d93
- '@blocksuite/store': 0.4.0-20230216011811-2776d93
- dependencies:
- '@blocksuite/blocks': 0.4.0-20230216011811-2776d93_agtz32e5txbljk4aobo36wfrpe
- '@blocksuite/global': 0.4.0-20230216011811-2776d93_lit@2.6.1
- '@blocksuite/store': 0.4.0-20230216011811-2776d93_lit@2.6.1
- lit: 2.6.1
- marked: 4.2.12
- turndown: 7.1.1
- dev: false
-
/@blocksuite/editor/0.4.0-20230217095654-a561b36_s2lgz6fjlafla2itashgrkrf5u:
resolution: {integrity: sha512-7GfjI2R1fawvaNSAyPVIeZf6pIsMjVp/+bRaIGRzHSTX7IE7G2oyAs4n9y+2DWQrFe2NOhiSrRbmFQaPoHbDGA==}
peerDependencies:
@@ -2649,8 +2672,8 @@ packages:
turndown: 7.1.1
dev: false
- /@blocksuite/global/0.4.0-20230216011811-2776d93:
- resolution: {integrity: sha512-CzgnyjLmctmDY5MHJXeeSDLHD2x0Ux/kotQJdbl7COdPeURxspCksSVZPHXzItMM53QHF5rjqjQWmzWVownN2A==}
+ /@blocksuite/global/0.4.0-20230217095654-a561b36:
+ resolution: {integrity: sha512-aIZhQ5P5WvosfDTyk5/6pb9kmdkgBZfDOiue4FgZKX40BN1J1TKyiaQeQ0upFmTdCZmLHA2Cwuy58qXdjIW4VA==}
peerDependencies:
lit: ^2.6
peerDependenciesMeta:
@@ -2661,19 +2684,6 @@ packages:
zod: 3.20.6
dev: false
- /@blocksuite/global/0.4.0-20230216011811-2776d93_lit@2.6.1:
- resolution: {integrity: sha512-CzgnyjLmctmDY5MHJXeeSDLHD2x0Ux/kotQJdbl7COdPeURxspCksSVZPHXzItMM53QHF5rjqjQWmzWVownN2A==}
- peerDependencies:
- lit: ^2.6
- peerDependenciesMeta:
- lit:
- optional: true
- dependencies:
- ansi-colors: 4.1.3
- lit: 2.6.1
- zod: 3.20.6
- dev: false
-
/@blocksuite/global/0.4.0-20230217095654-a561b36_lit@2.6.1:
resolution: {integrity: sha512-aIZhQ5P5WvosfDTyk5/6pb9kmdkgBZfDOiue4FgZKX40BN1J1TKyiaQeQ0upFmTdCZmLHA2Cwuy58qXdjIW4VA==}
peerDependencies:
@@ -2717,12 +2727,12 @@ packages:
react: 18.2.0
dev: false
- /@blocksuite/phasor/0.4.0-20230216011811-2776d93_lit@2.6.1:
- resolution: {integrity: sha512-fY5XLFIOKZlCMLb093ZHRAjhnkEaJK9vJsh8Asib/hGc0PaDqu65FIM3zXR6YAAKsgKEIu8SVK1B7n+gH82Ugg==}
+ /@blocksuite/phasor/0.4.0-20230217095654-a561b36_lit@2.6.1:
+ resolution: {integrity: sha512-MmLaWNfPERPXpHbiNRI2bfwR/wyZAfJZ/aKeRMCPf8ZKUz6xKYhW0fjboi1b+MaBJHEProTwCj0wLR97yPfqrQ==}
peerDependencies:
yjs: ^13
dependencies:
- '@blocksuite/global': 0.4.0-20230216011811-2776d93_lit@2.6.1
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36_lit@2.6.1
fractional-indexing: 3.2.0
nanoid: 4.0.1
perfect-freehand: 1.2.0
@@ -2744,19 +2754,39 @@ packages:
- lit
dev: false
- /@blocksuite/react/0.4.0-20230216011811-2776d93_lq2prkv6yrdmxppjpam6ud3g7y:
- resolution: {integrity: sha512-XjgJ+XiHwUmaxXgyJrEIb4f7T2j6bvVM++/2RiegRw0UAqinm/pNV1YmbCue7x/Q6bksjGGeQLEgLs39fPc55w==}
+ /@blocksuite/react/0.4.0-20230217095654-a561b36_egd6bp35mqm7gvicj7jxwytmcu:
+ resolution: {integrity: sha512-YNaHFHB45p6HrZIpWL2CYwRYsD/MYbRnioOVwyt0yrkoE3IXLBuLACB76qtMlN3m83oto3cskBg+cUcDNqpRIg==}
peerDependencies:
- '@blocksuite/blocks': 0.4.0-20230216011811-2776d93
- '@blocksuite/editor': 0.4.0-20230216011811-2776d93
- '@blocksuite/store': 0.4.0-20230216011811-2776d93
+ '@blocksuite/blocks': 0.4.0-20230217095654-a561b36
+ '@blocksuite/editor': 0.4.0-20230217095654-a561b36
+ '@blocksuite/store': 0.4.0-20230217095654-a561b36
react: '>=18.0.0'
react-dom: '>=18.0.0'
dependencies:
- '@blocksuite/blocks': 0.4.0-20230216011811-2776d93_agtz32e5txbljk4aobo36wfrpe
- '@blocksuite/editor': 0.4.0-20230216011811-2776d93_6yfgczikbxxddpvfspgrnx2z2q
- '@blocksuite/global': 0.4.0-20230216011811-2776d93_lit@2.6.1
- '@blocksuite/store': 0.4.0-20230216011811-2776d93_lit@2.6.1
+ '@blocksuite/blocks': 0.4.0-20230217095654-a561b36_dtmhin5qsbpe5id5qeimghpavm
+ '@blocksuite/editor': 0.4.0-20230217095654-a561b36_s2lgz6fjlafla2itashgrkrf5u
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36
+ '@blocksuite/store': 0.4.0-20230217095654-a561b36
+ react: 18.2.0
+ zustand: 4.3.3_react@18.2.0
+ transitivePeerDependencies:
+ - immer
+ - lit
+ dev: false
+
+ /@blocksuite/react/0.4.0-20230217095654-a561b36_wqt5vgiwk2wcrkromazh2p2frm:
+ resolution: {integrity: sha512-YNaHFHB45p6HrZIpWL2CYwRYsD/MYbRnioOVwyt0yrkoE3IXLBuLACB76qtMlN3m83oto3cskBg+cUcDNqpRIg==}
+ peerDependencies:
+ '@blocksuite/blocks': 0.4.0-20230217095654-a561b36
+ '@blocksuite/editor': 0.4.0-20230217095654-a561b36
+ '@blocksuite/store': 0.4.0-20230217095654-a561b36
+ react: '>=18.0.0'
+ react-dom: '>=18.0.0'
+ dependencies:
+ '@blocksuite/blocks': 0.4.0-20230217095654-a561b36_dtmhin5qsbpe5id5qeimghpavm
+ '@blocksuite/editor': 0.4.0-20230217095654-a561b36_s2lgz6fjlafla2itashgrkrf5u
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36_lit@2.6.1
+ '@blocksuite/store': 0.4.0-20230217095654-a561b36_lit@2.6.1
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
zustand: 4.3.3_react@18.2.0
@@ -2765,13 +2795,13 @@ packages:
- lit
dev: false
- /@blocksuite/store/0.4.0-20230216011811-2776d93_lit@2.6.1:
- resolution: {integrity: sha512-UO5ipKxqfeW4MceW+nU5DkSpqXlm3sostGWx5GOl8AxWxqIjUIgOasTegqTZaR2hEUbYeqCzpuQWEERH+Fp5xQ==}
+ /@blocksuite/store/0.4.0-20230217095654-a561b36:
+ resolution: {integrity: sha512-6WaiEQwXWKuOf8DaKFu0g5AIKd0YuQpoHdblg0BWnG1kbgM5zCeySFOgrFxtXX1o8NhCNGjqenlZlkBaOn8UcA==}
peerDependencies:
yjs: ^13
dependencies:
- '@blocksuite/global': 0.4.0-20230216011811-2776d93_lit@2.6.1
- '@blocksuite/virgo': 0.4.0-20230216011811-2776d93_lit@2.6.1
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36
+ '@blocksuite/virgo': 0.4.0-20230217095654-a561b36
'@types/flexsearch': 0.7.3
buffer: 6.0.3
flexsearch: 0.7.21
@@ -2790,13 +2820,13 @@ packages:
- utf-8-validate
dev: false
- /@blocksuite/store/0.4.0-20230216011811-2776d93_yjs@13.5.45:
- resolution: {integrity: sha512-UO5ipKxqfeW4MceW+nU5DkSpqXlm3sostGWx5GOl8AxWxqIjUIgOasTegqTZaR2hEUbYeqCzpuQWEERH+Fp5xQ==}
+ /@blocksuite/store/0.4.0-20230217095654-a561b36_lit@2.6.1:
+ resolution: {integrity: sha512-6WaiEQwXWKuOf8DaKFu0g5AIKd0YuQpoHdblg0BWnG1kbgM5zCeySFOgrFxtXX1o8NhCNGjqenlZlkBaOn8UcA==}
peerDependencies:
yjs: ^13
dependencies:
- '@blocksuite/global': 0.4.0-20230216011811-2776d93
- '@blocksuite/virgo': 0.4.0-20230216011811-2776d93_yjs@13.5.45
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36_lit@2.6.1
+ '@blocksuite/virgo': 0.4.0-20230217095654-a561b36_lit@2.6.1
'@types/flexsearch': 0.7.3
buffer: 6.0.3
flexsearch: 0.7.21
@@ -2807,7 +2837,6 @@ packages:
nanoid: 4.0.1
y-protocols: 1.0.5
y-webrtc: 10.2.4
- yjs: 13.5.45
zod: 3.20.6
transitivePeerDependencies:
- bufferutil
@@ -2842,25 +2871,50 @@ packages:
- utf-8-validate
dev: false
- /@blocksuite/virgo/0.4.0-20230216011811-2776d93_lit@2.6.1:
- resolution: {integrity: sha512-R0jIeVa0LDw/ZGFY7X354l9F+RUyGOA8vq3RKttNIYK9pueBOdNv3yqavj/FQu5mGMX9v4HYm9AoZLr6dvWQ6Q==}
+ /@blocksuite/store/0.4.0-20230217095654-a561b36_yjs@13.5.45:
+ resolution: {integrity: sha512-6WaiEQwXWKuOf8DaKFu0g5AIKd0YuQpoHdblg0BWnG1kbgM5zCeySFOgrFxtXX1o8NhCNGjqenlZlkBaOn8UcA==}
+ peerDependencies:
+ yjs: ^13
+ dependencies:
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36
+ '@blocksuite/virgo': 0.4.0-20230217095654-a561b36_yjs@13.5.45
+ '@types/flexsearch': 0.7.3
+ buffer: 6.0.3
+ flexsearch: 0.7.21
+ idb-keyval: 6.2.0
+ ky: 0.33.2
+ lib0: 0.2.62
+ merge: 2.1.1
+ nanoid: 4.0.1
+ y-protocols: 1.0.5
+ y-webrtc: 10.2.4
+ yjs: 13.5.45
+ zod: 3.20.6
+ transitivePeerDependencies:
+ - bufferutil
+ - lit
+ - supports-color
+ - utf-8-validate
+ dev: false
+
+ /@blocksuite/virgo/0.4.0-20230217095654-a561b36:
+ resolution: {integrity: sha512-duJN3+nr+QwhTsnyU+CA/b5uDptbLmp/WdM5NjtGScsYz9/a1l4pnOph1fOF04+A9squLMAMl06nnf85G7izmA==}
peerDependencies:
lit: ^2
yjs: ^13
dependencies:
- '@blocksuite/global': 0.4.0-20230216011811-2776d93_lit@2.6.1
- lit: 2.6.1
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36
zod: 3.20.6
dev: false
- /@blocksuite/virgo/0.4.0-20230216011811-2776d93_yjs@13.5.45:
- resolution: {integrity: sha512-R0jIeVa0LDw/ZGFY7X354l9F+RUyGOA8vq3RKttNIYK9pueBOdNv3yqavj/FQu5mGMX9v4HYm9AoZLr6dvWQ6Q==}
+ /@blocksuite/virgo/0.4.0-20230217095654-a561b36_lit@2.6.1:
+ resolution: {integrity: sha512-duJN3+nr+QwhTsnyU+CA/b5uDptbLmp/WdM5NjtGScsYz9/a1l4pnOph1fOF04+A9squLMAMl06nnf85G7izmA==}
peerDependencies:
lit: ^2
yjs: ^13
dependencies:
- '@blocksuite/global': 0.4.0-20230216011811-2776d93
- yjs: 13.5.45
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36_lit@2.6.1
+ lit: 2.6.1
zod: 3.20.6
dev: false
@@ -2876,6 +2930,17 @@ packages:
zod: 3.20.6
dev: false
+ /@blocksuite/virgo/0.4.0-20230217095654-a561b36_yjs@13.5.45:
+ resolution: {integrity: sha512-duJN3+nr+QwhTsnyU+CA/b5uDptbLmp/WdM5NjtGScsYz9/a1l4pnOph1fOF04+A9squLMAMl06nnf85G7izmA==}
+ peerDependencies:
+ lit: ^2
+ yjs: ^13
+ dependencies:
+ '@blocksuite/global': 0.4.0-20230217095654-a561b36
+ yjs: 13.5.45
+ zod: 3.20.6
+ dev: false
+
/@changesets/apply-release-plan/6.1.3:
resolution: {integrity: sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg==}
dependencies:
@@ -6278,6 +6343,34 @@ packages:
'@tauri-apps/cli-win32-x64-msvc': 1.2.3
dev: true
+ /@testing-library/dom/9.0.0:
+ resolution: {integrity: sha512-+/TLgKNFsYUshOY/zXsQOk+PlFQK+eyJ9T13IDVNJEi+M+Un7xlJK+FZKkbGSnf0+7E1G6PlDhkSYQ/GFiruBQ==}
+ engines: {node: '>=14'}
+ dependencies:
+ '@babel/code-frame': 7.18.6
+ '@babel/runtime': 7.20.7
+ '@types/aria-query': 5.0.1
+ aria-query: 5.1.3
+ chalk: 4.1.2
+ dom-accessibility-api: 0.5.16
+ lz-string: 1.4.4
+ pretty-format: 27.5.1
+ dev: true
+
+ /@testing-library/react/14.0.0_biqbaboplfbrettd7655fr4n2y:
+ resolution: {integrity: sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.20.7
+ '@testing-library/dom': 9.0.0
+ '@types/react-dom': 18.0.10
+ react: 18.2.0
+ react-dom: 18.2.0_react@18.2.0
+ dev: true
+
/@tokenizer/token/0.3.0:
resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==}
dev: true
@@ -6298,6 +6391,10 @@ packages:
resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==}
dev: true
+ /@types/aria-query/5.0.1:
+ resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==}
+ dev: true
+
/@types/babel__core/7.20.0:
resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==}
dependencies:
@@ -6580,7 +6677,7 @@ packages:
/@types/react-dom/18.0.10:
resolution: {integrity: sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==}
dependencies:
- '@types/react': 18.0.27
+ '@types/react': 18.0.28
dev: true
/@types/react-dom/18.0.6:
@@ -6623,6 +6720,14 @@ packages:
'@types/scheduler': 0.16.2
csstype: 3.1.1
+ /@types/react/18.0.28:
+ resolution: {integrity: sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==}
+ dependencies:
+ '@types/prop-types': 15.7.5
+ '@types/scheduler': 0.16.2
+ csstype: 3.1.1
+ dev: true
+
/@types/responselike/1.0.0:
resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
dependencies:
@@ -6836,7 +6941,23 @@ packages:
- supports-color
dev: true
- /@vitest/coverage-istanbul/0.28.5:
+ /@vitejs/plugin-react/3.1.0_vite@4.1.2:
+ resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^4.1.0-beta.0
+ dependencies:
+ '@babel/core': 7.20.12
+ '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.20.12
+ '@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.12
+ magic-string: 0.27.0
+ react-refresh: 0.14.0
+ vite: 4.1.2_@types+node@18.11.18
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@vitest/coverage-istanbul/0.28.5_happy-dom@8.4.4:
resolution: {integrity: sha512-na1pkr3AVrdFflzuBXsBh1MvBfhSMrv4nfd4N8rm0HEJlvlbQc+GiqNwtwzfO8TPsXxcjNphSIMp5wvCy+0xrQ==}
dependencies:
istanbul-lib-coverage: 3.2.0
@@ -6845,7 +6966,7 @@ packages:
istanbul-lib-source-maps: 4.0.1
istanbul-reports: 3.1.5
test-exclude: 6.0.0
- vitest: 0.28.5
+ vitest: 0.28.5_happy-dom@8.4.4
transitivePeerDependencies:
- '@edge-runtime/vm'
- '@vitest/browser'
@@ -7254,6 +7375,12 @@ packages:
'@babel/runtime-corejs3': 7.19.1
dev: true
+ /aria-query/5.1.3:
+ resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==}
+ dependencies:
+ deep-equal: 2.2.0
+ dev: true
+
/array-flatten/1.1.1:
resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
dev: true
@@ -8218,6 +8345,10 @@ packages:
lodash: 4.17.21
dev: false
+ /css.escape/1.5.1:
+ resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
+ dev: true
+
/csstype/3.1.1:
resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==}
@@ -8338,6 +8469,28 @@ packages:
regexp.prototype.flags: 1.4.3
dev: false
+ /deep-equal/2.2.0:
+ resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==}
+ dependencies:
+ call-bind: 1.0.2
+ es-get-iterator: 1.1.3
+ get-intrinsic: 1.1.3
+ is-arguments: 1.1.1
+ is-array-buffer: 3.0.1
+ is-date-object: 1.0.5
+ is-regex: 1.1.4
+ is-shared-array-buffer: 1.0.2
+ isarray: 2.0.5
+ object-is: 1.1.5
+ object-keys: 1.1.1
+ object.assign: 4.1.4
+ regexp.prototype.flags: 1.4.3
+ side-channel: 1.0.4
+ which-boxed-primitive: 1.0.2
+ which-collection: 1.0.1
+ which-typed-array: 1.1.9
+ dev: true
+
/deep-is/0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
dev: true
@@ -8479,6 +8632,10 @@ packages:
esutils: 2.0.3
dev: true
+ /dom-accessibility-api/0.5.16:
+ resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
+ dev: true
+
/dom-helpers/5.2.1:
resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
dependencies:
@@ -8634,6 +8791,20 @@ packages:
which-typed-array: 1.1.9
dev: true
+ /es-get-iterator/1.1.3:
+ resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.1.3
+ has-symbols: 1.0.3
+ is-arguments: 1.1.1
+ is-map: 2.0.2
+ is-set: 2.0.2
+ is-string: 1.0.7
+ isarray: 2.0.5
+ stop-iteration-iterator: 1.0.0
+ dev: true
+
/es-module-lexer/0.9.3:
resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==}
dev: true
@@ -10077,6 +10248,19 @@ packages:
uglify-js: 3.17.4
dev: true
+ /happy-dom/8.4.4:
+ resolution: {integrity: sha512-v0RbFlIIApDN8D7HOlCJWKE4BiRZgidM6I0v/1//ctDLkJcgvitgTw/AZ3S2BPN5Z9cMaVLnOIuvakJhf8dojw==}
+ dependencies:
+ css.escape: 1.5.1
+ he: 1.2.0
+ node-fetch: 2.6.7
+ webidl-conversions: 7.0.0
+ whatwg-encoding: 2.0.0
+ whatwg-mimetype: 3.0.0
+ transitivePeerDependencies:
+ - encoding
+ dev: true
+
/hard-rejection/2.1.0:
resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
engines: {node: '>=6'}
@@ -10133,6 +10317,11 @@ packages:
type-fest: 0.8.1
dev: true
+ /he/1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+ dev: true
+
/highlight.js/11.7.0:
resolution: {integrity: sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==}
engines: {node: '>=12.0.0'}
@@ -10271,7 +10460,6 @@ packages:
engines: {node: '>=0.10.0'}
dependencies:
safer-buffer: 2.1.2
- dev: false
/idb-keyval/6.2.0:
resolution: {integrity: sha512-uw+MIyQn2jl3+hroD7hF8J7PUviBU7BPKWw4f/ISf32D4LoGu98yHjrzWWJDASu9QNrX10tCJqk9YY0ClWm8Ng==}
@@ -10450,6 +10638,10 @@ packages:
engines: {node: '>=8'}
dev: true
+ /is-map/2.0.2:
+ resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
+ dev: true
+
/is-nan/1.3.2:
resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==}
engines: {node: '>= 0.4'}
@@ -10513,6 +10705,10 @@ packages:
call-bind: 1.0.2
has-tostringtag: 1.0.0
+ /is-set/2.0.2:
+ resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==}
+ dev: true
+
/is-shared-array-buffer/1.0.2:
resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
dependencies:
@@ -10575,12 +10771,23 @@ packages:
engines: {node: '>=10'}
dev: true
+ /is-weakmap/2.0.1:
+ resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==}
+ dev: true
+
/is-weakref/1.0.2:
resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
dependencies:
call-bind: 1.0.2
dev: true
+ /is-weakset/2.0.2:
+ resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.1.3
+ dev: true
+
/is-windows/1.0.2:
resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
engines: {node: '>=0.10.0'}
@@ -10600,6 +10807,10 @@ packages:
/isarray/1.0.0:
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+ /isarray/2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+ dev: true
+
/isexe/2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
dev: true
@@ -11174,6 +11385,7 @@ packages:
/loose-envify/1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
dependencies:
js-tokens: 4.0.0
@@ -11225,6 +11437,11 @@ packages:
es5-ext: 0.10.62
dev: false
+ /lz-string/1.4.4:
+ resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==}
+ hasBin: true
+ dev: true
+
/magic-string/0.27.0:
resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
engines: {node: '>=12'}
@@ -13476,6 +13693,13 @@ packages:
resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==}
dev: true
+ /stop-iteration-iterator/1.0.0:
+ resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ internal-slot: 1.0.4
+ dev: true
+
/store2/2.14.2:
resolution: {integrity: sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==}
dev: true
@@ -14381,7 +14605,7 @@ packages:
picocolors: 1.0.0
source-map: 0.6.1
source-map-support: 0.5.21
- vite: 4.1.1_@types+node@18.11.18
+ vite: 4.1.2_@types+node@18.11.18
transitivePeerDependencies:
- '@types/node'
- less
@@ -14459,7 +14683,41 @@ packages:
fsevents: 2.3.2
dev: true
- /vitest/0.28.5:
+ /vite/4.1.2_@types+node@18.11.18:
+ resolution: {integrity: sha512-MWDb9Rfy3DI8omDQySbMK93nQqStwbsQWejXRY2EBzEWKmLAXWb1mkI9Yw2IJrc+oCvPCI1Os5xSSIBYY6DEAw==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': '>= 14'
+ less: '*'
+ sass: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ '@types/node': 18.11.18
+ esbuild: 0.16.17
+ postcss: 8.4.21
+ resolve: 1.22.1
+ rollup: 3.14.0
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /vitest/0.28.5_happy-dom@8.4.4:
resolution: {integrity: sha512-pyCQ+wcAOX7mKMcBNkzDwEHRGqQvHUl0XnoHR+3Pb1hytAHISgSxv9h0gUiSiYtISXUU3rMrKiKzFYDrI6ZIHA==}
engines: {node: '>=v14.16.0'}
hasBin: true
@@ -14493,6 +14751,7 @@ packages:
cac: 6.7.14
chai: 4.3.7
debug: 4.3.4
+ happy-dom: 8.4.4
local-pkg: 0.4.3
pathe: 1.1.0
picocolors: 1.0.0
@@ -14502,7 +14761,7 @@ packages:
tinybench: 2.3.1
tinypool: 0.3.1
tinyspy: 1.1.1
- vite: 4.1.1_@types+node@18.11.18
+ vite: 4.1.2_@types+node@18.11.18
vite-node: 0.28.5_@types+node@18.11.18
why-is-node-running: 2.2.2
transitivePeerDependencies:
@@ -14555,6 +14814,11 @@ packages:
engines: {node: '>=10.4'}
dev: true
+ /webidl-conversions/7.0.0:
+ resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
+ engines: {node: '>=12'}
+ dev: true
+
/webpack-sources/3.2.3:
resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
engines: {node: '>=10.13.0'}
@@ -14618,6 +14882,18 @@ packages:
engines: {node: '>=0.8.0'}
dev: false
+ /whatwg-encoding/2.0.0:
+ resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
+ engines: {node: '>=12'}
+ dependencies:
+ iconv-lite: 0.6.3
+ dev: true
+
+ /whatwg-mimetype/3.0.0:
+ resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
+ engines: {node: '>=12'}
+ dev: true
+
/whatwg-url/5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
dependencies:
@@ -14643,6 +14919,15 @@ packages:
is-symbol: 1.0.4
dev: true
+ /which-collection/1.0.1:
+ resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==}
+ dependencies:
+ is-map: 2.0.2
+ is-set: 2.0.2
+ is-weakmap: 2.0.1
+ is-weakset: 2.0.2
+ dev: true
+
/which-module/2.0.0:
resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==}
dev: true
diff --git a/tsconfig.json b/tsconfig.json
index 5e5b4c08be..8c6ada265a 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -21,6 +21,7 @@
"@affine/datacenter": ["./packages/datacenter/src"],
"@affine/i18n": ["./packages/i18n/src"],
"@affine/logger": ["./packages/logger/src"],
+ "@affine/store": ["packages/store/src"],
"@toeverything/pathfinder-logger": ["./packages/logger"]
}
},
diff --git a/vitest.config.ts b/vitest.config.ts
index 85ae2781a5..aeb1a7e802 100644
--- a/vitest.config.ts
+++ b/vitest.config.ts
@@ -1,8 +1,13 @@
+import path from 'node:path';
+
+import react from '@vitejs/plugin-react';
+import { fileURLToPath } from 'url';
import { defineConfig } from 'vitest/config';
export default defineConfig({
+ plugins: [react()],
test: {
- include: ['packages/**/*.spec.ts'],
+ include: ['packages/**/*.spec.ts', 'packages/**/*.spec.tsx'],
testTimeout: 5000,
coverage: {
provider: 'istanbul', // or 'c8'
@@ -10,4 +15,11 @@ export default defineConfig({
reportsDirectory: '.coverage/store',
},
},
+ resolve: {
+ alias: {
+ '@affine/store': path.resolve(
+ fileURLToPath(new URL('packages/store', import.meta.url))
+ ),
+ },
+ },
});