mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-12 12:28:42 +00:00
close AI-213 #### PR Dependency Tree * **PR #12846** 👈 * **PR #12811** This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Introduced support for AI-editable blocks in document parsing, allowing blocks to include metadata for AI-based editing. - Added rendering for todo list items with markdown checkbox syntax. - Unsupported block types are now marked with placeholders in the parsed output. - **Tests** - Added new test cases and snapshots to verify parsing behavior with AI-editable content enabled. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
163 lines
3.9 KiB
TypeScript
163 lines
3.9 KiB
TypeScript
import { readFileSync } from 'node:fs';
|
|
import path from 'node:path';
|
|
|
|
import { expect, test } from 'vitest';
|
|
import { applyUpdate, Array as YArray, Doc as YDoc, Map as YMap } from 'yjs';
|
|
|
|
import {
|
|
parsePageDoc,
|
|
readAllBlocksFromDoc,
|
|
readAllDocIdsFromRootDoc,
|
|
readAllDocsFromRootDoc,
|
|
} from '../src';
|
|
|
|
const rootDocSnapshot = readFileSync(
|
|
path.join(import.meta.dirname, './__fixtures__/test-root-doc.snapshot.bin')
|
|
);
|
|
const docSnapshot = readFileSync(
|
|
path.join(import.meta.dirname, './__fixtures__/test-doc.snapshot.bin')
|
|
);
|
|
const docSnapshotWithAiEditable = readFileSync(
|
|
path.join(
|
|
import.meta.dirname,
|
|
'./__fixtures__/test-doc-with-ai-editable.snapshot.bin'
|
|
)
|
|
);
|
|
|
|
test('should read doc blocks work', async () => {
|
|
const rootDoc = new YDoc({
|
|
guid: 'test-root-doc',
|
|
});
|
|
applyUpdate(rootDoc, rootDocSnapshot);
|
|
|
|
const doc1 = new YDoc({
|
|
guid: 'test-doc',
|
|
});
|
|
applyUpdate(doc1, docSnapshot);
|
|
const result = await readAllBlocksFromDoc({
|
|
ydoc: doc1,
|
|
rootYDoc: rootDoc,
|
|
spaceId: 'test-space',
|
|
});
|
|
expect(result).toMatchSnapshot();
|
|
});
|
|
|
|
test('should read doc blocks work without root doc', async () => {
|
|
const doc = new YDoc({
|
|
guid: 'test-doc',
|
|
});
|
|
applyUpdate(doc, docSnapshot);
|
|
const result = await readAllBlocksFromDoc({
|
|
ydoc: doc,
|
|
spaceId: 'test-space',
|
|
});
|
|
expect(result).toMatchSnapshot();
|
|
});
|
|
|
|
test('should get all docs from root doc work', async () => {
|
|
const rootDoc = new YDoc({
|
|
guid: 'test-root-doc',
|
|
});
|
|
rootDoc.getMap('meta').set(
|
|
'pages',
|
|
YArray.from([
|
|
new YMap([
|
|
['id', 'test-doc-1'],
|
|
['title', 'Test Doc 1'],
|
|
]),
|
|
new YMap([
|
|
['id', 'test-doc-2'],
|
|
['title', 'Test Doc 2'],
|
|
]),
|
|
new YMap([
|
|
['id', 'test-doc-3'],
|
|
['title', 'Test Doc 3'],
|
|
['trash', true],
|
|
]),
|
|
new YMap([['id', 'test-doc-4']]),
|
|
])
|
|
);
|
|
|
|
const docs = readAllDocsFromRootDoc(rootDoc);
|
|
expect(Array.from(docs.entries())).toMatchSnapshot();
|
|
|
|
// include trash
|
|
const docsWithTrash = readAllDocsFromRootDoc(rootDoc, {
|
|
includeTrash: true,
|
|
});
|
|
expect(Array.from(docsWithTrash.entries())).toMatchSnapshot();
|
|
});
|
|
|
|
test('should read all docs from root doc snapshot work', async () => {
|
|
const rootDoc = new YDoc({
|
|
guid: 'test-root-doc',
|
|
});
|
|
applyUpdate(rootDoc, rootDocSnapshot);
|
|
const docsWithTrash = readAllDocsFromRootDoc(rootDoc, {
|
|
includeTrash: true,
|
|
});
|
|
expect(Array.from(docsWithTrash.entries())).toMatchSnapshot();
|
|
});
|
|
|
|
test('should read all doc ids from root doc snapshot work', async () => {
|
|
const rootDoc = new YDoc({
|
|
guid: 'test-root-doc',
|
|
});
|
|
applyUpdate(rootDoc, rootDocSnapshot);
|
|
const docIds = readAllDocIdsFromRootDoc(rootDoc);
|
|
expect(docIds).toMatchSnapshot();
|
|
});
|
|
|
|
test('should parse page doc work', () => {
|
|
const doc = new YDoc({
|
|
guid: 'test-doc',
|
|
});
|
|
applyUpdate(doc, docSnapshot);
|
|
|
|
const result = parsePageDoc({
|
|
workspaceId: 'test-space',
|
|
doc,
|
|
buildBlobUrl: id => `blob://${id}`,
|
|
buildDocUrl: id => `doc://${id}`,
|
|
renderDocTitle: id => `Doc Title ${id}`,
|
|
});
|
|
|
|
expect(result).toMatchSnapshot();
|
|
});
|
|
|
|
test('should parse page doc work with ai editable', () => {
|
|
const doc = new YDoc({
|
|
guid: 'test-doc',
|
|
});
|
|
applyUpdate(doc, docSnapshot);
|
|
|
|
const result = parsePageDoc({
|
|
workspaceId: 'test-space',
|
|
doc,
|
|
buildBlobUrl: id => `blob://${id}`,
|
|
buildDocUrl: id => `doc://${id}`,
|
|
renderDocTitle: id => `Doc Title ${id}`,
|
|
aiEditable: true,
|
|
});
|
|
|
|
expect(result.md).toMatchSnapshot();
|
|
});
|
|
|
|
test('should parse page full doc work with ai editable', () => {
|
|
const doc = new YDoc({
|
|
guid: 'test-doc',
|
|
});
|
|
applyUpdate(doc, docSnapshotWithAiEditable);
|
|
|
|
const result = parsePageDoc({
|
|
workspaceId: 'test-space',
|
|
doc,
|
|
buildBlobUrl: id => `blob://${id}`,
|
|
buildDocUrl: id => `doc://${id}`,
|
|
renderDocTitle: id => `Doc Title ${id}`,
|
|
aiEditable: true,
|
|
});
|
|
|
|
expect(result.md).toMatchSnapshot();
|
|
});
|