mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-08-11 05:58:56 +08:00
ce87dcf58e
1. **Major Architectural Change: Schema Management**
- Moved from `workspace.schema` to `store.schema` throughout the codebase
- Removed schema property from Workspace and Doc interfaces
- Added `BlockSchemaExtension` pattern across multiple block types
2. **Block Schema Extensions Added**
- Added new `BlockSchemaExtension` to numerous block types including:
- DataView, Surface, Attachment, Bookmark, Code
- Database, Divider, EdgelessText, Embed blocks (Figma, Github, HTML, etc.)
- Frame, Image, Latex, List, Note, Paragraph
- Root, Surface Reference, Table blocks
3. **Import/Export System Updates**
- Updated import functions to accept `schema` parameter:
- `importHTMLToDoc`
- `importHTMLZip`
- `importMarkdownToDoc`
- `importMarkdownZip`
- `importNotionZip`
- Modified export functions to use new schema pattern
4. **Test Infrastructure Updates**
- Updated test files to use new schema extensions
- Modified test document creation to include schema extensions
- Removed direct schema registration in favor of extensions
5. **Service Layer Changes**
- Updated various services to use `getAFFiNEWorkspaceSchema()`
- Modified transformer initialization to use document schema
- Updated collection initialization patterns
6. **Version Management**
- Removed version-related properties and methods from:
- `WorkspaceMetaImpl`
- `TestMeta`
- `DocImpl`
- Removed `blockVersions` and `workspaceVersion/pageVersion`
7. **Store and Extension Updates**
- Added new store extensions and adapters
- Updated store initialization patterns
- Added new schema-related functionality in store extension
This PR represents a significant architectural shift in how schemas are managed, moving from a workspace-centric to a store-centric approach, while introducing a more extensible block schema system through `BlockSchemaExtension`. The changes touch multiple layers of the application including core functionality, services, testing infrastructure, and import/export capabilities.
71 lines
2.2 KiB
TypeScript
71 lines
2.2 KiB
TypeScript
import type {
|
|
ConnectorElementModel,
|
|
SurfaceElementModelMap,
|
|
} from '@blocksuite/affine-model';
|
|
import type { SurfaceBlockProps } from '@blocksuite/block-std/gfx';
|
|
import { SurfaceBlockModel as BaseSurfaceModel } from '@blocksuite/block-std/gfx';
|
|
import { DisposableGroup } from '@blocksuite/global/utils';
|
|
import { BlockSchemaExtension, defineBlockSchema } from '@blocksuite/store';
|
|
import * as Y from 'yjs';
|
|
|
|
import { elementsCtorMap } from './element-model/index.js';
|
|
import { SurfaceBlockTransformer } from './surface-transformer.js';
|
|
import { connectorWatcher } from './watchers/connector.js';
|
|
import { groupRelationWatcher } from './watchers/group.js';
|
|
|
|
export const SurfaceBlockSchema = defineBlockSchema({
|
|
flavour: 'affine:surface',
|
|
props: (internalPrimitives): SurfaceBlockProps => ({
|
|
elements: internalPrimitives.Boxed(new Y.Map()),
|
|
}),
|
|
metadata: {
|
|
version: 5,
|
|
role: 'hub',
|
|
parent: ['affine:page'],
|
|
children: [
|
|
'affine:frame',
|
|
'affine:image',
|
|
'affine:bookmark',
|
|
'affine:attachment',
|
|
'affine:embed-*',
|
|
'affine:edgeless-text',
|
|
],
|
|
},
|
|
transformer: transformerConfigs =>
|
|
new SurfaceBlockTransformer(transformerConfigs),
|
|
toModel: () => new SurfaceBlockModel(),
|
|
});
|
|
|
|
export const SurfaceBlockSchemaExtension =
|
|
BlockSchemaExtension(SurfaceBlockSchema);
|
|
|
|
export type SurfaceMiddleware = (surface: SurfaceBlockModel) => () => void;
|
|
|
|
export class SurfaceBlockModel extends BaseSurfaceModel {
|
|
private readonly _disposables: DisposableGroup = new DisposableGroup();
|
|
|
|
override _init() {
|
|
this._extendElement(elementsCtorMap);
|
|
super._init();
|
|
[connectorWatcher(this), groupRelationWatcher(this)].forEach(disposable =>
|
|
this._disposables.add(disposable)
|
|
);
|
|
}
|
|
|
|
getConnectors(id: string) {
|
|
const connectors = this.getElementsByType(
|
|
'connector'
|
|
) as unknown[] as ConnectorElementModel[];
|
|
|
|
return connectors.filter(
|
|
connector => connector.source?.id === id || connector.target?.id === id
|
|
);
|
|
}
|
|
|
|
override getElementsByType<K extends keyof SurfaceElementModelMap>(
|
|
type: K
|
|
): SurfaceElementModelMap[K][] {
|
|
return super.getElementsByType(type) as SurfaceElementModelMap[K][];
|
|
}
|
|
}
|