refactor: reorganize specs and adapter extensions (#10359)

### TL;DR
Refactored `SpecProvider` singleton access pattern and reorganized adapter/extension code structure.

### What changed?
- Changed `SpecProvider.getInstance()` to `SpecProvider._` for cleaner singleton access
- Moved adapter/extension code from `_common` directory to dedicated `adapters` and `extensions` folders
- Consolidated adapter extensions into a single file
- Removed unused dependencies from package.json
- Deleted unnecessary schema files
- Extracted `MobileSpecsPatches` class into the mobile patching code
- Updated all references to use the new `SpecProvider._` accessor

### How to test?
- Verify all specs are properly registered and accessible via `SpecProvider._`
- Test adapter functionality for HTML, Markdown, Notion HTML and plain text
- Check mobile-specific features and patches work correctly
- Ensure preview functionality works in both page and edgeless modes

### Why make this change?
- Improves code organization by properly separating adapters and extensions
- Simplifies singleton access pattern
- Removes unnecessary dependencies and files
- Makes the codebase more maintainable by consolidating related functionality
This commit is contained in:
Saul-Mirone
2025-02-21 14:25:35 +00:00
parent 72b751943c
commit 2cf9a8f286
49 changed files with 224 additions and 320 deletions

View File

@@ -197,7 +197,7 @@ async function renderNoteContent(
match: ids.map(id => ({ id, viewType: 'display' })),
};
const previewDoc = doc.doc.getStore({ query });
const previewSpec = SpecProvider.getInstance().getSpec('preview:page');
const previewSpec = SpecProvider._.getSpec('preview:page');
const previewStd = new BlockStdScope({
store: previewDoc,
extensions: previewSpec.value,

View File

@@ -118,7 +118,7 @@ export class EmbedSyncedDocBlockComponent extends EmbedBlockComponent<EmbedSynce
protected _buildPreviewSpec = (name: 'preview:page' | 'preview:edgeless') => {
const nextDepth = this.depth + 1;
const previewSpecBuilder = SpecProvider.getInstance().getSpec(name);
const previewSpecBuilder = SpecProvider._.getSpec(name);
const currentDisposables = this.disposables;
const editorSetting =
this.std.getOptional(EditorSettingProvider) ??

View File

@@ -80,8 +80,7 @@ export class FramePreview extends WithDisposable(ShadowlessElement) {
private _previewDoc: Store | null = null;
private readonly _previewSpec =
SpecProvider.getInstance().getSpec('preview:edgeless');
private readonly _previewSpec = SpecProvider._.getSpec('preview:edgeless');
private readonly _updateFrameViewportWH = () => {
const [, , w, h] = deserializeXYWH(this.frame.xywh);

View File

@@ -26,7 +26,7 @@ type ImportHTMLZipOptions = {
function getProvider() {
const container = new Container();
const exts = SpecProvider.getInstance().getSpec('store').value;
const exts = SpecProvider._.getSpec('store').value;
exts.forEach(ext => {
ext.setup(container);
});

View File

@@ -16,7 +16,7 @@ import { createAssetsArchive, download, Unzip } from './utils.js';
function getProvider() {
const container = new Container();
const exts = SpecProvider.getInstance().getSpec('store').value;
const exts = SpecProvider._.getSpec('store').value;
exts.forEach(ext => {
ext.setup(container);
});

View File

@@ -14,7 +14,7 @@ type ImportNotionZipOptions = {
function getProvider() {
const container = new Container();
const exts = SpecProvider.getInstance().getSpec('store').value;
const exts = SpecProvider._.getSpec('store').value;
exts.forEach(ext => {
ext.setup(container);
});

View File

@@ -118,7 +118,7 @@ export class SurfaceRefNotePortal extends WithDisposable(ShadowlessElement) {
query: this.query,
readonly: true,
});
const previewSpec = SpecProvider.getInstance().getSpec('preview:page');
const previewSpec = SpecProvider._.getSpec('preview:page');
return new BlockStdScope({
store: doc,
extensions: previewSpec.value.slice(),

View File

@@ -239,8 +239,7 @@ export class SurfaceRefBlockComponent extends BlockComponent<SurfaceRefBlockMode
private _previewDoc: Store | null = null;
private readonly _previewSpec =
SpecProvider.getInstance().getSpec('preview:edgeless');
private readonly _previewSpec = SpecProvider._.getSpec('preview:edgeless');
private _referencedModel: GfxModel | null = null;

View File

@@ -17,7 +17,7 @@ export class SpecProvider {
private constructor() {}
static getInstance() {
static get _() {
if (!SpecProvider.instance) {
SpecProvider.instance = new SpecProvider();
}

View File

@@ -102,7 +102,7 @@ export class PreviewHelper {
const editorSetting = std.get(EditorSettingProvider).peek();
const query = this._calculateQuery(blockIds as string[], mode);
const store = widget.doc.doc.getStore({ query });
const previewSpec = SpecProvider.getInstance().getSpec(
const previewSpec = SpecProvider._.getSpec(
isEdgeless ? 'preview:edgeless' : 'preview:page'
);
const settingSignal = signal({ ...editorSetting });

View File

@@ -47,28 +47,7 @@
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.1",
"@blocksuite/inline": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.10",
"@lit/context": "^1.1.2",
"@preact/signals-core": "^1.8.0",
"@toeverything/theme": "^1.1.11",
"@vanilla-extract/css": "^1.17.0",
"date-fns": "^4.0.0",
"dompurify": "^3.2.4",
"fflate": "^0.8.2",
"file-type": "^20.0.0",
"fractional-indexing": "^3.2.0",
"html2canvas": "^1.4.1",
"katex": "^0.16.11",
"lit": "^3.2.0",
"lodash-es": "^4.17.21",
"lz-string": "^1.5.0",
"minimatch": "^10.0.1",
"nanoid": "^5.0.7",
"shiki": "^2.0.0",
"simple-xml-to-json": "^1.2.2",
"yjs": "^13.6.21",
"zod": "^3.23.8"
"@blocksuite/store": "workspace:*"
},
"exports": {
".": "./src/index.ts",
@@ -79,13 +58,9 @@
"src",
"dist",
"!src/__tests__",
"!dist/__tests__",
"schemas.d.ts",
"schemas.js"
"!dist/__tests__"
],
"devDependencies": {
"@types/katex": "^0.16.7",
"@types/lodash-es": "^4.17.12",
"@vanilla-extract/vite-plugin": "^5.0.0",
"vitest": "3.0.6"
}

View File

@@ -1,2 +0,0 @@
// @ts-expect-error FIXME: ts error
export * from './dist/schemas';

View File

@@ -1,3 +0,0 @@
/// <reference types="./dist/schemas.d.ts" />
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
export * from './dist/schemas.js';

View File

@@ -1,13 +1,8 @@
import {
HtmlInlineToDeltaAdapterExtensions,
InlineDeltaToHtmlAdapterExtensions,
} from '@blocksuite/affine-components/rich-text';
import { DefaultTheme, NoteDisplayMode } from '@blocksuite/affine-model';
import {
embedSyncedDocMiddleware,
HtmlAdapter,
} from '@blocksuite/affine-shared/adapters';
import { Container } from '@blocksuite/global/di';
import type {
BlockSnapshot,
DocSnapshot,
@@ -16,19 +11,11 @@ import type {
import { AssetsManager, MemoryBlobCRUD } from '@blocksuite/store';
import { describe, expect, test } from 'vitest';
import { defaultBlockHtmlAdapterMatchers } from '../../_common/adapters/html/block-matcher.js';
import { createJob } from '../utils/create-job.js';
import { getProvider } from '../utils/get-provider.js';
import { nanoidReplacement } from '../utils/nanoid-replacement.js';
const container = new Container();
[
...HtmlInlineToDeltaAdapterExtensions,
...defaultBlockHtmlAdapterMatchers,
...InlineDeltaToHtmlAdapterExtensions,
].forEach(ext => {
ext.setup(container);
});
const provider = container.provider();
const provider = getProvider();
describe('snapshot to html', () => {
const template = (html: string, title?: string) => {

View File

@@ -1,7 +1,3 @@
import {
InlineDeltaToMarkdownAdapterExtensions,
MarkdownInlineToDeltaAdapterExtensions,
} from '@blocksuite/affine-components/rich-text';
import {
DefaultTheme,
NoteDisplayMode,
@@ -11,7 +7,6 @@ import {
embedSyncedDocMiddleware,
MarkdownAdapter,
} from '@blocksuite/affine-shared/adapters';
import { Container } from '@blocksuite/global/di';
import type {
BlockSnapshot,
DocSnapshot,
@@ -21,20 +16,11 @@ import type {
import { AssetsManager, MemoryBlobCRUD } from '@blocksuite/store';
import { describe, expect, test } from 'vitest';
import { defaultBlockMarkdownAdapterMatchers } from '../../_common/adapters/markdown/block-matcher.js';
import { createJob } from '../utils/create-job.js';
import { getProvider } from '../utils/get-provider.js';
import { nanoidReplacement } from '../utils/nanoid-replacement.js';
const container = new Container();
[
...MarkdownInlineToDeltaAdapterExtensions,
...defaultBlockMarkdownAdapterMatchers,
...InlineDeltaToMarkdownAdapterExtensions,
].forEach(ext => {
ext.setup(container);
});
const provider = container.provider();
const provider = getProvider();
describe('snapshot to markdown', () => {
test('code', async () => {

View File

@@ -1,7 +1,5 @@
import { NotionHtmlInlineToDeltaAdapterExtensions } from '@blocksuite/affine-components/rich-text';
import { DefaultTheme, NoteDisplayMode } from '@blocksuite/affine-model';
import { NotionHtmlAdapter } from '@blocksuite/affine-shared/adapters';
import { Container } from '@blocksuite/global/di';
import {
AssetsManager,
type BlockSnapshot,
@@ -9,19 +7,11 @@ import {
} from '@blocksuite/store';
import { describe, expect, test } from 'vitest';
import { defaultBlockNotionHtmlAdapterMatchers } from '../../_common/adapters/notion-html/block-matcher.js';
import { createJob } from '../utils/create-job.js';
import { getProvider } from '../utils/get-provider.js';
import { nanoidReplacement } from '../utils/nanoid-replacement.js';
const container = new Container();
[
...NotionHtmlInlineToDeltaAdapterExtensions,
...defaultBlockNotionHtmlAdapterMatchers,
].forEach(ext => {
ext.setup(container);
});
const provider = container.provider();
const provider = getProvider();
describe('notion html to snapshot', () => {
test('code', async () => {

View File

@@ -1,10 +1,8 @@
import { InlineDeltaToPlainTextAdapterExtensions } from '@blocksuite/affine-components/rich-text';
import { DefaultTheme, NoteDisplayMode } from '@blocksuite/affine-model';
import {
embedSyncedDocMiddleware,
PlainTextAdapter,
} from '@blocksuite/affine-shared/adapters';
import { Container } from '@blocksuite/global/di';
import type {
BlockSnapshot,
DocSnapshot,
@@ -12,17 +10,10 @@ import type {
} from '@blocksuite/store';
import { describe, expect, test } from 'vitest';
import { defaultBlockPlainTextAdapterMatchers } from '../../_common/adapters/plain-text/block-matcher.js';
import { createJob } from '../utils/create-job.js';
import { getProvider } from '../utils/get-provider.js';
const container = new Container();
[
...defaultBlockPlainTextAdapterMatchers,
...InlineDeltaToPlainTextAdapterExtensions,
].forEach(ext => {
ext.setup(container);
});
const provider = container.provider();
const provider = getProvider();
describe('snapshot to plain text', () => {
test('paragraph', async () => {

View File

@@ -0,0 +1,15 @@
import { SpecProvider } from '@blocksuite/affine-shared/utils';
import { Container } from '@blocksuite/global/di';
import { registerSpecs } from '../../extensions/register';
registerSpecs();
export function getProvider() {
const container = new Container();
const exts = SpecProvider._.getSpec('store').value;
exts.forEach(ext => {
ext.setup(container);
});
return container.provider();
}

View File

@@ -1,22 +0,0 @@
import {
AttachmentAdapterFactoryExtension,
HtmlAdapterFactoryExtension,
ImageAdapterFactoryExtension,
MarkdownAdapterFactoryExtension,
MixTextAdapterFactoryExtension,
NotionHtmlAdapterFactoryExtension,
NotionTextAdapterFactoryExtension,
PlainTextAdapterFactoryExtension,
} from '@blocksuite/affine-shared/adapters';
import type { ExtensionType } from '@blocksuite/store';
export const AdapterFactoryExtensions: ExtensionType[] = [
AttachmentAdapterFactoryExtension,
ImageAdapterFactoryExtension,
MarkdownAdapterFactoryExtension,
PlainTextAdapterFactoryExtension,
HtmlAdapterFactoryExtension,
NotionTextAdapterFactoryExtension,
NotionHtmlAdapterFactoryExtension,
MixTextAdapterFactoryExtension,
];

View File

@@ -1,6 +0,0 @@
export * from './common.js';
export * from './preset/edgeless-specs.js';
export * from './preset/mobile-patch.js';
export * from './preset/page-specs.js';
export * from './preset/preview-specs.js';
export { SpecBuilder, SpecProvider } from '@blocksuite/affine-shared/utils';

View File

@@ -1,31 +0,0 @@
import {
HtmlInlineToDeltaAdapterExtensions,
InlineDeltaToHtmlAdapterExtensions,
InlineDeltaToMarkdownAdapterExtensions,
MarkdownInlineToDeltaAdapterExtensions,
NotionHtmlInlineToDeltaAdapterExtensions,
} from '@blocksuite/affine-components/rich-text';
import type { ExtensionType } from '@blocksuite/store';
import {
defaultBlockHtmlAdapterMatchers,
defaultBlockMarkdownAdapterMatchers,
defaultBlockNotionHtmlAdapterMatchers,
} from '../../_common/adapters';
export const HtmlAdapterExtension: ExtensionType[] = [
...HtmlInlineToDeltaAdapterExtensions,
...defaultBlockHtmlAdapterMatchers,
...InlineDeltaToHtmlAdapterExtensions,
];
export const MarkdownAdapterExtension: ExtensionType[] = [
...MarkdownInlineToDeltaAdapterExtensions,
...defaultBlockMarkdownAdapterMatchers,
...InlineDeltaToMarkdownAdapterExtensions,
];
export const NotionHtmlAdapterExtension: ExtensionType[] = [
...NotionHtmlInlineToDeltaAdapterExtensions,
...defaultBlockNotionHtmlAdapterMatchers,
];

View File

@@ -1,9 +0,0 @@
import { EdgelessBuiltInSpecs } from '@blocksuite/affine-block-root';
import type { ExtensionType } from '@blocksuite/store';
import { EdgelessFirstPartyBlockSpecs } from '../common';
export const EdgelessEditorBlockSpecs: ExtensionType[] = [
EdgelessBuiltInSpecs,
EdgelessFirstPartyBlockSpecs,
].flat();

View File

@@ -1,74 +0,0 @@
import type { CodeBlockConfig } from '@blocksuite/affine-block-code';
import { ParagraphBlockService } from '@blocksuite/affine-block-paragraph';
import {
type ReferenceNodeConfig,
ReferenceNodeConfigIdentifier,
} from '@blocksuite/affine-components/rich-text';
import { FeatureFlagService } from '@blocksuite/affine-shared/services';
import {
type BlockStdScope,
ConfigIdentifier,
LifeCycleWatcher,
} from '@blocksuite/block-std';
import type { Container } from '@blocksuite/global/di';
export class MobileSpecsPatches extends LifeCycleWatcher {
static override key = 'mobile-patches';
constructor(std: BlockStdScope) {
super(std);
const featureFlagService = std.get(FeatureFlagService);
featureFlagService.setFlag('enable_mobile_keyboard_toolbar', true);
featureFlagService.setFlag('enable_mobile_linked_doc_menu', true);
}
static override setup(di: Container) {
super.setup(di);
// Hide reference popup on mobile.
{
const prev = di.getFactory(ReferenceNodeConfigIdentifier);
di.override(ReferenceNodeConfigIdentifier, provider => {
return {
...prev?.(provider),
hidePopup: true,
} satisfies ReferenceNodeConfig;
});
}
// Hide number lines for code block on mobile.
{
const codeConfigIdentifier = ConfigIdentifier('affine:code');
const prev = di.getFactory(codeConfigIdentifier);
di.override(codeConfigIdentifier, provider => {
return {
...prev?.(provider),
showLineNumbers: false,
} satisfies CodeBlockConfig;
});
}
}
override mounted() {
// remove slash placeholder for mobile: `type / ...`
{
const paragraphService = this.std.get(ParagraphBlockService);
if (!paragraphService) return;
paragraphService.placeholderGenerator = model => {
const placeholders = {
text: '',
h1: 'Heading 1',
h2: 'Heading 2',
h3: 'Heading 3',
h4: 'Heading 4',
h5: 'Heading 5',
h6: 'Heading 6',
quote: '',
};
return placeholders[model.type];
};
}
}
}

View File

@@ -1,9 +0,0 @@
import { PageRootBlockSpec } from '@blocksuite/affine-block-root';
import type { ExtensionType } from '@blocksuite/store';
import { PageFirstPartyBlockSpecs } from '../common.js';
export const PageEditorBlockSpecs: ExtensionType[] = [
PageRootBlockSpec,
...PageFirstPartyBlockSpecs,
].flat();

View File

@@ -1,23 +0,0 @@
import { SpecProvider } from '@blocksuite/affine-shared/utils';
import { StoreExtensions } from './common.js';
import { EdgelessEditorBlockSpecs } from './preset/edgeless-specs.js';
import { PageEditorBlockSpecs } from './preset/page-specs.js';
import {
PreviewEdgelessEditorBlockSpecs,
PreviewPageEditorBlockSpecs,
} from './preset/preview-specs.js';
export function registerSpecs() {
SpecProvider.getInstance().addSpec('store', StoreExtensions);
SpecProvider.getInstance().addSpec('page', PageEditorBlockSpecs);
SpecProvider.getInstance().addSpec('edgeless', EdgelessEditorBlockSpecs);
SpecProvider.getInstance().addSpec(
'preview:page',
PreviewPageEditorBlockSpecs
);
SpecProvider.getInstance().addSpec(
'preview:edgeless',
PreviewEdgelessEditorBlockSpecs
);
}

View File

@@ -0,0 +1,57 @@
import {
HtmlInlineToDeltaAdapterExtensions,
InlineDeltaToHtmlAdapterExtensions,
InlineDeltaToMarkdownAdapterExtensions,
InlineDeltaToPlainTextAdapterExtensions,
MarkdownInlineToDeltaAdapterExtensions,
NotionHtmlInlineToDeltaAdapterExtensions,
} from '@blocksuite/affine-components/rich-text';
import {
AttachmentAdapterFactoryExtension,
HtmlAdapterFactoryExtension,
ImageAdapterFactoryExtension,
MarkdownAdapterFactoryExtension,
MixTextAdapterFactoryExtension,
NotionHtmlAdapterFactoryExtension,
NotionTextAdapterFactoryExtension,
PlainTextAdapterFactoryExtension,
} from '@blocksuite/affine-shared/adapters';
import type { ExtensionType } from '@blocksuite/store';
import { defaultBlockHtmlAdapterMatchers } from './html/block-matcher';
import { defaultBlockMarkdownAdapterMatchers } from './markdown/block-matcher';
import { defaultBlockNotionHtmlAdapterMatchers } from './notion-html/block-matcher';
import { defaultBlockPlainTextAdapterMatchers } from './plain-text/block-matcher';
export const AdapterFactoryExtensions: ExtensionType[] = [
AttachmentAdapterFactoryExtension,
ImageAdapterFactoryExtension,
MarkdownAdapterFactoryExtension,
PlainTextAdapterFactoryExtension,
HtmlAdapterFactoryExtension,
NotionTextAdapterFactoryExtension,
NotionHtmlAdapterFactoryExtension,
MixTextAdapterFactoryExtension,
];
export const HtmlAdapterExtension: ExtensionType[] = [
...HtmlInlineToDeltaAdapterExtensions,
...defaultBlockHtmlAdapterMatchers,
...InlineDeltaToHtmlAdapterExtensions,
];
export const MarkdownAdapterExtension: ExtensionType[] = [
...MarkdownInlineToDeltaAdapterExtensions,
...defaultBlockMarkdownAdapterMatchers,
...InlineDeltaToMarkdownAdapterExtensions,
];
export const NotionHtmlAdapterExtension: ExtensionType[] = [
...NotionHtmlInlineToDeltaAdapterExtensions,
...defaultBlockNotionHtmlAdapterMatchers,
];
export const PlainTextAdapterExtension: ExtensionType[] = [
...defaultBlockPlainTextAdapterMatchers,
...InlineDeltaToPlainTextAdapterExtensions,
];

View File

@@ -45,7 +45,7 @@ import { effects as stdEffects } from '@blocksuite/block-std/effects';
import { effects as dataViewEffects } from '@blocksuite/data-view/effects';
import { effects as inlineEffects } from '@blocksuite/inline/effects';
import { registerSpecs } from './_specs/register-specs.js';
import { registerSpecs } from './extensions/register.js';
export function effects() {
registerSpecs();
@@ -73,6 +73,7 @@ export function effects() {
blockCodeEffects();
blockTableEffects();
blockRootEffects();
componentCaptionEffects();
componentContextMenuEffects();
componentDatePickerEffects();

View File

@@ -55,12 +55,13 @@ import {
} from '@blocksuite/block-std';
import type { ExtensionType } from '@blocksuite/store';
import { AdapterFactoryExtensions } from '../_common/adapters/extension.js';
import {
AdapterFactoryExtensions,
HtmlAdapterExtension,
MarkdownAdapterExtension,
NotionHtmlAdapterExtension,
} from './preset/adapters.js';
PlainTextAdapterExtension,
} from '../adapters/extension.js';
export const CommonBlockSpecs: ExtensionType[] = [
DocDisplayMetaService,
@@ -119,4 +120,5 @@ export const StoreExtensions: ExtensionType[] = [
HtmlAdapterExtension,
MarkdownAdapterExtension,
NotionHtmlAdapterExtension,
PlainTextAdapterExtension,
].flat();

View File

@@ -0,0 +1,20 @@
import {
EdgelessBuiltInSpecs,
PageRootBlockSpec,
} from '@blocksuite/affine-block-root';
import type { ExtensionType } from '@blocksuite/store';
import {
EdgelessFirstPartyBlockSpecs,
PageFirstPartyBlockSpecs,
} from './common';
export const EdgelessEditorBlockSpecs: ExtensionType[] = [
EdgelessBuiltInSpecs,
EdgelessFirstPartyBlockSpecs,
].flat();
export const PageEditorBlockSpecs: ExtensionType[] = [
PageRootBlockSpec,
PageFirstPartyBlockSpecs,
].flat();

View File

@@ -0,0 +1,3 @@
export * from './common.js';
export * from './editor-specs.js';
export * from './preview-specs.js';

View File

@@ -7,7 +7,7 @@ import type { ExtensionType } from '@blocksuite/store';
import {
EdgelessFirstPartyBlockSpecs,
PageFirstPartyBlockSpecs,
} from '../common.js';
} from './common.js';
export const PreviewEdgelessEditorBlockSpecs: ExtensionType[] = [
PreviewEdgelessRootBlockSpec,

View File

@@ -0,0 +1,19 @@
import { SpecProvider } from '@blocksuite/affine-shared/utils';
import { StoreExtensions } from './common.js';
import {
EdgelessEditorBlockSpecs,
PageEditorBlockSpecs,
} from './editor-specs.js';
import {
PreviewEdgelessEditorBlockSpecs,
PreviewPageEditorBlockSpecs,
} from './preview-specs.js';
export function registerSpecs() {
SpecProvider._.addSpec('store', StoreExtensions);
SpecProvider._.addSpec('page', PageEditorBlockSpecs);
SpecProvider._.addSpec('edgeless', EdgelessEditorBlockSpecs);
SpecProvider._.addSpec('preview:page', PreviewPageEditorBlockSpecs);
SpecProvider._.addSpec('preview:edgeless', PreviewEdgelessEditorBlockSpecs);
}

View File

@@ -1,8 +1,5 @@
/* oxlint-disable @typescript-eslint/triple-slash-reference */
/// <reference path="./effects.ts" />
export * from './_common/adapters/index.js';
export * from './_specs/index.js';
export * from './adapters/index.js';
export * from './extensions/index.js';
export * from './schemas.js';
export * from '@blocksuite/affine-block-attachment';
export * from '@blocksuite/affine-block-bookmark';
@@ -105,6 +102,7 @@ export {
printToPdf,
referenceToNode,
type Signal,
SpecBuilder,
SpecProvider,
} from '@blocksuite/affine-shared/utils';
export type { DragBlockPayload } from '@blocksuite/affine-widget-drag-handle';

View File

@@ -5,8 +5,7 @@ import { TestWorkspace } from '@blocksuite/store/test';
export function createEmptyDoc() {
const schema = new Schema().register(AffineSchemas);
const collection = new TestWorkspace({ schema });
collection.storeExtensions =
SpecProvider.getInstance().getSpec('store').value;
collection.storeExtensions = SpecProvider._.getSpec('store').value;
collection.meta.initialize();
const doc = collection.createDoc();

View File

@@ -56,8 +56,7 @@ export function createStarterDocCollection() {
blobSources,
};
const collection = new TestWorkspace(options);
collection.storeExtensions =
SpecProvider.getInstance().getSpec('store').value;
collection.storeExtensions = SpecProvider._.getSpec('store').value;
collection.start();
// debug info