refactor(editor): finish the extension provider migration (#12259)

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - Added AI-powered store extension to support chat and transcription block schemas.
  - Introduced a new database view extension for enhanced database block integration.

- **Refactor**
  - Updated and reorganized import paths for improved code structure and maintainability.
  - Consolidated and streamlined extension registration for store and view managers.

- **Chores**
  - Removed deprecated or redundant extension classes and imports.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
Saul-Mirone
2025-05-14 02:18:21 +00:00
parent fb16caf192
commit 2f8d8dbc1e
68 changed files with 110 additions and 86 deletions

View File

@@ -1,4 +1,6 @@
import { createReactComponentFromLit } from '@affine/component';
import { getStoreManager } from '@affine/core/blocksuite/manager/store';
import { getViewManager } from '@affine/core/blocksuite/manager/view';
import type { FeatureFlagService } from '@affine/core/modules/feature-flag';
import { Container, type ServiceProvider } from '@blocksuite/affine/global/di';
import { WithDisposable } from '@blocksuite/affine/global/lit';
@@ -33,8 +35,6 @@ import { keyed } from 'lit/directives/keyed.js';
import { literal } from 'lit/static-html.js';
import React from 'react';
import { getStoreManager } from '../../manager/migrating-store';
import { getViewManager } from '../../manager/migrating-view';
import { markDownToDoc } from '../../utils';
import type {
AffineAIPanelState,

View File

@@ -1,4 +1,4 @@
import { getStoreManager } from '@affine/core/blocksuite/manager/migrating-store.js';
import { getStoreManager } from '@affine/core/blocksuite/manager/store';
import { Container } from '@blocksuite/affine/global/di';
import { TestWorkspace } from '@blocksuite/affine/store/test';
import { describe, expect, test } from 'vitest';

View File

@@ -1,4 +1,9 @@
import { Button, Divider, useLitPortalFactory } from '@affine/component';
import { getViewManager } from '@affine/core/blocksuite/manager/view';
import {
patchReferenceRenderer,
type ReferenceReactRenderer,
} from '@affine/core/blocksuite/view-extensions/editor-view/reference-renderer';
import { useGuard } from '@affine/core/components/guard';
import { useEnableAI } from '@affine/core/components/hooks/affine/use-enable-ai';
import { DocService } from '@affine/core/modules/doc';
@@ -41,11 +46,6 @@ import {
AffineSharedPageReference,
} from '../../components/affine/reference-link';
import { LitTextRenderer } from '../ai/components/text-renderer';
import {
patchReferenceRenderer,
type ReferenceReactRenderer,
} from '../extensions/reference-renderer';
import { getViewManager } from '../manager/migrating-view';
import * as styles from './bi-directional-link-panel.css';
const PREFIX = 'bi-directional-link-panel-collapse:';

View File

@@ -6,7 +6,7 @@ import {
LitEdgelessEditor,
type PageEditor,
} from '@affine/core/blocksuite/editors';
import { getViewManager } from '@affine/core/blocksuite/manager/migrating-view';
import { getViewManager } from '@affine/core/blocksuite/manager/view';
import { useEnableAI } from '@affine/core/components/hooks/affine/use-enable-ai';
import type { DocCustomPropertyInfo } from '@affine/core/modules/db';
import type {

View File

@@ -1,4 +1,5 @@
import { toast } from '@affine/component';
import { getStoreManager } from '@affine/core/blocksuite/manager/store';
import { AppSidebarService } from '@affine/core/modules/app-sidebar';
import { DocsService } from '@affine/core/modules/doc';
import { WorkbenchService } from '@affine/core/modules/workbench';
@@ -8,8 +9,6 @@ import type { Workspace } from '@blocksuite/affine/store';
import { useServices } from '@toeverything/infra';
import { useCallback, useMemo } from 'react';
import { getStoreManager } from '../manager/migrating-store';
export const usePageHelper = (docCollection: Workspace) => {
const { docsService, workbenchService, appSidebarService } = useServices({
DocsService,

View File

@@ -1,24 +1,9 @@
import { FeatureFlagStoreExtension } from '@affine/core/blocksuite/extensions/feature-flag';
import { AIStoreExtension } from '@affine/core/blocksuite/store-extensions/ai';
import type { FeatureFlagService } from '@affine/core/modules/feature-flag';
import {
type StoreExtensionContext,
StoreExtensionManager,
StoreExtensionProvider,
} from '@blocksuite/affine/ext-loader';
import { StoreExtensionManager } from '@blocksuite/affine/ext-loader';
import { getInternalStoreExtensions } from '@blocksuite/affine/extensions/store';
import { AIChatBlockSchemaExtension } from '../ai/blocks/ai-chat-block/model';
import { TranscriptionBlockSchemaExtension } from '../ai/blocks/transcription-block/model';
class MigratingAffineStoreExtension extends StoreExtensionProvider {
override name = 'affine-store-extensions';
override setup(context: StoreExtensionContext) {
super.setup(context);
context.register(AIChatBlockSchemaExtension);
context.register(TranscriptionBlockSchemaExtension);
}
}
import { FeatureFlagStoreExtension } from '../store-extensions/feature-flag';
interface Configure {
init: () => Configure;
@@ -42,7 +27,7 @@ class StoreProvider {
constructor() {
this._manager = new StoreExtensionManager([
...getInternalStoreExtensions(),
MigratingAffineStoreExtension,
AIStoreExtension,
FeatureFlagStoreExtension,
]);
}

View File

@@ -1,23 +1,25 @@
import type { ReactToLit } from '@affine/component';
import { AIViewExtension } from '@affine/core/blocksuite/extensions/ai';
import { CloudViewExtension } from '@affine/core/blocksuite/extensions/cloud';
import { AIViewExtension } from '@affine/core/blocksuite/view-extensions/ai';
import { CloudViewExtension } from '@affine/core/blocksuite/view-extensions/cloud';
import { CodeBlockPreviewViewExtension } from '@affine/core/blocksuite/view-extensions/code-block-preview';
import { AffineDatabaseViewExtension } from '@affine/core/blocksuite/view-extensions/database';
import {
EdgelessBlockHeaderConfigViewExtension,
type EdgelessBlockHeaderViewOptions,
} from '@affine/core/blocksuite/extensions/edgeless-block-header';
import { AffineEditorConfigViewExtension } from '@affine/core/blocksuite/extensions/editor-config';
import { createDatabaseOptionsConfig } from '@affine/core/blocksuite/extensions/editor-config/database';
import { createLinkedWidgetConfig } from '@affine/core/blocksuite/extensions/editor-config/linked';
import { ElectronViewExtension } from '@affine/core/blocksuite/extensions/electron';
import { AffineLinkPreviewExtension } from '@affine/core/blocksuite/extensions/link-preview-service';
import { MobileViewExtension } from '@affine/core/blocksuite/extensions/mobile';
import { PdfViewExtension } from '@affine/core/blocksuite/extensions/pdf';
import { AffineThemeViewExtension } from '@affine/core/blocksuite/extensions/theme';
import { TurboRendererViewExtension } from '@affine/core/blocksuite/extensions/turbo-renderer';
} from '@affine/core/blocksuite/view-extensions/edgeless-block-header';
import { AffineEditorConfigViewExtension } from '@affine/core/blocksuite/view-extensions/editor-config';
import { createDatabaseOptionsConfig } from '@affine/core/blocksuite/view-extensions/editor-config/database';
import { createLinkedWidgetConfig } from '@affine/core/blocksuite/view-extensions/editor-config/linked';
import {
AffineEditorViewExtension,
type AffineEditorViewOptions,
} from '@affine/core/blocksuite/manager/editor-view';
} from '@affine/core/blocksuite/view-extensions/editor-view/editor-view';
import { ElectronViewExtension } from '@affine/core/blocksuite/view-extensions/electron';
import { AffineLinkPreviewExtension } from '@affine/core/blocksuite/view-extensions/link-preview-service';
import { MobileViewExtension } from '@affine/core/blocksuite/view-extensions/mobile';
import { PdfViewExtension } from '@affine/core/blocksuite/view-extensions/pdf';
import { AffineThemeViewExtension } from '@affine/core/blocksuite/view-extensions/theme';
import { TurboRendererViewExtension } from '@affine/core/blocksuite/view-extensions/turbo-renderer';
import { PeekViewService } from '@affine/core/modules/peek-view';
import { DebugLogger } from '@affine/debug';
import { mixpanel } from '@affine/track';
@@ -35,8 +37,6 @@ import { LinkedDocViewExtension } from '@blocksuite/affine/widgets/linked-doc/vi
import type { FrameworkProvider } from '@toeverything/infra';
import type { TemplateResult } from 'lit';
import { CodeBlockPreviewViewExtension } from './code-block-preview';
type Configure = {
init: () => Configure;
@@ -88,6 +88,7 @@ class ViewProvider {
AIViewExtension,
ElectronViewExtension,
AffineLinkPreviewExtension,
AffineDatabaseViewExtension,
]);
}

View File

@@ -0,0 +1,16 @@
import { AIChatBlockSchemaExtension } from '@affine/core/blocksuite/ai/blocks';
import { TranscriptionBlockSchemaExtension } from '@affine/core/blocksuite/ai/blocks/transcription-block/model';
import {
type StoreExtensionContext,
StoreExtensionProvider,
} from '@blocksuite/affine/ext-loader';
export class AIStoreExtension extends StoreExtensionProvider {
override name = 'affine-store-extensions';
override setup(context: StoreExtensionContext) {
super.setup(context);
context.register(AIChatBlockSchemaExtension);
context.register(TranscriptionBlockSchemaExtension);
}
}

View File

@@ -1,4 +1,4 @@
import { getFeatureFlagSyncer } from '@affine/core/blocksuite/extensions/feature-flag/feature-flag-syncer';
import { getFeatureFlagSyncer } from '@affine/core/blocksuite/store-extensions/feature-flag/feature-flag-syncer';
import { FeatureFlagService } from '@affine/core/modules/feature-flag';
import {
type StoreExtensionContext,

View File

@@ -6,7 +6,7 @@ import {
import {
CodeBlockHtmlPreview,
effects as htmlPreviewEffects,
} from '../extensions/code-block-preview/html-preview';
} from './html-preview';
export class CodeBlockPreviewViewExtension extends ViewExtensionProvider {
override name = 'code-block-preview';

View File

@@ -4,8 +4,8 @@ import {
} from '@blocksuite/affine/blocks/database';
import type { ExtensionType } from '@blocksuite/affine/store';
import { groupByConfigList } from '../database-block/group-by';
import { propertiesPresets } from '../database-block/properties';
import { groupByConfigList } from '../../database-block/group-by';
import { propertiesPresets } from '../../database-block/properties';
export function patchDatabaseBlockConfigService(): ExtensionType {
//TODO use service

View File

@@ -0,0 +1,26 @@
import {
type ViewExtensionContext,
ViewExtensionProvider,
} from '@blocksuite/affine/ext-loader';
import { z } from 'zod';
import { patchDatabaseBlockConfigService } from './database-block-config-service';
const optionsSchema = z.object({});
export type AffineDatabaseViewOptions = z.infer<typeof optionsSchema>;
export class AffineDatabaseViewExtension extends ViewExtensionProvider<AffineDatabaseViewOptions> {
override name = 'affine-database-view';
override schema = optionsSchema;
override setup(
context: ViewExtensionContext,
options?: AffineDatabaseViewOptions
) {
super.setup(context, options);
context.register(patchDatabaseBlockConfigService());
}
}

View File

@@ -2,7 +2,7 @@ import type { ElementOrFactory } from '@affine/component';
import {
patchForEdgelessNoteConfig,
patchForEmbedSyncedDocConfig,
} from '@affine/core/blocksuite/extensions/edgeless-block-header/patch';
} from '@affine/core/blocksuite/view-extensions/edgeless-block-header/patch';
import {
type ViewExtensionContext,
ViewExtensionProvider,

View File

@@ -1,7 +1,7 @@
import {
createCustomToolbarExtension,
createToolbarMoreMenuConfig,
} from '@affine/core/blocksuite/extensions/editor-config/toolbar';
} from '@affine/core/blocksuite/view-extensions/editor-config/toolbar';
import { WorkspaceServerService } from '@affine/core/modules/cloud';
import { EditorSettingService } from '@affine/core/modules/editor-setting';
import { ToolbarMoreMenuConfigExtension } from '@blocksuite/affine/components/toolbar';

View File

@@ -1,4 +1,4 @@
import { getEditorConfigExtension } from '@affine/core/blocksuite/extensions/editor-config/get-config';
import { getEditorConfigExtension } from '@affine/core/blocksuite/view-extensions/editor-config/get-config';
import {
type ViewExtensionContext,
ViewExtensionProvider,

View File

@@ -89,7 +89,7 @@ import { keyed } from 'lit/directives/keyed.js';
import { repeat } from 'lit/directives/repeat.js';
import { styleMap } from 'lit/directives/style-map.js';
import { openDocActions } from '../../open-doc';
import { openDocActions } from '../../editor-view/open-doc';
import { copyAsImage, createCopyAsPngMenuItem } from './copy-as-image';
export function createToolbarMoreMenuConfig(framework: FrameworkProvider) {

View File

@@ -1,18 +1,4 @@
import type { ConfirmModalProps, ElementOrFactory } from '@affine/component';
import { patchForAudioEmbedView } from '@affine/core/blocksuite/extensions/audio/audio-view';
import { patchDatabaseBlockConfigService } from '@affine/core/blocksuite/extensions/database-block-config-service';
import { buildDocDisplayMetaExtension } from '@affine/core/blocksuite/extensions/display-meta';
import { patchDocModeService } from '@affine/core/blocksuite/extensions/doc-mode-service';
import { patchDocUrlExtensions } from '@affine/core/blocksuite/extensions/doc-url';
import { patchFileSizeLimitExtension } from '@affine/core/blocksuite/extensions/file-size-limit';
import { patchNotificationService } from '@affine/core/blocksuite/extensions/notification-service';
import { patchOpenDocExtension } from '@affine/core/blocksuite/extensions/open-doc';
import { patchQuickSearchService } from '@affine/core/blocksuite/extensions/quick-search-service';
import {
patchReferenceRenderer,
type ReferenceReactRenderer,
} from '@affine/core/blocksuite/extensions/reference-renderer';
import { patchSideBarService } from '@affine/core/blocksuite/extensions/side-bar-service';
import {
AffinePageReference,
AffineSharedPageReference,
@@ -29,6 +15,20 @@ import { FrameworkProvider } from '@toeverything/infra';
import type { TemplateResult } from 'lit';
import { z } from 'zod';
import { patchForAudioEmbedView } from './audio/audio-view';
import { buildDocDisplayMetaExtension } from './display-meta';
import { patchDocModeService } from './doc-mode-service';
import { patchDocUrlExtensions } from './doc-url';
import { patchFileSizeLimitExtension } from './file-size-limit';
import { patchNotificationService } from './notification-service';
import { patchOpenDocExtension } from './open-doc';
import { patchQuickSearchService } from './quick-search-service';
import {
patchReferenceRenderer,
type ReferenceReactRenderer,
} from './reference-renderer';
import { patchSideBarService } from './side-bar-service';
const optionsSchema = z.object({
// services
framework: z.instanceof(FrameworkProvider),
@@ -115,12 +115,9 @@ export class AffineEditorViewExtension extends ViewExtensionProvider<AffineEdito
patchDocModeService(docService, docsService, editorService),
patchFileSizeLimitExtension(framework),
buildDocDisplayMetaExtension(framework),
patchForAudioEmbedView(reactToLit),
])
.register(patchDocUrlExtensions(framework))
.register(patchQuickSearchService(framework))
.register([
patchDatabaseBlockConfigService(),
patchForAudioEmbedView(reactToLit),
]);
.register(patchQuickSearchService(framework));
}
}

View File

@@ -1,5 +1,5 @@
import { KeyboardToolbarExtension } from '@affine/core/blocksuite/extensions/mobile/keyboard-toolbar-extension';
import { MobileFeatureFlagControl } from '@affine/core/blocksuite/extensions/mobile/mobile-feature-flag-control';
import { KeyboardToolbarExtension } from '@affine/core/blocksuite/view-extensions/mobile/keyboard-toolbar-extension';
import { MobileFeatureFlagControl } from '@affine/core/blocksuite/view-extensions/mobile/mobile-feature-flag-control';
import {
type ViewExtensionContext,
ViewExtensionProvider,

View File

@@ -1,5 +1,5 @@
import { getPreviewThemeExtension } from '@affine/core/blocksuite/extensions/theme/preview-theme';
import { getThemeExtension } from '@affine/core/blocksuite/extensions/theme/theme';
import { getPreviewThemeExtension } from '@affine/core/blocksuite/view-extensions/theme/preview-theme';
import { getThemeExtension } from '@affine/core/blocksuite/view-extensions/theme/theme';
import {
type ViewExtensionContext,
ViewExtensionProvider,

View File

@@ -3,7 +3,7 @@
*/
import 'fake-indexeddb/auto';
import { getStoreManager } from '@affine/core/blocksuite/manager/migrating-store';
import { getStoreManager } from '@affine/core/blocksuite/manager/store';
import { type Store, Text } from '@blocksuite/affine/store';
import { TestWorkspace } from '@blocksuite/affine/store/test';
import { renderHook } from '@testing-library/react';

View File

@@ -1,5 +1,5 @@
import { Button, IconButton, Modal } from '@affine/component';
import { getStoreManager } from '@affine/core/blocksuite/manager/migrating-store';
import { getStoreManager } from '@affine/core/blocksuite/manager/store';
import { useAsyncCallback } from '@affine/core/components/hooks/affine-async-hooks';
import type {
DialogComponentProps,

View File

@@ -1,5 +1,5 @@
import { Skeleton } from '@affine/component';
import { getViewManager } from '@affine/core/blocksuite/manager/migrating-view';
import { getViewManager } from '@affine/core/blocksuite/manager/view';
import type { EditorSettingSchema } from '@affine/core/modules/editor-setting';
import { EditorSettingService } from '@affine/core/modules/editor-setting';
import { EdgelessCRUDIdentifier } from '@blocksuite/affine/blocks/surface';

View File

@@ -1,4 +1,4 @@
import { getViewManager } from '@affine/core/blocksuite/manager/migrating-view';
import { getViewManager } from '@affine/core/blocksuite/manager/view';
import { DebugLogger } from '@affine/debug';
import { BlockStdScope } from '@blocksuite/affine/std';
import type { Store } from '@blocksuite/affine/store';

View File

@@ -1,4 +1,4 @@
import { getStoreManager } from '@affine/core/blocksuite/manager/migrating-store';
import { getStoreManager } from '@affine/core/blocksuite/manager/store';
import { MarkdownTransformer } from '@blocksuite/affine/widgets/linked-doc';
import { Service } from '@toeverything/infra';

View File

@@ -1,4 +1,4 @@
import { getStoreManager } from '@affine/core/blocksuite/manager/migrating-store';
import { getStoreManager } from '@affine/core/blocksuite/manager/store';
import { MarkdownTransformer } from '@blocksuite/affine/widgets/linked-doc';
import { Entity } from '@toeverything/infra';

View File

@@ -1,4 +1,4 @@
import { getStoreManager } from '@affine/core/blocksuite/manager/migrating-store';
import { getStoreManager } from '@affine/core/blocksuite/manager/store';
import {
AwarenessStore,
type Doc,