EYHN
55cb4dc5e7
feat(core): adjust guard service support loading state ( #10989 )
2025-03-20 10:53:41 +08:00
Saul-Mirone
258c70cf07
refactor(editor): store should not rely on inline ( #11017 )
2025-03-20 01:33:29 +00:00
akumatus
ee337a16af
feat(core): support collection search for ai chat ( #10987 )
...
Close [BS-2787](https://linear.app/affine-design/issue/BS-2787 ).
Close [BS-2788](https://linear.app/affine-design/issue/BS-2788 ).

2025-03-20 00:34:12 +00:00
akumatus
47206b8d47
feat(core): support tag search for ai chat ( #10965 )
...
Close [BS-2785](https://linear.app/affine-design/issue/BS-2785 ).
Close [BS-2786](https://linear.app/affine-design/issue/BS-2786 ).

2025-03-19 04:22:11 +00:00
pengx17
6b73e8ebb5
fix(core): allow unused blobs to preview in new tab ( #10874 )
...
fix AF-2330
2025-03-19 02:40:06 +00:00
JimmFly
70fe521300
fix(core): copy link should not have mode ( #10904 )
2025-03-19 01:50:34 +00:00
zzj3720
3939cc1c52
feat(editor): support file column and member column for database block ( #10932 )
...
close: BS-2630, BS-2631, BS-2629, BS-2632, BS-2635
2025-03-18 14:51:45 +00:00
CatsJuice
ff8c3d1cee
feat(core): intilize integration module and basic readwise impl ( #10726 )
...
close AF-2257, AF-2261, AF-2260, AF-2259
### Feat
- New `Integration` Module
- Basic Readwise integration
- connect
- import
- disconnect
- Common Integration UI
- Common Integration Writer (Transform markdown to AFFiNE Doc)
### Not Implemented
> will be implemented in down-stack
- delete docs when disconnect
- readwise settiing UI
- integration property rendering
2025-03-18 08:13:58 +00:00
EYHN
b401012d85
feat(core): user service loading state ( #10922 )
2025-03-17 09:28:25 +00:00
Saul-Mirone
26285f7dcb
feat(editor): unify block props api ( #10888 )
...
Closes: [BS-2707](https://linear.app/affine-design/issue/BS-2707/统一使用props获取和更新block-prop )
2025-03-16 05:48:34 +00:00
EYHN
05200ad7b7
feat(nbstore): add blob sync storage ( #10752 )
2025-03-14 18:05:54 +08:00
EYHN
a2eb3fe1b2
feat(core): add notification service ( #10855 )
2025-03-14 09:32:10 +00:00
EYHN
f3ef9c4415
feat(nbstore): rename SyncStorage to DocSyncStorage ( #10751 )
2025-03-14 06:25:26 +00:00
JimmFly
0c9591f08e
feat(core): add an entry for admin panel ( #10813 )
...

2025-03-13 10:46:26 +00:00
forehalo
7100d87efe
chore(core): doc role telemetry ( #10822 )
2025-03-13 08:15:46 +00:00
Saul-Mirone
250f3f1efd
feat(editor): add isLocal flag in blockUpdated subject ( #10799 )
2025-03-13 05:33:06 +00:00
donteatfriedrice
d2c62602a4
feat(editor): support embed iframe block ( #10740 )
...
To close:
[BS-2660](https://linear.app/affine-design/issue/BS-2660/slash-menu-支持-iframe-embed )
[BS-2661](https://linear.app/affine-design/issue/BS-2661/iframe-embed-block-model-and-block-component )
[BS-2662](https://linear.app/affine-design/issue/BS-2662/iframe-embed-block-toolbar )
[BS-2768](https://linear.app/affine-design/issue/BS-2768/iframe-embed-block-loading-和-error-态 )
[BS-2670](https://linear.app/affine-design/issue/BS-2670/iframe-embed-block-导出 )
# PR Description
# Add Embed Iframe Block Support
## Overview
This PR introduces a new `EmbedIframeBlock` to enhance content embedding capabilities within our editor. This block allows users to seamlessly embed external content from various providers (Google Drive, Spotify, etc.) directly into their docs.
## New Blocks
### EmbedIframeBlock
The core block that renders embedded iframe content. This block:
* Displays external content within a secure iframe
* Handles loading states with visual feedback
* Provides error handling with edit and retry options
* Supports customization of width, height, and other iframe attributes
### Supporting Components
* **EmbedIframeCreateModal**: Modal interface for creating new iframe embeds
* **EmbedIframeLinkEditPopup**: UI for editing existing embed links
* **EmbedIframeLoadingCard**: Visual feedback during content loading
* **EmbedIframeErrorCard**: Error handling with retry functionality
## New Store Extensions
### EmbedIframeConfigExtension
This extension provides configuration for different embed providers:
```typescript
/**
* The options for the iframe
* @example
* {
* defaultWidth: '100%',
* defaultHeight: '152px',
* style: 'border-radius: 8px;',
* allow: 'autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture',
* }
* =>
* <iframe
* width="100%"
* height="152px"
* style="border-radius: 8px;"
* allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture"
* ></iframe>
*/
export type IframeOptions = {
defaultWidth?: string;
defaultHeight?: string;
style?: string;
referrerpolicy?: string;
scrolling?: boolean;
allow?: string;
allowFullscreen?: boolean;
};
/**
* Define the config of an embed iframe block provider
*/
export type EmbedIframeConfig = {
/**
* The name of the embed iframe block provider
*/
name: string;
/**
* The function to match the url
*/
match: (url: string) => boolean;
/**
* The function to build the oEmbed URL for fetching embed data
*/
buildOEmbedUrl: (url: string) => string | undefined;
/**
* Use oEmbed URL directly as iframe src without fetching oEmbed data
*/
useOEmbedUrlDirectly: boolean;
/**
* The options for the iframe
*/
options?: IframeOptions;
};
export const EmbedIframeConfigIdentifier =
createIdentifier<EmbedIframeConfig>('EmbedIframeConfig');
export function EmbedIframeConfigExtension(
config: EmbedIframeConfig
): ExtensionType & {
identifier: ServiceIdentifier<EmbedIframeConfig>;
} {
const identifier = EmbedIframeConfigIdentifier(config.name);
return {
setup: di => {
di.addImpl(identifier, () => config);
},
identifier,
};
}
```
**example:**
```typescript
// blocksuite/affine/blocks/block-embed/src/embed-iframe-block/configs/providers/spotify.ts
const SPOTIFY_DEFAULT_WIDTH = '100%';
const SPOTIFY_DEFAULT_HEIGHT = '152px';
// https://developer.spotify.com/documentation/embeds/reference/oembed
const spotifyEndpoint = 'https://open.spotify.com/oembed ';
const spotifyUrlValidationOptions: EmbedIframeUrlValidationOptions = {
protocols: ['https:'],
hostnames: ['open.spotify.com', 'spotify.link'],
};
const spotifyConfig = {
name: 'spotify',
match: (url: string) =>
validateEmbedIframeUrl(url, spotifyUrlValidationOptions),
buildOEmbedUrl: (url: string) => {
const match = validateEmbedIframeUrl(url, spotifyUrlValidationOptions);
if (!match) {
return undefined;
}
const encodedUrl = encodeURIComponent(url);
const oEmbedUrl = `${spotifyEndpoint}?url=${encodedUrl}`;
return oEmbedUrl;
},
useOEmbedUrlDirectly: false,
options: {
defaultWidth: SPOTIFY_DEFAULT_WIDTH,
defaultHeight: SPOTIFY_DEFAULT_HEIGHT,
allow:
'autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture',
style: 'border-radius: 12px;',
allowFullscreen: true,
},
};
// add the config extension to store
export const SpotifyEmbedConfig = EmbedIframeConfigExtension(spotifyConfig);
```
**Key features:**
* Provider registration and discovery
* URL pattern matching
* Provider-specific embed options (width, height, features)
### EmbedIframeService
This service provides abilities to handle URL validation, data fetching, and block creation
**Type:**
```typescript
/**
* Service for handling embeddable URLs
*/
export interface EmbedIframeProvider {
/**
* Check if a URL can be embedded
* @param url URL to check
* @returns true if the URL can be embedded, false otherwise
*/
canEmbed: (url: string) => boolean;
/**
* Build a API URL for fetching embed data
* @param url URL to build API URL
* @returns API URL if the URL can be embedded, undefined otherwise
*/
buildOEmbedUrl: (url: string) => string | undefined;
/**
* Get the embed iframe config
* @param url URL to get embed iframe config
* @returns Embed iframe config if the URL can be embedded, undefined otherwise
*/
getConfig: (url: string) => EmbedIframeConfig | undefined;
/**
* Get embed iframe data
* @param url URL to get embed iframe data
* @returns Embed iframe data if the URL can be embedded, undefined otherwise
*/
getEmbedIframeData: (url: string) => Promise<EmbedIframeData | null>;
/**
* Parse an embeddable URL and add an EmbedIframeBlock to doc
* @param url Original url to embed
* @param parentId Parent block ID
* @param index Optional index to insert at
* @returns Created block id if successful, undefined if the URL cannot be embedded
*/
addEmbedIframeBlock: (
props: Partial<EmbedIframeBlockProps>,
parentId: string,
index?: number
) => string | undefined;
}
```
**Implemetation:**
```typescript
export class EmbedIframeService
extends StoreExtension
implements EmbedIframeProvider
{
static override key = 'embed-iframe-service';
private readonly _configs: EmbedIframeConfig[];
constructor(store: Store) {
super(store);
this._configs = Array.from(
store.provider.getAll(EmbedIframeConfigIdentifier).values()
);
}
canEmbed = (url: string): boolean => {
return this._configs.some(config => config.match(url));
};
buildOEmbedUrl = (url: string): string | undefined => {
return this._configs.find(config => config.match(url))?.buildOEmbedUrl(url);
};
getConfig = (url: string): EmbedIframeConfig | undefined => {
return this._configs.find(config => config.match(url));
};
getEmbedIframeData = async (
url: string,
signal?: AbortSignal
): Promise<EmbedIframeData | null> => {
try {
const config = this._configs.find(config => config.match(url));
if (!config) {
return null;
}
const oEmbedUrl = config.buildOEmbedUrl(url);
if (!oEmbedUrl) {
return null;
}
// if the config useOEmbedUrlDirectly is true, return the url directly as iframe_url
if (config.useOEmbedUrlDirectly) {
return {
iframe_url: oEmbedUrl,
};
}
// otherwise, fetch the oEmbed data
const response = await fetch(oEmbedUrl, { signal });
if (!response.ok) {
console.warn(
`Failed to fetch oEmbed data: ${response.status} ${response.statusText}`
);
return null;
}
const data = await response.json();
return data as EmbedIframeData;
} catch (error) {
if (error instanceof Error && error.name !== 'AbortError') {
console.error('Error fetching embed iframe data:', error);
}
return null;
}
};
addEmbedIframeBlock = (
props: Partial<EmbedIframeBlockProps>,
parentId: string,
index?: number
): string | undefined => {
const blockId = this.store.addBlock(
'affine:embed-iframe',
props,
parentId,
index
);
return blockId;
};
}
```
**Usage:**
```typescript
// Usage example
const embedIframeService = this.std.get(EmbedIframeService);
// Check if a URL can be embedded
const canEmbed = embedIframeService.canEmbed(url);
// Get embed data for a URL
const embedData = await embedIframeService.getEmbedIframeData(url);
// Add an embed iframe block to the document
const block = embedIframeService.addEmbedIframeBlock({
url,
iframeUrl: embedData.iframe_url,
title: embedData.title,
description: embedData.description
}, parentId, index);
```
**Key features:**
* URL validation and transformation
* Provider-specific data fetching
* Block creation and management
## Adaptations
### Toolbar Integration
Added toolbar actions for embedded content:
* Copy link
* Edit embed title and description
* Toggle between inline/card views
* Add caption
* And more
### Slash Menu Integration
Added a new slash menu option for embedding content:
* Embed item for inserting embed iframe block
* Conditional rendering based on feature flags
### Adapters
Implemented adapters for various formats:
* **HTML Adapter**: Exports embed original urls as html links
* **Markdown Adapter**: Exports embed original urls as markdown links
* **Plain Text Adapter**: Exports embed original urls as link text
## To Be Continued:
- [ ] **UI Optimization**
- [ ] **Edgeless Mode Support**
- [ ] **Mobile Support**
2025-03-13 04:11:46 +00:00
EYHN
86729fb447
feat(core): adjust web clipper page ( #10779 )
2025-03-13 10:59:50 +08:00
fengmk2
3417cc5dc1
fix(core): handle Content-Type with charset in fetch error handling ( #10777 )
2025-03-12 09:56:41 +00:00
fengmk2
43712839fd
refactor(server): improve magic link login flow ( #10736 )
2025-03-12 15:27:36 +08:00
fengmk2
867ae7933f
refactor(server): improve oauth login flow ( #10648 )
...
close CLOUD-145
2025-03-12 15:27:36 +08:00
EYHN
4b5d1de206
feat(core): add blocksuite writer info service ( #10754 )
2025-03-12 05:02:04 +00:00
Mirone
cd63e0ed8b
feat(editor): replace slot with rxjs subject ( #10768 )
2025-03-12 11:29:24 +09:00
EYHN
ea07aa8607
feat(core): add notification list ( #10480 )
2025-03-11 06:23:33 +00:00
Saul-Mirone
ec709925ee
refactor(editor): orgnize exports ( #10709 )
2025-03-10 02:04:01 +00:00
Saul-Mirone
12bc142809
refactor(editor): remove blocks package ( #10708 )
2025-03-09 05:44:26 +00:00
EYHN
4677049b5c
feat(core): add public user service ( #10695 )
2025-03-07 08:00:27 +00:00
forehalo
e02fb4fa94
refactor(core): standardize frontend error handling ( #10667 )
2025-03-06 13:10:18 +00:00
Saul-Mirone
84e2dda3f8
refactor(editor): separate lit and slot in global ( #10666 )
2025-03-06 10:24:59 +00:00
EYHN
5c8b81581c
feat(core): doc level awareness ( #10646 )
2025-03-06 06:05:45 +00:00
liuyi
7e61a0b2fc
refactor(graphql): codegen ( #10626 )
2025-03-06 12:06:19 +08:00
CatsJuice
6b08e3f5d4
feat(core): support create new template in starter-bar ( #10570 )
2025-03-06 02:05:29 +00:00
EYHN
0015bfbaf2
refactor(core): adjust sentry config ( #10631 )
2025-03-05 11:18:06 +00:00
JimmFly
bb4240f6ef
fix(core): add missing control of modifyDocDefaultRole track event ( #10625 )
2025-03-05 11:02:45 +00:00
Saul-Mirone
7e39893aac
refactor(editor): remove assert functions ( #10629 )
2025-03-05 10:20:02 +00:00
EYHN
201c3438ba
feat(core): add user list service for blocksuite ( #10627 )
2025-03-05 10:06:14 +00:00
pengx17
47d01f5f66
fix(core): db backlink infinite query issue ( #10628 )
...
fix AF-2301
2025-03-05 09:43:05 +00:00
Flrande
bd62634a76
feat(editor): add callout block ( #10563 )
...
- Add `CalloutBlockModel `
- Implement `CalloutBlockComponent `
- Integrate with slash menu (/)
2025-03-05 09:28:51 +00:00
EYHN
61635aa77a
feat(core): add clipper import interface ( #10619 )
2025-03-05 04:22:03 +00:00
EYHN
4daa763c95
fix(core): fix table text content search ( #10488 )
2025-03-05 04:06:44 +00:00
Saul-Mirone
b8ecfbdae6
refactor(editor): remove assertExists ( #10615 )
2025-03-05 00:13:08 +00:00
Saul-Mirone
66d9d576e0
refactor(editor): add gfx entry in bs global package ( #10612 )
2025-03-04 12:46:50 +00:00
doodlewind
c418e89fb9
chore(editor): add feature flag entry for testing turbo renderer ( #10581 )
...
The debug pane will be displayed once the `enable_turbo_renderer` feature flag is enabled.

2025-03-04 05:38:44 +00:00
Saul-Mirone
fdde818ddd
feat(editor): add block meta feature flag ( #10548 )
2025-03-03 01:45:33 +00:00
Saul-Mirone
f23f29610c
refactor(editor): remove stable feature flags ( #10547 )
2025-03-02 08:41:12 +00:00
renovate
7227b7f8f6
chore: bump up oxlint version to v0.15.12 ( #10206 )
...
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [oxlint](https://oxc.rs ) ([source](https://redirect.github.com/oxc-project/oxc/tree/HEAD/npm/oxlint )) | [`0.15.10` -> `0.15.12`](https://renovatebot.com/diffs/npm/oxlint/0.15.10/0.15.12 ) | [](https://docs.renovatebot.com/merge-confidence/ ) | [](https://docs.renovatebot.com/merge-confidence/ ) | [](https://docs.renovatebot.com/merge-confidence/ ) | [](https://docs.renovatebot.com/merge-confidence/ ) |
---
### Release Notes
<details>
<summary>oxc-project/oxc (oxlint)</summary>
### [`v0.15.12`](https://redirect.github.com/oxc-project/oxc/releases/tag/oxlint_v0.15.12 ): oxlint v0.15.12
[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxlint_v0.15.11...oxlint_v0.15.12 )
#### \[0.15.12] - 2025-02-24
##### Features
- [`914dd46`](https://redirect.github.com/oxc-project/oxc/commit/914dd46 ) linter: Add eslint/max-depth ([#​9173](https://redirect.github.com/oxc-project/oxc/issues/9173 )) (ikkz)
- [`0b08159`](https://redirect.github.com/oxc-project/oxc/commit/0b08159 ) linter: Add eslint/max-lines-per-function ([#​9161](https://redirect.github.com/oxc-project/oxc/issues/9161 )) (ikkz)
- [`cc8dd48`](https://redirect.github.com/oxc-project/oxc/commit/cc8dd48 ) linter: Add unicorn/no-invalid-fetch-options rule ([#​9212](https://redirect.github.com/oxc-project/oxc/issues/9212 )) (Mikhail Baev)
- [`af13b1b`](https://redirect.github.com/oxc-project/oxc/commit/af13b1b ) linter: Promote `eslint/no-eval` to `correctness` ([#​9231](https://redirect.github.com/oxc-project/oxc/issues/9231 )) (dalaoshu)
- [`542bbd7`](https://redirect.github.com/oxc-project/oxc/commit/542bbd7 ) linter: Support `import-x` plugin name ([#​9074](https://redirect.github.com/oxc-project/oxc/issues/9074 )) (Sysix)
- [`d266c29`](https://redirect.github.com/oxc-project/oxc/commit/d266c29 ) linter: Add eslint/max-nested-callbacks ([#​9172](https://redirect.github.com/oxc-project/oxc/issues/9172 )) (ikkz)
- [`86795d0`](https://redirect.github.com/oxc-project/oxc/commit/86795d0 ) linter: Implement grouped-accessor-pairs ([#​9065](https://redirect.github.com/oxc-project/oxc/issues/9065 )) (yefan)
- [`d70bad3`](https://redirect.github.com/oxc-project/oxc/commit/d70bad3 ) linter: Add eslint/no-unneeded-ternary rule ([#​9160](https://redirect.github.com/oxc-project/oxc/issues/9160 )) (Cédric DIRAND)
- [`4bd86e6`](https://redirect.github.com/oxc-project/oxc/commit/4bd86e6 ) linter: Add `fixer` for `unicorn/catch-error-name` ([#​9165](https://redirect.github.com/oxc-project/oxc/issues/9165 )) (dalaoshu)
##### Bug Fixes
- [`94bd2d8`](https://redirect.github.com/oxc-project/oxc/commit/94bd2d8 ) language_server: Fix `clippy::significant_drop_in_scrutinee` warning ([#​9234](https://redirect.github.com/oxc-project/oxc/issues/9234 )) (Boshen)
- [`69091c0`](https://redirect.github.com/oxc-project/oxc/commit/69091c0 ) linter: Correct default for `eslint/no-eval` ([#​9312](https://redirect.github.com/oxc-project/oxc/issues/9312 )) (dalaoshu)
- [`3031845`](https://redirect.github.com/oxc-project/oxc/commit/3031845 ) linter: Add option "allowTypeImports" for rule "no-restricted-imports" ([#​7894](https://redirect.github.com/oxc-project/oxc/issues/7894 )) (Alexander S.)
##### Documentation
- [`6c0f006`](https://redirect.github.com/oxc-project/oxc/commit/6c0f006 ) linter: Improve the documentation of eslint/no-useless-concat ([#​9179](https://redirect.github.com/oxc-project/oxc/issues/9179 )) (Tom)
- [`3414824`](https://redirect.github.com/oxc-project/oxc/commit/3414824 ) oxc: Enable `clippy::too_long_first_doc_paragraph` ([#​9237](https://redirect.github.com/oxc-project/oxc/issues/9237 )) (Boshen)
##### Refactor
- [`fb7df52`](https://redirect.github.com/oxc-project/oxc/commit/fb7df52 ) linter: Allow indirect `eval` by default for `eslint/no-eval` ([#​9302](https://redirect.github.com/oxc-project/oxc/issues/9302 )) (dalaoshu)
- [`b6fc0f6`](https://redirect.github.com/oxc-project/oxc/commit/b6fc0f6 ) linter: Improve `unicorn/consistent-function-scoping` ([#​9163](https://redirect.github.com/oxc-project/oxc/issues/9163 )) (dalaoshu)
### [`v0.15.11`](https://redirect.github.com/oxc-project/oxc/blob/HEAD/npm/oxlint/CHANGELOG.md#01511---2025-02-16 )
[Compare Source](https://redirect.github.com/oxc-project/oxc/compare/oxlint_v0.15.10...oxlint_v0.15.11 )
##### Features
- [`5d508a4`](https://redirect.github.com/oxc-project/oxc/commit/5d508a4 ) linter: Support `env` and `globals` in `overrides` configuration ([#​8915](https://redirect.github.com/oxc-project/oxc/issues/8915 )) (Sysix)
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/ ). View the [repository job log](https://developer.mend.io/github/toeverything/AFFiNE ).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xNjcuMSIsInVwZGF0ZWRJblZlciI6IjM5LjE3Ni4yIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->
2025-02-28 10:43:57 +00:00
L-Sun
d476d3b1df
fix(editor): android keyboard can not be opened ( #10502 )
...
Close [BS-2674](https://linear.app/affine-design/issue/BS-2674/[android]-%E6%96%87%E6%9C%AC%E7%BC%96%E8%BE%91%E5%8C%BA%E5%9F%9F%E7%82%B9%E5%87%BB%E5%90%8E%E6%97%A0%E6%B3%95%E6%BF%80%E6%B4%BB%E9%94%AE%E7%9B%98 ) [BS-2609](https://linear.app/affine-design/issue/BS-2609/[android]-%E8%BE%93%E5%85%A5%E7%9A%84-toolbar-%E6%B2%A1%E6%9C%89%E4%BA%86 )
2025-02-28 08:23:26 +00:00
pengx17
cd0bec5d31
fix(core): at menu ux ( #10485 )
...
fix AF-2285
1. loading icon will be rendered to the group name
2. make the focused item more stable
2025-02-28 02:34:29 +00:00
Saul-Mirone
4c736bc190
feat(editor): type safe draft model and transformer ( #10486 )
2025-02-27 09:19:49 +00:00
Saul-Mirone
ce87dcf58e
feat(editor): schema extension ( #10447 )
...
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.
2025-02-26 11:31:29 +00:00