From 0f03c3fc5e9f94face8ff6317cecd14479dd31db Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Tue, 31 Dec 2024 05:13:43 +0000 Subject: [PATCH] fix(editor): missing resource files in exported snapshot zip (#9450) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes: [BS-2280](https://linear.app/affine-design/issue/BS-2280/导出-zip-snapshot-丢失-blob) --- .../attachment/attachment-transformer.ts | 19 ++++++++++++++++++- .../src/blocks/image/image-transformer.ts | 19 ++++++++++++++++++- .../blocks/src/_common/transformers/zip.ts | 16 +++++++++++----- .../framework/store/src/transformer/base.ts | 2 +- 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/blocksuite/affine/model/src/blocks/attachment/attachment-transformer.ts b/blocksuite/affine/model/src/blocks/attachment/attachment-transformer.ts index f6bd06a77d..b8608b0eb6 100644 --- a/blocksuite/affine/model/src/blocks/attachment/attachment-transformer.ts +++ b/blocksuite/affine/model/src/blocks/attachment/attachment-transformer.ts @@ -1,4 +1,9 @@ -import type { FromSnapshotPayload, SnapshotNode } from '@blocksuite/store'; +import type { + BlockSnapshotLeaf, + FromSnapshotPayload, + SnapshotNode, + ToSnapshotPayload, +} from '@blocksuite/store'; import { BaseBlockTransformer } from '@blocksuite/store'; import type { AttachmentBlockProps } from './attachment-model.js'; @@ -14,4 +19,16 @@ export class AttachmentBlockTransformer extends BaseBlockTransformer + ): BlockSnapshotLeaf { + const snapshotRet = super.toSnapshot(snapshot); + const sourceId = snapshot.model.sourceId; + if (sourceId) { + const pathBlobIdMap = snapshot.assets.getPathBlobIdMap(); + pathBlobIdMap.set(snapshot.model.id, sourceId); + } + return snapshotRet; + } } diff --git a/blocksuite/affine/model/src/blocks/image/image-transformer.ts b/blocksuite/affine/model/src/blocks/image/image-transformer.ts index 1135659392..4a5bcf4624 100644 --- a/blocksuite/affine/model/src/blocks/image/image-transformer.ts +++ b/blocksuite/affine/model/src/blocks/image/image-transformer.ts @@ -1,4 +1,9 @@ -import type { FromSnapshotPayload, SnapshotNode } from '@blocksuite/store'; +import type { + BlockSnapshotLeaf, + FromSnapshotPayload, + SnapshotNode, + ToSnapshotPayload, +} from '@blocksuite/store'; import { BaseBlockTransformer } from '@blocksuite/store'; import type { ImageBlockProps } from './image-model.js'; @@ -14,4 +19,16 @@ export class ImageBlockTransformer extends BaseBlockTransformer return snapshotRet; } + + override toSnapshot( + snapshot: ToSnapshotPayload + ): BlockSnapshotLeaf { + const snapshotRet = super.toSnapshot(snapshot); + const sourceId = snapshot.model.sourceId; + if (sourceId) { + const pathBlobIdMap = snapshot.assets.getPathBlobIdMap(); + pathBlobIdMap.set(snapshot.model.id, sourceId); + } + return snapshotRet; + } } diff --git a/blocksuite/blocks/src/_common/transformers/zip.ts b/blocksuite/blocks/src/_common/transformers/zip.ts index 939b16f0d5..d6c5e72e6e 100644 --- a/blocksuite/blocks/src/_common/transformers/zip.ts +++ b/blocksuite/blocks/src/_common/transformers/zip.ts @@ -23,13 +23,19 @@ async function exportDocs(collection: DocCollection, docs: Doc[]) { ); const assets = zip.folder('assets'); + const pathBlobIdMap = job.assetsManager.getPathBlobIdMap(); const assetsMap = job.assets; - for (const [id, blob] of assetsMap) { - const ext = getAssetName(assetsMap, id).split('.').at(-1); - const name = `${id}.${ext}`; - await assets.file(name, blob); - } + await Promise.all( + Array.from(pathBlobIdMap.values()).map(async blobId => { + await job.assetsManager.readFromBlob(blobId); + const ext = getAssetName(assetsMap, blobId).split('.').at(-1); + const blob = assetsMap.get(blobId); + if (blob) { + await assets.file(`${blobId}.${ext}`, blob); + } + }) + ); const downloadBlob = await zip.generate(); return download(downloadBlob, `${collection.id}.bs.zip`); diff --git a/blocksuite/framework/store/src/transformer/base.ts b/blocksuite/framework/store/src/transformer/base.ts index 2a43762745..92c432bc9f 100644 --- a/blocksuite/framework/store/src/transformer/base.ts +++ b/blocksuite/framework/store/src/transformer/base.ts @@ -5,7 +5,7 @@ import type { DraftModel } from './draft.js'; import { fromJSON, toJSON } from './json.js'; import type { BlockSnapshot } from './type.js'; -type BlockSnapshotLeaf = Pick< +export type BlockSnapshotLeaf = Pick< BlockSnapshot, 'id' | 'flavour' | 'props' | 'version' >;