From d5e075e7fe04b9adca3e270e3c0b3d9d36ab261f Mon Sep 17 00:00:00 2001 From: Yifeng Wang Date: Sat, 9 Mar 2024 10:47:13 +0800 Subject: [PATCH 01/11] refactor: `Workspace` -> `DocCollection` --- packages/framework/store/src/index.ts | 2 +- packages/framework/store/src/{workspace => store}/addon/blob.ts | 0 .../framework/store/src/{workspace => store}/addon/index.ts | 0 .../framework/store/src/{workspace => store}/addon/indexer.ts | 0 .../framework/store/src/{workspace => store}/addon/shared.ts | 0 packages/framework/store/src/{workspace => store}/addon/test.ts | 0 packages/framework/store/src/{workspace => store}/addon/type.ts | 0 .../store/src/{workspace => store}/block/block-tree.ts | 0 .../framework/store/src/{workspace => store}/block/block.ts | 0 .../framework/store/src/{workspace => store}/block/index.ts | 0 packages/framework/store/src/{workspace => store}/doc.ts | 0 packages/framework/store/src/{workspace => store}/index.ts | 0 packages/framework/store/src/{workspace => store}/meta.ts | 0 packages/framework/store/src/{workspace => store}/space.ts | 0 packages/framework/store/src/{workspace => store}/store.ts | 0 packages/framework/store/src/{workspace => store}/workspace.ts | 0 16 files changed, 1 insertion(+), 1 deletion(-) rename packages/framework/store/src/{workspace => store}/addon/blob.ts (100%) rename packages/framework/store/src/{workspace => store}/addon/index.ts (100%) rename packages/framework/store/src/{workspace => store}/addon/indexer.ts (100%) rename packages/framework/store/src/{workspace => store}/addon/shared.ts (100%) rename packages/framework/store/src/{workspace => store}/addon/test.ts (100%) rename packages/framework/store/src/{workspace => store}/addon/type.ts (100%) rename packages/framework/store/src/{workspace => store}/block/block-tree.ts (100%) rename packages/framework/store/src/{workspace => store}/block/block.ts (100%) rename packages/framework/store/src/{workspace => store}/block/index.ts (100%) rename packages/framework/store/src/{workspace => store}/doc.ts (100%) rename packages/framework/store/src/{workspace => store}/index.ts (100%) rename packages/framework/store/src/{workspace => store}/meta.ts (100%) rename packages/framework/store/src/{workspace => store}/space.ts (100%) rename packages/framework/store/src/{workspace => store}/store.ts (100%) rename packages/framework/store/src/{workspace => store}/workspace.ts (100%) diff --git a/packages/framework/store/src/index.ts b/packages/framework/store/src/index.ts index 2001396f984b..f50649a5e0a3 100644 --- a/packages/framework/store/src/index.ts +++ b/packages/framework/store/src/index.ts @@ -16,6 +16,7 @@ export type { export { sha } from './persistence/blob/utils.js'; export * from './reactive/index.js'; export * from './schema/index.js'; +export * from './store/index.js'; export * from './transformer/index.js'; export { createAutoIncrementIdGenerator, @@ -25,7 +26,6 @@ export { uuidv4, } from './utils/id-generator.js'; export * as Utils from './utils/utils.js'; -export * from './workspace/index.js'; export * from './yjs/index.js'; export { Slot } from '@blocksuite/global/utils'; diff --git a/packages/framework/store/src/workspace/addon/blob.ts b/packages/framework/store/src/store/addon/blob.ts similarity index 100% rename from packages/framework/store/src/workspace/addon/blob.ts rename to packages/framework/store/src/store/addon/blob.ts diff --git a/packages/framework/store/src/workspace/addon/index.ts b/packages/framework/store/src/store/addon/index.ts similarity index 100% rename from packages/framework/store/src/workspace/addon/index.ts rename to packages/framework/store/src/store/addon/index.ts diff --git a/packages/framework/store/src/workspace/addon/indexer.ts b/packages/framework/store/src/store/addon/indexer.ts similarity index 100% rename from packages/framework/store/src/workspace/addon/indexer.ts rename to packages/framework/store/src/store/addon/indexer.ts diff --git a/packages/framework/store/src/workspace/addon/shared.ts b/packages/framework/store/src/store/addon/shared.ts similarity index 100% rename from packages/framework/store/src/workspace/addon/shared.ts rename to packages/framework/store/src/store/addon/shared.ts diff --git a/packages/framework/store/src/workspace/addon/test.ts b/packages/framework/store/src/store/addon/test.ts similarity index 100% rename from packages/framework/store/src/workspace/addon/test.ts rename to packages/framework/store/src/store/addon/test.ts diff --git a/packages/framework/store/src/workspace/addon/type.ts b/packages/framework/store/src/store/addon/type.ts similarity index 100% rename from packages/framework/store/src/workspace/addon/type.ts rename to packages/framework/store/src/store/addon/type.ts diff --git a/packages/framework/store/src/workspace/block/block-tree.ts b/packages/framework/store/src/store/block/block-tree.ts similarity index 100% rename from packages/framework/store/src/workspace/block/block-tree.ts rename to packages/framework/store/src/store/block/block-tree.ts diff --git a/packages/framework/store/src/workspace/block/block.ts b/packages/framework/store/src/store/block/block.ts similarity index 100% rename from packages/framework/store/src/workspace/block/block.ts rename to packages/framework/store/src/store/block/block.ts diff --git a/packages/framework/store/src/workspace/block/index.ts b/packages/framework/store/src/store/block/index.ts similarity index 100% rename from packages/framework/store/src/workspace/block/index.ts rename to packages/framework/store/src/store/block/index.ts diff --git a/packages/framework/store/src/workspace/doc.ts b/packages/framework/store/src/store/doc.ts similarity index 100% rename from packages/framework/store/src/workspace/doc.ts rename to packages/framework/store/src/store/doc.ts diff --git a/packages/framework/store/src/workspace/index.ts b/packages/framework/store/src/store/index.ts similarity index 100% rename from packages/framework/store/src/workspace/index.ts rename to packages/framework/store/src/store/index.ts diff --git a/packages/framework/store/src/workspace/meta.ts b/packages/framework/store/src/store/meta.ts similarity index 100% rename from packages/framework/store/src/workspace/meta.ts rename to packages/framework/store/src/store/meta.ts diff --git a/packages/framework/store/src/workspace/space.ts b/packages/framework/store/src/store/space.ts similarity index 100% rename from packages/framework/store/src/workspace/space.ts rename to packages/framework/store/src/store/space.ts diff --git a/packages/framework/store/src/workspace/store.ts b/packages/framework/store/src/store/store.ts similarity index 100% rename from packages/framework/store/src/workspace/store.ts rename to packages/framework/store/src/store/store.ts diff --git a/packages/framework/store/src/workspace/workspace.ts b/packages/framework/store/src/store/workspace.ts similarity index 100% rename from packages/framework/store/src/workspace/workspace.ts rename to packages/framework/store/src/store/workspace.ts From 12ef005c57077bf5a0c9d794d852d541b8fcd6c7 Mon Sep 17 00:00:00 2001 From: Yifeng Wang Date: Sat, 9 Mar 2024 10:50:23 +0800 Subject: [PATCH 02/11] fix: unit test --- .../framework/store/src/__tests__/block-tree.unit.spec.ts | 2 +- packages/framework/store/src/__tests__/block.unit.spec.ts | 2 +- packages/framework/store/src/__tests__/schema.unit.spec.ts | 4 ++-- packages/framework/store/src/__tests__/test-utils-dom.ts | 2 +- .../framework/store/src/__tests__/transformer.unit.spec.ts | 2 +- packages/framework/store/src/__tests__/workspace.unit.spec.ts | 2 +- packages/framework/store/src/schema/schema.ts | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/framework/store/src/__tests__/block-tree.unit.spec.ts b/packages/framework/store/src/__tests__/block-tree.unit.spec.ts index e0ad7c7333a3..45e0d56a6ed4 100644 --- a/packages/framework/store/src/__tests__/block-tree.unit.spec.ts +++ b/packages/framework/store/src/__tests__/block-tree.unit.spec.ts @@ -3,7 +3,7 @@ import * as Y from 'yjs'; import type { SchemaToModel } from '../schema/index.js'; import { defineBlockSchema, Schema } from '../schema/index.js'; -import { Generator, Workspace } from '../workspace/index.js'; +import { Generator, Workspace } from '../store/index.js'; const docSchema = defineBlockSchema({ flavour: 'page', diff --git a/packages/framework/store/src/__tests__/block.unit.spec.ts b/packages/framework/store/src/__tests__/block.unit.spec.ts index 321d3936a8d1..fde13cccd47e 100644 --- a/packages/framework/store/src/__tests__/block.unit.spec.ts +++ b/packages/framework/store/src/__tests__/block.unit.spec.ts @@ -6,7 +6,7 @@ import { Schema, type SchemaToModel, } from '../schema/index.js'; -import { Block } from '../workspace/block/block.js'; +import { Block } from '../store/block/block.js'; const schema = new Schema(); const pageSchema = defineBlockSchema({ diff --git a/packages/framework/store/src/__tests__/schema.unit.spec.ts b/packages/framework/store/src/__tests__/schema.unit.spec.ts index f1dcb12e10bc..8dfc12684cb6 100644 --- a/packages/framework/store/src/__tests__/schema.unit.spec.ts +++ b/packages/framework/store/src/__tests__/schema.unit.spec.ts @@ -7,8 +7,8 @@ import { describe, expect, it } from 'vitest'; import { type BlockModel, defineBlockSchema } from '../schema/base.js'; import { SchemaValidateError } from '../schema/error.js'; import { Schema } from '../schema/index.js'; -import { Workspace } from '../workspace/index.js'; -import { Generator } from '../workspace/store.js'; +import { Workspace } from '../store/index.js'; +import { Generator } from '../store/store.js'; import { DividerBlockSchema, ListBlockSchema, diff --git a/packages/framework/store/src/__tests__/test-utils-dom.ts b/packages/framework/store/src/__tests__/test-utils-dom.ts index c80a3acfb035..38ce2e411616 100644 --- a/packages/framework/store/src/__tests__/test-utils-dom.ts +++ b/packages/framework/store/src/__tests__/test-utils-dom.ts @@ -1,4 +1,4 @@ -import type { Workspace } from '../workspace/workspace.js'; +import type { Workspace } from '../store/store.js'; declare global { interface WindowEventMap { diff --git a/packages/framework/store/src/__tests__/transformer.unit.spec.ts b/packages/framework/store/src/__tests__/transformer.unit.spec.ts index 262827a880c2..a3547f9a5ea5 100644 --- a/packages/framework/store/src/__tests__/transformer.unit.spec.ts +++ b/packages/framework/store/src/__tests__/transformer.unit.spec.ts @@ -9,8 +9,8 @@ import { Schema, type SchemaToModel, } from '../schema/index.js'; +import { Generator, Workspace } from '../store/index.js'; import { AssetsManager, BaseBlockTransformer } from '../transformer/index.js'; -import { Generator, Workspace } from '../workspace/index.js'; const docSchema = defineBlockSchema({ flavour: 'page', diff --git a/packages/framework/store/src/__tests__/workspace.unit.spec.ts b/packages/framework/store/src/__tests__/workspace.unit.spec.ts index 5b8dc9536953..e703e109fbdf 100644 --- a/packages/framework/store/src/__tests__/workspace.unit.spec.ts +++ b/packages/framework/store/src/__tests__/workspace.unit.spec.ts @@ -8,7 +8,7 @@ import { applyUpdate, encodeStateAsUpdate } from 'yjs'; import { PAGE_VERSION, WORKSPACE_VERSION } from '../consts.js'; import type { BlockModel, BlockSchemaType, Doc } from '../index.js'; import { Generator, Schema, Workspace } from '../index.js'; -import type { DocMeta } from '../workspace/index.js'; +import type { DocMeta } from '../store/index.js'; import type { BlockSuiteDoc } from '../yjs/index.js'; import { NoteBlockSchema, diff --git a/packages/framework/store/src/schema/schema.ts b/packages/framework/store/src/schema/schema.ts index 8211261c5862..e76112ca270e 100644 --- a/packages/framework/store/src/schema/schema.ts +++ b/packages/framework/store/src/schema/schema.ts @@ -4,7 +4,7 @@ import type * as Y from 'yjs'; import { SCHEMA_NOT_FOUND_MESSAGE } from '../consts.js'; import { docMigrations, workspaceMigrations } from '../migration/index.js'; -import { Block } from '../workspace/block/block.js'; +import { Block } from '../store/block/block.js'; import type { BlockSchemaType } from './base.js'; import { BlockSchema } from './base.js'; import { MigrationError, SchemaValidateError } from './error.js'; From c6e30871960f547d402754b9d01c115c2ad64531 Mon Sep 17 00:00:00 2001 From: Yifeng Wang Date: Sat, 9 Mar 2024 10:54:19 +0800 Subject: [PATCH 03/11] fix: lint --- packages/framework/store/src/indexer/base.ts | 2 +- packages/framework/store/src/indexer/search.ts | 4 ++-- packages/framework/store/src/schema/base.ts | 4 ++-- packages/framework/store/src/transformer/job.ts | 6 +++--- packages/framework/store/src/transformer/middleware.ts | 2 +- packages/framework/store/src/transformer/slice.ts | 2 +- packages/framework/store/src/transformer/type.ts | 2 +- packages/framework/store/src/utils/utils.ts | 6 +++--- packages/framework/store/src/yjs/awareness.ts | 4 ++-- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/framework/store/src/indexer/base.ts b/packages/framework/store/src/indexer/base.ts index bfa7c047d913..631438e2310e 100644 --- a/packages/framework/store/src/indexer/base.ts +++ b/packages/framework/store/src/indexer/base.ts @@ -2,7 +2,7 @@ import { assertExists, DisposableGroup, Slot } from '@blocksuite/global/utils'; import type * as Y from 'yjs'; import { YArrayEvent, YMapEvent, YTextEvent } from 'yjs'; -import type { YBlock } from '../workspace/block/block.js'; +import type { YBlock } from '../store/block/block.js'; import type { BlockSuiteDoc } from '../yjs/index.js'; type DocId = string; diff --git a/packages/framework/store/src/indexer/search.ts b/packages/framework/store/src/indexer/search.ts index 56280958856a..6257b561a1fa 100644 --- a/packages/framework/store/src/indexer/search.ts +++ b/packages/framework/store/src/indexer/search.ts @@ -4,8 +4,8 @@ import FlexSearch from 'flexsearch'; import type { Doc } from 'yjs'; import { Text as YText } from 'yjs'; -import type { YBlock } from '../workspace/block/block.js'; -import type { YBlocks } from '../workspace/doc.js'; +import type { YBlock } from '../store/block/block.js'; +import type { YBlocks } from '../store/doc.js'; import type { BlockSuiteDoc } from '../yjs/index.js'; const DocumentIndexer = FlexSearch.Document; diff --git a/packages/framework/store/src/schema/base.ts b/packages/framework/store/src/schema/base.ts index 25cdeae3080d..f3aa9e8524a3 100644 --- a/packages/framework/store/src/schema/base.ts +++ b/packages/framework/store/src/schema/base.ts @@ -4,9 +4,9 @@ import { z } from 'zod'; import { Boxed } from '../reactive/boxed.js'; import { Text } from '../reactive/text.js'; +import type { YBlock } from '../store/block/block.js'; +import type { Doc } from '../store/index.js'; import type { BaseBlockTransformer } from '../transformer/base.js'; -import type { YBlock } from '../workspace/block/block.js'; -import type { Doc } from '../workspace/index.js'; const FlavourSchema = z.string(); const ParentSchema = z.array(z.string()).optional(); diff --git a/packages/framework/store/src/transformer/job.ts b/packages/framework/store/src/transformer/job.ts index e55d9ce57f94..80c5eec8c7af 100644 --- a/packages/framework/store/src/transformer/job.ts +++ b/packages/framework/store/src/transformer/job.ts @@ -2,9 +2,9 @@ import { Slot } from '@blocksuite/global/utils'; import { assertExists } from '@blocksuite/global/utils'; import type { BlockModel, BlockSchemaType } from '../schema/index.js'; -import type { DocMeta, Workspace } from '../workspace/index.js'; -import type { Doc } from '../workspace/index.js'; -import type { DocsPropertiesMeta } from '../workspace/meta.js'; +import type { DocMeta, Workspace } from '../store/index.js'; +import type { Doc } from '../store/index.js'; +import type { DocsPropertiesMeta } from '../store/meta.js'; import { AssetsManager } from './assets.js'; import { BaseBlockTransformer } from './base.js'; import type { diff --git a/packages/framework/store/src/transformer/middleware.ts b/packages/framework/store/src/transformer/middleware.ts index 6edf3bd9fa1d..4b3e5082900d 100644 --- a/packages/framework/store/src/transformer/middleware.ts +++ b/packages/framework/store/src/transformer/middleware.ts @@ -1,7 +1,7 @@ import type { Slot } from '@blocksuite/global/utils'; import type { BlockModel } from '../schema/index.js'; -import type { Doc, Workspace } from '../workspace/index.js'; +import type { Doc, Workspace } from '../store/index.js'; import type { AssetsManager } from './assets.js'; import type { Slice } from './slice.js'; import type { diff --git a/packages/framework/store/src/transformer/slice.ts b/packages/framework/store/src/transformer/slice.ts index 8e1cf5299d28..438b46dc1d00 100644 --- a/packages/framework/store/src/transformer/slice.ts +++ b/packages/framework/store/src/transformer/slice.ts @@ -1,7 +1,7 @@ import { assertExists } from '@blocksuite/global/utils'; import type { BlockModel } from '../schema/index.js'; -import type { Doc } from '../workspace/index.js'; +import type { Doc } from '../store/index.js'; type SliceData = { content: BlockModel[]; diff --git a/packages/framework/store/src/transformer/type.ts b/packages/framework/store/src/transformer/type.ts index e4e9039bc6b9..e334b2a11e2b 100644 --- a/packages/framework/store/src/transformer/type.ts +++ b/packages/framework/store/src/transformer/type.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -import type { DocMeta, DocsPropertiesMeta } from '../workspace/meta.js'; +import type { DocMeta, DocsPropertiesMeta } from '../store/meta.js'; export type BlockSnapshot = { type: 'block'; diff --git a/packages/framework/store/src/utils/utils.ts b/packages/framework/store/src/utils/utils.ts index fa64059a501b..c2450797c809 100644 --- a/packages/framework/store/src/utils/utils.ts +++ b/packages/framework/store/src/utils/utils.ts @@ -7,9 +7,9 @@ import { native2Y } from '../reactive/index.js'; import type { BlockModel } from '../schema/base.js'; import { type BlockSchema } from '../schema/base.js'; import { internalPrimitives } from '../schema/base.js'; -import type { YBlock } from '../workspace/block/block.js'; -import type { BlockProps, YBlocks } from '../workspace/doc.js'; -import type { Workspace } from '../workspace/index.js'; +import type { YBlock } from '../store/block/block.js'; +import type { BlockProps, YBlocks } from '../store/doc.js'; +import type { Workspace } from '../store/index.js'; export function assertValidChildren( yBlocks: YBlocks, diff --git a/packages/framework/store/src/yjs/awareness.ts b/packages/framework/store/src/yjs/awareness.ts index 2e6c76d1e284..5689bdd44d26 100644 --- a/packages/framework/store/src/yjs/awareness.ts +++ b/packages/framework/store/src/yjs/awareness.ts @@ -2,8 +2,8 @@ import { Slot } from '@blocksuite/global/utils'; import { merge } from 'merge'; import type { Awareness as YAwareness } from 'y-protocols/awareness.js'; -import type { Space } from '../workspace/space.js'; -import type { Store } from '../workspace/store.js'; +import type { Space } from '../store/space.js'; +import type { Store } from '../store/store.js'; export interface UserInfo { name: string; From d8f64aae922cb84f48bfa6617334891bd87a4987 Mon Sep 17 00:00:00 2001 From: Yifeng Wang Date: Sat, 9 Mar 2024 10:57:47 +0800 Subject: [PATCH 04/11] fix: test --- packages/framework/store/src/__tests__/test-utils-dom.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/framework/store/src/__tests__/test-utils-dom.ts b/packages/framework/store/src/__tests__/test-utils-dom.ts index 38ce2e411616..d613c9ca39c7 100644 --- a/packages/framework/store/src/__tests__/test-utils-dom.ts +++ b/packages/framework/store/src/__tests__/test-utils-dom.ts @@ -1,4 +1,4 @@ -import type { Workspace } from '../store/store.js'; +import type { Workspace } from '../store/index.js'; declare global { interface WindowEventMap { From 8880b17b5259f228aaff28e8225c3152e181e9ec Mon Sep 17 00:00:00 2001 From: Yifeng Wang Date: Sat, 9 Mar 2024 11:03:39 +0800 Subject: [PATCH 05/11] refactor: rename --- .../__tests__/database/database.unit.spec.ts | 4 +-- .../migration/migration.unit.spec.ts | 6 ++-- .../embed-card/embed-card-toolbar.ts | 4 +-- .../_common/components/rich-text/rich-text.ts | 4 +-- packages/blocks/src/_common/mind-map/draw.ts | 8 ++--- .../blocks/src/_common/transformers/zip.ts | 6 ++-- packages/blocks/src/_common/utils/init.ts | 4 +-- .../common/columns/rich-text/cell-renderer.ts | 4 +-- .../common/datasource/all-doc-datasource.ts | 4 +-- .../common/datasource/tags-datasource.ts | 4 +-- .../database-block/common/header-area/text.ts | 10 +++---- .../embed-linked-doc-block.ts | 4 +-- .../embed-synced-doc-block.ts | 4 +-- .../root-block/clipboard/middlewares/paste.ts | 4 +-- .../auto-complete/auto-complete-panel.ts | 4 +-- .../components/auto-complete/utils.ts | 8 ++--- .../components/toolbar/frame/frame-menu.ts | 4 +-- .../edgeless/controllers/clipboard.ts | 4 +-- .../edgeless/controllers/tools/frame-tool.ts | 4 +-- .../src/root-block/edgeless/frame-manager.ts | 4 +-- .../src/root-block/edgeless/utils/text.ts | 6 ++-- .../linked-doc/import-doc/import-doc.ts | 10 +++---- .../widgets/linked-doc/import-doc/index.ts | 4 +-- .../src/surface-block/element-model/group.ts | 14 ++++----- .../src/surface-block/element-model/index.ts | 4 +-- .../src/surface-block/element-model/shape.ts | 6 ++-- .../src/surface-block/element-model/text.ts | 8 ++--- .../blocks/src/surface-block/surface-model.ts | 10 +++---- .../src/surface-block/surface-transformer.ts | 14 ++++----- .../block-std/src/scope/block-std-scope.ts | 6 ++-- .../src/__tests__/block-tree.unit.spec.ts | 8 ++--- .../store/src/__tests__/indexer.unit.spec.ts | 8 ++--- .../store/src/__tests__/schema.unit.spec.ts | 4 +-- .../store/src/__tests__/test-utils-dom.ts | 4 +-- .../src/__tests__/transformer.unit.spec.ts | 6 ++-- .../src/__tests__/workspace.unit.spec.ts | 30 +++++++++---------- .../framework/store/src/store/addon/blob.ts | 4 +-- .../framework/store/src/store/addon/index.ts | 2 +- .../store/src/store/addon/indexer.ts | 4 +-- .../framework/store/src/store/addon/shared.ts | 10 +++---- .../framework/store/src/store/addon/type.ts | 4 ++- .../src/store/{workspace.ts => collection.ts} | 18 +++++------ packages/framework/store/src/store/doc.ts | 6 ++-- packages/framework/store/src/store/index.ts | 4 +-- packages/framework/store/src/store/meta.ts | 26 ++++++++-------- .../framework/store/src/transformer/job.ts | 6 ++-- .../store/src/transformer/middleware.ts | 4 +-- packages/framework/store/src/utils/utils.ts | 4 +-- .../src/__tests__/edgeless/group.spec.ts | 4 +-- packages/presets/src/__tests__/env.d.ts | 6 ++-- packages/presets/src/__tests__/utils/setup.ts | 13 +++++--- .../src/fragments/comment/comment-input.ts | 6 ++-- .../src/fragments/comment/comment-manager.ts | 26 ++++++++-------- .../fragments/copilot-panel/edgeless/logic.ts | 4 +-- packages/presets/src/helpers/index.ts | 4 +-- 55 files changed, 203 insertions(+), 192 deletions(-) rename packages/framework/store/src/store/{workspace.ts => collection.ts} (91%) diff --git a/packages/blocks/src/__tests__/database/database.unit.spec.ts b/packages/blocks/src/__tests__/database/database.unit.spec.ts index 929d6844749a..7f0ed99586f9 100644 --- a/packages/blocks/src/__tests__/database/database.unit.spec.ts +++ b/packages/blocks/src/__tests__/database/database.unit.spec.ts @@ -3,7 +3,7 @@ import '../../database-block/kanban/define.js'; import '../../database-block/table/define.js'; import type { BlockModel, Doc } from '@blocksuite/store'; -import { Generator, Schema, Workspace } from '@blocksuite/store'; +import { DocCollection, Generator, Schema } from '@blocksuite/store'; import { beforeEach, describe, expect, test } from 'vitest'; import { numberPureColumnConfig } from '../../database-block/common/columns/number/define.js'; @@ -32,7 +32,7 @@ function createTestOptions() { function createTestDoc(docId = 'doc0') { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); const doc = workspace.createDoc({ id: docId }); doc.load(); return doc; diff --git a/packages/blocks/src/__tests__/migration/migration.unit.spec.ts b/packages/blocks/src/__tests__/migration/migration.unit.spec.ts index 22b8101a882c..f656265bce3b 100644 --- a/packages/blocks/src/__tests__/migration/migration.unit.spec.ts +++ b/packages/blocks/src/__tests__/migration/migration.unit.spec.ts @@ -5,7 +5,7 @@ import { readFile } from 'node:fs/promises'; import { join } from 'node:path'; import { fileURLToPath } from 'node:url'; -import { Schema, Workspace, type Y } from '@blocksuite/store'; +import { DocCollection, Schema, type Y } from '@blocksuite/store'; import { assert, describe, expect, test } from 'vitest'; import { DatabaseBlockSchema } from '../../database-block/database-model.js'; @@ -21,8 +21,8 @@ async function loadBinary(name: string) { const path = join(originPath, `../ydocs/${name}.ydoc`); const buffer = await readFile(path); const update = new Uint8Array(buffer); - const doc = new Workspace.Y.Doc(); - Workspace.Y.applyUpdate(doc, update); + const doc = new DocCollection.Y.Doc(); + DocCollection.Y.applyUpdate(doc, update); return doc; } diff --git a/packages/blocks/src/_common/components/embed-card/embed-card-toolbar.ts b/packages/blocks/src/_common/components/embed-card/embed-card-toolbar.ts index 2edc381836bc..c69cf4d493f7 100644 --- a/packages/blocks/src/_common/components/embed-card/embed-card-toolbar.ts +++ b/packages/blocks/src/_common/components/embed-card/embed-card-toolbar.ts @@ -4,7 +4,7 @@ import { assertExists } from '@blocksuite/global/utils'; import type { EditorHost } from '@blocksuite/lit'; import { WithDisposable } from '@blocksuite/lit'; import type { BlockModel } from '@blocksuite/store'; -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import { flip } from '@floating-ui/dom'; import { css, html, LitElement, nothing } from 'lit'; import { customElement, property, query } from 'lit/decorators.js'; @@ -308,7 +308,7 @@ export class EmbedCardToolbar extends WithDisposable(LitElement) { const parent = doc.getParent(this._model); const index = parent?.children.indexOf(this._model); - const yText = new Workspace.Y.Text(); + const yText = new DocCollection.Y.Text(); const insert = this._model.title || this._model.caption || this._model.url; yText.insert(0, insert); yText.format(0, insert.length, { link: this._model.url }); diff --git a/packages/blocks/src/_common/components/rich-text/rich-text.ts b/packages/blocks/src/_common/components/rich-text/rich-text.ts index 3400140e340c..90cd07cd5c98 100644 --- a/packages/blocks/src/_common/components/rich-text/rich-text.ts +++ b/packages/blocks/src/_common/components/rich-text/rich-text.ts @@ -10,7 +10,7 @@ import { } from '@blocksuite/inline'; import { ShadowlessElement, WithDisposable } from '@blocksuite/lit'; import type { Y } from '@blocksuite/store'; -import { Text, Workspace } from '@blocksuite/store'; +import { DocCollection, Text } from '@blocksuite/store'; import { css, html } from 'lit'; import { customElement, property, query } from 'lit/decorators.js'; import { classMap } from 'lit/directives/class-map.js'; @@ -318,7 +318,7 @@ export class RichText extends WithDisposable(ShadowlessElement) { assertExists(this._yText.doc, 'yText should be bind to yDoc.'); if (!this.undoManager) { - this.undoManager = new Workspace.Y.UndoManager(this._yText, { + this.undoManager = new DocCollection.Y.UndoManager(this._yText, { trackedOrigins: new Set([this._yText.doc.clientID]), }); } diff --git a/packages/blocks/src/_common/mind-map/draw.ts b/packages/blocks/src/_common/mind-map/draw.ts index a14294b0e77b..ea519db99270 100644 --- a/packages/blocks/src/_common/mind-map/draw.ts +++ b/packages/blocks/src/_common/mind-map/draw.ts @@ -1,4 +1,4 @@ -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import type { EdgelessRootService } from '../../root-block/edgeless/edgeless-root-service.js'; import { getFontString } from '../../surface-block/canvas-renderer/element-renderer/text/utils.js'; @@ -97,7 +97,7 @@ const drawAllNode = ( : service.addElement(CanvasElementType.SHAPE, { ...DEFAULT_SHAPE_PROPS, xywh: `[${0},${0},${0},${0}]`, - text: new Workspace.Y.Text(text), + text: new DocCollection.Y.Text(text), }); shapeIds.push(id); const ele = service.getElementById(id) as ShapeElementModel; @@ -229,7 +229,7 @@ export const createNode = ( const id = service.addElement(CanvasElementType.SHAPE, { ...DEFAULT_SHAPE_PROPS, xywh: `[${0},${0},${0},${0}]`, - text: new Workspace.Y.Text(text), + text: new DocCollection.Y.Text(text), }); const ele = service.getElementById(id) as ShapeElementModel; const maxWidth = @@ -268,7 +268,7 @@ export const changeText = ( service: EdgelessRootService ) => { service.updateElement(id, { - text: new Workspace.Y.Text(text), + text: new DocCollection.Y.Text(text), }); const ele = service.getElementById(id) as ShapeElementModel; const maxWidth = diff --git a/packages/blocks/src/_common/transformers/zip.ts b/packages/blocks/src/_common/transformers/zip.ts index effe39f68baf..70de37ba5d26 100644 --- a/packages/blocks/src/_common/transformers/zip.ts +++ b/packages/blocks/src/_common/transformers/zip.ts @@ -1,9 +1,9 @@ import { assertExists } from '@blocksuite/global/utils'; import type { Doc, + DocCollection, DocSnapshot, JobMiddleware, - Workspace, WorkspaceInfoSnapshot, } from '@blocksuite/store'; import { getAssetName, Job, sha } from '@blocksuite/store'; @@ -11,7 +11,7 @@ import JSZip from 'jszip'; import { replaceIdMiddleware } from './middlewares.js'; -async function exportDocs(workspace: Workspace, docs: Doc[]) { +async function exportDocs(workspace: DocCollection, docs: Doc[]) { const zip = new JSZip(); const job = new Job({ workspace }); @@ -38,7 +38,7 @@ async function exportDocs(workspace: Workspace, docs: Doc[]) { return zip.generateAsync({ type: 'blob' }); } -async function importDocs(workspace: Workspace, imported: Blob) { +async function importDocs(workspace: DocCollection, imported: Blob) { const zip = new JSZip(); const { files } = await zip.loadAsync(imported); diff --git a/packages/blocks/src/_common/utils/init.ts b/packages/blocks/src/_common/utils/init.ts index 93c0ea8640b8..77b484f47136 100644 --- a/packages/blocks/src/_common/utils/init.ts +++ b/packages/blocks/src/_common/utils/init.ts @@ -1,7 +1,7 @@ -import type { Workspace } from '@blocksuite/store'; +import type { DocCollection } from '@blocksuite/store'; export function createDefaultDoc( - workspace: Workspace, + workspace: DocCollection, options: { id?: string; title?: string } = {} ) { const doc = workspace.createDoc({ id: options.id }); diff --git a/packages/blocks/src/database-block/common/columns/rich-text/cell-renderer.ts b/packages/blocks/src/database-block/common/columns/rich-text/cell-renderer.ts index 08badb0985ff..61aaeeefd0f4 100644 --- a/packages/blocks/src/database-block/common/columns/rich-text/cell-renderer.ts +++ b/packages/blocks/src/database-block/common/columns/rich-text/cell-renderer.ts @@ -1,6 +1,6 @@ import { assertExists } from '@blocksuite/global/utils'; import type { Y } from '@blocksuite/store'; -import { Text, Workspace } from '@blocksuite/store'; +import { DocCollection, Text } from '@blocksuite/store'; import { css, nothing } from 'lit'; import { customElement, query } from 'lit/decorators.js'; import { html } from 'lit/static-html.js'; @@ -142,7 +142,7 @@ export class RichTextCell extends BaseCellRenderer { } private _initYText = (text?: string) => { - const yText = new Workspace.Y.Text(text); + const yText = new DocCollection.Y.Text(text); this.onChange(yText); }; diff --git a/packages/blocks/src/database-block/common/datasource/all-doc-datasource.ts b/packages/blocks/src/database-block/common/datasource/all-doc-datasource.ts index c6fdd562658d..b75bf1d314dd 100644 --- a/packages/blocks/src/database-block/common/datasource/all-doc-datasource.ts +++ b/packages/blocks/src/database-block/common/datasource/all-doc-datasource.ts @@ -1,6 +1,6 @@ import { assertExists, Slot } from '@blocksuite/global/utils'; import type { EditorHost } from '@blocksuite/lit'; -import type { Doc, Workspace } from '@blocksuite/store'; +import type { Doc, DocCollection } from '@blocksuite/store'; import type { InsertToPosition } from '../../types.js'; import type { ColumnConfig } from '../columns/manager.js'; @@ -11,7 +11,7 @@ import type { AllDocDatasourceConfig } from './base.js'; import { BaseDataSource } from './base.js'; export class AllDocDatasource extends BaseDataSource { - private workspace: Workspace; + private workspace: DocCollection; public get rows(): string[] { return Array.from(this.workspace.docs.keys()); diff --git a/packages/blocks/src/database-block/common/datasource/tags-datasource.ts b/packages/blocks/src/database-block/common/datasource/tags-datasource.ts index d7d42bd27dd3..34be36f62513 100644 --- a/packages/blocks/src/database-block/common/datasource/tags-datasource.ts +++ b/packages/blocks/src/database-block/common/datasource/tags-datasource.ts @@ -1,6 +1,6 @@ import { assertExists, Slot } from '@blocksuite/global/utils'; import type { EditorHost } from '@blocksuite/lit'; -import type { Workspace } from '@blocksuite/store'; +import type { DocCollection } from '@blocksuite/store'; import { nanoid } from '@blocksuite/store'; import { @@ -16,7 +16,7 @@ import type { TagsDatasourceConfig } from './base.js'; import { BaseDataSource } from './base.js'; export class TagsDatasource extends BaseDataSource { - private meta: Workspace['meta']; + private meta: DocCollection['meta']; public rowMove(rowId: string, position: InsertToPosition): void { // not support diff --git a/packages/blocks/src/database-block/common/header-area/text.ts b/packages/blocks/src/database-block/common/header-area/text.ts index a36f18a650fe..a65ee10302a9 100644 --- a/packages/blocks/src/database-block/common/header-area/text.ts +++ b/packages/blocks/src/database-block/common/header-area/text.ts @@ -1,6 +1,6 @@ import { assertExists } from '@blocksuite/global/utils'; import type { Y } from '@blocksuite/store'; -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import { css } from 'lit'; import { customElement, property, query } from 'lit/decorators.js'; import { html } from 'lit/static-html.js'; @@ -108,17 +108,17 @@ abstract class BaseTextCell extends BaseCellRenderer { getYText(text?: string | Y.Text) { if ( this._isRichText && - (text instanceof Workspace.Y.Text || text == null) + (text instanceof DocCollection.Y.Text || text == null) ) { let yText = text; if (!yText) { - yText = new Workspace.Y.Text(); + yText = new DocCollection.Y.Text(); this.titleColumn?.setValue(this.rowId, yText); } return yText; } - const yText = new Workspace.Y.Doc().getText('title'); - if (text instanceof Workspace.Y.Text) { + const yText = new DocCollection.Y.Doc().getText('title'); + if (text instanceof DocCollection.Y.Text) { return text; } yText.insert(0, text ?? ''); diff --git a/packages/blocks/src/embed-linked-doc-block/embed-linked-doc-block.ts b/packages/blocks/src/embed-linked-doc-block/embed-linked-doc-block.ts index d9a27956266b..603dc48d5bf9 100644 --- a/packages/blocks/src/embed-linked-doc-block/embed-linked-doc-block.ts +++ b/packages/blocks/src/embed-linked-doc-block/embed-linked-doc-block.ts @@ -3,7 +3,7 @@ import '../_common/components/embed-card/embed-card-caption.js'; import '../_common/components/embed-card/embed-card-toolbar.js'; import { assertExists } from '@blocksuite/global/utils'; -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import { flip, offset } from '@floating-ui/dom'; import { html, nothing } from 'lit'; import { @@ -180,7 +180,7 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockElement< assertExists(parent); const index = parent.children.indexOf(this.model); - const yText = new Workspace.Y.Text(); + const yText = new DocCollection.Y.Text(); yText.insert(0, REFERENCE_NODE); yText.format(0, REFERENCE_NODE.length, { reference: { type: 'LinkedPage', pageId }, diff --git a/packages/blocks/src/embed-synced-doc-block/embed-synced-doc-block.ts b/packages/blocks/src/embed-synced-doc-block/embed-synced-doc-block.ts index c75f7ca09587..4f063ac7d216 100644 --- a/packages/blocks/src/embed-synced-doc-block/embed-synced-doc-block.ts +++ b/packages/blocks/src/embed-synced-doc-block/embed-synced-doc-block.ts @@ -5,7 +5,7 @@ import '../_common/components/embed-card/embed-card-toolbar.js'; import { assertExists } from '@blocksuite/global/utils'; import type { EditorHost } from '@blocksuite/lit'; -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import { flip, offset } from '@floating-ui/dom'; import { html, nothing, type PropertyValues } from 'lit'; import { customElement, query, state } from 'lit/decorators.js'; @@ -310,7 +310,7 @@ export class EmbedSyncedDocBlockComponent extends EmbedBlockElement< assertExists(parent); const index = parent.children.indexOf(this.model); - const yText = new Workspace.Y.Text(); + const yText = new DocCollection.Y.Text(); yText.insert(0, REFERENCE_NODE); yText.format(0, REFERENCE_NODE.length, { reference: { type: 'LinkedPage', pageId }, diff --git a/packages/blocks/src/root-block/clipboard/middlewares/paste.ts b/packages/blocks/src/root-block/clipboard/middlewares/paste.ts index 9f9766597d89..a9c8713bb133 100644 --- a/packages/blocks/src/root-block/clipboard/middlewares/paste.ts +++ b/packages/blocks/src/root-block/clipboard/middlewares/paste.ts @@ -5,11 +5,11 @@ import { type BlockModel, type BlockSnapshot, type DeltaOperation, + DocCollection, fromJSON, type JobMiddleware, type SliceSnapshot, type Text, - Workspace, } from '@blocksuite/store'; import { matchFlavours } from '../../../_common/utils/index.js'; @@ -73,7 +73,7 @@ class PasteTr { this.lastSnapshot.props.text ) { const text = fromJSON(this.lastSnapshot.props.text) as Text; - const doc = new Workspace.Y.Doc(); + const doc = new DocCollection.Y.Doc(); const temp = doc.getMap('temp'); temp.set('text', text.yText); this.lastIndex = text.length; diff --git a/packages/blocks/src/root-block/edgeless/components/auto-complete/auto-complete-panel.ts b/packages/blocks/src/root-block/edgeless/components/auto-complete/auto-complete-panel.ts index 974a0d4b2699..d8cf67e58623 100644 --- a/packages/blocks/src/root-block/edgeless/components/auto-complete/auto-complete-panel.ts +++ b/packages/blocks/src/root-block/edgeless/components/auto-complete/auto-complete-panel.ts @@ -2,7 +2,7 @@ import '../buttons/tool-icon-button.js'; import { assertExists } from '@blocksuite/global/utils'; import { WithDisposable } from '@blocksuite/lit'; -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import { baseTheme } from '@toeverything/theme'; import { css, html, LitElement, nothing, unsafeCSS } from 'lit'; import { customElement, property } from 'lit/decorators.js'; @@ -367,7 +367,7 @@ export class EdgelessAutoCompletePanel extends WithDisposable(LitElement) { const id = service.addBlock( 'affine:frame', { - title: new Workspace.Y.Text(`Frame ${frameIndex}`), + title: new DocCollection.Y.Text(`Frame ${frameIndex}`), xywh: serializeXYWH(...xywh), }, surfaceBlockModel diff --git a/packages/blocks/src/root-block/edgeless/components/auto-complete/utils.ts b/packages/blocks/src/root-block/edgeless/components/auto-complete/utils.ts index 530cbfc4fecb..a5a109b7a995 100644 --- a/packages/blocks/src/root-block/edgeless/components/auto-complete/utils.ts +++ b/packages/blocks/src/root-block/edgeless/components/auto-complete/utils.ts @@ -1,5 +1,5 @@ import { assertExists } from '@blocksuite/global/utils'; -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import type { NoteBlockModel } from '../../../../note-block/index.js'; import { @@ -295,7 +295,7 @@ export function createEdgelessElement( if (isShape(current)) { id = service.addElement(current.type, { ...current.serialize(), - text: new Workspace.Y.Text(), + text: new DocCollection.Y.Text(), xywh: bound.serialize(), }); } else { @@ -335,7 +335,7 @@ export function createShapeElement( ...current.serialize(), shapeType: targetType === 'roundedRect' ? 'rect' : targetType, radius: targetType === 'roundedRect' ? 0.1 : 0, - text: new Workspace.Y.Text(), + text: new DocCollection.Y.Text(), }); const group = current.group; if (group instanceof GroupElementModel) { @@ -349,7 +349,7 @@ export function createTextElement( current: ShapeElementModel ) { const id = edgeless.service.addElement(CanvasElementType.TEXT, { - text: new Workspace.Y.Text(), + text: new DocCollection.Y.Text(), textAlign: 'left', fontSize: 24, fontFamily: CanvasTextFontFamily.Inter, diff --git a/packages/blocks/src/root-block/edgeless/components/toolbar/frame/frame-menu.ts b/packages/blocks/src/root-block/edgeless/components/toolbar/frame/frame-menu.ts index 36e8e88eef45..b7aa8c9d9a25 100644 --- a/packages/blocks/src/root-block/edgeless/components/toolbar/frame/frame-menu.ts +++ b/packages/blocks/src/root-block/edgeless/components/toolbar/frame/frame-menu.ts @@ -1,6 +1,6 @@ import { assertExists } from '@blocksuite/global/utils'; import { WithDisposable } from '@blocksuite/lit'; -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import { css, html, LitElement, nothing } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; @@ -115,7 +115,7 @@ export class EdgelessFrameMenu extends WithDisposable(LitElement) { const id = edgeless.service.addBlock( 'affine:frame', { - title: new Workspace.Y.Text( + title: new DocCollection.Y.Text( `Frame ${frames.length + 1}` ), xywh: bound.serialize(), diff --git a/packages/blocks/src/root-block/edgeless/controllers/clipboard.ts b/packages/blocks/src/root-block/edgeless/controllers/clipboard.ts index 17324e53799a..1c62827fd909 100644 --- a/packages/blocks/src/root-block/edgeless/controllers/clipboard.ts +++ b/packages/blocks/src/root-block/edgeless/controllers/clipboard.ts @@ -7,9 +7,9 @@ import { assertExists, DisposableGroup } from '@blocksuite/global/utils'; import type { EditorHost } from '@blocksuite/lit'; import { type BlockSnapshot, + DocCollection, fromJSON, Job, - Workspace, } from '@blocksuite/store'; import { @@ -331,7 +331,7 @@ export class EdgelessClipboardController extends PageClipboard { idMap: Map ) { if (clipboardData.type === GROUP) { - const yMap = new Workspace.Y.Map(); + const yMap = new DocCollection.Y.Map(); const children = clipboardData.children ?? {}; for (const [key, value] of Object.entries(children)) { const newKey = idMap.get(key); diff --git a/packages/blocks/src/root-block/edgeless/controllers/tools/frame-tool.ts b/packages/blocks/src/root-block/edgeless/controllers/tools/frame-tool.ts index cfed069454fe..67436ba2570f 100644 --- a/packages/blocks/src/root-block/edgeless/controllers/tools/frame-tool.ts +++ b/packages/blocks/src/root-block/edgeless/controllers/tools/frame-tool.ts @@ -1,6 +1,6 @@ import type { PointerEventState } from '@blocksuite/block-std'; import { assertExists, noop } from '@blocksuite/global/utils'; -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import { type FrameTool, @@ -40,7 +40,7 @@ export class FrameToolController extends EdgelessToolController { const id = this._service.addBlock( 'affine:frame', { - title: new Workspace.Y.Text(`Frame ${frames.length + 1}`), + title: new DocCollection.Y.Text(`Frame ${frames.length + 1}`), xywh: Bound.fromPoints([this._startPoint, currentPoint]).serialize(), }, this._service.surface diff --git a/packages/blocks/src/root-block/edgeless/frame-manager.ts b/packages/blocks/src/root-block/edgeless/frame-manager.ts index aecb5311564d..c6e52ffeef35 100644 --- a/packages/blocks/src/root-block/edgeless/frame-manager.ts +++ b/packages/blocks/src/root-block/edgeless/frame-manager.ts @@ -1,6 +1,6 @@ import { assertExists } from '@blocksuite/global/utils'; import type { Doc } from '@blocksuite/store'; -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import type { EdgelessModel, @@ -135,7 +135,7 @@ export class EdgelessFrameManager { const id = this._rootService.addBlock( 'affine:frame', { - title: new Workspace.Y.Text(`Frame ${frames.length + 1}`), + title: new DocCollection.Y.Text(`Frame ${frames.length + 1}`), xywh: bound.serialize(), }, surfaceModel diff --git a/packages/blocks/src/root-block/edgeless/utils/text.ts b/packages/blocks/src/root-block/edgeless/utils/text.ts index c1969b76e19c..6e5579979d8d 100644 --- a/packages/blocks/src/root-block/edgeless/utils/text.ts +++ b/packages/blocks/src/root-block/edgeless/utils/text.ts @@ -1,6 +1,6 @@ import type { PointerEventState } from '@blocksuite/block-std'; import { assertExists, assertInstanceOf } from '@blocksuite/global/utils'; -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import type { FrameBlockModel } from '../../../frame-block/index.js'; import { getCursorByCoord } from '../../../surface-block/canvas-renderer/element-renderer/text/utils.js'; @@ -63,7 +63,7 @@ export function mountShapeTextEditor( edgeless: EdgelessRootBlockComponent ) { if (!shapeElement.text) { - const text = new Workspace.Y.Text(); + const text = new DocCollection.Y.Text(); const { fillColor } = shapeElement; const color = isTransparent(fillColor) ? GET_DEFAULT_LINE_COLOR() @@ -138,7 +138,7 @@ export function addText( ); const id = edgeless.service.addElement(CanvasElementType.TEXT, { xywh: new Bound(modelX, modelY, 32, 32).serialize(), - text: new Workspace.Y.Text(), + text: new DocCollection.Y.Text(), }); edgeless.doc.captureSync(); const textElement = edgeless.service.getElementById(id); diff --git a/packages/blocks/src/root-block/widgets/linked-doc/import-doc/import-doc.ts b/packages/blocks/src/root-block/widgets/linked-doc/import-doc/import-doc.ts index f84573c01f9b..6b0703087243 100644 --- a/packages/blocks/src/root-block/widgets/linked-doc/import-doc/import-doc.ts +++ b/packages/blocks/src/root-block/widgets/linked-doc/import-doc/import-doc.ts @@ -1,7 +1,7 @@ import '../../../../_common/components/loader.js'; import { WithDisposable } from '@blocksuite/lit'; -import { type Workspace } from '@blocksuite/store'; +import { type DocCollection } from '@blocksuite/store'; import { Job } from '@blocksuite/store'; import JSZip from 'jszip'; import { html, LitElement, type PropertyValues } from 'lit'; @@ -30,7 +30,7 @@ export type OnFailHandler = (message: string) => void; const SHOW_LOADING_SIZE = 1024 * 200; -export async function importMarkDown(workspace: Workspace, text: string) { +export async function importMarkDown(workspace: DocCollection, text: string) { const job = new Job({ workspace: workspace, middlewares: [defaultImageProxyMiddleware], @@ -45,7 +45,7 @@ export async function importMarkDown(workspace: Workspace, text: string) { return page.id; } -export async function importHtml(workspace: Workspace, text: string) { +export async function importHtml(workspace: DocCollection, text: string) { const job = new Job({ workspace: workspace, middlewares: [defaultImageProxyMiddleware], @@ -60,7 +60,7 @@ export async function importHtml(workspace: Workspace, text: string) { return page.id; } -export async function importNotion(workspace: Workspace, file: File) { +export async function importNotion(workspace: DocCollection, file: File) { const pageIds: string[] = []; let isWorkspaceFile = false; let hasMarkdown = false; @@ -157,7 +157,7 @@ export class ImportDoc extends WithDisposable(LitElement) { containerEl!: HTMLElement; constructor( - private workspace: Workspace, + private workspace: DocCollection, private onSuccess?: OnSuccessHandler, private onFail?: OnFailHandler, private abortController = new AbortController() diff --git a/packages/blocks/src/root-block/widgets/linked-doc/import-doc/index.ts b/packages/blocks/src/root-block/widgets/linked-doc/import-doc/index.ts index 2d3110db6464..88e9c0997ff0 100644 --- a/packages/blocks/src/root-block/widgets/linked-doc/import-doc/index.ts +++ b/packages/blocks/src/root-block/widgets/linked-doc/import-doc/index.ts @@ -1,4 +1,4 @@ -import type { Workspace } from '@blocksuite/store'; +import type { DocCollection } from '@blocksuite/store'; import { ImportDoc, @@ -15,7 +15,7 @@ export function showImportModal({ container = document.body, abortController = new AbortController(), }: { - workspace: Workspace; + workspace: DocCollection; onSuccess?: OnSuccessHandler; onFail?: OnFailHandler; multiple?: boolean; diff --git a/packages/blocks/src/surface-block/element-model/group.ts b/packages/blocks/src/surface-block/element-model/group.ts index da33b656cc11..d46d10311ba0 100644 --- a/packages/blocks/src/surface-block/element-model/group.ts +++ b/packages/blocks/src/surface-block/element-model/group.ts @@ -1,5 +1,5 @@ import type { Y } from '@blocksuite/store'; -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import { keys } from '../../_common/utils/iterable.js'; import type { @@ -22,12 +22,12 @@ type GroupElementProps = BaseProps & { export class GroupElementModel extends ElementModel { static override propsToY(props: GroupElementProps) { - if (props.title && !(props.title instanceof Workspace.Y.Text)) { - props.title = new Workspace.Y.Text(props.title); + if (props.title && !(props.title instanceof DocCollection.Y.Text)) { + props.title = new DocCollection.Y.Text(props.title); } - if (props.children && !(props.children instanceof Workspace.Y.Map)) { - const children = new Workspace.Y.Map() as Y.Map; + if (props.children && !(props.children instanceof DocCollection.Y.Map)) { + const children = new DocCollection.Y.Map() as Y.Map; keys(props.children).forEach(key => { children.set(key as string, true); @@ -43,10 +43,10 @@ export class GroupElementModel extends ElementModel { instance.childIds = Array.from(instance.children.keys()); }) @yfield() - children: Y.Map = new Workspace.Y.Map(); + children: Y.Map = new DocCollection.Y.Map(); @yfield() - title: Y.Text = new Workspace.Y.Text(); + title: Y.Text = new DocCollection.Y.Text(); @local() showTitle: boolean = true; diff --git a/packages/blocks/src/surface-block/element-model/index.ts b/packages/blocks/src/surface-block/element-model/index.ts index c75be08234a6..1b6b881dd291 100644 --- a/packages/blocks/src/surface-block/element-model/index.ts +++ b/packages/blocks/src/surface-block/element-model/index.ts @@ -1,4 +1,4 @@ -import { Workspace, type Y } from '@blocksuite/store'; +import { DocCollection, type Y } from '@blocksuite/store'; import type { SurfaceBlockModel } from '../surface-model.js'; import { ElementModel } from './base.js'; @@ -152,7 +152,7 @@ export function createModelFromProps( throw new Error('Cannot find id in props'); } - const yMap = new Workspace.Y.Map(); + const yMap = new DocCollection.Y.Map(); const elementModel = createElementModel( type as string, id as string, diff --git a/packages/blocks/src/surface-block/element-model/shape.ts b/packages/blocks/src/surface-block/element-model/shape.ts index 11a01daec7ff..0bbd65189dc7 100644 --- a/packages/blocks/src/surface-block/element-model/shape.ts +++ b/packages/blocks/src/surface-block/element-model/shape.ts @@ -1,4 +1,4 @@ -import { Workspace, type Y } from '@blocksuite/store'; +import { DocCollection, type Y } from '@blocksuite/store'; import type { HitTestOptions } from '../../root-block/edgeless/type.js'; import { DEFAULT_ROUGHNESS } from '../consts.js'; @@ -65,8 +65,8 @@ export type ShapeProps = BaseProps & { export class ShapeElementModel extends ElementModel { static override propsToY(props: ShapeProps) { - if (props.text && !(props.text instanceof Workspace.Y.Text)) { - props.text = new Workspace.Y.Text(props.text); + if (props.text && !(props.text instanceof DocCollection.Y.Text)) { + props.text = new DocCollection.Y.Text(props.text); } return props; diff --git a/packages/blocks/src/surface-block/element-model/text.ts b/packages/blocks/src/surface-block/element-model/text.ts index 95faa80a37e9..a4e14855bc43 100644 --- a/packages/blocks/src/surface-block/element-model/text.ts +++ b/packages/blocks/src/surface-block/element-model/text.ts @@ -1,4 +1,4 @@ -import { Workspace, type Y } from '@blocksuite/store'; +import { DocCollection, type Y } from '@blocksuite/store'; import type { SerializedXYWH } from '../index.js'; import { Bound } from '../utils/bound.js'; @@ -31,8 +31,8 @@ export type TextElementProps = BaseProps & { export class TextElementModel extends ElementModel { static override propsToY(props: Record) { - if (props.text && !(props.text instanceof Workspace.Y.Text)) { - props.text = new Workspace.Y.Text(props.text as string); + if (props.text && !(props.text instanceof DocCollection.Y.Text)) { + props.text = new DocCollection.Y.Text(props.text as string); } return props; @@ -45,7 +45,7 @@ export class TextElementModel extends ElementModel { rotate: number = 0; @yfield() - text: Y.Text = new Workspace.Y.Text(); + text: Y.Text = new DocCollection.Y.Text(); @yfield() color: string = '#000000'; diff --git a/packages/blocks/src/surface-block/surface-model.ts b/packages/blocks/src/surface-block/surface-model.ts index 60053d80a00f..f4180928b092 100644 --- a/packages/blocks/src/surface-block/surface-model.ts +++ b/packages/blocks/src/surface-block/surface-model.ts @@ -4,8 +4,8 @@ import { BlockModel, Boxed, defineBlockSchema, + DocCollection, Text, - Workspace, } from '@blocksuite/store'; import type { ElementModel } from './element-model/base.js'; @@ -111,14 +111,14 @@ const migration = { toV5: data => { const { elements } = data; if (!((elements as object | Boxed) instanceof Boxed)) { - const yMap = new Workspace.Y.Map() as Y.Map>; + const yMap = new DocCollection.Y.Map() as Y.Map>; Object.entries(elements).forEach(([key, value]) => { - const map = new Workspace.Y.Map(); + const map = new DocCollection.Y.Map(); Object.entries(value).forEach(([_key, _value]) => { map.set( _key, - _value instanceof Workspace.Y.Text + _value instanceof DocCollection.Y.Text ? _value.clone() : _value instanceof Text ? _value.yText.clone() @@ -136,7 +136,7 @@ const migration = { export const SurfaceBlockSchema = defineBlockSchema({ flavour: 'affine:surface', props: (internalPrimitives): SurfaceBlockProps => ({ - elements: internalPrimitives.Boxed(new Workspace.Y.Map()), + elements: internalPrimitives.Boxed(new DocCollection.Y.Map()), }), metadata: { version: 5, diff --git a/packages/blocks/src/surface-block/surface-transformer.ts b/packages/blocks/src/surface-block/surface-transformer.ts index f6e8988a1c94..0a15bb893783 100644 --- a/packages/blocks/src/surface-block/surface-transformer.ts +++ b/packages/blocks/src/surface-block/surface-transformer.ts @@ -4,7 +4,7 @@ import type { ToSnapshotPayload, Y, } from '@blocksuite/store'; -import { BaseBlockTransformer, Workspace } from '@blocksuite/store'; +import { BaseBlockTransformer, DocCollection } from '@blocksuite/store'; import type { SurfaceBlockProps } from './surface-model.js'; @@ -14,12 +14,12 @@ const SURFACE_YMAP_UNIQ_IDENTIFIER = 'affine:surface:ymap'; export class SurfaceBlockTransformer extends BaseBlockTransformer { private _toJSON(value: unknown): unknown { - if (value instanceof Workspace.Y.Text) { + if (value instanceof DocCollection.Y.Text) { return { [SURFACE_TEXT_UNIQ_IDENTIFIER]: true, delta: value.toDelta(), }; - } else if (value instanceof Workspace.Y.Map) { + } else if (value instanceof DocCollection.Y.Map) { return { [SURFACE_YMAP_UNIQ_IDENTIFIER]: true, json: value.toJSON(), @@ -31,11 +31,11 @@ export class SurfaceBlockTransformer extends BaseBlockTransformer; Object.entries(json).forEach(([key, value]) => { yMap.set(key, value); @@ -56,7 +56,7 @@ export class SurfaceBlockTransformer extends BaseBlockTransformer) { - const yMap = new Workspace.Y.Map(); + const yMap = new DocCollection.Y.Map(); Object.entries(element).forEach(([key, value]) => { yMap.set(key, this._fromJSON(value)); }); @@ -88,7 +88,7 @@ export class SurfaceBlockTransformer extends BaseBlockTransformer; - const yMap = new Workspace.Y.Map>(); + const yMap = new DocCollection.Y.Map>(); Object.entries(elementsJSON).forEach(([key, value]) => { const element = this.elementFromJSON(value as Record); diff --git a/packages/framework/block-std/src/scope/block-std-scope.ts b/packages/framework/block-std/src/scope/block-std-scope.ts index 7a82fa9a46e1..e1a3d997870e 100644 --- a/packages/framework/block-std/src/scope/block-std-scope.ts +++ b/packages/framework/block-std/src/scope/block-std-scope.ts @@ -1,4 +1,4 @@ -import type { Doc, Workspace } from '@blocksuite/store'; +import type { Doc, DocCollection } from '@blocksuite/store'; import { Clipboard } from '../clipboard/index.js'; import { CommandManager } from '../command/index.js'; @@ -9,13 +9,13 @@ import { ViewStore } from '../view/index.js'; export interface BlockStdOptions { host: HTMLElement; - workspace: Workspace; + workspace: DocCollection; doc: Doc; } export class BlockStdScope { readonly doc: Doc; - readonly workspace: Workspace; + readonly workspace: DocCollection; readonly event: UIEventDispatcher; readonly selection: SelectionManager; readonly command: CommandManager; diff --git a/packages/framework/store/src/__tests__/block-tree.unit.spec.ts b/packages/framework/store/src/__tests__/block-tree.unit.spec.ts index 45e0d56a6ed4..c336c0b7406e 100644 --- a/packages/framework/store/src/__tests__/block-tree.unit.spec.ts +++ b/packages/framework/store/src/__tests__/block-tree.unit.spec.ts @@ -3,7 +3,7 @@ import * as Y from 'yjs'; import type { SchemaToModel } from '../schema/index.js'; import { defineBlockSchema, Schema } from '../schema/index.js'; -import { Generator, Workspace } from '../store/index.js'; +import { DocCollection, Generator } from '../store/index.js'; const docSchema = defineBlockSchema({ flavour: 'page', @@ -30,7 +30,7 @@ function createTestOptions() { test('trigger props updated', () => { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); const doc = workspace.createDoc({ id: 'home' }); doc.load(); @@ -89,7 +89,7 @@ test('trigger props updated', () => { test('stash and pop', () => { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); const doc = workspace.createDoc({ id: 'home' }); doc.load(); @@ -158,7 +158,7 @@ test('stash and pop', () => { test('always get latest value in onChange', () => { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); const doc = workspace.createDoc({ id: 'home' }); doc.load(); diff --git a/packages/framework/store/src/__tests__/indexer.unit.spec.ts b/packages/framework/store/src/__tests__/indexer.unit.spec.ts index b23a6895b6e6..d22f16759eb1 100644 --- a/packages/framework/store/src/__tests__/indexer.unit.spec.ts +++ b/packages/framework/store/src/__tests__/indexer.unit.spec.ts @@ -3,7 +3,7 @@ import { beforeEach, describe, expect, it } from 'vitest'; import { applyUpdate, encodeStateAsUpdate } from 'yjs'; -import { Generator, Schema, Workspace } from '../index.js'; +import { DocCollection, Generator, Schema } from '../index.js'; // Use manual per-module import/export to support vitest environment on Node.js import { NoteBlockSchema, @@ -24,9 +24,9 @@ function createTestOptions() { return { id: 'test-workspace', idGenerator, schema }; } -function createTestDoc(pageId = 'doc:home', workspace?: Workspace) { +function createTestDoc(pageId = 'doc:home', workspace?: DocCollection) { const options = createTestOptions(); - const _workspace = workspace || new Workspace(options); + const _workspace = workspace || new DocCollection(options); const doc = _workspace.createDoc({ id: pageId }); doc.load(); return doc; @@ -109,7 +109,7 @@ describe('workspace.search works', () => { const update = encodeStateAsUpdate(doc.spaceDoc); const schema = new Schema(); - const workspace2 = new Workspace({ + const workspace2 = new DocCollection({ schema, id: 'test', }); diff --git a/packages/framework/store/src/__tests__/schema.unit.spec.ts b/packages/framework/store/src/__tests__/schema.unit.spec.ts index 8dfc12684cb6..33a482cdf0f5 100644 --- a/packages/framework/store/src/__tests__/schema.unit.spec.ts +++ b/packages/framework/store/src/__tests__/schema.unit.spec.ts @@ -7,7 +7,7 @@ import { describe, expect, it } from 'vitest'; import { type BlockModel, defineBlockSchema } from '../schema/base.js'; import { SchemaValidateError } from '../schema/error.js'; import { Schema } from '../schema/index.js'; -import { Workspace } from '../store/index.js'; +import { DocCollection } from '../store/index.js'; import { Generator } from '../store/store.js'; import { DividerBlockSchema, @@ -63,7 +63,7 @@ const BlockSchemas = [ const defaultDocId = 'doc0'; function createTestDoc(docId = defaultDocId) { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); const doc = workspace.createDoc({ id: docId }); doc.load(); return doc; diff --git a/packages/framework/store/src/__tests__/test-utils-dom.ts b/packages/framework/store/src/__tests__/test-utils-dom.ts index d613c9ca39c7..caeee341b743 100644 --- a/packages/framework/store/src/__tests__/test-utils-dom.ts +++ b/packages/framework/store/src/__tests__/test-utils-dom.ts @@ -1,11 +1,11 @@ -import type { Workspace } from '../store/index.js'; +import type { DocCollection } from '../store/index.js'; declare global { interface WindowEventMap { 'test-result': CustomEvent; } interface Window { - workspace: Workspace; + workspace: DocCollection; } } diff --git a/packages/framework/store/src/__tests__/transformer.unit.spec.ts b/packages/framework/store/src/__tests__/transformer.unit.spec.ts index a3547f9a5ea5..26ed678c62a6 100644 --- a/packages/framework/store/src/__tests__/transformer.unit.spec.ts +++ b/packages/framework/store/src/__tests__/transformer.unit.spec.ts @@ -9,7 +9,7 @@ import { Schema, type SchemaToModel, } from '../schema/index.js'; -import { Generator, Workspace } from '../store/index.js'; +import { DocCollection, Generator } from '../store/index.js'; import { AssetsManager, BaseBlockTransformer } from '../transformer/index.js'; const docSchema = defineBlockSchema({ @@ -56,7 +56,7 @@ const assets = new AssetsManager({ blob: blobManager }); test('model to snapshot', () => { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); const doc = workspace.createDoc({ id: 'home' }); doc.load(); doc.addBlock('page'); @@ -72,7 +72,7 @@ test('model to snapshot', () => { test('snapshot to model', async () => { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); const doc = workspace.createDoc({ id: 'home' }); doc.load(); doc.addBlock('page'); diff --git a/packages/framework/store/src/__tests__/workspace.unit.spec.ts b/packages/framework/store/src/__tests__/workspace.unit.spec.ts index e703e109fbdf..8fdaecdc9af1 100644 --- a/packages/framework/store/src/__tests__/workspace.unit.spec.ts +++ b/packages/framework/store/src/__tests__/workspace.unit.spec.ts @@ -7,7 +7,7 @@ import { applyUpdate, encodeStateAsUpdate } from 'yjs'; import { PAGE_VERSION, WORKSPACE_VERSION } from '../consts.js'; import type { BlockModel, BlockSchemaType, Doc } from '../index.js'; -import { Generator, Schema, Workspace } from '../index.js'; +import { DocCollection, Generator, Schema } from '../index.js'; import type { DocMeta } from '../store/index.js'; import type { BlockSuiteDoc } from '../yjs/index.js'; import { @@ -62,7 +62,7 @@ function createRoot(doc: Doc) { function createTestDoc(docId = defaultDocId) { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); const doc = workspace.createDoc({ id: docId }); doc.load(); return doc; @@ -93,7 +93,7 @@ beforeEach(() => { describe('basic', () => { it('can init workspace', () => { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); assert.equal(workspace.isEmpty, true); const doc = workspace.createDoc({ id: 'doc:home' }); @@ -134,7 +134,7 @@ describe('basic', () => { it('init workspace with custom id generator', () => { const options = createTestOptions(); let id = 100; - const workspace = new Workspace({ + const workspace = new DocCollection({ ...options, idGenerator: () => { return String(id++); @@ -152,7 +152,7 @@ describe('basic', () => { it('doc ready lifecycle', () => { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); const doc = workspace.createDoc({ id: 'space:0', }); @@ -179,8 +179,8 @@ describe('basic', () => { it('workspace docs with yjs applyUpdate', () => { const options = createTestOptions(); - const workspace = new Workspace(options); - const workspace2 = new Workspace(options); + const workspace = new DocCollection(options); + const workspace2 = new DocCollection(options); const doc = workspace.createDoc({ id: 'space:0', }); @@ -368,7 +368,7 @@ describe('addBlock', () => { it('can add and remove multi docs', async () => { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); const doc0 = workspace.createDoc({ id: 'doc:home' }); const doc1 = workspace.createDoc({ id: 'space:doc1' }); @@ -392,7 +392,7 @@ describe('addBlock', () => { it('can remove doc that has not been loaded', () => { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); const doc0 = workspace.createDoc({ id: 'doc:home' }); @@ -402,7 +402,7 @@ describe('addBlock', () => { it('can set doc state', () => { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); workspace.createDoc({ id: 'doc:home' }); assert.deepEqual( @@ -445,7 +445,7 @@ describe('addBlock', () => { it('can set workspace common meta fields', async () => { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); queueMicrotask(() => workspace.meta.setName('hello')); await waitOnce(workspace.meta.commonFieldsUpdated); @@ -831,7 +831,7 @@ describe('getBlock', () => { describe('workspace.exportJSX works', () => { it('workspace matches snapshot', () => { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); const doc = workspace.createDoc({ id: 'doc:home' }); doc.addBlock('affine:page', { title: new doc.Text('hello') }); @@ -845,7 +845,7 @@ describe('workspace.exportJSX works', () => { it('empty workspace matches snapshot', () => { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); workspace.createDoc({ id: 'doc:home' }); expect(workspace.exportJSX()).toMatchInlineSnapshot('null'); @@ -853,7 +853,7 @@ describe('workspace.exportJSX works', () => { it('workspace with multiple blocks children matches snapshot', () => { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); const doc = workspace.createDoc({ id: 'doc:home' }); doc.load(() => { const rootId = doc.addBlock('affine:page', { @@ -882,7 +882,7 @@ describe('workspace.exportJSX works', () => { describe('workspace search', () => { it('search doc meta title', () => { const options = createTestOptions(); - const workspace = new Workspace(options); + const workspace = new DocCollection(options); const doc = workspace.createDoc({ id: 'doc:home' }); doc.load(() => { const rootId = doc.addBlock('affine:page', { diff --git a/packages/framework/store/src/store/addon/blob.ts b/packages/framework/store/src/store/addon/blob.ts index f00714668c74..cf619a4cbe70 100644 --- a/packages/framework/store/src/store/addon/blob.ts +++ b/packages/framework/store/src/store/addon/blob.ts @@ -1,7 +1,7 @@ import { createMemoryStorage } from '../../persistence/blob/memory-storage.js'; import type { BlobManager, BlobStorage } from '../../persistence/blob/types.js'; import { sha } from '../../persistence/blob/utils.js'; -import type { WorkspaceOptions } from '../workspace.js'; +import type { DocCollectionOptions } from '../collection.js'; import { addOnFactory } from './shared.js'; export interface BlobAddon { @@ -15,7 +15,7 @@ export const blob = addOnFactory( readonly blob: BlobManager; - constructor(storeOptions: WorkspaceOptions) { + constructor(storeOptions: DocCollectionOptions) { super(storeOptions); this._storages = ( diff --git a/packages/framework/store/src/store/addon/index.ts b/packages/framework/store/src/store/addon/index.ts index 1f3cd06fec72..59283c542667 100644 --- a/packages/framework/store/src/store/addon/index.ts +++ b/packages/framework/store/src/store/addon/index.ts @@ -1,4 +1,4 @@ export { blob } from './blob.js'; export { indexer } from './indexer.js'; export { test } from './test.js'; -export { WorkspaceAddonType } from './type.js'; +export { DocCollectionAddonType } from './type.js'; diff --git a/packages/framework/store/src/store/addon/indexer.ts b/packages/framework/store/src/store/addon/indexer.ts index 40062dfd703d..a67ed6643924 100644 --- a/packages/framework/store/src/store/addon/indexer.ts +++ b/packages/framework/store/src/store/addon/indexer.ts @@ -4,7 +4,7 @@ import { BlockIndexer, SearchIndexer, } from '../../indexer/index.js'; -import type { WorkspaceOptions } from '../workspace.js'; +import type { DocCollectionOptions } from '../collection.js'; import { addOnFactory } from './shared.js'; type Indexer = { @@ -26,7 +26,7 @@ export const indexer = addOnFactory( return this.indexer.search.search(query); } - constructor(storeOptions: WorkspaceOptions) { + constructor(storeOptions: DocCollectionOptions) { super(storeOptions); const blockIndexer = new BlockIndexer(this.doc, { slots: this.slots }); this.indexer = { diff --git a/packages/framework/store/src/store/addon/shared.ts b/packages/framework/store/src/store/addon/shared.ts index b00bbae0bae7..a95f81b707fe 100644 --- a/packages/framework/store/src/store/addon/shared.ts +++ b/packages/framework/store/src/store/addon/shared.ts @@ -1,17 +1,17 @@ -import type { Workspace } from '../workspace.js'; -import type { WorkspaceOptions } from '../workspace.js'; +import type { DocCollection } from '../collection.js'; +import type { DocCollectionOptions } from '../collection.js'; type WorkspaceConstructor = { - new (storeOptions: WorkspaceOptions): Omit; + new (storeOptions: DocCollectionOptions): Omit; }; export type AddOn = ( originalClass: WorkspaceConstructor -) => { new (storeOptions: WorkspaceOptions): unknown }; +) => { new (storeOptions: DocCollectionOptions): unknown }; export type AddOnReturn = ( originalClass: WorkspaceConstructor -) => typeof Workspace; +) => typeof DocCollection; export function addOnFactory(fn: AddOn) { return fn as AddOnReturn; diff --git a/packages/framework/store/src/store/addon/type.ts b/packages/framework/store/src/store/addon/type.ts index 7cd7f5177b5c..1e20488ba3da 100644 --- a/packages/framework/store/src/store/addon/type.ts +++ b/packages/framework/store/src/store/addon/type.ts @@ -2,7 +2,9 @@ import type { BlobAddon } from './blob.js'; import type { IndexerAddon } from './indexer.js'; import type { TestAddon } from './test.js'; -export class WorkspaceAddonType implements BlobAddon, IndexerAddon, TestAddon { +export class DocCollectionAddonType + implements BlobAddon, IndexerAddon, TestAddon +{ blob!: BlobAddon['blob']; indexer!: IndexerAddon['indexer']; diff --git a/packages/framework/store/src/store/workspace.ts b/packages/framework/store/src/store/collection.ts similarity index 91% rename from packages/framework/store/src/store/workspace.ts rename to packages/framework/store/src/store/collection.ts index a1f3ed2d9f07..4404bc9d8640 100644 --- a/packages/framework/store/src/store/workspace.ts +++ b/packages/framework/store/src/store/collection.ts @@ -3,25 +3,25 @@ import * as Y from 'yjs'; import type { Schema } from '../schema/index.js'; import type { AwarenessStore } from '../yjs/index.js'; -import { blob, indexer, test, WorkspaceAddonType } from './addon/index.js'; +import { blob, DocCollectionAddonType, indexer, test } from './addon/index.js'; import { Doc } from './doc.js'; -import { type DocMeta, WorkspaceMeta } from './meta.js'; +import { DocCollectionMeta, type DocMeta } from './meta.js'; import { Store, type StoreOptions } from './store.js'; -export type WorkspaceOptions = StoreOptions & { +export type DocCollectionOptions = StoreOptions & { schema: Schema; }; @blob @indexer @test -export class Workspace extends WorkspaceAddonType { +export class DocCollection extends DocCollectionAddonType { static Y = Y; protected _store: Store; protected readonly _schema: Schema; - meta: WorkspaceMeta; + meta: DocCollectionMeta; slots = { docAdded: new Slot(), @@ -29,13 +29,13 @@ export class Workspace extends WorkspaceAddonType { docRemoved: new Slot(), }; - constructor(storeOptions: WorkspaceOptions) { + constructor(options: DocCollectionOptions) { super(); - this._schema = storeOptions.schema; + this._schema = options.schema; - this._store = new Store(storeOptions); + this._store = new Store(options); - this.meta = new WorkspaceMeta(this.doc); + this.meta = new DocCollectionMeta(this.doc); this._bindDocMetaEvents(); } diff --git a/packages/framework/store/src/store/doc.ts b/packages/framework/store/src/store/doc.ts index f2e1a9be53dc..59b511530493 100644 --- a/packages/framework/store/src/store/doc.ts +++ b/packages/framework/store/src/store/doc.ts @@ -10,8 +10,8 @@ import { assertValidChildren, syncBlockProps } from '../utils/utils.js'; import type { AwarenessStore, BlockSuiteDoc } from '../yjs/index.js'; import type { YBlock } from './block/index.js'; import { BlockTree } from './block/index.js'; +import type { DocCollection } from './collection.js'; import { Space } from './space.js'; -import type { Workspace } from './workspace.js'; export type YBlocks = Y.Map; type FlatBlockMap = Record; @@ -28,14 +28,14 @@ export type BlockProps = BlockSysProps & { type DocOptions = { id: string; - workspace: Workspace; + workspace: DocCollection; doc: BlockSuiteDoc; awarenessStore: AwarenessStore; idGenerator?: IdGenerator; }; export class Doc extends Space { - private readonly _workspace: Workspace; + private readonly _workspace: DocCollection; private readonly _idGenerator: IdGenerator; private readonly _blockTree: BlockTree; private _history!: Y.UndoManager; diff --git a/packages/framework/store/src/store/index.ts b/packages/framework/store/src/store/index.ts index c17297d02ff1..cc1f789b9c25 100644 --- a/packages/framework/store/src/store/index.ts +++ b/packages/framework/store/src/store/index.ts @@ -1,7 +1,7 @@ +export type * from './collection.js'; +export { DocCollection } from './collection.js'; export type * from './doc.js'; export { Doc } from './doc.js'; export type * from './meta.js'; export * from './space.js'; export * from './store.js'; -export type * from './workspace.js'; -export { Workspace } from './workspace.js'; diff --git a/packages/framework/store/src/store/meta.ts b/packages/framework/store/src/store/meta.ts index 3e5e1f197c2b..e46c5e38ec97 100644 --- a/packages/framework/store/src/store/meta.ts +++ b/packages/framework/store/src/store/meta.ts @@ -3,7 +3,7 @@ import type * as Y from 'yjs'; import { PAGE_VERSION, WORKSPACE_VERSION } from '../consts.js'; import type { BlockSuiteDoc } from '../yjs/index.js'; -import type { Workspace } from './workspace.js'; +import type { DocCollection } from './collection.js'; // please use `declare module '@blocksuite/store'` to extend this interface export interface DocMeta { @@ -23,7 +23,7 @@ export type DocsPropertiesMeta = { options: Tag[]; }; }; -export type WorkspaceMetaState = { +export type DocCollectionMetaState = { pages?: unknown[]; properties?: DocsPropertiesMeta; workspaceVersion?: number; @@ -33,7 +33,7 @@ export type WorkspaceMetaState = { avatar?: string; }; -export class WorkspaceMeta { +export class DocCollectionMeta { readonly id: string = 'meta'; readonly doc: BlockSuiteDoc; @@ -44,14 +44,16 @@ export class WorkspaceMeta { docMetaUpdated = new Slot(); commonFieldsUpdated = new Slot(); - protected readonly _yMap: Y.Map; - protected readonly _proxy: WorkspaceMetaState; + protected readonly _yMap: Y.Map< + DocCollectionMetaState[keyof DocCollectionMetaState] + >; + protected readonly _proxy: DocCollectionMetaState; constructor(doc: BlockSuiteDoc) { this.doc = doc; this._yMap = doc.getMap(this.id); - this._proxy = doc.getMapProxy(this.id); - this._yMap.observeDeep(this._handleWorkspaceMetaEvents); + this._proxy = doc.getMapProxy(this.id); + this._yMap.observeDeep(this._handleDocCollectionMetaEvents); } get yDocs() { @@ -120,7 +122,7 @@ export class WorkspaceMeta { } /** - * @internal Use {@link Workspace.setDocMeta} instead + * @internal Use {@link DocCollection.setDocMeta} instead */ setDocMeta(id: string, props: Partial) { const docs = (this.docs as DocMeta[]) ?? []; @@ -164,7 +166,7 @@ export class WorkspaceMeta { /** * @internal Only for doc initialization */ - writeVersion(workspace: Workspace) { + writeVersion(workspace: DocCollection) { const { blockVersions, pageVersion, workspaceVersion } = this._proxy; if (!workspaceVersion) { @@ -190,7 +192,7 @@ export class WorkspaceMeta { } } - updateVersion(workspace: Workspace) { + updateVersion(workspace: DocCollection) { this._proxy.workspaceVersion = WORKSPACE_VERSION; this._proxy.pageVersion = PAGE_VERSION; @@ -205,7 +207,7 @@ export class WorkspaceMeta { /** * @deprecated Only used for legacy doc version validation */ - validateVersion(workspace: Workspace) { + validateVersion(workspace: DocCollection) { const workspaceVersion = this._proxy.workspaceVersion; if (!workspaceVersion) { throw new Error( @@ -289,7 +291,7 @@ export class WorkspaceMeta { this.commonFieldsUpdated.emit(); } - private _handleWorkspaceMetaEvents = ( + private _handleDocCollectionMetaEvents = ( events: Y.YEvent | Y.Text | Y.Map>[] ) => { events.forEach(e => { diff --git a/packages/framework/store/src/transformer/job.ts b/packages/framework/store/src/transformer/job.ts index 80c5eec8c7af..8ccb94a035e4 100644 --- a/packages/framework/store/src/transformer/job.ts +++ b/packages/framework/store/src/transformer/job.ts @@ -2,7 +2,7 @@ import { Slot } from '@blocksuite/global/utils'; import { assertExists } from '@blocksuite/global/utils'; import type { BlockModel, BlockSchemaType } from '../schema/index.js'; -import type { DocMeta, Workspace } from '../store/index.js'; +import type { DocCollection, DocMeta } from '../store/index.js'; import type { Doc } from '../store/index.js'; import type { DocsPropertiesMeta } from '../store/meta.js'; import { AssetsManager } from './assets.js'; @@ -29,12 +29,12 @@ import { } from './type.js'; export type JobConfig = { - workspace: Workspace; + workspace: DocCollection; middlewares?: JobMiddleware[]; }; export class Job { - private readonly _workspace: Workspace; + private readonly _workspace: DocCollection; private readonly _assetsManager: AssetsManager; private readonly _adapterConfigs: Map = new Map(); diff --git a/packages/framework/store/src/transformer/middleware.ts b/packages/framework/store/src/transformer/middleware.ts index 4b3e5082900d..b00b6fa1d34b 100644 --- a/packages/framework/store/src/transformer/middleware.ts +++ b/packages/framework/store/src/transformer/middleware.ts @@ -1,7 +1,7 @@ import type { Slot } from '@blocksuite/global/utils'; import type { BlockModel } from '../schema/index.js'; -import type { Doc, Workspace } from '../store/index.js'; +import type { Doc, DocCollection } from '../store/index.js'; import type { AssetsManager } from './assets.js'; import type { Slice } from './slice.js'; import type { @@ -79,7 +79,7 @@ export type JobSlots = { }; type JobMiddlewareOptions = { - workspace: Workspace; + workspace: DocCollection; assetsManager: AssetsManager; slots: JobSlots; adapterConfigs: Map; diff --git a/packages/framework/store/src/utils/utils.ts b/packages/framework/store/src/utils/utils.ts index c2450797c809..bdcdcaacd540 100644 --- a/packages/framework/store/src/utils/utils.ts +++ b/packages/framework/store/src/utils/utils.ts @@ -9,7 +9,7 @@ import { type BlockSchema } from '../schema/base.js'; import { internalPrimitives } from '../schema/base.js'; import type { YBlock } from '../store/block/block.js'; import type { BlockProps, YBlocks } from '../store/doc.js'; -import type { Workspace } from '../store/index.js'; +import type { DocCollection } from '../store/index.js'; export function assertValidChildren( yBlocks: YBlocks, @@ -53,6 +53,6 @@ export function syncBlockProps( }); } -export function encodeWorkspaceAsYjsUpdateV2(workspace: Workspace): string { +export function encodeWorkspaceAsYjsUpdateV2(workspace: DocCollection): string { return toBase64(Y.encodeStateAsUpdateV2(workspace.doc)); } diff --git a/packages/presets/src/__tests__/edgeless/group.spec.ts b/packages/presets/src/__tests__/edgeless/group.spec.ts index a120e5f72aa2..4a8e256e099e 100644 --- a/packages/presets/src/__tests__/edgeless/group.spec.ts +++ b/packages/presets/src/__tests__/edgeless/group.spec.ts @@ -1,5 +1,5 @@ import type { EdgelessRootBlockComponent } from '@blocksuite/blocks'; -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import { beforeEach, describe, expect, test } from 'vitest'; import { getDocRootBlock } from '../utils/edgeless.js'; @@ -16,7 +16,7 @@ describe('group', () => { }); test('remove group without children', () => { - const map = new Workspace.Y.Map(); + const map = new DocCollection.Y.Map(); const ids = Array.from({ length: 2 }).map(() => { const id = service.addElement('shape', { shapeType: 'rect', diff --git a/packages/presets/src/__tests__/env.d.ts b/packages/presets/src/__tests__/env.d.ts index bcdebed8d0b7..812b35bc48a1 100644 --- a/packages/presets/src/__tests__/env.d.ts +++ b/packages/presets/src/__tests__/env.d.ts @@ -1,4 +1,4 @@ -import type { Doc, Workspace } from '@blocksuite/store'; +import type { Doc, DocCollection } from '@blocksuite/store'; // eslint-disable-next-line @typescript-eslint/no-restricted-imports import type { AffineEditorContainer } from '../index.js'; @@ -6,10 +6,10 @@ import type { AffineEditorContainer } from '../index.js'; declare global { const editor: AffineEditorContainer; const doc: Doc; - const workspace: Workspace; + const workspace: DocCollection; interface Window { editor: AffineEditorContainer; doc: Doc; - workspace: Workspace; + workspace: DocCollection; } } diff --git a/packages/presets/src/__tests__/utils/setup.ts b/packages/presets/src/__tests__/utils/setup.ts index 2d9a00bad8f3..1622d2cd9f82 100644 --- a/packages/presets/src/__tests__/utils/setup.ts +++ b/packages/presets/src/__tests__/utils/setup.ts @@ -1,6 +1,11 @@ import { AffineSchemas } from '@blocksuite/blocks/schemas'; import { assertExists } from '@blocksuite/global/utils'; -import { type BlobStorage, type Doc, Text, Workspace } from '@blocksuite/store'; +import { + type BlobStorage, + type Doc, + DocCollection, + Text, +} from '@blocksuite/store'; import { createMemoryStorage, Generator, Schema } from '@blocksuite/store'; import { AffineEditorContainer } from '../../index.js'; @@ -32,7 +37,7 @@ function createWorkspaceOptions() { }; } -function initWorkspace(workspace: Workspace) { +function initWorkspace(workspace: DocCollection) { const doc = workspace.createDoc({ id: 'doc:home' }); doc.load(() => { @@ -45,7 +50,7 @@ function initWorkspace(workspace: Workspace) { } async function createEditor( - workspace: Workspace, + workspace: DocCollection, mode: 'edgeless' | 'page' = 'page' ) { const app = document.createElement('div'); @@ -68,7 +73,7 @@ async function createEditor( } export async function setupEditor(mode: 'edgeless' | 'page' = 'page') { - const workspace = new Workspace(createWorkspaceOptions()); + const workspace = new DocCollection(createWorkspaceOptions()); window.workspace = workspace; diff --git a/packages/presets/src/fragments/comment/comment-input.ts b/packages/presets/src/fragments/comment/comment-input.ts index 9c50f067b7fe..1d1ccf378264 100644 --- a/packages/presets/src/fragments/comment/comment-input.ts +++ b/packages/presets/src/fragments/comment/comment-input.ts @@ -1,7 +1,7 @@ import type { TextSelection } from '@blocksuite/block-std'; import type { RichText } from '@blocksuite/blocks'; import { ShadowlessElement, WithDisposable } from '@blocksuite/lit'; -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import { css, html, nothing } from 'lit'; import { customElement, property, query } from 'lit/decorators.js'; @@ -61,7 +61,7 @@ export class CommentInput extends WithDisposable(ShadowlessElement) { return; } - const yText = new Workspace.Y.Text(); + const yText = new DocCollection.Y.Text(); yText.applyDelta(deltas); const comment = this.manager.addComment(textSelection, { author: 'Anonymous', @@ -91,7 +91,7 @@ export class CommentInput extends WithDisposable(ShadowlessElement) { const { quote } = parseResult; - const tmpYDoc = new Workspace.Y.Doc(); + const tmpYDoc = new DocCollection.Y.Doc(); const tmpYText = tmpYDoc.getText('comment'); return html`
diff --git a/packages/presets/src/fragments/comment/comment-manager.ts b/packages/presets/src/fragments/comment/comment-manager.ts index b0b1cd02a6a1..ca0910b9ed1d 100644 --- a/packages/presets/src/fragments/comment/comment-manager.ts +++ b/packages/presets/src/fragments/comment/comment-manager.ts @@ -1,7 +1,7 @@ import type { TextSelection } from '@blocksuite/block-std'; import { assertExists } from '@blocksuite/global/utils'; import type { EditorHost } from '@blocksuite/lit'; -import { Workspace, type Y } from '@blocksuite/store'; +import { DocCollection, type Y } from '@blocksuite/store'; export interface CommentMeta { id: string; @@ -58,11 +58,11 @@ export class CommentManager { assertExists(toBlockText); assertExists(toBlockPath); - const startIndex = Workspace.Y.createRelativePositionFromTypeIndex( + const startIndex = DocCollection.Y.createRelativePositionFromTypeIndex( fromBlockText.yText, from.index ); - const endIndex = Workspace.Y.createRelativePositionFromTypeIndex( + const endIndex = DocCollection.Y.createRelativePositionFromTypeIndex( toBlockText.yText, to ? to.index + to.length : from.index + from.length ); @@ -119,7 +119,7 @@ export class CommentManager { }; this.commentsMap.set( id, - new Workspace.Y.Map(Object.entries(comment)) + new DocCollection.Y.Map(Object.entries(comment)) ); return comment; } @@ -130,15 +130,17 @@ export class CommentManager { const start = comment.get('start') as Comment['start']; const end = comment.get('end') as Comment['end']; - const startIndex = Workspace.Y.createAbsolutePositionFromRelativePosition( - start.index, - this.host.doc.spaceDoc - ); + const startIndex = + DocCollection.Y.createAbsolutePositionFromRelativePosition( + start.index, + this.host.doc.spaceDoc + ); const startBlock = this.host.view.viewFromPath('block', start.path); - const endIndex = Workspace.Y.createAbsolutePositionFromRelativePosition( - end.index, - this.host.doc.spaceDoc - ); + const endIndex = + DocCollection.Y.createAbsolutePositionFromRelativePosition( + end.index, + this.host.doc.spaceDoc + ); const endBlock = this.host.view.viewFromPath('block', end.path); if (!startIndex || !startBlock || !endIndex || !endBlock) { diff --git a/packages/presets/src/fragments/copilot-panel/edgeless/logic.ts b/packages/presets/src/fragments/copilot-panel/edgeless/logic.ts index 12a76f0a0097..51bac6ca0f6d 100644 --- a/packages/presets/src/fragments/copilot-panel/edgeless/logic.ts +++ b/packages/presets/src/fragments/copilot-panel/edgeless/logic.ts @@ -8,7 +8,7 @@ import { type TreeNode, } from '@blocksuite/blocks'; import type { EditorHost } from '@blocksuite/lit'; -import type { BlockModel, Workspace } from '@blocksuite/store'; +import type { BlockModel, DocCollection } from '@blocksuite/store'; import { copilotConfig } from '../copilot-service/copilot-config.js'; import { @@ -56,7 +56,7 @@ export class AIEdgelessLogic { }).dispose; }; - get workspace(): Workspace { + get workspace(): DocCollection { return this.host.doc.workspace; } diff --git a/packages/presets/src/helpers/index.ts b/packages/presets/src/helpers/index.ts index 9a05dce5e60a..56b0d05f465f 100644 --- a/packages/presets/src/helpers/index.ts +++ b/packages/presets/src/helpers/index.ts @@ -1,9 +1,9 @@ import { AffineSchemas } from '@blocksuite/blocks/schemas'; -import { Schema, Workspace } from '@blocksuite/store'; +import { DocCollection, Schema } from '@blocksuite/store'; export function createEmptyDoc() { const schema = new Schema().register(AffineSchemas); - const workspace = new Workspace({ schema }); + const workspace = new DocCollection({ schema }); const doc = workspace.createDoc(); return { From ad57bd46c783203cc8396df91975870193eb352e Mon Sep 17 00:00:00 2001 From: Yifeng Wang Date: Sat, 9 Mar 2024 11:06:52 +0800 Subject: [PATCH 06/11] fix: test --- packages/playground/apps/_common/components/debug-menu.ts | 4 ++-- packages/playground/apps/_common/components/docs-panel.ts | 4 ++-- tests/utils/declare-test-window.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/playground/apps/_common/components/debug-menu.ts b/packages/playground/apps/_common/components/debug-menu.ts index ab4e4c1f3c4d..6cae002249e3 100644 --- a/packages/playground/apps/_common/components/debug-menu.ts +++ b/packages/playground/apps/_common/components/debug-menu.ts @@ -43,7 +43,7 @@ import type { CopilotPanel, } from '@blocksuite/presets'; import type { BlockModel } from '@blocksuite/store'; -import { Text, Utils, type Workspace } from '@blocksuite/store'; +import { type DocCollection, Text, Utils } from '@blocksuite/store'; import type { SlDropdown } from '@shoelace-style/shoelace'; import { setBasePath } from '@shoelace-style/shoelace/dist/utilities/base-path.js'; import { css, html } from 'lit'; @@ -181,7 +181,7 @@ export class DebugMenu extends ShadowlessElement { `; @property({ attribute: false }) - workspace!: Workspace; + workspace!: DocCollection; @property({ attribute: false }) editor!: AffineEditorContainer; diff --git a/packages/playground/apps/_common/components/docs-panel.ts b/packages/playground/apps/_common/components/docs-panel.ts index 4158afcdb7fc..1245430d8365 100644 --- a/packages/playground/apps/_common/components/docs-panel.ts +++ b/packages/playground/apps/_common/components/docs-panel.ts @@ -1,7 +1,7 @@ import { CloseIcon, createDefaultDoc } from '@blocksuite/blocks'; import { ShadowlessElement, WithDisposable } from '@blocksuite/lit'; import type { AffineEditorContainer } from '@blocksuite/presets'; -import type { Workspace } from '@blocksuite/store'; +import type { DocCollection } from '@blocksuite/store'; import { css, html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; @@ -112,7 +112,7 @@ export class DocsPanel extends WithDisposable(ShadowlessElement) { } } -function createDocBlock(workspace: Workspace) { +function createDocBlock(workspace: DocCollection) { const id = workspace.idGenerator(); createDefaultDoc(workspace, { id }); } diff --git a/tests/utils/declare-test-window.ts b/tests/utils/declare-test-window.ts index ee92aa34a677..cf5a7763c2ae 100644 --- a/tests/utils/declare-test-window.ts +++ b/tests/utils/declare-test-window.ts @@ -3,7 +3,7 @@ import type { TestUtils } from '@blocks/index.js'; import type { EditorHost } from '@lit/element/index.js'; import type { DebugMenu } from '@playground/apps/_common/components/debug-menu.js'; import type { AffineEditorContainer } from '@presets/editors/index.js'; -import type { BlockModel, Doc, Workspace } from '@store/index.js'; +import type { BlockModel, Doc, DocCollection } from '@store/index.js'; declare global { interface Window { @@ -16,7 +16,7 @@ declare global { }; editor: typeof import('../../packages/presets/src/index.js'); }; - workspace: Workspace; + workspace: DocCollection; blockSchema: Record; doc: Doc; debugMenu: DebugMenu; From 4daf3eb08ed43274d19557a2688b02d71b49d071 Mon Sep 17 00:00:00 2001 From: Yifeng Wang Date: Sat, 9 Mar 2024 11:13:47 +0800 Subject: [PATCH 07/11] fix: build --- .../apps/_common/components/quick-edgeless-menu.ts | 4 ++-- packages/playground/apps/default/utils/editor.ts | 4 ++-- .../playground/apps/default/utils/workspace.ts | 12 ++++++------ packages/playground/apps/starter/data/database.ts | 4 ++-- packages/playground/apps/starter/data/embed.ts | 4 ++-- packages/playground/apps/starter/data/empty.ts | 4 ++-- .../apps/starter/data/heavy-whiteboard.ts | 7 +++++-- packages/playground/apps/starter/data/heavy.ts | 4 ++-- packages/playground/apps/starter/data/linked.ts | 4 ++-- .../apps/starter/data/multiple-editor.ts | 6 +++--- .../apps/starter/data/pending-structs.ts | 13 ++++++++----- packages/playground/apps/starter/data/preset.ts | 4 ++-- packages/playground/apps/starter/data/synced.ts | 4 ++-- packages/playground/apps/starter/data/utils.ts | 4 ++-- .../apps/starter/data/version-mismatch.ts | 11 +++++++---- packages/playground/apps/starter/utils/editor.ts | 4 ++-- .../playground/apps/starter/utils/workspace.ts | 14 +++++++------- packages/playground/examples/store/main.ts | 4 ++-- 18 files changed, 60 insertions(+), 51 deletions(-) diff --git a/packages/playground/apps/_common/components/quick-edgeless-menu.ts b/packages/playground/apps/_common/components/quick-edgeless-menu.ts index 547f53e84fae..0a866bd71841 100644 --- a/packages/playground/apps/_common/components/quick-edgeless-menu.ts +++ b/packages/playground/apps/_common/components/quick-edgeless-menu.ts @@ -22,7 +22,7 @@ import { ColorVariables, extractCssVariables } from '@blocksuite/blocks'; import type { DeltaInsert } from '@blocksuite/inline'; import { ShadowlessElement } from '@blocksuite/lit'; import type { AffineEditorContainer } from '@blocksuite/presets'; -import { Text, Utils, type Workspace } from '@blocksuite/store'; +import { type DocCollection, Text, Utils } from '@blocksuite/store'; import { setBasePath } from '@shoelace-style/shoelace/dist/utilities/base-path.js'; import { css, html, nothing } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; @@ -64,7 +64,7 @@ export class QuickEdgelessMenu extends ShadowlessElement { `; @property({ attribute: false }) - workspace!: Workspace; + workspace!: DocCollection; @property({ attribute: false }) editor!: AffineEditorContainer; diff --git a/packages/playground/apps/default/utils/editor.ts b/packages/playground/apps/default/utils/editor.ts index e9c944adbc1d..f8d62a10baa4 100644 --- a/packages/playground/apps/default/utils/editor.ts +++ b/packages/playground/apps/default/utils/editor.ts @@ -1,7 +1,7 @@ import { assertExists } from '@blocksuite/global/utils'; import type { EditorHost } from '@blocksuite/lit'; import { AffineEditorContainer } from '@blocksuite/presets'; -import type { Workspace } from '@blocksuite/store'; +import type { DocCollection } from '@blocksuite/store'; import { DocsPanel } from '../../_common/components/docs-panel.js'; import { LeftSidePanel } from '../../_common/components/left-side-panel.js'; @@ -11,7 +11,7 @@ import { getExampleSpecs } from '../specs-examples/index.js'; const params = new URLSearchParams(location.search); const defaultMode = params.get('mode') === 'page' ? 'page' : 'edgeless'; -export async function mountDefaultDocEditor(workspace: Workspace) { +export async function mountDefaultDocEditor(workspace: DocCollection) { const doc = workspace.docs.values().next().value; assertExists(doc, 'Need to create a doc first'); diff --git a/packages/playground/apps/default/utils/workspace.ts b/packages/playground/apps/default/utils/workspace.ts index f6063ba17804..d4cf95ee04ed 100644 --- a/packages/playground/apps/default/utils/workspace.ts +++ b/packages/playground/apps/default/utils/workspace.ts @@ -3,13 +3,13 @@ import { assertExists } from '@blocksuite/global/utils'; import { type BlobStorage, createIndexeddbStorage, + DocCollection, + type DocCollectionOptions, Generator, Job, Schema, type StoreOptions, Text, - Workspace, - type WorkspaceOptions, } from '@blocksuite/store'; import { IndexedDBDocSource } from '@blocksuite/sync'; @@ -45,7 +45,7 @@ export async function createDefaultDocWorkspace() { awarenessSources = [new WebSocketAwarenessSource(ws)]; } - const options: WorkspaceOptions = { + const options: DocCollectionOptions = { id: 'quickEdgeless', schema, idGenerator, @@ -57,7 +57,7 @@ export async function createDefaultDocWorkspace() { enable_bultin_ledits: true, }, }; - const workspace = new Workspace(options); + const workspace = new DocCollection(options); workspace.start(); @@ -65,12 +65,12 @@ export async function createDefaultDocWorkspace() { window.workspace = workspace; window.blockSchemas = AffineSchemas; window.job = new Job({ workspace }); - window.Y = Workspace.Y; + window.Y = DocCollection.Y; return workspace; } -export async function initDefaultDocWorkspace(workspace: Workspace) { +export async function initDefaultDocWorkspace(workspace: DocCollection) { const params = new URLSearchParams(location.search); await workspace.waitForSynced(); diff --git a/packages/playground/apps/starter/data/database.ts b/packages/playground/apps/starter/data/database.ts index 74ccc5634ce6..aff89049186c 100644 --- a/packages/playground/apps/starter/data/database.ts +++ b/packages/playground/apps/starter/data/database.ts @@ -11,11 +11,11 @@ import { numberPureColumnConfig } from '@blocksuite/blocks'; import { progressPureColumnConfig } from '@blocksuite/blocks'; import { richTextPureColumnConfig } from '@blocksuite/blocks'; import { assertExists } from '@blocksuite/global/utils'; -import { Text, type Workspace } from '@blocksuite/store'; +import { type DocCollection, Text } from '@blocksuite/store'; import { type InitFn } from './utils.js'; -export const database: InitFn = (workspace: Workspace, id: string) => { +export const database: InitFn = (workspace: DocCollection, id: string) => { const doc = workspace.createDoc({ id }); doc.awarenessStore.setFlag('enable_expand_database_block', true); diff --git a/packages/playground/apps/starter/data/embed.ts b/packages/playground/apps/starter/data/embed.ts index 9a51ad738024..78214408216e 100644 --- a/packages/playground/apps/starter/data/embed.ts +++ b/packages/playground/apps/starter/data/embed.ts @@ -1,8 +1,8 @@ -import { Text, type Workspace } from '@blocksuite/store'; +import { type DocCollection, Text } from '@blocksuite/store'; import { type InitFn } from './utils.js'; -export const embed: InitFn = (workspace: Workspace, id: string) => { +export const embed: InitFn = (workspace: DocCollection, id: string) => { const doc = workspace.getDoc(id) ?? workspace.createDoc({ id }); doc.clear(); diff --git a/packages/playground/apps/starter/data/empty.ts b/packages/playground/apps/starter/data/empty.ts index cf2f5cc4b4c9..07217c5c54ca 100644 --- a/packages/playground/apps/starter/data/empty.ts +++ b/packages/playground/apps/starter/data/empty.ts @@ -1,8 +1,8 @@ -import { Text, type Workspace } from '@blocksuite/store'; +import { type DocCollection, Text } from '@blocksuite/store'; import { type InitFn } from './utils.js'; -export const empty: InitFn = (workspace: Workspace, id: string) => { +export const empty: InitFn = (workspace: DocCollection, id: string) => { const doc = workspace.getDoc(id) ?? workspace.createDoc({ id }); doc.clear(); diff --git a/packages/playground/apps/starter/data/heavy-whiteboard.ts b/packages/playground/apps/starter/data/heavy-whiteboard.ts index 616db0fe4437..cdcc72cf077c 100644 --- a/packages/playground/apps/starter/data/heavy-whiteboard.ts +++ b/packages/playground/apps/starter/data/heavy-whiteboard.ts @@ -1,10 +1,10 @@ import type { SerializedXYWH } from '@blocksuite/blocks'; import { Boxed, + type DocCollection, nanoid, native2Y, Text, - type Workspace, type Y, } from '@blocksuite/store'; @@ -13,7 +13,10 @@ import { type InitFn } from './utils.js'; const SHAPE_TYPES = ['rect', 'triangle', 'ellipse', 'diamond']; const params = new URLSearchParams(location.search); -export const heavyWhiteboard: InitFn = (workspace: Workspace, id: string) => { +export const heavyWhiteboard: InitFn = ( + workspace: DocCollection, + id: string +) => { const count = Number(params.get('count')) || 100; const doc = workspace.createDoc({ id }); diff --git a/packages/playground/apps/starter/data/heavy.ts b/packages/playground/apps/starter/data/heavy.ts index 48b0fd847b17..bdea5a2ef6f8 100644 --- a/packages/playground/apps/starter/data/heavy.ts +++ b/packages/playground/apps/starter/data/heavy.ts @@ -1,10 +1,10 @@ -import { Text, type Workspace } from '@blocksuite/store'; +import { type DocCollection, Text } from '@blocksuite/store'; import { type InitFn } from './utils.js'; const params = new URLSearchParams(location.search); -export const heavy: InitFn = (workspace: Workspace, docId: string) => { +export const heavy: InitFn = (workspace: DocCollection, docId: string) => { const count = Number(params.get('count')) || 1000; const doc = workspace.createDoc({ id: docId }); diff --git a/packages/playground/apps/starter/data/linked.ts b/packages/playground/apps/starter/data/linked.ts index 894c1ae1efef..af98cf9a448a 100644 --- a/packages/playground/apps/starter/data/linked.ts +++ b/packages/playground/apps/starter/data/linked.ts @@ -1,8 +1,8 @@ -import { Text, type Workspace } from '@blocksuite/store'; +import { type DocCollection, Text } from '@blocksuite/store'; import { type InitFn } from './utils.js'; -export const linked: InitFn = (workspace: Workspace, id: string) => { +export const linked: InitFn = (workspace: DocCollection, id: string) => { const docA = workspace.getDoc(id) ?? workspace.createDoc({ id }); const docBId = 'doc:linked-page'; diff --git a/packages/playground/apps/starter/data/multiple-editor.ts b/packages/playground/apps/starter/data/multiple-editor.ts index 3c7a82c6fd6e..63368054be3b 100644 --- a/packages/playground/apps/starter/data/multiple-editor.ts +++ b/packages/playground/apps/starter/data/multiple-editor.ts @@ -1,9 +1,9 @@ import { AffineEditorContainer } from '@blocksuite/presets'; -import { Text, type Workspace } from '@blocksuite/store'; +import { type DocCollection, Text } from '@blocksuite/store'; import { type InitFn } from './utils.js'; -export const multiEditor: InitFn = (workspace: Workspace, id: string) => { +export const multiEditor: InitFn = (workspace: DocCollection, id: string) => { const doc = workspace.createDoc({ id }); doc.load(() => { // Add root block and surface block at root level @@ -49,7 +49,7 @@ multiEditor.displayName = 'Multiple Editor Example'; multiEditor.description = 'Multiple Editor basic example'; export const multiEditorVertical: InitFn = ( - workspace: Workspace, + workspace: DocCollection, docId: string ) => { const doc = workspace.createDoc({ id: docId }); diff --git a/packages/playground/apps/starter/data/pending-structs.ts b/packages/playground/apps/starter/data/pending-structs.ts index 6f79dafe0a99..dced69eaeec3 100644 --- a/packages/playground/apps/starter/data/pending-structs.ts +++ b/packages/playground/apps/starter/data/pending-structs.ts @@ -1,9 +1,12 @@ -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import { Text } from '@blocksuite/store'; import type { InitFn } from './utils.js'; -export const pendingStructs: InitFn = (workspace: Workspace, id: string) => { +export const pendingStructs: InitFn = ( + workspace: DocCollection, + id: string +) => { const doc = workspace.createDoc({ id }); const tempDoc = workspace.createDoc({ id: 'tempDoc' }); doc.load(); @@ -11,7 +14,7 @@ export const pendingStructs: InitFn = (workspace: Workspace, id: string) => { const rootId = tempDoc.addBlock('affine:page', { title: new Text('Pending Structs'), }); - const vec = Workspace.Y.encodeStateVector(tempDoc.spaceDoc); + const vec = DocCollection.Y.encodeStateVector(tempDoc.spaceDoc); // To avoid pending structs, uncomment the following line // const update = Workspace.Y.encodeStateAsUpdate(tempDoc.spaceDoc); @@ -26,11 +29,11 @@ export const pendingStructs: InitFn = (workspace: Workspace, id: string) => { }, noteId ); - const diff = Workspace.Y.encodeStateAsUpdate(tempDoc.spaceDoc, vec); + const diff = DocCollection.Y.encodeStateAsUpdate(tempDoc.spaceDoc, vec); // To avoid pending structs, uncomment the following line // Workspace.Y.applyUpdate(doc.spaceDoc, update); - Workspace.Y.applyUpdate(doc.spaceDoc, diff); + DocCollection.Y.applyUpdate(doc.spaceDoc, diff); }); }; diff --git a/packages/playground/apps/starter/data/preset.ts b/packages/playground/apps/starter/data/preset.ts index da63bda43b51..7b1e589e6a9b 100644 --- a/packages/playground/apps/starter/data/preset.ts +++ b/packages/playground/apps/starter/data/preset.ts @@ -1,11 +1,11 @@ import { MarkdownTransformer } from '@blocksuite/blocks'; -import { Text, type Workspace } from '@blocksuite/store'; +import { type DocCollection, Text } from '@blocksuite/store'; import { type InitFn } from './utils.js'; const presetMarkdown = `Click the ๐Ÿ” button to switch between editors dynamically - they are fully compatible!`; -export const preset: InitFn = async (workspace: Workspace, id: string) => { +export const preset: InitFn = async (workspace: DocCollection, id: string) => { const doc = workspace.createDoc({ id }); doc.load(); // Add root block and surface block at root level diff --git a/packages/playground/apps/starter/data/synced.ts b/packages/playground/apps/starter/data/synced.ts index 4173d4292fd5..a556e4c8bb2a 100644 --- a/packages/playground/apps/starter/data/synced.ts +++ b/packages/playground/apps/starter/data/synced.ts @@ -1,5 +1,5 @@ import { MarkdownTransformer } from '@blocksuite/blocks'; -import { Text, type Workspace } from '@blocksuite/store'; +import { type DocCollection, Text } from '@blocksuite/store'; import { type InitFn } from './utils'; @@ -11,7 +11,7 @@ This article has also been published [in PDF format](https://www.inkandswitch.co We welcome your feedback: [@inkandswitch](https://twitter.com/inkandswitch) or hello@inkandswitch.com.`; -export const synced: InitFn = (workspace: Workspace, id: string) => { +export const synced: InitFn = (workspace: DocCollection, id: string) => { const docMain = workspace.getDoc(id) ?? workspace.createDoc({ id }); const docSyncedPageId = 'doc:synced-page'; diff --git a/packages/playground/apps/starter/data/utils.ts b/packages/playground/apps/starter/data/utils.ts index 5f4c3979f625..e0580ded3e6d 100644 --- a/packages/playground/apps/starter/data/utils.ts +++ b/packages/playground/apps/starter/data/utils.ts @@ -1,7 +1,7 @@ -import { type Workspace } from '@blocksuite/store'; +import { type DocCollection } from '@blocksuite/store'; export interface InitFn { - (workspace: Workspace, docId: string): Promise | void; + (workspace: DocCollection, docId: string): Promise | void; id: string; displayName: string; description: string; diff --git a/packages/playground/apps/starter/data/version-mismatch.ts b/packages/playground/apps/starter/data/version-mismatch.ts index e1654019ef76..b6914de847af 100644 --- a/packages/playground/apps/starter/data/version-mismatch.ts +++ b/packages/playground/apps/starter/data/version-mismatch.ts @@ -1,9 +1,12 @@ import type { Y } from '@blocksuite/store'; -import { Workspace } from '@blocksuite/store'; +import { DocCollection } from '@blocksuite/store'; import type { InitFn } from './utils.js'; -export const versionMismatch: InitFn = (workspace: Workspace, id: string) => { +export const versionMismatch: InitFn = ( + workspace: DocCollection, + id: string +) => { const doc = workspace.createDoc({ id }); const tempDoc = workspace.createDoc({ id: 'tempDoc' }); doc.load(); @@ -21,9 +24,9 @@ export const versionMismatch: InitFn = (workspace: Workspace, id: string) => { const paragraph = blocks.get(paragraphId) as Y.Map; paragraph.set('sys:version', (paragraph.get('sys:version') as number) + 1); - const update = Workspace.Y.encodeStateAsUpdate(tempDoc.spaceDoc); + const update = DocCollection.Y.encodeStateAsUpdate(tempDoc.spaceDoc); - Workspace.Y.applyUpdate(doc.spaceDoc, update); + DocCollection.Y.applyUpdate(doc.spaceDoc, update); doc.addBlock('affine:paragraph', {}, noteId); }); diff --git a/packages/playground/apps/starter/utils/editor.ts b/packages/playground/apps/starter/utils/editor.ts index 1f5ed41429f0..683ce8627771 100644 --- a/packages/playground/apps/starter/utils/editor.ts +++ b/packages/playground/apps/starter/utils/editor.ts @@ -5,7 +5,7 @@ import { CommentPanel, CopilotPanel, } from '@blocksuite/presets'; -import type { Workspace } from '@blocksuite/store'; +import type { DocCollection } from '@blocksuite/store'; import { CustomFramePanel } from '../../_common/components/custom-frame-panel.js'; import { CustomOutlinePanel } from '../../_common/components/custom-outline-panel.js'; @@ -17,7 +17,7 @@ import { SidePanel } from '../../_common/components/side-panel.js'; const params = new URLSearchParams(location.search); const defaultMode = params.get('mode') === 'edgeless' ? 'edgeless' : 'page'; -export async function mountDefaultDocEditor(workspace: Workspace) { +export async function mountDefaultDocEditor(workspace: DocCollection) { const doc = workspace.docs.values().next().value; assertExists(doc, 'Need to create a doc first'); diff --git a/packages/playground/apps/starter/utils/workspace.ts b/packages/playground/apps/starter/utils/workspace.ts index 8f908a0e5f6f..4665fa428c07 100644 --- a/packages/playground/apps/starter/utils/workspace.ts +++ b/packages/playground/apps/starter/utils/workspace.ts @@ -6,12 +6,12 @@ import { createIndexeddbStorage, createMemoryStorage, createSimpleServerStorage, + DocCollection, + type DocCollectionOptions, Generator, Job, Schema, type StoreOptions, - Workspace, - type WorkspaceOptions, } from '@blocksuite/store'; import { BroadcastChannelAwarenessSource, @@ -49,7 +49,7 @@ export function createStarterDocWorkspace() { }; } - const options: WorkspaceOptions = { + const options: DocCollectionOptions = { id: room ?? 'starter', schema, idGenerator, @@ -61,7 +61,7 @@ export function createStarterDocWorkspace() { awarenessSources: [new BroadcastChannelAwarenessSource()], docSources, }; - const workspace = new Workspace(options); + const workspace = new DocCollection(options); workspace.start(); @@ -69,13 +69,13 @@ export function createStarterDocWorkspace() { window.workspace = workspace; window.blockSchemas = AffineSchemas; window.job = new Job({ workspace }); - window.Y = Workspace.Y; + window.Y = DocCollection.Y; window.testUtils = new TestUtils(); return workspace; } -export async function initStarterDocWorkspace(workspace: Workspace) { +export async function initStarterDocWorkspace(workspace: DocCollection) { // init from other clients if (room && !params.has('init')) { let firstDoc = workspace.docs.values().next().value as Doc | undefined; @@ -99,7 +99,7 @@ export async function initStarterDocWorkspace(workspace: Workspace) { // use built-in init function const functionMap = new Map< string, - (workspace: Workspace, id: string) => Promise | void + (workspace: DocCollection, id: string) => Promise | void >(); Object.values( (await import('../data/index.js')) as Record diff --git a/packages/playground/examples/store/main.ts b/packages/playground/examples/store/main.ts index 551d23804920..ab93369db13f 100644 --- a/packages/playground/examples/store/main.ts +++ b/packages/playground/examples/store/main.ts @@ -1,4 +1,4 @@ -import { type Doc, Schema, Workspace } from '@blocksuite/store'; +import { type Doc, DocCollection, Schema } from '@blocksuite/store'; import { type TodoContainerBlockModel, @@ -9,7 +9,7 @@ import { function initDoc() { const schema = new Schema(); schema.register(TodoSchema); - const workspace = new Workspace({ schema }); + const workspace = new DocCollection({ schema }); const doc = workspace.createDoc({ id: 'doc:home' }); doc.addBlock('todo:container'); return doc; From 5c1fb7f7e304e2f890c4e615fc0b8d19a5442f37 Mon Sep 17 00:00:00 2001 From: Yifeng Wang Date: Sat, 9 Mar 2024 11:33:51 +0800 Subject: [PATCH 08/11] refactor: rename --- .../__tests__/database/database.unit.spec.ts | 4 +- .../components/rich-text/keymap/container.ts | 2 +- .../_common/configs/quick-action/config.ts | 4 +- .../nodes/reference-node/reference-node.ts | 4 +- .../blocks/src/_common/transformers/html.ts | 2 +- .../src/_common/transformers/markdown.ts | 10 +- .../src/_common/transformers/middlewares.ts | 5 +- .../blocks/src/_common/transformers/zip.ts | 24 ++-- .../common/datasource/all-doc-datasource.ts | 4 +- .../datasource/database-block-datasource.ts | 2 +- .../common/datasource/datasource-manager.ts | 2 +- .../common/datasource/tags-datasource.ts | 4 +- .../embed-linked-doc-block.ts | 2 +- .../components/embed-synced-doc-card.ts | 2 +- .../edgeless/controllers/clipboard.ts | 2 +- .../edgeless/services/template-middlewares.ts | 4 +- .../root-block/edgeless/services/template.ts | 4 +- .../remote-color-manager.ts | 2 +- packages/blocks/src/root-block/root-model.ts | 4 +- .../root-block/widgets/format-bar/config.ts | 4 +- .../root-block/widgets/linked-doc/config.ts | 4 +- .../linked-doc/import-doc/import-doc.ts | 6 +- .../widgets/linked-doc/linked-doc-popover.ts | 4 +- .../root-block/widgets/slash-menu/config.ts | 2 +- packages/docs/guide/store.md | 16 +-- .../block-std/src/clipboard/index.ts | 10 +- .../framework/lit/src/element/lit-host.ts | 2 +- .../src/__tests__/block-tree.unit.spec.ts | 14 +- .../store/src/__tests__/indexer.unit.spec.ts | 26 ++-- .../store/src/__tests__/schema.unit.spec.ts | 4 +- .../src/__tests__/transformer.unit.spec.ts | 8 +- .../src/__tests__/workspace.unit.spec.ts | 124 +++++++++--------- .../store/src/migration/migrate-workspace.ts | 4 +- packages/framework/store/src/schema/schema.ts | 4 +- packages/framework/store/src/store/doc.ts | 22 ++-- .../framework/store/src/transformer/job.ts | 52 ++++---- .../store/src/transformer/middleware.ts | 8 +- .../framework/store/src/transformer/slice.ts | 4 +- .../framework/store/src/transformer/type.ts | 4 +- .../apps/_common/components/docs-panel.ts | 12 +- packages/playground/apps/default/main.ts | 14 +- .../utils/{workspace.ts => collection.ts} | 28 ++-- packages/playground/apps/starter/main.ts | 14 +- .../utils/{workspace.ts => collection.ts} | 26 ++-- .../src/__tests__/main/snapshot.spec.ts | 4 +- packages/presets/src/__tests__/utils/setup.ts | 18 +-- .../bi-directional-link-panel.ts | 8 +- .../src/fragments/comment/comment-manager.ts | 2 +- .../src/fragments/copilot-panel/chat/chat.ts | 4 +- .../src/fragments/copilot-panel/chat/logic.ts | 4 +- .../fragments/copilot-panel/edgeless/logic.ts | 4 +- .../copilot-panel/utils/markdown-utils.ts | 8 +- .../fragments/doc-meta-tags/doc-meta-tags.ts | 8 +- .../src/fragments/doc-title/doc-title.ts | 2 +- .../outline-panel/card/outline-preview.ts | 2 +- packages/presets/src/helpers/index.ts | 4 +- 56 files changed, 287 insertions(+), 284 deletions(-) rename packages/playground/apps/default/utils/{workspace.ts => collection.ts} (78%) rename packages/playground/apps/starter/utils/{workspace.ts => collection.ts} (79%) diff --git a/packages/blocks/src/__tests__/database/database.unit.spec.ts b/packages/blocks/src/__tests__/database/database.unit.spec.ts index 7f0ed99586f9..d31c8881687f 100644 --- a/packages/blocks/src/__tests__/database/database.unit.spec.ts +++ b/packages/blocks/src/__tests__/database/database.unit.spec.ts @@ -32,8 +32,8 @@ function createTestOptions() { function createTestDoc(docId = 'doc0') { const options = createTestOptions(); - const workspace = new DocCollection(options); - const doc = workspace.createDoc({ id: docId }); + const collection = new DocCollection(options); + const doc = collection.createDoc({ id: docId }); doc.load(); return doc; } diff --git a/packages/blocks/src/_common/components/rich-text/keymap/container.ts b/packages/blocks/src/_common/components/rich-text/keymap/container.ts index f632919c1530..ecc9c3e433f7 100644 --- a/packages/blocks/src/_common/components/rich-text/keymap/container.ts +++ b/packages/blocks/src/_common/components/rich-text/keymap/container.ts @@ -422,7 +422,7 @@ export const bindContainerHotkey = (blockElement: BlockElement) => { }); inlineEditor.setInlineRange({ index: inlineRange.index - 1, length: 0 }); - const doc = createDefaultDoc(blockElement.doc.workspace, { + const doc = createDefaultDoc(blockElement.doc.collection, { title: docName, }); insertLinkedNode({ diff --git a/packages/blocks/src/_common/configs/quick-action/config.ts b/packages/blocks/src/_common/configs/quick-action/config.ts index 2794ac8ea82b..c9eaa78b38ab 100644 --- a/packages/blocks/src/_common/configs/quick-action/config.ts +++ b/packages/blocks/src/_common/configs/quick-action/config.ts @@ -131,7 +131,7 @@ export const quickActionConfig: QuickActionConfig[] = [ host.selection.clear(); const doc = host.doc; - const linkedDoc = doc.workspace.createDoc({}); + const linkedDoc = doc.collection.createDoc({}); linkedDoc.load(() => { const rootId = linkedDoc.addBlock('affine:page', { title: new doc.Text(''), @@ -158,7 +158,7 @@ export const quickActionConfig: QuickActionConfig[] = [ firstBlock.type.match(/^h[1-6]$/) ) { const title = firstBlock.text.toString(); - linkedDoc.workspace.setDocMeta(linkedDoc.id, { + linkedDoc.collection.setDocMeta(linkedDoc.id, { title, }); diff --git a/packages/blocks/src/_common/inline/presets/nodes/reference-node/reference-node.ts b/packages/blocks/src/_common/inline/presets/nodes/reference-node/reference-node.ts index ffdc1f5c6dc4..2748b6e54f06 100644 --- a/packages/blocks/src/_common/inline/presets/nodes/reference-node/reference-node.ts +++ b/packages/blocks/src/_common/inline/presets/nodes/reference-node/reference-node.ts @@ -149,7 +149,7 @@ export class AffineReference extends WithDisposable(ShadowlessElement) { const doc = this.doc; this._updateRefMeta(doc); this._disposables.add( - doc.workspace.slots.docUpdated.on(() => this._updateRefMeta(doc)) + doc.collection.slots.docUpdated.on(() => this._updateRefMeta(doc)) ); this.updateComplete @@ -166,7 +166,7 @@ export class AffineReference extends WithDisposable(ShadowlessElement) { const refAttribute = this.delta.attributes?.reference; assertExists(refAttribute, 'Failed to get reference attribute!'); this._refAttribute = refAttribute; - const refMeta = doc.workspace.meta.docMetas.find( + const refMeta = doc.collection.meta.docMetas.find( doc => doc.id === refAttribute.pageId ); this._refMeta = refMeta diff --git a/packages/blocks/src/_common/transformers/html.ts b/packages/blocks/src/_common/transformers/html.ts index 93ba725e061f..67950734cf52 100644 --- a/packages/blocks/src/_common/transformers/html.ts +++ b/packages/blocks/src/_common/transformers/html.ts @@ -5,7 +5,7 @@ import { HtmlAdapter } from '../adapters/index.js'; import { createAssetsArchive, download } from './utils.js'; async function exportDoc(doc: Doc) { - const job = new Job({ workspace: doc.workspace }); + const job = new Job({ collection: doc.collection }); const snapshot = await job.docToSnapshot(doc); const adapter = new HtmlAdapter(); const htmlResult = await adapter.fromDocSnapshot({ diff --git a/packages/blocks/src/_common/transformers/markdown.ts b/packages/blocks/src/_common/transformers/markdown.ts index 5dbd2486b5ed..1e13e3e75161 100644 --- a/packages/blocks/src/_common/transformers/markdown.ts +++ b/packages/blocks/src/_common/transformers/markdown.ts @@ -7,7 +7,7 @@ import { defaultImageProxyMiddleware } from './middlewares.js'; import { createAssetsArchive, download } from './utils.js'; async function exportDoc(doc: Doc) { - const job = new Job({ workspace: doc.workspace }); + const job = new Job({ collection: doc.collection }); const snapshot = await job.docToSnapshot(doc); const adapter = new MarkdownAdapter(); @@ -47,7 +47,7 @@ async function importMarkdown({ noteId, }: ImportMarkdownOptions) { const job = new Job({ - workspace: doc.workspace, + collection: doc.collection, middlewares: [defaultImageProxyMiddleware], }); const adapter = new MarkdownAdapter(); @@ -55,9 +55,9 @@ async function importMarkdown({ const snapshot = await adapter.toSliceSnapshot({ file: markdown, assets: job.assetsManager, - pageVersion: doc.workspace.meta.pageVersion!, - workspaceVersion: doc.workspace.meta.workspaceVersion!, - workspaceId: doc.workspace.id, + pageVersion: doc.collection.meta.pageVersion!, + workspaceVersion: doc.collection.meta.workspaceVersion!, + workspaceId: doc.collection.id, pageId: doc.id, }); diff --git a/packages/blocks/src/_common/transformers/middlewares.ts b/packages/blocks/src/_common/transformers/middlewares.ts index 41632b7a1175..ebd7fc7e2fbf 100644 --- a/packages/blocks/src/_common/transformers/middlewares.ts +++ b/packages/blocks/src/_common/transformers/middlewares.ts @@ -6,7 +6,10 @@ import type { ListBlockModel } from '../../list-block/index.js'; import type { ParagraphBlockModel } from '../../paragraph-block/index.js'; import { DEFAULT_IMAGE_PROXY_ENDPOINT } from '../consts.js'; -export const replaceIdMiddleware: JobMiddleware = ({ slots, workspace }) => { +export const replaceIdMiddleware: JobMiddleware = ({ + slots, + collection: workspace, +}) => { const idMap = new Map(); slots.afterImport.on(payload => { if ( diff --git a/packages/blocks/src/_common/transformers/zip.ts b/packages/blocks/src/_common/transformers/zip.ts index 70de37ba5d26..1d005764c29a 100644 --- a/packages/blocks/src/_common/transformers/zip.ts +++ b/packages/blocks/src/_common/transformers/zip.ts @@ -1,24 +1,24 @@ import { assertExists } from '@blocksuite/global/utils'; import type { + CollectionInfoSnapshot, Doc, DocCollection, DocSnapshot, JobMiddleware, - WorkspaceInfoSnapshot, } from '@blocksuite/store'; import { getAssetName, Job, sha } from '@blocksuite/store'; import JSZip from 'jszip'; import { replaceIdMiddleware } from './middlewares.js'; -async function exportDocs(workspace: DocCollection, docs: Doc[]) { +async function exportDocs(collection: DocCollection, docs: Doc[]) { const zip = new JSZip(); - const job = new Job({ workspace }); + const job = new Job({ collection }); const snapshots = await Promise.all(docs.map(job.docToSnapshot)); - const workspaceInfo = job.workspaceInfoToSnapshot(); - zip.file('info.json', JSON.stringify(workspaceInfo, null, 2)); + const collectionInfo = job.collectionInfoToSnapshot(); + zip.file('info.json', JSON.stringify(collectionInfo, null, 2)); snapshots.forEach(snapshot => { const snapshotName = `${snapshot.meta.id}.snapshot.json`; @@ -38,14 +38,14 @@ async function exportDocs(workspace: DocCollection, docs: Doc[]) { return zip.generateAsync({ type: 'blob' }); } -async function importDocs(workspace: DocCollection, imported: Blob) { +async function importDocs(collection: DocCollection, imported: Blob) { const zip = new JSZip(); const { files } = await zip.loadAsync(imported); const assetObjs: JSZip.JSZipObject[] = []; const snapshotsObjs: JSZip.JSZipObject[] = []; let infoObj: JSZip.JSZipObject | undefined; - let info: WorkspaceInfoSnapshot | undefined; + let info: CollectionInfoSnapshot | undefined; Object.entries(files).map(([name, fileObj]) => { if (name.includes('MACOSX') || name.includes('DS_Store')) { @@ -71,13 +71,13 @@ async function importDocs(workspace: DocCollection, imported: Blob) { { const json = await infoObj?.async('text'); assertExists(json); - info = JSON.parse(json) as WorkspaceInfoSnapshot; + info = JSON.parse(json) as CollectionInfoSnapshot; } - const migrationMiddleware: JobMiddleware = ({ slots, workspace }) => { + const migrationMiddleware: JobMiddleware = ({ slots, collection }) => { slots.afterImport.on(payload => { if (payload.type === 'page') { - workspace.schema.upgradeDoc( + collection.schema.upgradeDoc( info?.pageVersion ?? 0, {}, payload.page.spaceDoc @@ -86,12 +86,12 @@ async function importDocs(workspace: DocCollection, imported: Blob) { }); }; const job = new Job({ - workspace, + collection, middlewares: [replaceIdMiddleware, migrationMiddleware], }); const assetsMap = job.assets; - job.snapshotToWorkspaceInfo(info); + job.snapshotToCollectionInfo(info); await Promise.all( assetObjs.map(async fileObj => { diff --git a/packages/blocks/src/database-block/common/datasource/all-doc-datasource.ts b/packages/blocks/src/database-block/common/datasource/all-doc-datasource.ts index b75bf1d314dd..532b4e109160 100644 --- a/packages/blocks/src/database-block/common/datasource/all-doc-datasource.ts +++ b/packages/blocks/src/database-block/common/datasource/all-doc-datasource.ts @@ -64,8 +64,8 @@ export class AllDocDatasource extends BaseDataSource { constructor(host: EditorHost, _config: AllDocDatasourceConfig) { super(); - this.workspace = host.doc.workspace; - host.doc.workspace.meta.docMetaUpdated.pipe(this.slots.update); + this.workspace = host.doc.collection; + host.doc.collection.meta.docMetaUpdated.pipe(this.slots.update); } public cellChangeValue( diff --git a/packages/blocks/src/database-block/common/datasource/database-block-datasource.ts b/packages/blocks/src/database-block/common/datasource/database-block-datasource.ts index 381afbe67643..11a2d8de6b13 100644 --- a/packages/blocks/src/database-block/common/datasource/database-block-datasource.ts +++ b/packages/blocks/src/database-block/common/datasource/database-block-datasource.ts @@ -39,7 +39,7 @@ export class DatabaseBlockDatasource extends BaseDataSource { config: DatabaseBlockDatasourceConfig ) { super(); - this._model = host.doc.workspace + this._model = host.doc.collection .getDoc(config.pageId) ?.getBlockById(config.blockId) as DatabaseBlockModel; this._model.childrenUpdated.pipe(this.slots.update); diff --git a/packages/blocks/src/database-block/common/datasource/datasource-manager.ts b/packages/blocks/src/database-block/common/datasource/datasource-manager.ts index 3f172e4c03dc..f5a162185252 100644 --- a/packages/blocks/src/database-block/common/datasource/datasource-manager.ts +++ b/packages/blocks/src/database-block/common/datasource/datasource-manager.ts @@ -21,7 +21,7 @@ const datasourceMap: { } = { 'database-block': { title: (host: EditorHost, config: DatabaseBlockDatasourceConfig) => { - const dbblock = host.doc.workspace + const dbblock = host.doc.collection .getDoc(config.pageId) ?.getBlockById(config.blockId) as DatabaseBlockModel; return dbblock?.title.toString() ?? ''; diff --git a/packages/blocks/src/database-block/common/datasource/tags-datasource.ts b/packages/blocks/src/database-block/common/datasource/tags-datasource.ts index 34be36f62513..77f98b4aae3d 100644 --- a/packages/blocks/src/database-block/common/datasource/tags-datasource.ts +++ b/packages/blocks/src/database-block/common/datasource/tags-datasource.ts @@ -84,8 +84,8 @@ export class TagsDatasource extends BaseDataSource { constructor(host: EditorHost, _config: TagsDatasourceConfig) { super(); - this.meta = host.doc.workspace.meta; - host.doc.workspace.meta.docMetaUpdated.pipe(this.slots.update); + this.meta = host.doc.collection.meta; + host.doc.collection.meta.docMetaUpdated.pipe(this.slots.update); } public cellChangeValue( diff --git a/packages/blocks/src/embed-linked-doc-block/embed-linked-doc-block.ts b/packages/blocks/src/embed-linked-doc-block/embed-linked-doc-block.ts index 603dc48d5bf9..e2594c9481c6 100644 --- a/packages/blocks/src/embed-linked-doc-block/embed-linked-doc-block.ts +++ b/packages/blocks/src/embed-linked-doc-block/embed-linked-doc-block.ts @@ -294,7 +294,7 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockElement< const linkedDoc = this.linkedDoc; if (linkedDoc) { this.disposables.add( - linkedDoc.workspace.meta.docMetaUpdated.on(() => { + linkedDoc.collection.meta.docMetaUpdated.on(() => { this._load().catch(e => { console.error(e); this.isError = true; diff --git a/packages/blocks/src/embed-synced-doc-block/components/embed-synced-doc-card.ts b/packages/blocks/src/embed-synced-doc-block/components/embed-synced-doc-card.ts index 9c922df8e665..97c342acfc34 100644 --- a/packages/blocks/src/embed-synced-doc-block/components/embed-synced-doc-card.ts +++ b/packages/blocks/src/embed-synced-doc-block/components/embed-synced-doc-card.ts @@ -111,7 +111,7 @@ export class EmbedSyncedDocCard extends WithDisposable(ShadowlessElement) { } this.disposables.add( - syncedDoc.workspace.meta.docMetaUpdated.on(() => { + syncedDoc.collection.meta.docMetaUpdated.on(() => { renderLinkedDocInCard(this); }) ); diff --git a/packages/blocks/src/root-block/edgeless/controllers/clipboard.ts b/packages/blocks/src/root-block/edgeless/controllers/clipboard.ts index 1c62827fd909..b8c203c9b8b1 100644 --- a/packages/blocks/src/root-block/edgeless/controllers/clipboard.ts +++ b/packages/blocks/src/root-block/edgeless/controllers/clipboard.ts @@ -1250,7 +1250,7 @@ export async function prepareClipboardData( const selected = await Promise.all( selectedAll.map(async selected => { const job = new Job({ - workspace: std.workspace, + collection: std.workspace, }); if (isNoteBlock(selected)) { diff --git a/packages/blocks/src/root-block/edgeless/services/template-middlewares.ts b/packages/blocks/src/root-block/edgeless/services/template-middlewares.ts index d75104a7b7bd..8feeac4cda34 100644 --- a/packages/blocks/src/root-block/edgeless/services/template-middlewares.ts +++ b/packages/blocks/src/root-block/edgeless/services/template-middlewares.ts @@ -22,7 +22,7 @@ export const replaceIdMiddleware = (job: TemplateJob) => { const { blockJson } = data; const newId = regeneratedIdMap.has(blockJson.id) ? regeneratedIdMap.get(blockJson.id)! - : job.model.doc.workspace.idGenerator(); + : job.model.doc.collection.idGenerator(); if (!regeneratedIdMap.has(blockJson.id)) { regeneratedIdMap.set(blockJson.id, newId); @@ -64,7 +64,7 @@ export const replaceIdMiddleware = (job: TemplateJob) => { }); blockJson.children.forEach(block => { - regeneratedIdMap.set(block.id, job.model.doc.workspace.idGenerator()); + regeneratedIdMap.set(block.id, job.model.doc.collection.idGenerator()); }); defered.forEach(id => { diff --git a/packages/blocks/src/root-block/edgeless/services/template.ts b/packages/blocks/src/root-block/edgeless/services/template.ts index d8bee9736532..0eef8c5bfb98 100644 --- a/packages/blocks/src/root-block/edgeless/services/template.ts +++ b/packages/blocks/src/root-block/edgeless/services/template.ts @@ -89,7 +89,7 @@ export class TemplateJob { }; constructor({ model, type, middlewares }: TemplateJobConfig) { - this.job = new Job({ workspace: model.doc.workspace, middlewares: [] }); + this.job = new Job({ collection: model.doc.collection, middlewares: [] }); this.model = model; this.type = TEMPLATE_TYPES.includes(type as TemplateType) ? (type as TemplateType) @@ -120,7 +120,7 @@ export class TemplateJob { to: Y.Map> ) { const schema = - this.model.doc.workspace.schema.flavourSchemaMap.get('affine:surface'); + this.model.doc.collection.schema.flavourSchemaMap.get('affine:surface'); const surfaceTransformer = schema?.transformer?.() as SurfaceBlockTransformer; diff --git a/packages/blocks/src/root-block/remote-color-manager/remote-color-manager.ts b/packages/blocks/src/root-block/remote-color-manager/remote-color-manager.ts index 610e1ee7c7e9..67c3e274cfee 100644 --- a/packages/blocks/src/root-block/remote-color-manager/remote-color-manager.ts +++ b/packages/blocks/src/root-block/remote-color-manager/remote-color-manager.ts @@ -4,7 +4,7 @@ import { multiPlayersColor } from './color-picker.js'; export class RemoteColorManager { private get awareness() { - return this.host.doc.workspace.awarenessStore; + return this.host.doc.collection.awarenessStore; } private get rootService() { diff --git a/packages/blocks/src/root-block/root-model.ts b/packages/blocks/src/root-block/root-model.ts index 8eaa706ba38a..c6f72db42465 100644 --- a/packages/blocks/src/root-block/root-model.ts +++ b/packages/blocks/src/root-block/root-model.ts @@ -11,9 +11,9 @@ export class RootBlockModel extends BlockModel { this.created.on(() => { this.doc.slots.rootAdded.on(model => { if (model instanceof RootBlockModel) { - const newDocMeta = this.doc.workspace.meta.getDocMeta(model.doc.id); + const newDocMeta = this.doc.collection.meta.getDocMeta(model.doc.id); if (!newDocMeta || newDocMeta.title !== model.title.toString()) { - this.doc.workspace.setDocMeta(model.doc.id, { + this.doc.collection.setDocMeta(model.doc.id, { title: model.title.toString(), }); } diff --git a/packages/blocks/src/root-block/widgets/format-bar/config.ts b/packages/blocks/src/root-block/widgets/format-bar/config.ts index 22ff05009a27..10d8d112f781 100644 --- a/packages/blocks/src/root-block/widgets/format-bar/config.ts +++ b/packages/blocks/src/root-block/widgets/format-bar/config.ts @@ -175,7 +175,7 @@ export function toolbarDefaultConfig(toolbar: AffineFormatBarWidget) { host.selection.clear(); const doc = host.doc; - const linkedDoc = doc.workspace.createDoc({}); + const linkedDoc = doc.collection.createDoc({}); linkedDoc.load(() => { const rootId = linkedDoc.addBlock('affine:page', { title: new doc.Text(''), @@ -202,7 +202,7 @@ export function toolbarDefaultConfig(toolbar: AffineFormatBarWidget) { firstBlock.type.match(/^h[1-6]$/) ) { const title = firstBlock.text.toString(); - linkedDoc.workspace.setDocMeta(linkedDoc.id, { + linkedDoc.collection.setDocMeta(linkedDoc.id, { title, }); diff --git a/packages/blocks/src/root-block/widgets/linked-doc/config.ts b/packages/blocks/src/root-block/widgets/linked-doc/config.ts index 4ab4464a187d..e5f93be999ed 100644 --- a/packages/blocks/src/root-block/widgets/linked-doc/config.ts +++ b/packages/blocks/src/root-block/widgets/linked-doc/config.ts @@ -110,7 +110,7 @@ export const getMenus: (ctx: { icon: NewDocIcon, action: () => { const docName = query; - const newDoc = createDefaultDoc(doc.workspace, { + const newDoc = createDefaultDoc(doc.collection, { title: docName, }); insertLinkedNode({ @@ -147,7 +147,7 @@ export const getMenus: (ctx: { toast(editorHost, message); }; showImportModal({ - workspace: doc.workspace, + workspace: doc.collection, onSuccess, onFail, }); diff --git a/packages/blocks/src/root-block/widgets/linked-doc/import-doc/import-doc.ts b/packages/blocks/src/root-block/widgets/linked-doc/import-doc/import-doc.ts index 6b0703087243..85aec94f1fd2 100644 --- a/packages/blocks/src/root-block/widgets/linked-doc/import-doc/import-doc.ts +++ b/packages/blocks/src/root-block/widgets/linked-doc/import-doc/import-doc.ts @@ -32,7 +32,7 @@ const SHOW_LOADING_SIZE = 1024 * 200; export async function importMarkDown(workspace: DocCollection, text: string) { const job = new Job({ - workspace: workspace, + collection: workspace, middlewares: [defaultImageProxyMiddleware], }); const mdAdapter = new MarkdownAdapter(); @@ -47,7 +47,7 @@ export async function importMarkDown(workspace: DocCollection, text: string) { export async function importHtml(workspace: DocCollection, text: string) { const job = new Job({ - workspace: workspace, + collection: workspace, middlewares: [defaultImageProxyMiddleware], }); const htmlAdapter = new NotionHtmlAdapter(); @@ -112,7 +112,7 @@ export async function importNotion(workspace: DocCollection, file: File) { } const pagePromises = Array.from(pageMap.keys()).map(async file => { const job = new Job({ - workspace: workspace, + collection: workspace, middlewares: [defaultImageProxyMiddleware], }); const htmlAdapter = new NotionHtmlAdapter(); diff --git a/packages/blocks/src/root-block/widgets/linked-doc/linked-doc-popover.ts b/packages/blocks/src/root-block/widgets/linked-doc/linked-doc-popover.ts index 8e47d1e5ff58..5c75dc6cb9c1 100644 --- a/packages/blocks/src/root-block/widgets/linked-doc/linked-doc-popover.ts +++ b/packages/blocks/src/root-block/widgets/linked-doc/linked-doc-popover.ts @@ -56,7 +56,7 @@ export class LinkedDocPopover extends WithDisposable(LitElement) { query: this._query, doc: this._doc, model: this.model, - docMetas: this._doc.workspace.meta.docMetas, + docMetas: this._doc.collection.meta.docMetas, }); } @@ -85,7 +85,7 @@ export class LinkedDocPopover extends WithDisposable(LitElement) { // init this._updateActionList(); this._disposables.add( - this.model.doc.workspace.slots.docUpdated.on(() => { + this.model.doc.collection.slots.docUpdated.on(() => { this._updateActionList(); }) ); diff --git a/packages/blocks/src/root-block/widgets/slash-menu/config.ts b/packages/blocks/src/root-block/widgets/slash-menu/config.ts index 1a3f16e35f06..3a42f98c817b 100644 --- a/packages/blocks/src/root-block/widgets/slash-menu/config.ts +++ b/packages/blocks/src/root-block/widgets/slash-menu/config.ts @@ -174,7 +174,7 @@ export const menuGroups: SlashMenuOptions['menus'] = [ name: 'New Doc', icon: NewDocIcon, action: ({ rootElement, model }) => { - const newDoc = createDefaultDoc(rootElement.doc.workspace); + const newDoc = createDefaultDoc(rootElement.doc.collection); insertContent(rootElement.host, model, REFERENCE_NODE, { reference: { type: 'LinkedPage', diff --git a/packages/docs/guide/store.md b/packages/docs/guide/store.md index c81b4de5a201..1f4c2977a9c6 100644 --- a/packages/docs/guide/store.md +++ b/packages/docs/guide/store.md @@ -10,38 +10,38 @@ Besides the block tree, the [selection](./selection) state is also stored in the ## `Workspace` -In BlockSuite, a [`Workspace`](/api/@blocksuite/store/classes/Workspace.html) is defined as an opt-in collection of multiple docs, providing comprehensive features for managing cross-doc updates and data synchronization. You can access the workspace via the `doc.workspace` getter, or you can also create a workspace manually: +In BlockSuite, a [`DocCollection`](/api/@blocksuite/store/classes/DocCollection.html) is defined as an opt-in collection of multiple docs, providing comprehensive features for managing cross-doc updates and data synchronization. You can access the workspace via the `doc.collection` getter, or you can also create a workspace manually: ```ts -import { Workspace, Schema } from '@blocksuite/store'; +import { DocCollection, Schema } from '@blocksuite/store'; const schema = new Schema(); // You can register a batch of block schemas to the workspace schema.register(AffineSchemas); -const workspace = new Workspace({ schema }); +const collection = new DocCollection({ schema }); ``` Then multiple `doc`s can be created under the workspace: ```ts -const workspace = new Workspace({ schema }); +const collection = new DocCollection({ schema }); // This is an empty doc at this moment -const doc = workspace.createDoc(); +const doc = collection.createDoc(); ``` As an example, the `createEmptyDoc` is a simple helper implemented exactly in this way ([source](https://github.com/toeverything/blocksuite/blob/master/packages/presets/src/helpers/index.ts)): ```ts import { AffineSchemas } from '@blocksuite/blocks/models'; -import { Schema, Workspace } from '@blocksuite/store'; +import { Schema, DocCollection } from '@blocksuite/store'; export function createEmptyDoc() { const schema = new Schema().register(AffineSchemas); - const workspace = new Workspace({ schema }); - const doc = workspace.createDoc(); + const collection = new DocCollection({ schema }); + const doc = collection.createDoc(); return { doc, diff --git a/packages/framework/block-std/src/clipboard/index.ts b/packages/framework/block-std/src/clipboard/index.ts index 2e5223678dd6..ca98c1553d72 100644 --- a/packages/framework/block-std/src/clipboard/index.ts +++ b/packages/framework/block-std/src/clipboard/index.ts @@ -42,7 +42,7 @@ export class Clipboard { private _getJob() { return new Job({ middlewares: this._jobMiddlewares, - workspace: this.std.workspace, + collection: this.std.workspace, }); } @@ -112,10 +112,10 @@ export class Clipboard { const payload = { file: item, assets: job.assetsManager, - blockVersions: doc.workspace.meta.blockVersions, - pageVersion: doc.workspace.meta.pageVersion, - workspaceVersion: doc.workspace.meta.workspaceVersion, - workspaceId: doc.workspace.id, + blockVersions: doc.collection.meta.blockVersions, + pageVersion: doc.collection.meta.pageVersion, + workspaceVersion: doc.collection.meta.workspaceVersion, + workspaceId: doc.collection.id, pageId: doc.id, }; const sliceSnapshot = await adapter.toSliceSnapshot(payload); diff --git a/packages/framework/lit/src/element/lit-host.ts b/packages/framework/lit/src/element/lit-host.ts index d21024a42cc9..fc2d2df7708a 100644 --- a/packages/framework/lit/src/element/lit-host.ts +++ b/packages/framework/lit/src/element/lit-host.ts @@ -114,7 +114,7 @@ export class EditorHost extends WithDisposable(ShadowlessElement) { this.std = new BlockStdScope({ host: this, - workspace: this.doc.workspace, + workspace: this.doc.collection, doc: this.doc, }); this._registerView(); diff --git a/packages/framework/store/src/__tests__/block-tree.unit.spec.ts b/packages/framework/store/src/__tests__/block-tree.unit.spec.ts index c336c0b7406e..28b67a38df79 100644 --- a/packages/framework/store/src/__tests__/block-tree.unit.spec.ts +++ b/packages/framework/store/src/__tests__/block-tree.unit.spec.ts @@ -25,14 +25,14 @@ function createTestOptions() { const idGenerator = Generator.AutoIncrement; const schema = new Schema(); schema.register([docSchema]); - return { id: 'test-workspace', idGenerator, schema }; + return { id: 'test-collection', idGenerator, schema }; } test('trigger props updated', () => { const options = createTestOptions(); - const workspace = new DocCollection(options); + const collection = new DocCollection(options); - const doc = workspace.createDoc({ id: 'home' }); + const doc = collection.createDoc({ id: 'home' }); doc.load(); doc.addBlock('page'); @@ -89,9 +89,9 @@ test('trigger props updated', () => { test('stash and pop', () => { const options = createTestOptions(); - const workspace = new DocCollection(options); + const collection = new DocCollection(options); - const doc = workspace.createDoc({ id: 'home' }); + const doc = collection.createDoc({ id: 'home' }); doc.load(); doc.addBlock('page'); @@ -158,9 +158,9 @@ test('stash and pop', () => { test('always get latest value in onChange', () => { const options = createTestOptions(); - const workspace = new DocCollection(options); + const collection = new DocCollection(options); - const doc = workspace.createDoc({ id: 'home' }); + const doc = collection.createDoc({ id: 'home' }); doc.load(); doc.addBlock('page'); diff --git a/packages/framework/store/src/__tests__/indexer.unit.spec.ts b/packages/framework/store/src/__tests__/indexer.unit.spec.ts index d22f16759eb1..65e9cd7f8948 100644 --- a/packages/framework/store/src/__tests__/indexer.unit.spec.ts +++ b/packages/framework/store/src/__tests__/indexer.unit.spec.ts @@ -57,7 +57,7 @@ beforeEach(() => { describe('workspace.search works', () => { it('workspace search matching', () => { const doc = createTestDoc(); - const workspace = doc.workspace; + const collection = doc.collection; const rootId = doc.addBlock('affine:page', { title: new doc.Text(''), @@ -102,18 +102,18 @@ describe('workspace.search works', () => { requestIdleCallback(() => { queueMicrotask(() => { - expect(workspace.search('ๅค„็†ๅ™จ')).toStrictEqual(expected1); - expect(workspace.search('็ดขๅฐผ')).toStrictEqual(expected2); + expect(collection.search('ๅค„็†ๅ™จ')).toStrictEqual(expected1); + expect(collection.search('็ดขๅฐผ')).toStrictEqual(expected2); }); }); const update = encodeStateAsUpdate(doc.spaceDoc); const schema = new Schema(); - const workspace2 = new DocCollection({ + const collection2 = new DocCollection({ schema, id: 'test', }); - const doc2 = workspace2.createDoc({ + const doc2 = collection2.createDoc({ id: 'doc:home', }); applyUpdate(doc2.spaceDoc, update); @@ -121,8 +121,8 @@ describe('workspace.search works', () => { requestIdleCallback(() => { queueMicrotask(() => { - expect(workspace2.search('ๅค„็†ๅ™จ')).toStrictEqual(expected1); - expect(workspace2.search('็ดขๅฐผ')).toStrictEqual(expected2); + expect(collection2.search('ๅค„็†ๅ™จ')).toStrictEqual(expected1); + expect(collection2.search('็ดขๅฐผ')).toStrictEqual(expected2); }); }); }); @@ -131,9 +131,9 @@ describe('workspace.search works', () => { describe('backlink works', () => { it('backlink indexer works with subpage', async () => { const doc = createTestDoc(); - const workspace = doc.workspace; - const subpage = createTestDoc('doc1', workspace); - const backlinkIndexer = workspace.indexer.backlink; + const collection = doc.collection; + const subpage = createTestDoc('doc1', collection); + const backlinkIndexer = collection.indexer.backlink; const rootId = doc.addBlock('affine:page', { title: new doc.Text(''), @@ -175,9 +175,9 @@ describe('backlink works', () => { it('backlink indexer works with linked doc', async () => { const doc0 = createTestDoc(); - const workspace = doc0.workspace; - const doc1 = createTestDoc('space:doc1', workspace); - const backlinkIndexer = workspace.indexer.backlink; + const collection = doc0.collection; + const doc1 = createTestDoc('space:doc1', collection); + const backlinkIndexer = collection.indexer.backlink; const doc0Id = doc0.addBlock('affine:page'); const note0Id = doc0.addBlock('affine:note', {}, doc0Id); diff --git a/packages/framework/store/src/__tests__/schema.unit.spec.ts b/packages/framework/store/src/__tests__/schema.unit.spec.ts index 33a482cdf0f5..a9aac1cfad0d 100644 --- a/packages/framework/store/src/__tests__/schema.unit.spec.ts +++ b/packages/framework/store/src/__tests__/schema.unit.spec.ts @@ -63,8 +63,8 @@ const BlockSchemas = [ const defaultDocId = 'doc0'; function createTestDoc(docId = defaultDocId) { const options = createTestOptions(); - const workspace = new DocCollection(options); - const doc = workspace.createDoc({ id: docId }); + const collection = new DocCollection(options); + const doc = collection.createDoc({ id: docId }); doc.load(); return doc; } diff --git a/packages/framework/store/src/__tests__/transformer.unit.spec.ts b/packages/framework/store/src/__tests__/transformer.unit.spec.ts index 26ed678c62a6..6e7ec4c2d96f 100644 --- a/packages/framework/store/src/__tests__/transformer.unit.spec.ts +++ b/packages/framework/store/src/__tests__/transformer.unit.spec.ts @@ -56,8 +56,8 @@ const assets = new AssetsManager({ blob: blobManager }); test('model to snapshot', () => { const options = createTestOptions(); - const workspace = new DocCollection(options); - const doc = workspace.createDoc({ id: 'home' }); + const collection = new DocCollection(options); + const doc = collection.createDoc({ id: 'home' }); doc.load(); doc.addBlock('page'); const rootModel = doc.root as RootBlockModel; @@ -72,8 +72,8 @@ test('model to snapshot', () => { test('snapshot to model', async () => { const options = createTestOptions(); - const workspace = new DocCollection(options); - const doc = workspace.createDoc({ id: 'home' }); + const collection = new DocCollection(options); + const doc = collection.createDoc({ id: 'home' }); doc.load(); doc.addBlock('page'); const rootModel = doc.root as RootBlockModel; diff --git a/packages/framework/store/src/__tests__/workspace.unit.spec.ts b/packages/framework/store/src/__tests__/workspace.unit.spec.ts index 8fdaecdc9af1..3de122ee776a 100644 --- a/packages/framework/store/src/__tests__/workspace.unit.spec.ts +++ b/packages/framework/store/src/__tests__/workspace.unit.spec.ts @@ -62,8 +62,8 @@ function createRoot(doc: Doc) { function createTestDoc(docId = defaultDocId) { const options = createTestOptions(); - const workspace = new DocCollection(options); - const doc = workspace.createDoc({ id: docId }); + const collection = new DocCollection(options); + const doc = collection.createDoc({ id: docId }); doc.load(); return doc; } @@ -93,15 +93,15 @@ beforeEach(() => { describe('basic', () => { it('can init workspace', () => { const options = createTestOptions(); - const workspace = new DocCollection(options); - assert.equal(workspace.isEmpty, true); + const collection = new DocCollection(options); + assert.equal(collection.isEmpty, true); - const doc = workspace.createDoc({ id: 'doc:home' }); + const doc = collection.createDoc({ id: 'doc:home' }); doc.load(); - const actual = serializeWorkspace(workspace.doc); + const actual = serializeWorkspace(collection.doc); const actualDoc = actual[spaceMetaId].pages[0] as DocMeta; - assert.equal(workspace.isEmpty, false); + assert.equal(collection.isEmpty, false); assert.equal(typeof actualDoc.createDate, 'number'); // @ts-ignore delete actualDoc.createDate; @@ -134,26 +134,26 @@ describe('basic', () => { it('init workspace with custom id generator', () => { const options = createTestOptions(); let id = 100; - const workspace = new DocCollection({ + const collection = new DocCollection({ ...options, idGenerator: () => { return String(id++); }, }); { - const doc = workspace.createDoc(); + const doc = collection.createDoc(); assert.equal(doc.id, '100'); } { - const doc = workspace.createDoc(); + const doc = collection.createDoc(); assert.equal(doc.id, '101'); } }); it('doc ready lifecycle', () => { const options = createTestOptions(); - const workspace = new DocCollection(options); - const doc = workspace.createDoc({ + const collection = new DocCollection(options); + const doc = collection.createDoc({ id: 'space:0', }); @@ -179,9 +179,9 @@ describe('basic', () => { it('workspace docs with yjs applyUpdate', () => { const options = createTestOptions(); - const workspace = new DocCollection(options); - const workspace2 = new DocCollection(options); - const doc = workspace.createDoc({ + const collection = new DocCollection(options); + const collection2 = new DocCollection(options); + const doc = collection.createDoc({ id: 'space:0', }); doc.load(() => { @@ -194,27 +194,27 @@ describe('basic', () => { expect(added.size).toBe(1); }); // only apply root update - workspace2.doc.once('subdocs', subdocsTester); + collection2.doc.once('subdocs', subdocsTester); expect(subdocsTester).toBeCalledTimes(0); - expect(workspace2.docs.size).toBe(0); - const update = encodeStateAsUpdate(workspace.doc); - applyUpdate(workspace2.doc, update); - expect(workspace2.doc.toJSON()['spaces']).toEqual({ + expect(collection2.docs.size).toBe(0); + const update = encodeStateAsUpdate(collection.doc); + applyUpdate(collection2.doc, update); + expect(collection2.doc.toJSON()['spaces']).toEqual({ 'space:0': { blocks: {}, }, }); - expect(workspace2.docs.size).toBe(1); + expect(collection2.docs.size).toBe(1); expect(subdocsTester).toBeCalledTimes(1); } { // apply doc update const update = encodeStateAsUpdate(doc.spaceDoc); - expect(workspace2.docs.size).toBe(1); - const doc2 = workspace2.getDoc('space:0'); + expect(collection2.docs.size).toBe(1); + const doc2 = collection2.getDoc('space:0'); assertExists(doc2); applyUpdate(doc2.spaceDoc, update); - expect(workspace2.doc.toJSON()['spaces']).toEqual({ + expect(collection2.doc.toJSON()['spaces']).toEqual({ 'space:0': { blocks: { '0': { @@ -230,7 +230,7 @@ describe('basic', () => { const fn = vi.fn(({ loaded }) => { expect(loaded.size).toBe(1); }); - workspace2.doc.once('subdocs', fn); + collection2.doc.once('subdocs', fn); expect(fn).toBeCalledTimes(0); doc2.load(); expect(fn).toBeCalledTimes(1); @@ -368,45 +368,45 @@ describe('addBlock', () => { it('can add and remove multi docs', async () => { const options = createTestOptions(); - const workspace = new DocCollection(options); + const collection = new DocCollection(options); - const doc0 = workspace.createDoc({ id: 'doc:home' }); - const doc1 = workspace.createDoc({ id: 'space:doc1' }); + const doc0 = collection.createDoc({ id: 'doc:home' }); + const doc1 = collection.createDoc({ id: 'space:doc1' }); await Promise.all([doc0.load(), doc1.load()]); - assert.equal(workspace.docs.size, 2); + assert.equal(collection.docs.size, 2); doc0.addBlock('affine:page', { title: new doc0.Text(), }); - workspace.removeDoc(doc0.id); + collection.removeDoc(doc0.id); - assert.equal(workspace.docs.size, 1); + assert.equal(collection.docs.size, 1); assert.equal( serializeWorkspace(doc0.rootDoc).spaces['doc:home'], undefined ); - workspace.removeDoc(doc1.id); - assert.equal(workspace.docs.size, 0); + collection.removeDoc(doc1.id); + assert.equal(collection.docs.size, 0); }); it('can remove doc that has not been loaded', () => { const options = createTestOptions(); - const workspace = new DocCollection(options); + const collection = new DocCollection(options); - const doc0 = workspace.createDoc({ id: 'doc:home' }); + const doc0 = collection.createDoc({ id: 'doc:home' }); - workspace.removeDoc(doc0.id); - assert.equal(workspace.docs.size, 0); + collection.removeDoc(doc0.id); + assert.equal(collection.docs.size, 0); }); it('can set doc state', () => { const options = createTestOptions(); - const workspace = new DocCollection(options); - workspace.createDoc({ id: 'doc:home' }); + const collection = new DocCollection(options); + collection.createDoc({ id: 'doc:home' }); assert.deepEqual( - workspace.meta.docMetas.map(({ id, title }) => ({ + collection.meta.docMetas.map(({ id, title }) => ({ id, title, })), @@ -419,15 +419,15 @@ describe('addBlock', () => { ); let called = false; - workspace.meta.docMetaUpdated.on(() => { + collection.meta.docMetaUpdated.on(() => { called = true; }); // @ts-ignore - workspace.setDocMeta('doc:home', { favorite: true }); + collection.setDocMeta('doc:home', { favorite: true }); assert.deepEqual( // @ts-ignore - workspace.meta.docMetas.map(({ id, title, favorite }) => ({ + collection.meta.docMetas.map(({ id, title, favorite }) => ({ id, title, favorite, @@ -445,15 +445,15 @@ describe('addBlock', () => { it('can set workspace common meta fields', async () => { const options = createTestOptions(); - const workspace = new DocCollection(options); + const collection = new DocCollection(options); - queueMicrotask(() => workspace.meta.setName('hello')); - await waitOnce(workspace.meta.commonFieldsUpdated); - assert.deepEqual(workspace.meta.name, 'hello'); + queueMicrotask(() => collection.meta.setName('hello')); + await waitOnce(collection.meta.commonFieldsUpdated); + assert.deepEqual(collection.meta.name, 'hello'); - queueMicrotask(() => workspace.meta.setAvatar('gengar.jpg')); - await waitOnce(workspace.meta.commonFieldsUpdated); - assert.deepEqual(workspace.meta.avatar, 'gengar.jpg'); + queueMicrotask(() => collection.meta.setAvatar('gengar.jpg')); + await waitOnce(collection.meta.commonFieldsUpdated); + assert.deepEqual(collection.meta.avatar, 'gengar.jpg'); }); }); @@ -831,12 +831,12 @@ describe('getBlock', () => { describe('workspace.exportJSX works', () => { it('workspace matches snapshot', () => { const options = createTestOptions(); - const workspace = new DocCollection(options); - const doc = workspace.createDoc({ id: 'doc:home' }); + const collection = new DocCollection(options); + const doc = collection.createDoc({ id: 'doc:home' }); doc.addBlock('affine:page', { title: new doc.Text('hello') }); - expect(workspace.exportJSX()).toMatchInlineSnapshot(` + expect(collection.exportJSX()).toMatchInlineSnapshot(` @@ -845,16 +845,16 @@ describe('workspace.exportJSX works', () => { it('empty workspace matches snapshot', () => { const options = createTestOptions(); - const workspace = new DocCollection(options); - workspace.createDoc({ id: 'doc:home' }); + const collection = new DocCollection(options); + collection.createDoc({ id: 'doc:home' }); - expect(workspace.exportJSX()).toMatchInlineSnapshot('null'); + expect(collection.exportJSX()).toMatchInlineSnapshot('null'); }); it('workspace with multiple blocks children matches snapshot', () => { const options = createTestOptions(); - const workspace = new DocCollection(options); - const doc = workspace.createDoc({ id: 'doc:home' }); + const collection = new DocCollection(options); + const doc = collection.createDoc({ id: 'doc:home' }); doc.load(() => { const rootId = doc.addBlock('affine:page', { title: new doc.Text(), @@ -864,7 +864,7 @@ describe('workspace.exportJSX works', () => { doc.addBlock('affine:paragraph', {}, noteId); }); - expect(workspace.exportJSX()).toMatchInlineSnapshot(/* xml */ ` + expect(collection.exportJSX()).toMatchInlineSnapshot(/* xml */ ` { describe('workspace search', () => { it('search doc meta title', () => { const options = createTestOptions(); - const workspace = new DocCollection(options); - const doc = workspace.createDoc({ id: 'doc:home' }); + const collection = new DocCollection(options); + const doc = collection.createDoc({ id: 'doc:home' }); doc.load(() => { const rootId = doc.addBlock('affine:page', { title: new doc.Text('test123'), @@ -893,7 +893,7 @@ describe('workspace search', () => { }); requestIdleCallback(() => { - const result = workspace.search('test'); + const result = collection.search('test'); expect(result).toMatchInlineSnapshot(` Map { "0" => { diff --git a/packages/framework/store/src/migration/migrate-workspace.ts b/packages/framework/store/src/migration/migrate-workspace.ts index 9d40e82cf786..8f19bcc1372d 100644 --- a/packages/framework/store/src/migration/migrate-workspace.ts +++ b/packages/framework/store/src/migration/migrate-workspace.ts @@ -1,12 +1,12 @@ import type * as Y from 'yjs'; -interface IWorkspaceMigration { +interface ICollctionMigration { desc: string; condition: (rootDoc: Y.Doc) => boolean; migrate: (rootDoc: Y.Doc) => void; } -export const workspaceMigrations: IWorkspaceMigration[] = [ +export const collectionMigrations: ICollctionMigration[] = [ { desc: 'add pageVersion in meta', condition: (rootDoc: Y.Doc) => { diff --git a/packages/framework/store/src/schema/schema.ts b/packages/framework/store/src/schema/schema.ts index e76112ca270e..bee99027b03b 100644 --- a/packages/framework/store/src/schema/schema.ts +++ b/packages/framework/store/src/schema/schema.ts @@ -3,7 +3,7 @@ import { minimatch } from 'minimatch'; import type * as Y from 'yjs'; import { SCHEMA_NOT_FOUND_MESSAGE } from '../consts.js'; -import { docMigrations, workspaceMigrations } from '../migration/index.js'; +import { collectionMigrations, docMigrations } from '../migration/index.js'; import { Block } from '../store/block/block.js'; import type { BlockSchemaType } from './base.js'; import { BlockSchema } from './base.js'; @@ -108,7 +108,7 @@ export class Schema { upgradeWorkspace = (rootData: Y.Doc) => { this._upgradeBlockVersions(rootData); - workspaceMigrations.forEach(migration => { + collectionMigrations.forEach(migration => { try { if (migration.condition(rootData)) { migration.migrate(rootData); diff --git a/packages/framework/store/src/store/doc.ts b/packages/framework/store/src/store/doc.ts index 59b511530493..2666abd4121b 100644 --- a/packages/framework/store/src/store/doc.ts +++ b/packages/framework/store/src/store/doc.ts @@ -35,7 +35,7 @@ type DocOptions = { }; export class Doc extends Space { - private readonly _workspace: DocCollection; + private readonly _collection: DocCollection; private readonly _idGenerator: IdGenerator; private readonly _blockTree: BlockTree; private _history!: Y.UndoManager; @@ -90,7 +90,7 @@ export class Doc extends Space { idGenerator = uuidv4, }: DocOptions) { super(id, doc, awarenessStore); - this._workspace = workspace; + this._collection = workspace; this._idGenerator = idGenerator; this._blockTree = new BlockTree({ schema: workspace.schema, @@ -110,20 +110,20 @@ export class Doc extends Space { return this._history; } - get workspace() { - return this._workspace; + get collection() { + return this._collection; } get schema() { - return this.workspace.schema; + return this.collection.schema; } get meta() { - return this.workspace.meta.getDocMeta(this.id); + return this.collection.meta.getDocMeta(this.id); } get blob() { - return this.workspace.blob; + return this.collection.blob; } get root() { @@ -659,7 +659,7 @@ export class Doc extends Space { super.load(); - if ((this.workspace.meta.docs?.length ?? 0) <= 1) { + if ((this.collection.meta.docs?.length ?? 0) <= 1) { this._handleVersion(); } @@ -807,12 +807,12 @@ export class Doc extends Space { private _handleVersion() { // Initialization from empty yDoc, indicating that the document is new. - if (!this.workspace.meta.hasVersion) { - this.workspace.meta.writeVersion(this.workspace); + if (!this.collection.meta.hasVersion) { + this.collection.meta.writeVersion(this.collection); } else { // Initialization from existing yDoc, indicating that the document is loaded from storage. if (this.awarenessStore.getFlag('enable_legacy_validation')) { - this.workspace.meta.validateVersion(this.workspace); + this.collection.meta.validateVersion(this.collection); } } } diff --git a/packages/framework/store/src/transformer/job.ts b/packages/framework/store/src/transformer/job.ts index 8ccb94a035e4..266831eff2cd 100644 --- a/packages/framework/store/src/transformer/job.ts +++ b/packages/framework/store/src/transformer/job.ts @@ -17,24 +17,24 @@ import type { import { Slice } from './slice.js'; import type { BlockSnapshot, + CollectionInfoSnapshot, DocSnapshot, SliceSnapshot, - WorkspaceInfoSnapshot, } from './type.js'; import { BlockSnapshotSchema, + CollectionInfoSnapshotSchema, DocSnapshotSchema, SliceSnapshotSchema, - WorkspaceInfoSnapshotSchema, } from './type.js'; export type JobConfig = { - workspace: DocCollection; + collection: DocCollection; middlewares?: JobMiddleware[]; }; export class Job { - private readonly _workspace: DocCollection; + private readonly _collection: DocCollection; private readonly _assetsManager: AssetsManager; private readonly _adapterConfigs: Map = new Map(); @@ -45,15 +45,15 @@ export class Job { afterExport: new Slot(), }; - constructor({ workspace, middlewares = [] }: JobConfig) { - this._workspace = workspace; - this._assetsManager = new AssetsManager({ blob: workspace.blob }); + constructor({ collection, middlewares = [] }: JobConfig) { + this._collection = collection; + this._assetsManager = new AssetsManager({ blob: collection.blob }); middlewares.forEach(middleware => { middleware({ slots: this._slots, assetsManager: this._assetsManager, - workspace: this._workspace, + collection: this._collection, adapterConfigs: this._adapterConfigs, }); }); @@ -76,7 +76,7 @@ export class Job { } private _getSchema(flavour: string) { - const schema = this._workspace.schema.flavourSchemaMap.get(flavour); + const schema = this._collection.schema.flavourSchemaMap.get(flavour); assertExists(schema, `Flavour schema not found for ${flavour}`); return schema; } @@ -85,8 +85,8 @@ export class Job { return schema.transformer?.() ?? new BaseBlockTransformer(); } - private _getWorkspaceMeta() { - const { meta } = this._workspace; + private _getCollectionMeta() { + const { meta } = this._collection; const { pageVersion, workspaceVersion, properties, docs } = meta; assertExists(pageVersion); assertExists(workspaceVersion); @@ -116,12 +116,12 @@ export class Job { const docMeta = doc.meta; assertExists(docMeta); - const workspaceTags = this._workspace.meta.properties.tags?.options; - assertExists(workspaceTags); + const collectionTags = this._collection.meta.properties.tags?.options; + assertExists(collectionTags); meta.tags.forEach(tag => { - const exists = workspaceTags.some(t => t.id === tag); + const exists = collectionTags.some(t => t.id === tag); if (!exists) { - throw new Error(`Tag ${tag} is not in workspace options`); + throw new Error(`Tag ${tag} is not in collection options`); } docMeta.tags.push(tag); }); @@ -289,7 +289,7 @@ export class Job { }); DocSnapshotSchema.parse(snapshot); const { meta, blocks } = snapshot; - const doc = this._workspace.createDoc({ id: meta.id }); + const doc = this._collection.createDoc({ id: meta.id }); doc.load(); this._importDocMeta(doc, meta); await this.snapshotToBlock(blocks, doc); @@ -302,37 +302,37 @@ export class Job { return doc; }; - workspaceInfoToSnapshot = (): WorkspaceInfoSnapshot => { + collectionInfoToSnapshot = (): CollectionInfoSnapshot => { this._slots.beforeExport.emit({ type: 'info', }); - const workspaceMeta = this._getWorkspaceMeta(); - const snapshot: WorkspaceInfoSnapshot = { + const collectionMeta = this._getCollectionMeta(); + const snapshot: CollectionInfoSnapshot = { type: 'info', - id: this._workspace.id, - ...workspaceMeta, + id: this._collection.id, + ...collectionMeta, }; this._slots.afterExport.emit({ type: 'info', snapshot, }); - WorkspaceInfoSnapshotSchema.parse(snapshot); + CollectionInfoSnapshotSchema.parse(snapshot); return snapshot; }; - snapshotToWorkspaceInfo = (snapshot: WorkspaceInfoSnapshot): void => { + snapshotToCollectionInfo = (snapshot: CollectionInfoSnapshot): void => { this._slots.beforeImport.emit({ type: 'info', snapshot, }); - WorkspaceInfoSnapshotSchema.parse(snapshot); + CollectionInfoSnapshotSchema.parse(snapshot); const { properties } = snapshot; - const currentProperties = this._workspace.meta.properties; + const currentProperties = this._collection.meta.properties; const newOptions = properties.tags?.options ?? []; const currentOptions = currentProperties.tags?.options ?? []; const options = new Set([...newOptions, ...currentOptions]); - this._workspace.meta.setProperties({ + this._collection.meta.setProperties({ tags: { options: Array.from(options), }, diff --git a/packages/framework/store/src/transformer/middleware.ts b/packages/framework/store/src/transformer/middleware.ts index b00b6fa1d34b..a850eb2113e0 100644 --- a/packages/framework/store/src/transformer/middleware.ts +++ b/packages/framework/store/src/transformer/middleware.ts @@ -6,9 +6,9 @@ import type { AssetsManager } from './assets.js'; import type { Slice } from './slice.js'; import type { BlockSnapshot, + CollectionInfoSnapshot, DocSnapshot, SliceSnapshot, - WorkspaceInfoSnapshot, } from './type.js'; export type BeforeImportPayload = @@ -27,7 +27,7 @@ export type BeforeImportPayload = type: 'page'; } | { - snapshot: WorkspaceInfoSnapshot; + snapshot: CollectionInfoSnapshot; type: 'info'; }; @@ -67,7 +67,7 @@ export type FinalPayload = slice: Slice; } | { - snapshot: WorkspaceInfoSnapshot; + snapshot: CollectionInfoSnapshot; type: 'info'; }; @@ -79,7 +79,7 @@ export type JobSlots = { }; type JobMiddlewareOptions = { - workspace: DocCollection; + collection: DocCollection; assetsManager: AssetsManager; slots: JobSlots; adapterConfigs: Map; diff --git a/packages/framework/store/src/transformer/slice.ts b/packages/framework/store/src/transformer/slice.ts index 438b46dc1d00..a2fee0a96549 100644 --- a/packages/framework/store/src/transformer/slice.ts +++ b/packages/framework/store/src/transformer/slice.ts @@ -13,13 +13,13 @@ type SliceData = { export class Slice { static fromModels(doc: Doc, models: BlockModel[]) { - const meta = doc.workspace.meta; + const meta = doc.collection.meta; const { pageVersion, workspaceVersion } = meta; assertExists(pageVersion); assertExists(workspaceVersion); return new Slice({ content: models, - workspaceId: doc.workspace.id, + workspaceId: doc.collection.id, pageId: doc.id, pageVersion, workspaceVersion, diff --git a/packages/framework/store/src/transformer/type.ts b/packages/framework/store/src/transformer/type.ts index e334b2a11e2b..36c35d3c9ee7 100644 --- a/packages/framework/store/src/transformer/type.ts +++ b/packages/framework/store/src/transformer/type.ts @@ -38,7 +38,7 @@ export const SliceSnapshotSchema: z.ZodType = z.object({ pageId: z.string(), }); -export type WorkspaceInfoSnapshot = { +export type CollectionInfoSnapshot = { id: string; type: 'info'; pageVersion: number; @@ -46,7 +46,7 @@ export type WorkspaceInfoSnapshot = { properties: DocsPropertiesMeta; }; -export const WorkspaceInfoSnapshotSchema: z.ZodType = +export const CollectionInfoSnapshotSchema: z.ZodType = z.object({ id: z.string(), type: z.literal('info'), diff --git a/packages/playground/apps/_common/components/docs-panel.ts b/packages/playground/apps/_common/components/docs-panel.ts index 1245430d8365..d414f1770b94 100644 --- a/packages/playground/apps/_common/components/docs-panel.ts +++ b/packages/playground/apps/_common/components/docs-panel.ts @@ -57,19 +57,19 @@ export class DocsPanel extends WithDisposable(ShadowlessElement) { public override connectedCallback() { super.connectedCallback(); this.disposables.add( - this.editor.doc.workspace.slots.docUpdated.on(() => { + this.editor.doc.collection.slots.docUpdated.on(() => { this.requestUpdate(); }) ); } createDoc = () => { - createDocBlock(this.editor.doc.workspace); + createDocBlock(this.editor.doc.collection); }; protected override render(): unknown { - const workspace = this.editor.doc.workspace; - const docs = [...workspace.docs.values()]; + const collection = this.editor.doc.collection; + const docs = [...collection.docs.values()]; return html`
New Doc
${repeat( @@ -94,9 +94,9 @@ export class DocsPanel extends WithDisposable(ShadowlessElement) { this.requestUpdate(); }; const deleteDoc = () => { - workspace.removeDoc(doc.id); + collection.removeDoc(doc.id); // When delete a doc, we need to set the editor doc to the first remaining doc - const docs = Array.from(workspace.docs.values()); + const docs = Array.from(collection.docs.values()); this.editor.doc = docs[0]; this.requestUpdate(); }; diff --git a/packages/playground/apps/default/main.ts b/packages/playground/apps/default/main.ts index 08f6ba626185..1c4dc5c10783 100644 --- a/packages/playground/apps/default/main.ts +++ b/packages/playground/apps/default/main.ts @@ -2,18 +2,18 @@ import '@blocksuite/presets/themes/affine.css'; import '../dev-format.js'; -import { mountDefaultDocEditor } from './utils/editor.js'; import { - createDefaultDocWorkspace, - initDefaultDocWorkspace, -} from './utils/workspace.js'; + createDefaultDocCollection, + initDefaultDocCollection, +} from './utils/collection.js'; +import { mountDefaultDocEditor } from './utils/editor.js'; async function main() { if (window.workspace) return; - const workspace = await createDefaultDocWorkspace(); - await initDefaultDocWorkspace(workspace); - await mountDefaultDocEditor(workspace); + const collection = await createDefaultDocCollection(); + await initDefaultDocCollection(collection); + await mountDefaultDocEditor(collection); } main().catch(console.error); diff --git a/packages/playground/apps/default/utils/workspace.ts b/packages/playground/apps/default/utils/collection.ts similarity index 78% rename from packages/playground/apps/default/utils/workspace.ts rename to packages/playground/apps/default/utils/collection.ts index d4cf95ee04ed..6ca105eae8ca 100644 --- a/packages/playground/apps/default/utils/workspace.ts +++ b/packages/playground/apps/default/utils/collection.ts @@ -18,7 +18,7 @@ import { WebSocketDocSource } from '../../_common/sync/websocket/doc'; const BASE_WEBSOCKET_URL = new URL(import.meta.env.PLAYGROUND_WS); -export async function createDefaultDocWorkspace() { +export async function createDefaultDocCollection() { const blobStorages: ((id: string) => BlobStorage)[] = [ createIndexeddbStorage, ]; @@ -57,27 +57,27 @@ export async function createDefaultDocWorkspace() { enable_bultin_ledits: true, }, }; - const workspace = new DocCollection(options); + const collection = new DocCollection(options); - workspace.start(); + collection.start(); // debug info - window.workspace = workspace; + window.workspace = collection; window.blockSchemas = AffineSchemas; - window.job = new Job({ workspace }); + window.job = new Job({ collection }); window.Y = DocCollection.Y; - return workspace; + return collection; } -export async function initDefaultDocWorkspace(workspace: DocCollection) { +export async function initDefaultDocCollection(colelction: DocCollection) { const params = new URLSearchParams(location.search); - await workspace.waitForSynced(); + await colelction.waitForSynced(); - const shouldInit = workspace.docs.size === 0 && !params.get('room'); + const shouldInit = colelction.docs.size === 0 && !params.get('room'); if (shouldInit) { - const doc = workspace.createDoc({ id: 'doc:home' }); + const doc = colelction.createDoc({ id: 'doc:home' }); doc.load(); const rootId = doc.addBlock('affine:page', { title: new Text(), @@ -87,12 +87,12 @@ export async function initDefaultDocWorkspace(workspace: DocCollection) { } else { // wait for data injected from provider const firstPageId = - workspace.docs.size > 0 - ? workspace.docs.keys().next().value + colelction.docs.size > 0 + ? colelction.docs.keys().next().value : await new Promise(resolve => - workspace.slots.docAdded.once(id => resolve(id)) + colelction.slots.docAdded.once(id => resolve(id)) ); - const doc = workspace.getDoc(firstPageId); + const doc = colelction.getDoc(firstPageId); assertExists(doc); doc.load(); // wait for data injected from provider diff --git a/packages/playground/apps/starter/main.ts b/packages/playground/apps/starter/main.ts index 2450c40c472f..7bdb468d3d91 100644 --- a/packages/playground/apps/starter/main.ts +++ b/packages/playground/apps/starter/main.ts @@ -7,11 +7,11 @@ import * as globalUtils from '@blocksuite/global/utils'; import * as editor from '@blocksuite/presets'; import * as store from '@blocksuite/store'; -import { mountDefaultDocEditor } from './utils/editor.js'; import { - createStarterDocWorkspace, - initStarterDocWorkspace, -} from './utils/workspace.js'; + createStarterDocCollection, + initStarterDocCollection, +} from './utils/collection.js'; +import { mountDefaultDocEditor } from './utils/editor.js'; async function main() { if (window.workspace) return; @@ -19,7 +19,7 @@ async function main() { const params = new URLSearchParams(location.search); const room = params.get('room') ?? Math.random().toString(16).slice(2, 8); const isE2E = room.startsWith('playwright'); - const workspace = createStarterDocWorkspace(); + const collection = createStarterDocCollection(); if (isE2E) { Object.defineProperty(window, '$blocksuite', { @@ -33,8 +33,8 @@ async function main() { return; } - await initStarterDocWorkspace(workspace); - await mountDefaultDocEditor(workspace); + await initStarterDocCollection(collection); + await mountDefaultDocEditor(collection); } main().catch(console.error); diff --git a/packages/playground/apps/starter/utils/workspace.ts b/packages/playground/apps/starter/utils/collection.ts similarity index 79% rename from packages/playground/apps/starter/utils/workspace.ts rename to packages/playground/apps/starter/utils/collection.ts index 4665fa428c07..12ba1cfa8adb 100644 --- a/packages/playground/apps/starter/utils/workspace.ts +++ b/packages/playground/apps/starter/utils/collection.ts @@ -26,7 +26,7 @@ const blobStorageArgs = (params.get('blobStorage') ?? 'memory').split(','); const featureArgs = (params.get('features') ?? '').split(','); const isE2E = room?.startsWith('playwright'); -export function createStarterDocWorkspace() { +export function createStarterDocCollection() { const blobStorages: ((id: string) => BlobStorage)[] = []; if (blobStorageArgs.includes('memory')) { blobStorages.push(createMemoryStorage); @@ -61,29 +61,29 @@ export function createStarterDocWorkspace() { awarenessSources: [new BroadcastChannelAwarenessSource()], docSources, }; - const workspace = new DocCollection(options); + const collection = new DocCollection(options); - workspace.start(); + collection.start(); // debug info - window.workspace = workspace; + window.workspace = collection; window.blockSchemas = AffineSchemas; - window.job = new Job({ workspace }); + window.job = new Job({ collection: collection }); window.Y = DocCollection.Y; window.testUtils = new TestUtils(); - return workspace; + return collection; } -export async function initStarterDocWorkspace(workspace: DocCollection) { +export async function initStarterDocCollection(collection: DocCollection) { // init from other clients if (room && !params.has('init')) { - let firstDoc = workspace.docs.values().next().value as Doc | undefined; + let firstDoc = collection.docs.values().next().value as Doc | undefined; if (!firstDoc) { await new Promise(resolve => - workspace.slots.docAdded.once(resolve) + collection.slots.docAdded.once(resolve) ); - firstDoc = workspace.docs.values().next().value; + firstDoc = collection.docs.values().next().value; } assertExists(firstDoc); const doc = firstDoc; @@ -99,15 +99,15 @@ export async function initStarterDocWorkspace(workspace: DocCollection) { // use built-in init function const functionMap = new Map< string, - (workspace: DocCollection, id: string) => Promise | void + (collection: DocCollection, id: string) => Promise | void >(); Object.values( (await import('../data/index.js')) as Record ).forEach(fn => functionMap.set(fn.id, fn)); const init = params.get('init') || 'preset'; if (functionMap.has(init)) { - await functionMap.get(init)?.(workspace, 'doc:home'); - const doc = workspace.getDoc('doc:home'); + await functionMap.get(init)?.(collection, 'doc:home'); + const doc = collection.getDoc('doc:home'); if (!doc?.loaded) { doc?.load(); } diff --git a/packages/presets/src/__tests__/main/snapshot.spec.ts b/packages/presets/src/__tests__/main/snapshot.spec.ts index 28ad7427176b..097e6bf70453 100644 --- a/packages/presets/src/__tests__/main/snapshot.spec.ts +++ b/packages/presets/src/__tests__/main/snapshot.spec.ts @@ -25,7 +25,7 @@ test('snapshot 1 importing', async () => { throw e; }); const [newDoc] = await transformer.importDocs( - window.editor.doc.workspace, + window.editor.doc.collection, snapshotFile ); @@ -69,7 +69,7 @@ test('snapshot 2 importing', async () => { throw e; }); const [newDoc] = await transformer.importDocs( - window.editor.doc.workspace, + window.editor.doc.collection, snapshotFile ); diff --git a/packages/presets/src/__tests__/utils/setup.ts b/packages/presets/src/__tests__/utils/setup.ts index 1622d2cd9f82..547bfcfb526b 100644 --- a/packages/presets/src/__tests__/utils/setup.ts +++ b/packages/presets/src/__tests__/utils/setup.ts @@ -10,7 +10,7 @@ import { createMemoryStorage, Generator, Schema } from '@blocksuite/store'; import { AffineEditorContainer } from '../../index.js'; -function createWorkspaceOptions() { +function createCollectionOptions() { const blobStorages: ((id: string) => BlobStorage)[] = []; const schema = new Schema(); const room = Math.random().toString(16).slice(2, 8); @@ -37,8 +37,8 @@ function createWorkspaceOptions() { }; } -function initWorkspace(workspace: DocCollection) { - const doc = workspace.createDoc({ id: 'doc:home' }); +function initCollection(collection: DocCollection) { + const doc = collection.createDoc({ id: 'doc:home' }); doc.load(() => { const rootId = doc.addBlock('affine:page', { @@ -50,11 +50,11 @@ function initWorkspace(workspace: DocCollection) { } async function createEditor( - workspace: DocCollection, + collection: DocCollection, mode: 'edgeless' | 'page' = 'page' ) { const app = document.createElement('div'); - const doc = workspace.docs.values().next().value as Doc | undefined; + const doc = collection.docs.values().next().value as Doc | undefined; assertExists(doc, 'Need to create a doc first'); const editor = new AffineEditorContainer(); editor.doc = doc; @@ -73,12 +73,12 @@ async function createEditor( } export async function setupEditor(mode: 'edgeless' | 'page' = 'page') { - const workspace = new DocCollection(createWorkspaceOptions()); + const collection = new DocCollection(createCollectionOptions()); - window.workspace = workspace; + window.workspace = collection; - initWorkspace(workspace); - const appElement = await createEditor(workspace, mode); + initCollection(collection); + const appElement = await createEditor(collection, mode); return () => { appElement.remove(); diff --git a/packages/presets/src/fragments/bi-directional-link/bi-directional-link-panel.ts b/packages/presets/src/fragments/bi-directional-link/bi-directional-link-panel.ts index ed87080ae46a..75264083ee02 100644 --- a/packages/presets/src/fragments/bi-directional-link/bi-directional-link-panel.ts +++ b/packages/presets/src/fragments/bi-directional-link/bi-directional-link-panel.ts @@ -239,7 +239,7 @@ export class BiDirectionalLinkPanel extends WithDisposable(LitElement) { ); const { _disposables } = this; _disposables.add( - this.doc.workspace.indexer.backlink.slots.indexUpdated.on(() => { + this.doc.collection.indexer.backlink.slots.indexUpdated.on(() => { this.requestUpdate(); }) ); @@ -292,7 +292,7 @@ export class BiDirectionalLinkPanel extends WithDisposable(LitElement) { } private _renderLinks(ids: string[]) { - const { workspace } = this.doc; + const { collection: workspace } = this.doc; return html`