refactor(editor): use spec builder (#9424)

This commit is contained in:
Saul-Mirone
2024-12-30 08:42:58 +00:00
parent 4fee0e2eb3
commit b66a64bc9a
16 changed files with 65 additions and 150 deletions

View File

@@ -19,9 +19,10 @@ export class SpecBuilder {
this._value = this._value.filter(extension => extension !== target); this._value = this._value.filter(extension => extension !== target);
} }
replace(target: ExtensionType, newExtension: ExtensionType) { replace(target: ExtensionType[], newExtension: ExtensionType[]) {
this._value = this._value.map(extension => this._value = [
extension === target ? newExtension : extension ...this._value.filter(extension => !target.includes(extension)),
); ...newExtension,
];
} }
} }

View File

@@ -22,6 +22,7 @@ import {
RichTextExtensions, RichTextExtensions,
} from '@blocksuite/affine-components/rich-text'; } from '@blocksuite/affine-components/rich-text';
import { import {
DocDisplayMetaService,
EditPropsStore, EditPropsStore,
FontLoaderService, FontLoaderService,
} from '@blocksuite/affine-shared/services'; } from '@blocksuite/affine-shared/services';
@@ -36,6 +37,7 @@ import {
} from '../surface-ref-block/surface-ref-spec.js'; } from '../surface-ref-block/surface-ref-spec.js';
export const CommonBlockSpecs: ExtensionType[] = [ export const CommonBlockSpecs: ExtensionType[] = [
DocDisplayMetaService,
RefNodeSlotsExtension, RefNodeSlotsExtension,
EditPropsStore, EditPropsStore,
RichTextExtensions, RichTextExtensions,
@@ -54,7 +56,7 @@ export const CommonBlockSpecs: ExtensionType[] = [
].flat(); ].flat();
export const PageFirstPartyBlockSpecs: ExtensionType[] = [ export const PageFirstPartyBlockSpecs: ExtensionType[] = [
...CommonBlockSpecs, CommonBlockSpecs,
NoteBlockSpec, NoteBlockSpec,
PageSurfaceBlockSpec, PageSurfaceBlockSpec,
PageSurfaceRefBlockSpec, PageSurfaceRefBlockSpec,
@@ -62,7 +64,7 @@ export const PageFirstPartyBlockSpecs: ExtensionType[] = [
].flat(); ].flat();
export const EdgelessFirstPartyBlockSpecs: ExtensionType[] = [ export const EdgelessFirstPartyBlockSpecs: ExtensionType[] = [
...CommonBlockSpecs, CommonBlockSpecs,
EdgelessNoteBlockSpec, EdgelessNoteBlockSpec,
EdgelessSurfaceBlockSpec, EdgelessSurfaceBlockSpec,

View File

@@ -1,44 +0,0 @@
import { AttachmentBlockSpec } from '@blocksuite/affine-block-attachment';
import { BookmarkBlockSpec } from '@blocksuite/affine-block-bookmark';
import { CodeBlockSpec } from '@blocksuite/affine-block-code';
import { DividerBlockSpec } from '@blocksuite/affine-block-divider';
import {
EmbedFigmaBlockSpec,
EmbedGithubBlockSpec,
EmbedHtmlBlockSpec,
EmbedLinkedDocBlockSpec,
EmbedLoomBlockSpec,
EmbedSyncedDocBlockSpec,
EmbedYoutubeBlockSpec,
} from '@blocksuite/affine-block-embed';
import { ImageBlockSpec } from '@blocksuite/affine-block-image';
import { ListBlockSpec } from '@blocksuite/affine-block-list';
import {
EdgelessNoteBlockSpec,
NoteBlockSpec,
} from '@blocksuite/affine-block-note';
import { ParagraphBlockSpec } from '@blocksuite/affine-block-paragraph';
import { DataViewBlockSpec } from '../../data-view-block/data-view-spec.js';
import { DatabaseBlockSpec } from '../../database-block/database-spec.js';
export {
AttachmentBlockSpec,
BookmarkBlockSpec,
CodeBlockSpec,
DatabaseBlockSpec,
DataViewBlockSpec,
DividerBlockSpec,
EdgelessNoteBlockSpec,
EmbedFigmaBlockSpec,
EmbedGithubBlockSpec,
EmbedHtmlBlockSpec,
EmbedLinkedDocBlockSpec,
EmbedLoomBlockSpec,
EmbedSyncedDocBlockSpec,
EmbedYoutubeBlockSpec,
ImageBlockSpec,
ListBlockSpec,
NoteBlockSpec,
ParagraphBlockSpec,
};

View File

@@ -1,16 +0,0 @@
import { EdgelessTextBlockSpec } from '@blocksuite/affine-block-edgeless-text';
import { FrameBlockSpec } from '@blocksuite/affine-block-frame';
import { LatexBlockSpec } from '@blocksuite/affine-block-latex';
import { EdgelessSurfaceBlockSpec } from '@blocksuite/affine-block-surface';
import { EdgelessRootBlockSpec } from '../../root-block/edgeless/edgeless-root-spec.js';
import { EdgelessSurfaceRefBlockSpec } from '../../surface-ref-block/surface-ref-spec.js';
export {
EdgelessRootBlockSpec,
EdgelessSurfaceBlockSpec,
EdgelessSurfaceRefBlockSpec,
EdgelessTextBlockSpec,
FrameBlockSpec,
LatexBlockSpec,
};

View File

@@ -1,6 +0,0 @@
import { PageSurfaceBlockSpec } from '@blocksuite/affine-block-surface';
import { PageRootBlockSpec } from '../../root-block/page/page-root-spec.js';
import { PageSurfaceRefBlockSpec } from '../../surface-ref-block/surface-ref-spec.js';
export { PageRootBlockSpec, PageSurfaceBlockSpec, PageSurfaceRefBlockSpec };

View File

@@ -1,4 +1,3 @@
export * from './group/common.js';
export * from './preset/edgeless-specs.js'; export * from './preset/edgeless-specs.js';
export * from './preset/mobile-patch.js'; export * from './preset/mobile-patch.js';
export * from './preset/page-specs.js'; export * from './preset/page-specs.js';

View File

@@ -53,7 +53,7 @@ export const EdgelessBuiltInManager: ExtensionType[] = [
export const EdgelessEditorBlockSpecs: ExtensionType[] = [ export const EdgelessEditorBlockSpecs: ExtensionType[] = [
EdgelessRootBlockSpec, EdgelessRootBlockSpec,
...EdgelessFirstPartyBlockSpecs, EdgelessFirstPartyBlockSpecs,
EdgelessToolExtension, EdgelessToolExtension,
EdgelessBuiltInManager, EdgelessBuiltInManager,
].flat(); ].flat();

View File

@@ -2,6 +2,7 @@ import type { DataViewBlockModel } from './data-view-model.js';
export * from './data-view-block.js'; export * from './data-view-block.js';
export * from './data-view-model.js'; export * from './data-view-model.js';
export * from './data-view-spec.js';
declare global { declare global {
namespace BlockSuite { namespace BlockSuite {

View File

@@ -5,6 +5,7 @@ export type { DatabaseOptionsConfig } from './config.js';
export * from './data-source.js'; export * from './data-source.js';
export * from './database-block.js'; export * from './database-block.js';
export * from './database-service.js'; export * from './database-service.js';
export * from './database-spec.js';
export { databaseBlockColumns } from './properties/index.js'; export { databaseBlockColumns } from './properties/index.js';
declare global { declare global {
namespace BlockSuite { namespace BlockSuite {

View File

@@ -16,8 +16,8 @@ export * from './_common/test-utils/test-utils.js';
export * from './_common/transformers/index.js'; export * from './_common/transformers/index.js';
export { type AbstractEditor } from './_common/types.js'; export { type AbstractEditor } from './_common/types.js';
export * from './_specs/index.js'; export * from './_specs/index.js';
export * from './data-view-block/index.js'; export * from './data-view-block';
export * from './database-block/index.js'; export * from './database-block';
export { EdgelessTemplatePanel } from './root-block/edgeless/components/toolbar/template/template-panel.js'; export { EdgelessTemplatePanel } from './root-block/edgeless/components/toolbar/template/template-panel.js';
export type { export type {
Template, Template,

View File

@@ -1,7 +1,6 @@
import { FileDropExtension } from '@blocksuite/affine-components/drag-indicator'; import { FileDropExtension } from '@blocksuite/affine-components/drag-indicator';
import { import {
DNDAPIExtension, DNDAPIExtension,
DocDisplayMetaService,
DocModeService, DocModeService,
EmbedOptionService, EmbedOptionService,
PageViewportServiceExtension, PageViewportServiceExtension,
@@ -99,7 +98,6 @@ const EdgelessCommonExtension: ExtensionType[] = [
ToolController, ToolController,
DNDAPIExtension, DNDAPIExtension,
PageViewportServiceExtension, PageViewportServiceExtension,
DocDisplayMetaService,
RootBlockAdapterExtensions, RootBlockAdapterExtensions,
FileDropExtension, FileDropExtension,
].flat(); ].flat();

View File

@@ -1,7 +1,6 @@
import { FileDropExtension } from '@blocksuite/affine-components/drag-indicator'; import { FileDropExtension } from '@blocksuite/affine-components/drag-indicator';
import { import {
DNDAPIExtension, DNDAPIExtension,
DocDisplayMetaService,
DocModeService, DocModeService,
EmbedOptionService, EmbedOptionService,
PageViewportServiceExtension, PageViewportServiceExtension,
@@ -70,7 +69,6 @@ const PageCommonExtension: ExtensionType[] = [
DocModeService, DocModeService,
ThemeService, ThemeService,
EmbedOptionService, EmbedOptionService,
DocDisplayMetaService,
PageViewportServiceExtension, PageViewportServiceExtension,
]; ];

View File

@@ -15,6 +15,7 @@ import {
DividerBlockSpec, DividerBlockSpec,
EditPropsStore, EditPropsStore,
EmbedExtensions, EmbedExtensions,
FontLoaderService,
ImageBlockSpec, ImageBlockSpec,
LatexBlockSpec, LatexBlockSpec,
ListBlockSpec, ListBlockSpec,
@@ -36,6 +37,7 @@ const CommonBlockSpecs: ExtensionType[] = [
BookmarkBlockSpec, BookmarkBlockSpec,
AttachmentBlockSpec, AttachmentBlockSpec,
AdapterFactoryExtensions, AdapterFactoryExtensions,
FontLoaderService,
].flat(); ].flat();
export const DefaultBlockSpecs: ExtensionType[] = [ export const DefaultBlockSpecs: ExtensionType[] = [

View File

@@ -1,11 +1,12 @@
import { import {
AIEdgelessRootBlockSpec, AICodeBlockSpec,
AIPageRootBlockSpec, AIImageBlockSpec,
AIParagraphBlockSpec,
} from '@affine/core/blocksuite/presets/ai'; } from '@affine/core/blocksuite/presets/ai';
import { AIChatBlockSpec } from '@affine/core/blocksuite/presets/blocks';
import { DocService, DocsService } from '@affine/core/modules/doc'; import { DocService, DocsService } from '@affine/core/modules/doc';
import { DocDisplayMetaService } from '@affine/core/modules/doc-display-meta'; import { DocDisplayMetaService } from '@affine/core/modules/doc-display-meta';
import { EditorSettingService } from '@affine/core/modules/editor-setting'; import { EditorSettingService } from '@affine/core/modules/editor-setting';
import { FeatureFlagService } from '@affine/core/modules/feature-flag';
import { AppThemeService } from '@affine/core/modules/theme'; import { AppThemeService } from '@affine/core/modules/theme';
import { mixpanel } from '@affine/track'; import { mixpanel } from '@affine/track';
import { import {
@@ -18,18 +19,17 @@ import type {
DocDisplayMetaExtension, DocDisplayMetaExtension,
DocDisplayMetaParams, DocDisplayMetaParams,
RootBlockConfig, RootBlockConfig,
SpecBuilder,
TelemetryEventMap, TelemetryEventMap,
ThemeExtension, ThemeExtension,
} from '@blocksuite/affine/blocks'; } from '@blocksuite/affine/blocks';
import { import {
CodeBlockSpec,
ColorScheme, ColorScheme,
DocDisplayMetaProvider, DocDisplayMetaProvider,
EdgelessBuiltInManager,
EdgelessRootBlockSpec,
EdgelessToolExtension,
EditorSettingExtension, EditorSettingExtension,
FontLoaderService, ImageBlockSpec,
PageRootBlockSpec, ParagraphBlockSpec,
TelemetryProvider, TelemetryProvider,
ThemeExtensionIdentifier, ThemeExtensionIdentifier,
} from '@blocksuite/affine/blocks'; } from '@blocksuite/affine/blocks';
@@ -258,36 +258,24 @@ export const extendEdgelessPreviewSpec = (function () {
}; };
})(); })();
export function createPageRootBlockSpec( export function enableAffineExtension(
framework: FrameworkProvider framework: FrameworkProvider,
): ExtensionType[] { specBuilder: SpecBuilder
const featureFlagService = framework.get(FeatureFlagService); ): void {
const enableAI = featureFlagService.flags.enable_ai.value; specBuilder.extend(
return [ [
enableAI ? AIPageRootBlockSpec : PageRootBlockSpec, getThemeExtension(framework),
FontLoaderService, getFontConfigExtension(),
getThemeExtension(framework), getTelemetryExtension(),
getFontConfigExtension(), getEditorConfigExtension(framework),
getTelemetryExtension(), buildDocDisplayMetaExtension(framework),
getEditorConfigExtension(framework), ].flat()
buildDocDisplayMetaExtension(framework), );
].flat();
} }
export function createEdgelessRootBlockSpec( export function enableAIExtension(specBuilder: SpecBuilder): void {
framework: FrameworkProvider specBuilder.replace(CodeBlockSpec, AICodeBlockSpec);
): ExtensionType[] { specBuilder.replace(ImageBlockSpec, AIImageBlockSpec);
const featureFlagService = framework.get(FeatureFlagService); specBuilder.replace(ParagraphBlockSpec, AIParagraphBlockSpec);
const enableAI = featureFlagService.flags.enable_ai.value; specBuilder.extend(AIChatBlockSpec);
return [
enableAI ? AIEdgelessRootBlockSpec : EdgelessRootBlockSpec,
FontLoaderService,
getThemeExtension(framework),
EdgelessToolExtension,
EdgelessBuiltInManager,
getFontConfigExtension(),
getTelemetryExtension(),
getEditorConfigExtension(framework),
buildDocDisplayMetaExtension(framework),
].flat();
} }

View File

@@ -1,36 +1,31 @@
import { AIEdgelessRootBlockSpec } from '@affine/core/blocksuite/presets/ai';
import { FeatureFlagService } from '@affine/core/modules/feature-flag'; import { FeatureFlagService } from '@affine/core/modules/feature-flag';
import { builtInTemplates as builtInEdgelessTemplates } from '@affine/templates/edgeless'; import { builtInTemplates as builtInEdgelessTemplates } from '@affine/templates/edgeless';
import { builtInTemplates as builtInStickersTemplates } from '@affine/templates/stickers'; import { builtInTemplates as builtInStickersTemplates } from '@affine/templates/stickers';
import type { ExtensionType } from '@blocksuite/affine/block-std'; import type { ExtensionType } from '@blocksuite/affine/block-std';
import type { TemplateManager } from '@blocksuite/affine/blocks'; import type { TemplateManager } from '@blocksuite/affine/blocks';
import { import {
EdgelessNoteBlockSpec, EdgelessRootBlockSpec,
EdgelessSurfaceBlockSpec,
EdgelessSurfaceRefBlockSpec,
EdgelessTemplatePanel, EdgelessTemplatePanel,
EdgelessTextBlockSpec, SpecProvider,
FrameBlockSpec,
} from '@blocksuite/affine/blocks'; } from '@blocksuite/affine/blocks';
import { type FrameworkProvider } from '@toeverything/infra'; import { type FrameworkProvider } from '@toeverything/infra';
import { AIBlockSpecs, DefaultBlockSpecs } from './common'; import { enableAffineExtension, enableAIExtension } from './custom/root-block';
import { createEdgelessRootBlockSpec } from './custom/root-block';
export function createEdgelessModeSpecs( export function createEdgelessModeSpecs(
framework: FrameworkProvider framework: FrameworkProvider
): ExtensionType[] { ): ExtensionType[] {
const featureFlagService = framework.get(FeatureFlagService); const featureFlagService = framework.get(FeatureFlagService);
const enableAI = featureFlagService.flags.enable_ai.value; const enableAI = featureFlagService.flags.enable_ai.value;
return [ const edgelessSpec = SpecProvider.getInstance().getSpec('edgeless');
...(enableAI ? AIBlockSpecs : DefaultBlockSpecs), enableAffineExtension(framework, edgelessSpec);
EdgelessSurfaceBlockSpec, if (enableAI) {
EdgelessSurfaceRefBlockSpec, enableAIExtension(edgelessSpec);
FrameBlockSpec, edgelessSpec.replace(EdgelessRootBlockSpec, AIEdgelessRootBlockSpec);
EdgelessTextBlockSpec, }
EdgelessNoteBlockSpec,
// special return edgelessSpec.value;
createEdgelessRootBlockSpec(framework),
].flat();
} }
export function effects() { export function effects() {

View File

@@ -1,26 +1,22 @@
import { AIPageRootBlockSpec } from '@affine/core/blocksuite/presets/ai';
import { FeatureFlagService } from '@affine/core/modules/feature-flag'; import { FeatureFlagService } from '@affine/core/modules/feature-flag';
import type { ExtensionType } from '@blocksuite/affine/block-std'; import type { ExtensionType } from '@blocksuite/affine/block-std';
import { import { PageRootBlockSpec, SpecProvider } from '@blocksuite/affine/blocks';
NoteBlockSpec,
PageSurfaceBlockSpec,
PageSurfaceRefBlockSpec,
} from '@blocksuite/affine/blocks';
import { type FrameworkProvider } from '@toeverything/infra'; import { type FrameworkProvider } from '@toeverything/infra';
import { AIBlockSpecs, DefaultBlockSpecs } from './common'; import { enableAffineExtension, enableAIExtension } from './custom/root-block';
import { createPageRootBlockSpec } from './custom/root-block';
export function createPageModeSpecs( export function createPageModeSpecs(
framework: FrameworkProvider framework: FrameworkProvider
): ExtensionType[] { ): ExtensionType[] {
const featureFlagService = framework.get(FeatureFlagService); const featureFlagService = framework.get(FeatureFlagService);
const enableAI = featureFlagService.flags.enable_ai.value; const enableAI = featureFlagService.flags.enable_ai.value;
return [ const provider = SpecProvider.getInstance();
...(enableAI ? AIBlockSpecs : DefaultBlockSpecs), const pageSpec = provider.getSpec('page');
PageSurfaceBlockSpec, enableAffineExtension(framework, pageSpec);
PageSurfaceRefBlockSpec, if (enableAI) {
NoteBlockSpec, enableAIExtension(pageSpec);
// special pageSpec.replace(PageRootBlockSpec, AIPageRootBlockSpec);
createPageRootBlockSpec(framework), }
].flat(); return pageSpec.value;
} }