From 55345bd9c73c3ea35feb8e789aa0f10a8b58546e Mon Sep 17 00:00:00 2001 From: Sylvain Zimmer Date: Sun, 17 May 2026 13:51:09 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(y-provider)=20preserve=20custom=20blo?= =?UTF-8?q?cks=20on=20HTML/markdown=20conversion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wire the docs BlockNote schema (callout, pdf, uploadLoader, interlinking link, page break) into the conversion editor so /api/convert no longer drops or mangles these blocks. --- CHANGELOG.md | 2 + .../y-provider/__tests__/convert.test.ts | 309 ++++++++++++++++++ src/frontend/servers/y-provider/package.json | 2 +- .../y-provider/src/blockSpecs/Callout.ts | 50 +++ .../src/blockSpecs/InterlinkingLinkInline.ts | 61 ++++ .../servers/y-provider/src/blockSpecs/Pdf.ts | 76 +++++ .../y-provider/src/blockSpecs/UploadLoader.ts | 35 ++ .../y-provider/src/blockSpecs/index.ts | 33 ++ .../y-provider/src/handlers/convertHandler.ts | 41 +-- 9 files changed, 588 insertions(+), 21 deletions(-) create mode 100644 src/frontend/servers/y-provider/src/blockSpecs/Callout.ts create mode 100644 src/frontend/servers/y-provider/src/blockSpecs/InterlinkingLinkInline.ts create mode 100644 src/frontend/servers/y-provider/src/blockSpecs/Pdf.ts create mode 100644 src/frontend/servers/y-provider/src/blockSpecs/UploadLoader.ts create mode 100644 src/frontend/servers/y-provider/src/blockSpecs/index.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 86cf1aba98..ecb181cab2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to ### Added - ✨(backend) support creating subdoc from file #1987 +- ✨(y-provider) preserve callouts, PDFs, page breaks and interlinking + links on HTML/markdown export ### Fixed diff --git a/src/frontend/servers/y-provider/__tests__/convert.test.ts b/src/frontend/servers/y-provider/__tests__/convert.test.ts index 5acba31050..4ba627ba97 100644 --- a/src/frontend/servers/y-provider/__tests__/convert.test.ts +++ b/src/frontend/servers/y-provider/__tests__/convert.test.ts @@ -11,6 +11,7 @@ vi.mock('../src/env', async (importOriginal) => { }; }); +import { docsBlockNoteSchema } from '@/blockSpecs'; import { initApp } from '@/servers'; import { @@ -300,6 +301,314 @@ describe('Conversion Testing', () => { expect(response.body).toStrictEqual(expectedBlocks); }); + test('POST /api/convert Yjs to HTML with callout block', async () => { + const app = initApp(); + const editor = ServerBlockNoteEditor.create({ + schema: docsBlockNoteSchema, + }); + const blocks = [ + { + type: 'callout' as const, + props: { emoji: '⚠️', backgroundColor: 'yellow' }, + content: [{ type: 'text' as const, text: 'Be careful', styles: {} }], + }, + ]; + const yDocument = editor.blocksToYDoc(blocks, 'document-store'); + const yjsUpdate = Y.encodeStateAsUpdate(yDocument); + const response = await request(app) + .post('/api/convert') + .set('origin', origin) + .set('authorization', `Bearer ${apiKey}`) + .set('content-type', 'application/vnd.yjs.doc') + .set('accept', 'text/html') + .send(Buffer.from(yjsUpdate)); + + expect(response.status).toBe(200); + expect(response.text).toContain('). + expect(response.text).toContain( + '