From 99ad4e871eddb24d745ae27aaae96fca2ba7bb0f Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Tue, 22 Apr 2025 15:51:22 +0000 Subject: [PATCH] feat(editor): use migrated extensions (#11886) Closes: BS-3283 --- .../affine/all/src/extensions/effects.ts | 108 +++++++++++++ blocksuite/affine/all/src/extensions/index.ts | 2 +- .../affine/all/src/extensions/legacy-store.ts | 112 ++++++++++++++ .../affine/all/src/extensions/migrating.ts | 35 ----- .../affine/all/src/extensions/register.ts | 2 +- blocksuite/affine/all/src/extensions/store.ts | 146 +++++++++++------- blocksuite/affine/all/src/extensions/view.ts | 2 +- .../affine/blocks/edgeless-text/src/view.ts | 16 +- blocksuite/affine/blocks/frame/src/view.ts | 8 +- .../affine/blocks/image/src/image-spec.ts | 2 - blocksuite/affine/blocks/latex/src/view.ts | 6 + blocksuite/affine/blocks/list/src/view.ts | 6 + .../affine/ext-loader/src/view-provider.ts | 2 +- .../framework/std/src/clipboard/clipboard.ts | 4 +- blocksuite/integration-test/src/store.ts | 35 ++++- blocksuite/integration-test/src/view.ts | 34 +++- .../ai/components/ai-chat-chips/doc-chip.ts | 5 +- .../blocksuite/ai/components/text-renderer.ts | 2 +- .../src/blocksuite/ai/extensions/enable-ai.ts | 4 +- .../src/blocksuite/ai/messages/mindmap.ts | 2 +- .../ai/mini-mindmap/mindmap-preview.ts | 2 +- .../src/blocksuite/ai/utils/editor-actions.ts | 2 +- .../src/blocksuite/manager/migrating-store.ts | 33 +++- .../src/blocksuite/manager/migrating-view.ts | 32 ++++ .../src/blocksuite/utils/markdown-utils.ts | 4 +- .../hooks/affine/use-export-page.ts | 2 +- 26 files changed, 483 insertions(+), 125 deletions(-) create mode 100644 blocksuite/affine/all/src/extensions/effects.ts create mode 100644 blocksuite/affine/all/src/extensions/legacy-store.ts diff --git a/blocksuite/affine/all/src/extensions/effects.ts b/blocksuite/affine/all/src/extensions/effects.ts new file mode 100644 index 0000000000..b0a2d32c81 --- /dev/null +++ b/blocksuite/affine/all/src/extensions/effects.ts @@ -0,0 +1,108 @@ +import { effects as blockRootEffects } from '@blocksuite/affine-block-root/effects'; +import { effects as blockSurfaceEffects } from '@blocksuite/affine-block-surface/effects'; +import { effects as blockSurfaceRefEffects } from '@blocksuite/affine-block-surface-ref/effects'; +import { effects as blockTableEffects } from '@blocksuite/affine-block-table/effects'; +import { BlockSelection } from '@blocksuite/affine-components/block-selection'; +import { BlockZeroWidth } from '@blocksuite/affine-components/block-zero-width'; +import { effects as componentCaptionEffects } from '@blocksuite/affine-components/caption'; +import { effects as componentCardStyleDropdownMenuEffects } from '@blocksuite/affine-components/card-style-dropdown-menu'; +import { effects as componentColorPickerEffects } from '@blocksuite/affine-components/color-picker'; +import { effects as componentContextMenuEffects } from '@blocksuite/affine-components/context-menu'; +import { effects as componentDatePickerEffects } from '@blocksuite/affine-components/date-picker'; +import { effects as componentDropIndicatorEffects } from '@blocksuite/affine-components/drop-indicator'; +import { effects as componentEdgelessLineStylesEffects } from '@blocksuite/affine-components/edgeless-line-styles-panel'; +import { effects as componentEdgelessLineWidthEffects } from '@blocksuite/affine-components/edgeless-line-width-panel'; +import { effects as componentEdgelessShapeColorPickerEffects } from '@blocksuite/affine-components/edgeless-shape-color-picker'; +import { effects as componentEmbedCardModalEffects } from '@blocksuite/affine-components/embed-card-modal'; +import { FilterableListComponent } from '@blocksuite/affine-components/filterable-list'; +import { effects as componentHighlightDropdownMenuEffects } from '@blocksuite/affine-components/highlight-dropdown-menu'; +import { IconButton } from '@blocksuite/affine-components/icon-button'; +import { effects as componentLinkPreviewEffects } from '@blocksuite/affine-components/link-preview'; +import { effects as componentLinkedDocTitleEffects } from '@blocksuite/affine-components/linked-doc-title'; +import { effects as componentOpenDocDropdownMenuEffects } from '@blocksuite/affine-components/open-doc-dropdown-menu'; +import { effects as componentPortalEffects } from '@blocksuite/affine-components/portal'; +import { effects as componentSizeDropdownMenuEffects } from '@blocksuite/affine-components/size-dropdown-menu'; +import { SmoothCorner } from '@blocksuite/affine-components/smooth-corner'; +import { effects as componentToggleButtonEffects } from '@blocksuite/affine-components/toggle-button'; +import { ToggleSwitch } from '@blocksuite/affine-components/toggle-switch'; +import { effects as componentToolbarEffects } from '@blocksuite/affine-components/toolbar'; +import { effects as componentTooltipContentWithShortcutEffects } from '@blocksuite/affine-components/tooltip-content-with-shortcut'; +import { effects as componentViewDropdownMenuEffects } from '@blocksuite/affine-components/view-dropdown-menu'; +import { effects as fragmentDocTitleEffects } from '@blocksuite/affine-fragment-doc-title/effects'; +import { effects as fragmentFramePanelEffects } from '@blocksuite/affine-fragment-frame-panel/effects'; +import { effects as fragmentOutlineEffects } from '@blocksuite/affine-fragment-outline/effects'; +import { effects as inlineFootnoteEffects } from '@blocksuite/affine-inline-footnote/effects'; +import { effects as inlineLatexEffects } from '@blocksuite/affine-inline-latex/effects'; +import { effects as inlineLinkEffects } from '@blocksuite/affine-inline-link/effects'; +import { effects as inlineMentionEffects } from '@blocksuite/affine-inline-mention'; +import { effects as inlinePresetEffects } from '@blocksuite/affine-inline-preset/effects'; +import { effects as inlineReferenceEffects } from '@blocksuite/affine-inline-reference/effects'; +import { effects as richTextEffects } from '@blocksuite/affine-rich-text/effects'; +import { effects as widgetDragHandleEffects } from '@blocksuite/affine-widget-drag-handle/effects'; +import { effects as widgetEdgelessAutoConnectEffects } from '@blocksuite/affine-widget-edgeless-auto-connect/effects'; +import { effects as widgetFrameTitleEffects } from '@blocksuite/affine-widget-frame-title/effects'; +import { effects as widgetRemoteSelectionEffects } from '@blocksuite/affine-widget-remote-selection/effects'; +import { effects as widgetScrollAnchoringEffects } from '@blocksuite/affine-widget-scroll-anchoring/effects'; +import { effects as widgetSlashMenuEffects } from '@blocksuite/affine-widget-slash-menu/effects'; +import { effects as widgetToolbarEffects } from '@blocksuite/affine-widget-toolbar/effects'; +import { effects as dataViewEffects } from '@blocksuite/data-view/effects'; +import { effects as stdEffects } from '@blocksuite/std/effects'; + +export function effects() { + stdEffects(); + + dataViewEffects(); + richTextEffects(); + + inlineReferenceEffects(); + inlinePresetEffects(); + inlineLinkEffects(); + inlineFootnoteEffects(); + inlineLatexEffects(); + inlineMentionEffects(); + + blockSurfaceEffects(); + blockSurfaceRefEffects(); + blockTableEffects(); + blockRootEffects(); + + componentCaptionEffects(); + componentContextMenuEffects(); + componentDatePickerEffects(); + componentPortalEffects(); + componentToolbarEffects(); + componentDropIndicatorEffects(); + componentToggleButtonEffects(); + componentColorPickerEffects(); + componentEmbedCardModalEffects(); + componentLinkPreviewEffects(); + componentLinkedDocTitleEffects(); + componentCardStyleDropdownMenuEffects(); + componentHighlightDropdownMenuEffects(); + componentViewDropdownMenuEffects(); + componentTooltipContentWithShortcutEffects(); + componentSizeDropdownMenuEffects(); + componentEdgelessLineWidthEffects(); + componentEdgelessLineStylesEffects(); + componentEdgelessShapeColorPickerEffects(); + componentOpenDocDropdownMenuEffects(); + + widgetScrollAnchoringEffects(); + widgetFrameTitleEffects(); + widgetRemoteSelectionEffects(); + widgetDragHandleEffects(); + widgetEdgelessAutoConnectEffects(); + widgetSlashMenuEffects(); + widgetToolbarEffects(); + + fragmentDocTitleEffects(); + fragmentFramePanelEffects(); + fragmentOutlineEffects(); + + customElements.define('icon-button', IconButton); + customElements.define('smooth-corner', SmoothCorner); + customElements.define('toggle-switch', ToggleSwitch); + customElements.define('affine-filterable-list', FilterableListComponent); + customElements.define('block-zero-width', BlockZeroWidth); + customElements.define('affine-block-selection', BlockSelection); +} diff --git a/blocksuite/affine/all/src/extensions/index.ts b/blocksuite/affine/all/src/extensions/index.ts index 611599b9fd..a53d7a0a9b 100644 --- a/blocksuite/affine/all/src/extensions/index.ts +++ b/blocksuite/affine/all/src/extensions/index.ts @@ -1,5 +1,5 @@ export * from './common'; export * from './editor-specs'; +export * from './legacy-store'; export * from './preview-specs'; export * from './register'; -export * from './store'; diff --git a/blocksuite/affine/all/src/extensions/legacy-store.ts b/blocksuite/affine/all/src/extensions/legacy-store.ts new file mode 100644 index 0000000000..48085e9c11 --- /dev/null +++ b/blocksuite/affine/all/src/extensions/legacy-store.ts @@ -0,0 +1,112 @@ +import { DataViewBlockSchemaExtension } from '@blocksuite/affine-block-data-view'; +import { DatabaseSelectionExtension } from '@blocksuite/affine-block-database'; +import { EmbedIframeConfigExtensions } from '@blocksuite/affine-block-embed'; +import { ImageStoreSpec } from '@blocksuite/affine-block-image'; +import { SurfaceBlockSchemaExtension } from '@blocksuite/affine-block-surface'; +import { TableSelectionExtension } from '@blocksuite/affine-block-table'; +import { + AttachmentBlockSchemaExtension, + BookmarkBlockSchemaExtension, + CalloutBlockSchemaExtension, + CodeBlockSchemaExtension, + DatabaseBlockSchemaExtension, + DividerBlockSchemaExtension, + EdgelessTextBlockSchemaExtension, + EmbedFigmaBlockSchemaExtension, + EmbedGithubBlockSchemaExtension, + EmbedHtmlBlockSchemaExtension, + EmbedIframeBlockSchemaExtension, + EmbedLinkedDocBlockSchemaExtension, + EmbedLoomBlockSchemaExtension, + EmbedSyncedDocBlockSchemaExtension, + EmbedYoutubeBlockSchemaExtension, + FrameBlockSchemaExtension, + ImageBlockSchemaExtension, + LatexBlockSchemaExtension, + ListBlockSchemaExtension, + NoteBlockSchemaExtension, + ParagraphBlockSchemaExtension, + RootBlockSchemaExtension, + SurfaceRefBlockSchemaExtension, + TableBlockSchemaExtension, + TranscriptionBlockSchemaExtension, +} from '@blocksuite/affine-model'; +import { + HighlightSelectionExtension, + ImageSelectionExtension, +} from '@blocksuite/affine-shared/selection'; +import { + BlockMetaService, + EmbedIframeService, + FeatureFlagService, + FileSizeLimitService, + LinkPreviewerService, +} from '@blocksuite/affine-shared/services'; +import { + BlockSelectionExtension, + CursorSelectionExtension, + SurfaceSelectionExtension, + TextSelectionExtension, +} from '@blocksuite/std'; +import type { ExtensionType } from '@blocksuite/store'; + +import { + getAdapterFactoryExtensions, + getHtmlAdapterExtensions, + getMarkdownAdapterExtensions, + getNotionHtmlAdapterExtensions, + getPlainTextAdapterExtensions, +} from '../adapters/extension.js'; + +export const StoreExtensions: ExtensionType[] = [ + CodeBlockSchemaExtension, + ParagraphBlockSchemaExtension, + RootBlockSchemaExtension, + ListBlockSchemaExtension, + NoteBlockSchemaExtension, + DividerBlockSchemaExtension, + ImageBlockSchemaExtension, + SurfaceBlockSchemaExtension, + BookmarkBlockSchemaExtension, + FrameBlockSchemaExtension, + DatabaseBlockSchemaExtension, + SurfaceRefBlockSchemaExtension, + DataViewBlockSchemaExtension, + AttachmentBlockSchemaExtension, + EmbedSyncedDocBlockSchemaExtension, + EmbedLinkedDocBlockSchemaExtension, + EmbedHtmlBlockSchemaExtension, + EmbedIframeBlockSchemaExtension, + EmbedGithubBlockSchemaExtension, + EmbedFigmaBlockSchemaExtension, + EmbedLoomBlockSchemaExtension, + EmbedYoutubeBlockSchemaExtension, + EdgelessTextBlockSchemaExtension, + LatexBlockSchemaExtension, + TableBlockSchemaExtension, + CalloutBlockSchemaExtension, + TranscriptionBlockSchemaExtension, + + BlockSelectionExtension, + TextSelectionExtension, + SurfaceSelectionExtension, + CursorSelectionExtension, + HighlightSelectionExtension, + ImageSelectionExtension, + DatabaseSelectionExtension, + TableSelectionExtension, + + getHtmlAdapterExtensions(), + getMarkdownAdapterExtensions(), + getNotionHtmlAdapterExtensions(), + getPlainTextAdapterExtensions(), + getAdapterFactoryExtensions(), + + FeatureFlagService, + LinkPreviewerService, + FileSizeLimitService, + ImageStoreSpec, + BlockMetaService, + EmbedIframeConfigExtensions, + EmbedIframeService, +].flat(); diff --git a/blocksuite/affine/all/src/extensions/migrating.ts b/blocksuite/affine/all/src/extensions/migrating.ts index aa6411a9c7..5e1e60e9f4 100644 --- a/blocksuite/affine/all/src/extensions/migrating.ts +++ b/blocksuite/affine/all/src/extensions/migrating.ts @@ -1,21 +1,3 @@ -import { AttachmentBlockSpec } from '@blocksuite/affine-block-attachment'; -import { BookmarkBlockSpec } from '@blocksuite/affine-block-bookmark'; -import { CalloutBlockSpec } from '@blocksuite/affine-block-callout'; -import { CodeBlockSpec } from '@blocksuite/affine-block-code'; -import { DataViewBlockSpec } from '@blocksuite/affine-block-data-view'; -import { DatabaseBlockSpec } from '@blocksuite/affine-block-database'; -import { DividerBlockSpec } from '@blocksuite/affine-block-divider'; -import { EdgelessTextBlockSpec } from '@blocksuite/affine-block-edgeless-text'; -import { EmbedExtensions } from '@blocksuite/affine-block-embed'; -import { FrameBlockSpec } from '@blocksuite/affine-block-frame'; -import { ImageBlockSpec } from '@blocksuite/affine-block-image'; -import { LatexBlockSpec } from '@blocksuite/affine-block-latex'; -import { ListBlockSpec } from '@blocksuite/affine-block-list'; -import { - EdgelessNoteBlockSpec, - NoteBlockSpec, -} from '@blocksuite/affine-block-note'; -import { ParagraphBlockSpec } from '@blocksuite/affine-block-paragraph'; import { EdgelessBuiltInSpecs, PageRootBlockSpec, @@ -89,22 +71,9 @@ const CommonBlockSpecs: ExtensionType[] = [ inlinePresetExtensions, DocDisplayMetaService, EditPropsStore, - LatexBlockSpec, - ListBlockSpec, - DatabaseBlockSpec, TableBlockSpec, - DataViewBlockSpec, - DividerBlockSpec, - BookmarkBlockSpec, - EmbedExtensions, - AttachmentBlockSpec, - CodeBlockSpec, - ImageBlockSpec, - ParagraphBlockSpec, DefaultOpenDocExtension, FontLoaderService, - CalloutBlockSpec, - FrameBlockSpec, elementToPlainTextAdapterMatchers, elementToMarkdownAdapterMatchers, @@ -112,7 +81,6 @@ const CommonBlockSpecs: ExtensionType[] = [ const PageFirstPartyBlockSpecs: ExtensionType[] = [ CommonBlockSpecs, - NoteBlockSpec, PageSurfaceBlockSpec, PageSurfaceRefBlockSpec, @@ -121,11 +89,8 @@ const PageFirstPartyBlockSpecs: ExtensionType[] = [ const EdgelessFirstPartyBlockSpecs: ExtensionType[] = [ CommonBlockSpecs, - - EdgelessNoteBlockSpec, EdgelessSurfaceBlockSpec, EdgelessSurfaceRefBlockSpec, - EdgelessTextBlockSpec, ...EdgelessSurfaceBlockAdapterExtensions, ].flat(); diff --git a/blocksuite/affine/all/src/extensions/register.ts b/blocksuite/affine/all/src/extensions/register.ts index a8f7237663..bcb2336c46 100644 --- a/blocksuite/affine/all/src/extensions/register.ts +++ b/blocksuite/affine/all/src/extensions/register.ts @@ -4,11 +4,11 @@ import { EdgelessEditorBlockSpecs, PageEditorBlockSpecs, } from './editor-specs.js'; +import { StoreExtensions } from './legacy-store.js'; import { PreviewEdgelessEditorBlockSpecs, PreviewPageEditorBlockSpecs, } from './preview-specs.js'; -import { StoreExtensions } from './store.js'; export function registerStoreSpecs() { SpecProvider._.addSpec('store', StoreExtensions); diff --git a/blocksuite/affine/all/src/extensions/store.ts b/blocksuite/affine/all/src/extensions/store.ts index 1cdcb8ec5a..24564d38d9 100644 --- a/blocksuite/affine/all/src/extensions/store.ts +++ b/blocksuite/affine/all/src/extensions/store.ts @@ -1,44 +1,45 @@ -import { DataViewBlockSchemaExtension } from '@blocksuite/affine-block-data-view'; +import { CodeMarkdownPreprocessorExtension } from '@blocksuite/affine-block-code'; import { DatabaseSelectionExtension } from '@blocksuite/affine-block-database'; import { EmbedIframeConfigExtensions } from '@blocksuite/affine-block-embed'; import { ImageStoreSpec } from '@blocksuite/affine-block-image'; +import { LatexMarkdownPreprocessorExtension } from '@blocksuite/affine-block-latex'; +import { + RootBlockHtmlAdapterExtension, + RootBlockMarkdownAdapterExtension, + RootBlockNotionHtmlAdapterExtension, +} from '@blocksuite/affine-block-root'; import { SurfaceBlockSchemaExtension } from '@blocksuite/affine-block-surface'; -import { TableSelectionExtension } from '@blocksuite/affine-block-table'; +import { + TableBlockHtmlAdapterExtension, + TableSelectionExtension, +} from '@blocksuite/affine-block-table'; import { type StoreExtensionContext, StoreExtensionProvider, } from '@blocksuite/affine-ext-loader'; import { - AttachmentBlockSchemaExtension, - BookmarkBlockSchemaExtension, - CalloutBlockSchemaExtension, - CodeBlockSchemaExtension, - DatabaseBlockSchemaExtension, - DividerBlockSchemaExtension, - EdgelessTextBlockSchemaExtension, - EmbedFigmaBlockSchemaExtension, - EmbedGithubBlockSchemaExtension, - EmbedHtmlBlockSchemaExtension, - EmbedIframeBlockSchemaExtension, - EmbedLinkedDocBlockSchemaExtension, - EmbedLoomBlockSchemaExtension, - EmbedSyncedDocBlockSchemaExtension, - EmbedYoutubeBlockSchemaExtension, - FrameBlockSchemaExtension, - ImageBlockSchemaExtension, - LatexBlockSchemaExtension, - ListBlockSchemaExtension, - NoteBlockSchemaExtension, - ParagraphBlockSchemaExtension, + HtmlInlineToDeltaAdapterExtensions, + InlineDeltaToHtmlAdapterExtensions, + InlineDeltaToMarkdownAdapterExtensions, + InlineDeltaToPlainTextAdapterExtensions, + MarkdownInlineToDeltaAdapterExtensions, + NotionHtmlInlineToDeltaAdapterExtensions, +} from '@blocksuite/affine-inline-preset'; +import { RootBlockSchemaExtension, SurfaceRefBlockSchemaExtension, TableBlockSchemaExtension, TranscriptionBlockSchemaExtension, } from '@blocksuite/affine-model'; import { - HighlightSelectionExtension, - ImageSelectionExtension, -} from '@blocksuite/affine-shared/selection'; + HtmlAdapterFactoryExtension, + MarkdownAdapterFactoryExtension, + MixTextAdapterFactoryExtension, + NotionHtmlAdapterFactoryExtension, + NotionTextAdapterFactoryExtension, + PlainTextAdapterFactoryExtension, +} from '@blocksuite/affine-shared/adapters'; +import { HighlightSelectionExtension } from '@blocksuite/affine-shared/selection'; import { BlockMetaService, EmbedIframeService, @@ -54,41 +55,71 @@ import { } from '@blocksuite/std'; import type { ExtensionType } from '@blocksuite/store'; -import { - getAdapterFactoryExtensions, - getHtmlAdapterExtensions, - getMarkdownAdapterExtensions, - getNotionHtmlAdapterExtensions, - getPlainTextAdapterExtensions, -} from '../adapters/extension.js'; +function getAdapterFactoryExtensions(): ExtensionType[] { + return [ + MarkdownAdapterFactoryExtension, + PlainTextAdapterFactoryExtension, + HtmlAdapterFactoryExtension, + NotionTextAdapterFactoryExtension, + NotionHtmlAdapterFactoryExtension, + MixTextAdapterFactoryExtension, + ]; +} -export const StoreExtensions: ExtensionType[] = [ - CodeBlockSchemaExtension, - ParagraphBlockSchemaExtension, +const defaultBlockHtmlAdapterMatchers = [ + RootBlockHtmlAdapterExtension, + TableBlockHtmlAdapterExtension, +]; + +const defaultBlockMarkdownAdapterMatchers = [RootBlockMarkdownAdapterExtension]; + +const defaultMarkdownPreprocessors = [ + LatexMarkdownPreprocessorExtension, + CodeMarkdownPreprocessorExtension, +]; + +const defaultBlockNotionHtmlAdapterMatchers: ExtensionType[] = [ + RootBlockNotionHtmlAdapterExtension, +]; + +const defaultBlockPlainTextAdapterMatchers: ExtensionType[] = []; + +function getHtmlAdapterExtensions(): ExtensionType[] { + return [ + ...HtmlInlineToDeltaAdapterExtensions, + ...defaultBlockHtmlAdapterMatchers, + ...InlineDeltaToHtmlAdapterExtensions, + ]; +} + +function getMarkdownAdapterExtensions(): ExtensionType[] { + return [ + ...MarkdownInlineToDeltaAdapterExtensions, + ...defaultBlockMarkdownAdapterMatchers, + ...InlineDeltaToMarkdownAdapterExtensions, + ...defaultMarkdownPreprocessors, + ]; +} + +function getNotionHtmlAdapterExtensions(): ExtensionType[] { + return [ + ...NotionHtmlInlineToDeltaAdapterExtensions, + ...defaultBlockNotionHtmlAdapterMatchers, + ]; +} + +function getPlainTextAdapterExtensions(): ExtensionType[] { + return [ + ...defaultBlockPlainTextAdapterMatchers, + ...InlineDeltaToPlainTextAdapterExtensions, + ]; +} + +const MigratingStoreExtensions: ExtensionType[] = [ RootBlockSchemaExtension, - ListBlockSchemaExtension, - NoteBlockSchemaExtension, - DividerBlockSchemaExtension, - ImageBlockSchemaExtension, SurfaceBlockSchemaExtension, - BookmarkBlockSchemaExtension, - FrameBlockSchemaExtension, - DatabaseBlockSchemaExtension, SurfaceRefBlockSchemaExtension, - DataViewBlockSchemaExtension, - AttachmentBlockSchemaExtension, - EmbedSyncedDocBlockSchemaExtension, - EmbedLinkedDocBlockSchemaExtension, - EmbedHtmlBlockSchemaExtension, - EmbedIframeBlockSchemaExtension, - EmbedGithubBlockSchemaExtension, - EmbedFigmaBlockSchemaExtension, - EmbedLoomBlockSchemaExtension, - EmbedYoutubeBlockSchemaExtension, - EdgelessTextBlockSchemaExtension, - LatexBlockSchemaExtension, TableBlockSchemaExtension, - CalloutBlockSchemaExtension, TranscriptionBlockSchemaExtension, BlockSelectionExtension, @@ -96,7 +127,6 @@ export const StoreExtensions: ExtensionType[] = [ SurfaceSelectionExtension, CursorSelectionExtension, HighlightSelectionExtension, - ImageSelectionExtension, DatabaseSelectionExtension, TableSelectionExtension, @@ -120,6 +150,6 @@ export class MigratingStoreExtension extends StoreExtensionProvider { override setup(context: StoreExtensionContext) { super.setup(context); - context.register(StoreExtensions); + context.register(MigratingStoreExtensions); } } diff --git a/blocksuite/affine/all/src/extensions/view.ts b/blocksuite/affine/all/src/extensions/view.ts index e440078357..92078eae4e 100644 --- a/blocksuite/affine/all/src/extensions/view.ts +++ b/blocksuite/affine/all/src/extensions/view.ts @@ -3,7 +3,7 @@ import { ViewExtensionProvider, } from '@blocksuite/affine-ext-loader'; -import { effects } from '../effects'; +import { effects } from './effects'; import { MigratingEdgelessEditorBlockSpecs, MigratingPageEditorBlockSpecs, diff --git a/blocksuite/affine/blocks/edgeless-text/src/view.ts b/blocksuite/affine/blocks/edgeless-text/src/view.ts index 3aaf2daebf..3e7cd2a410 100644 --- a/blocksuite/affine/blocks/edgeless-text/src/view.ts +++ b/blocksuite/affine/blocks/edgeless-text/src/view.ts @@ -17,8 +17,18 @@ export class EdgelessTextViewExtension extends ViewExtensionProvider { override setup(context: ViewExtensionContext) { super.setup(context); - context.register([ - BlockViewExtension('affine:edgeless-text', literal`affine-edgeless-text`), - ]); + const isEdgeless = + context.scope === 'edgeless' || + context.scope === 'preview-edgeless' || + context.scope === 'mobile-edgeless'; + + if (isEdgeless) { + context.register([ + BlockViewExtension( + 'affine:edgeless-text', + literal`affine-edgeless-text` + ), + ]); + } } } diff --git a/blocksuite/affine/blocks/frame/src/view.ts b/blocksuite/affine/blocks/frame/src/view.ts index 3abedcf933..03b86b2d8f 100644 --- a/blocksuite/affine/blocks/frame/src/view.ts +++ b/blocksuite/affine/blocks/frame/src/view.ts @@ -16,12 +16,6 @@ export class FrameViewExtension extends ViewExtensionProvider { override setup(context: ViewExtensionContext): void { super.setup(context); - if ( - context.scope === 'edgeless' || - context.scope === 'preview-edgeless' || - context.scope === 'mobile-edgeless' - ) { - context.register(FrameBlockSpec); - } + context.register(FrameBlockSpec); } } diff --git a/blocksuite/affine/blocks/image/src/image-spec.ts b/blocksuite/affine/blocks/image/src/image-spec.ts index c83ff28dc9..1b83fca43e 100644 --- a/blocksuite/affine/blocks/image/src/image-spec.ts +++ b/blocksuite/affine/blocks/image/src/image-spec.ts @@ -4,7 +4,6 @@ import { BlockViewExtension, FlavourExtension } from '@blocksuite/std'; import type { ExtensionType } from '@blocksuite/store'; import { literal } from 'lit/static-html.js'; -import { ImageBlockAdapterExtensions } from './adapters/extension'; import { imageSlashMenuConfig } from './configs/slash-menu'; import { createBuiltinToolbarConfigExtension } from './configs/toolbar'; import { ImageProxyService } from './image-proxy-service'; @@ -24,7 +23,6 @@ export const ImageBlockSpec: ExtensionType[] = [ return literal`affine-image`; }), ImageDropOption, - ImageBlockAdapterExtensions, createBuiltinToolbarConfigExtension(flavour), SlashMenuConfigExtension(flavour, imageSlashMenuConfig), ].flat(); diff --git a/blocksuite/affine/blocks/latex/src/view.ts b/blocksuite/affine/blocks/latex/src/view.ts index 1f13100cc8..b43d428e3a 100644 --- a/blocksuite/affine/blocks/latex/src/view.ts +++ b/blocksuite/affine/blocks/latex/src/view.ts @@ -7,10 +7,16 @@ import { BlockViewExtension } from '@blocksuite/std'; import { literal } from 'lit/static-html.js'; import { latexSlashMenuConfig } from './configs/slash-menu'; +import { effects } from './effects'; export class LatexViewExtension extends ViewExtensionProvider { override name = 'affine-latex-block'; + override effect() { + super.effect(); + effects(); + } + override setup(context: ViewExtensionContext) { super.setup(context); context.register([ diff --git a/blocksuite/affine/blocks/list/src/view.ts b/blocksuite/affine/blocks/list/src/view.ts index 905c33064e..fac1b2288b 100644 --- a/blocksuite/affine/blocks/list/src/view.ts +++ b/blocksuite/affine/blocks/list/src/view.ts @@ -5,11 +5,17 @@ import { import { BlockViewExtension, FlavourExtension } from '@blocksuite/std'; import { literal } from 'lit/static-html.js'; +import { effects } from './effects.js'; import { ListKeymapExtension, ListTextKeymapExtension } from './list-keymap.js'; export class ListViewExtension extends ViewExtensionProvider { override name = 'affine-list-block'; + override effect(): void { + super.effect(); + effects(); + } + override setup(context: ViewExtensionContext) { super.setup(context); context.register([ diff --git a/blocksuite/affine/ext-loader/src/view-provider.ts b/blocksuite/affine/ext-loader/src/view-provider.ts index fca68b9162..9787784687 100644 --- a/blocksuite/affine/ext-loader/src/view-provider.ts +++ b/blocksuite/affine/ext-loader/src/view-provider.ts @@ -85,8 +85,8 @@ export class ViewExtensionProvider< super.setup(context, options); const constructer = this.constructor as typeof ViewExtensionProvider; if (!constructer.effectRunned) { - this.effect(); constructer.effectRunned = true; + this.effect(); } } } diff --git a/blocksuite/framework/std/src/clipboard/clipboard.ts b/blocksuite/framework/std/src/clipboard/clipboard.ts index 8e71c5fbfb..d818d43ab0 100644 --- a/blocksuite/framework/std/src/clipboard/clipboard.ts +++ b/blocksuite/framework/std/src/clipboard/clipboard.ts @@ -93,7 +93,7 @@ export class Clipboard extends LifeCycleWatcher { } if (item) { const job = this._getJob(); - const adapterInstance = new adapter(job, this.std.provider); + const adapterInstance = new adapter(job, this.std.store.provider); const payload = { file: item, assets: job.assetsManager, @@ -225,7 +225,7 @@ export class Clipboard extends LifeCycleWatcher { return; } const { adapter } = adapterItem; - const adapterInstance = new adapter(job, this.std.provider); + const adapterInstance = new adapter(job, this.std.store.provider); const result = await adapterInstance.fromSlice(slice); if (!result) { return; diff --git a/blocksuite/integration-test/src/store.ts b/blocksuite/integration-test/src/store.ts index 63afa01014..08a4d5fbbd 100644 --- a/blocksuite/integration-test/src/store.ts +++ b/blocksuite/integration-test/src/store.ts @@ -1,7 +1,40 @@ +import { AttachmentStoreExtension } from '@blocksuite/affine/blocks/attachment/store'; +import { BookmarkStoreExtension } from '@blocksuite/affine/blocks/bookmark/store'; +import { CalloutStoreExtension } from '@blocksuite/affine/blocks/callout/store'; +import { CodeStoreExtension } from '@blocksuite/affine/blocks/code/store'; +import { DataViewStoreExtension } from '@blocksuite/affine/blocks/data-view/store'; +import { DatabaseStoreExtension } from '@blocksuite/affine/blocks/database/store'; +import { DividerStoreExtension } from '@blocksuite/affine/blocks/divider/store'; +import { EdgelessTextStoreExtension } from '@blocksuite/affine/blocks/edgeless-text/store'; +import { EmbedStoreExtension } from '@blocksuite/affine/blocks/embed/store'; +import { FrameStoreExtension } from '@blocksuite/affine/blocks/frame/store'; +import { ImageStoreExtension } from '@blocksuite/affine/blocks/image/store'; +import { LatexStoreExtension } from '@blocksuite/affine/blocks/latex/store'; +import { ListStoreExtension } from '@blocksuite/affine/blocks/list/store'; +import { NoteStoreExtension } from '@blocksuite/affine/blocks/note/store'; +import { ParagraphStoreExtension } from '@blocksuite/affine/blocks/paragraph/store'; import { StoreExtensionManager } from '@blocksuite/affine/ext-loader'; import { MigratingStoreExtension } from '@blocksuite/affine/extensions/store'; export function getTestStoreManager() { - const manager = new StoreExtensionManager([MigratingStoreExtension]); + const manager = new StoreExtensionManager([ + AttachmentStoreExtension, + BookmarkStoreExtension, + CalloutStoreExtension, + CodeStoreExtension, + DataViewStoreExtension, + DatabaseStoreExtension, + DividerStoreExtension, + EdgelessTextStoreExtension, + EmbedStoreExtension, + FrameStoreExtension, + ImageStoreExtension, + LatexStoreExtension, + ListStoreExtension, + NoteStoreExtension, + ParagraphStoreExtension, + + MigratingStoreExtension, + ]); return manager; } diff --git a/blocksuite/integration-test/src/view.ts b/blocksuite/integration-test/src/view.ts index fa89a7c729..dc56a13a3f 100644 --- a/blocksuite/integration-test/src/view.ts +++ b/blocksuite/integration-test/src/view.ts @@ -1,7 +1,39 @@ +import { AttachmentViewExtension } from '@blocksuite/affine/blocks/attachment/view'; +import { BookmarkViewExtension } from '@blocksuite/affine/blocks/bookmark/view'; +import { CalloutViewExtension } from '@blocksuite/affine/blocks/callout/view'; +import { CodeBlockViewExtension } from '@blocksuite/affine/blocks/code/view'; +import { DataViewViewExtension } from '@blocksuite/affine/blocks/data-view/view'; +import { DatabaseViewExtension } from '@blocksuite/affine/blocks/database/view'; +import { DividerViewExtension } from '@blocksuite/affine/blocks/divider/view'; +import { EdgelessTextViewExtension } from '@blocksuite/affine/blocks/edgeless-text/view'; +import { EmbedViewExtension } from '@blocksuite/affine/blocks/embed/view'; +import { FrameViewExtension } from '@blocksuite/affine/blocks/frame/view'; +import { ImageViewExtension } from '@blocksuite/affine/blocks/image/view'; +import { LatexViewExtension } from '@blocksuite/affine/blocks/latex/view'; +import { ListViewExtension } from '@blocksuite/affine/blocks/list/view'; +import { NoteViewExtension } from '@blocksuite/affine/blocks/note/view'; +import { ParagraphViewExtension } from '@blocksuite/affine/blocks/paragraph/view'; import { ViewExtensionManager } from '@blocksuite/affine/ext-loader'; import { MigratingViewExtension } from '@blocksuite/affine/extensions/view'; export function getTestViewManager() { - const manager = new ViewExtensionManager([MigratingViewExtension]); + const manager = new ViewExtensionManager([ + MigratingViewExtension, + AttachmentViewExtension, + BookmarkViewExtension, + CalloutViewExtension, + CodeBlockViewExtension, + DataViewViewExtension, + DatabaseViewExtension, + DividerViewExtension, + EdgelessTextViewExtension, + EmbedViewExtension, + FrameViewExtension, + ImageViewExtension, + LatexViewExtension, + ListViewExtension, + NoteViewExtension, + ParagraphViewExtension, + ]); return manager; } diff --git a/packages/frontend/core/src/blocksuite/ai/components/ai-chat-chips/doc-chip.ts b/packages/frontend/core/src/blocksuite/ai/components/ai-chat-chips/doc-chip.ts index 32f61c6d8c..3c46608582 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/ai-chat-chips/doc-chip.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/ai-chat-chips/doc-chip.ts @@ -111,7 +111,10 @@ export class ChatPanelDocChip extends SignalWatcher( if (!doc.ready) { doc.load(); } - const value = await extractMarkdownFromDoc(doc, this.host.std.provider); + const value = await extractMarkdownFromDoc( + doc, + this.host.std.store.provider + ); const tokenCount = estimateTokenCount(value); if (this.checkTokenLimit(this.chip, tokenCount)) { const markdown = this.chip.markdown ?? new Signal(''); diff --git a/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts b/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts index 5146257242..f50c0d8cfa 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts @@ -228,7 +228,7 @@ export class TextRenderer extends WithDisposable(ShadowlessElement) { const schema = this.schema ?? this.host?.std.store.schema; let provider: ServiceProvider; if (this.host) { - provider = this.host.std.provider; + provider = this.host.std.store.provider; } else { const container = new Container(); getMarkdownAdapterExtensions().forEach(ext => { diff --git a/packages/frontend/core/src/blocksuite/ai/extensions/enable-ai.ts b/packages/frontend/core/src/blocksuite/ai/extensions/enable-ai.ts index 0a3ad8e577..0d1314c583 100644 --- a/packages/frontend/core/src/blocksuite/ai/extensions/enable-ai.ts +++ b/packages/frontend/core/src/blocksuite/ai/extensions/enable-ai.ts @@ -21,9 +21,7 @@ export function enableAIExtension( framework: FrameworkProvider, enableAI: boolean ) { - if (!enableAI) { - return; - } + if (!enableAI) return; specBuilder.replace(CodeBlockSpec, AICodeBlockSpec); specBuilder.replace(ImageBlockSpec, AIImageBlockSpec); diff --git a/packages/frontend/core/src/blocksuite/ai/messages/mindmap.ts b/packages/frontend/core/src/blocksuite/ai/messages/mindmap.ts index c3e70f9491..ca997c4b14 100644 --- a/packages/frontend/core/src/blocksuite/ai/messages/mindmap.ts +++ b/packages/frontend/core/src/blocksuite/ai/messages/mindmap.ts @@ -56,7 +56,7 @@ export const createMindmapExecuteRenderer: ( } ctx.set({ - node: markdownToMindmap(answer, host.doc, host.std.provider), + node: markdownToMindmap(answer, host.doc, host.std.store.provider), }); handler(host, ctx); diff --git a/packages/frontend/core/src/blocksuite/ai/mini-mindmap/mindmap-preview.ts b/packages/frontend/core/src/blocksuite/ai/mini-mindmap/mindmap-preview.ts index d90073db74..618cd3acf5 100644 --- a/packages/frontend/core/src/blocksuite/ai/mini-mindmap/mindmap-preview.ts +++ b/packages/frontend/core/src/blocksuite/ai/mini-mindmap/mindmap-preview.ts @@ -132,7 +132,7 @@ export class MiniMindmapPreview extends WithDisposable(LitElement) { } private _toMindmapNode(answer: string, doc: Store) { - return markdownToMindmap(answer, doc, this.host.std.provider); + return markdownToMindmap(answer, doc, this.host.std.store.provider); } override connectedCallback(): void { diff --git a/packages/frontend/core/src/blocksuite/ai/utils/editor-actions.ts b/packages/frontend/core/src/blocksuite/ai/utils/editor-actions.ts index 08d68578f7..8dbfbdff80 100644 --- a/packages/frontend/core/src/blocksuite/ai/utils/editor-actions.ts +++ b/packages/frontend/core/src/blocksuite/ai/utils/editor-actions.ts @@ -154,7 +154,7 @@ export const copyTextAnswer = async (panel: AffineAIPanelWidget) => { export const copyText = async (host: EditorHost, text: string) => { const previewDoc = await markDownToDoc( - host.std.provider, + host.std.store.provider, host.std.store.schema, text, [defaultImageProxyMiddleware] diff --git a/packages/frontend/core/src/blocksuite/manager/migrating-store.ts b/packages/frontend/core/src/blocksuite/manager/migrating-store.ts index 16b2d55c32..36bc30ec86 100644 --- a/packages/frontend/core/src/blocksuite/manager/migrating-store.ts +++ b/packages/frontend/core/src/blocksuite/manager/migrating-store.ts @@ -1,3 +1,18 @@ +import { AttachmentStoreExtension } from '@blocksuite/affine/blocks/attachment/store'; +import { BookmarkStoreExtension } from '@blocksuite/affine/blocks/bookmark/store'; +import { CalloutStoreExtension } from '@blocksuite/affine/blocks/callout/store'; +import { CodeStoreExtension } from '@blocksuite/affine/blocks/code/store'; +import { DataViewStoreExtension } from '@blocksuite/affine/blocks/data-view/store'; +import { DatabaseStoreExtension } from '@blocksuite/affine/blocks/database/store'; +import { DividerStoreExtension } from '@blocksuite/affine/blocks/divider/store'; +import { EdgelessTextStoreExtension } from '@blocksuite/affine/blocks/edgeless-text/store'; +import { EmbedStoreExtension } from '@blocksuite/affine/blocks/embed/store'; +import { FrameStoreExtension } from '@blocksuite/affine/blocks/frame/store'; +import { ImageStoreExtension } from '@blocksuite/affine/blocks/image/store'; +import { LatexStoreExtension } from '@blocksuite/affine/blocks/latex/store'; +import { ListStoreExtension } from '@blocksuite/affine/blocks/list/store'; +import { NoteStoreExtension } from '@blocksuite/affine/blocks/note/store'; +import { ParagraphStoreExtension } from '@blocksuite/affine/blocks/paragraph/store'; import { type StoreExtensionContext, StoreExtensionManager, @@ -17,8 +32,24 @@ class MigratingAffineStoreExtension extends StoreExtensionProvider { } const manager = new StoreExtensionManager([ - MigratingAffineStoreExtension, + AttachmentStoreExtension, + BookmarkStoreExtension, + CalloutStoreExtension, + CodeStoreExtension, + DataViewStoreExtension, + DatabaseStoreExtension, + DividerStoreExtension, + EdgelessTextStoreExtension, + EmbedStoreExtension, + FrameStoreExtension, + ImageStoreExtension, + LatexStoreExtension, + ListStoreExtension, + NoteStoreExtension, + ParagraphStoreExtension, + MigratingStoreExtension, + MigratingAffineStoreExtension, ]); export function getStoreManager() { diff --git a/packages/frontend/core/src/blocksuite/manager/migrating-view.ts b/packages/frontend/core/src/blocksuite/manager/migrating-view.ts index 01a38800af..679bfd36e0 100644 --- a/packages/frontend/core/src/blocksuite/manager/migrating-view.ts +++ b/packages/frontend/core/src/blocksuite/manager/migrating-view.ts @@ -1,5 +1,20 @@ import { PeekViewService } from '@affine/core/modules/peek-view'; +import { AttachmentViewExtension } from '@blocksuite/affine/blocks/attachment/view'; +import { BookmarkViewExtension } from '@blocksuite/affine/blocks/bookmark/view'; +import { CalloutViewExtension } from '@blocksuite/affine/blocks/callout/view'; +import { CodeBlockViewExtension } from '@blocksuite/affine/blocks/code/view'; +import { DataViewViewExtension } from '@blocksuite/affine/blocks/data-view/view'; +import { DatabaseViewExtension } from '@blocksuite/affine/blocks/database/view'; +import { DividerViewExtension } from '@blocksuite/affine/blocks/divider/view'; +import { EdgelessTextViewExtension } from '@blocksuite/affine/blocks/edgeless-text/view'; +import { EmbedViewExtension } from '@blocksuite/affine/blocks/embed/view'; +import { FrameViewExtension } from '@blocksuite/affine/blocks/frame/view'; +import { ImageViewExtension } from '@blocksuite/affine/blocks/image/view'; +import { LatexViewExtension } from '@blocksuite/affine/blocks/latex/view'; +import { ListViewExtension } from '@blocksuite/affine/blocks/list/view'; +import { NoteViewExtension } from '@blocksuite/affine/blocks/note/view'; import { ParagraphBlockConfigExtension } from '@blocksuite/affine/blocks/paragraph'; +import { ParagraphViewExtension } from '@blocksuite/affine/blocks/paragraph/view'; import { type ViewExtensionContext, ViewExtensionManager, @@ -129,6 +144,23 @@ class MigratingAffineViewExtension extends ViewExtensionProvider< const manager = new ViewExtensionManager([ MigratingViewExtension, + + AttachmentViewExtension, + BookmarkViewExtension, + CalloutViewExtension, + CodeBlockViewExtension, + DataViewViewExtension, + DatabaseViewExtension, + DividerViewExtension, + EdgelessTextViewExtension, + EmbedViewExtension, + FrameViewExtension, + ImageViewExtension, + LatexViewExtension, + ListViewExtension, + NoteViewExtension, + ParagraphViewExtension, + MigratingAffineViewExtension, ]); diff --git a/packages/frontend/core/src/blocksuite/utils/markdown-utils.ts b/packages/frontend/core/src/blocksuite/utils/markdown-utils.ts index c73236bbf4..ed3a1867fc 100644 --- a/packages/frontend/core/src/blocksuite/utils/markdown-utils.ts +++ b/packages/frontend/core/src/blocksuite/utils/markdown-utils.ts @@ -91,8 +91,8 @@ export async function getContentFromSlice( processTextInSnapshot(snapshot, host); const adapter = type === 'markdown' - ? new MarkdownAdapter(transformer, host.std.provider) - : new PlainTextAdapter(transformer, host.std.provider); + ? new MarkdownAdapter(transformer, host.std.store.provider) + : new PlainTextAdapter(transformer, host.std.store.provider); const content = await adapter.fromSliceSnapshot({ snapshot, assets: transformer.assetsManager, diff --git a/packages/frontend/core/src/components/hooks/affine/use-export-page.ts b/packages/frontend/core/src/components/hooks/affine/use-export-page.ts index da4b1479ab..9ce439f4e4 100644 --- a/packages/frontend/core/src/components/hooks/affine/use-export-page.ts +++ b/packages/frontend/core/src/components/hooks/affine/use-export-page.ts @@ -76,7 +76,7 @@ async function exportDoc( ], }); - const adapterFactory = std.provider.get(config.identifier); + const adapterFactory = std.store.provider.get(config.identifier); const adapter = adapterFactory.get(transformer); const result = (await adapter.fromDoc(doc)) as AdapterResult;