From 3e914d935960fee25dbe21fbbd2c4ad7ed6f3804 Mon Sep 17 00:00:00 2001 From: levivilet <72156503+levivilet@users.noreply.github.com> Date: Wed, 23 Sep 2026 13:36:55 +0000 Subject: [PATCH 01/10] fix: read Blob-backed extension files in diffs --- .../diff-view/src/parts/ReadFile/ReadFile.ts | 9 ++++-- packages/diff-view/test/ReadFile.test.ts | 30 +++++++++++++++++++ packages/e2e/extension/main.js | 12 ++++++++ ...iff.extension-blob-file-system-provider.ts | 15 ++++++++++ 4 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 packages/e2e/src/diff.extension-blob-file-system-provider.ts diff --git a/packages/diff-view/src/parts/ReadFile/ReadFile.ts b/packages/diff-view/src/parts/ReadFile/ReadFile.ts index 0acc1be7..6eeba23b 100644 --- a/packages/diff-view/src/parts/ReadFile/ReadFile.ts +++ b/packages/diff-view/src/parts/ReadFile/ReadFile.ts @@ -12,10 +12,13 @@ const readExtensionFile = async (protocol: string, uri: string): Promise if (!response.found) { throw new Error(`no file system provider found for ${protocol}`) } - if (typeof response.result !== 'string') { - throw new TypeError(`expected file system provider ${protocol} to return a string`) + if (typeof response.result === 'string') { + return response.result } - return response.result + if (response.result instanceof Blob) { + return response.result.text() + } + throw new TypeError(`expected file system provider ${protocol} to return a string or Blob`) } export const readFile = async (uri: string): Promise => { diff --git a/packages/diff-view/test/ReadFile.test.ts b/packages/diff-view/test/ReadFile.test.ts index 3d6ad1fc..e9c17a26 100644 --- a/packages/diff-view/test/ReadFile.test.ts +++ b/packages/diff-view/test/ReadFile.test.ts @@ -80,6 +80,36 @@ test('readFile reads extension protocols through extension management worker', a ]) }) +test('readFile decodes Blob content from extension file system providers', async (): Promise => { + ExtensionManagementWorker.registerMockRpc({ + 'Extensions.executeFileSystemProviderReadFile': async (): Promise => ({ + found: true, + result: new Blob(['before 😀\nafter'], { type: 'text/plain' }), + }), + }) + + await expect(readFile('remote-ssh:///workspace/file.txt')).resolves.toBe('before 😀\nafter') +}) + +test('readFile returns empty content from an empty Blob extension provider', async (): Promise => { + ExtensionManagementWorker.registerMockRpc({ + 'Extensions.executeFileSystemProviderReadFile': async (): Promise => ({ + found: true, + result: new Blob([]), + }), + }) + + await expect(readFile('remote-ssh:///workspace/empty.txt')).resolves.toBe('') +}) + +test('readFile rejects invalid extension file system provider results', async (): Promise => { + ExtensionManagementWorker.registerMockRpc({ + 'Extensions.executeFileSystemProviderReadFile': async (): Promise => ({ found: true, result: { content: 'not text' } }), + }) + + await expect(readFile('remote-ssh:///workspace/file.txt')).rejects.toThrow('expected file system provider remote-ssh to return a string or Blob') +}) + test('readFile rejects when no isolated extension provides the protocol', async (): Promise => { ExtensionManagementWorker.registerMockRpc({ 'Extensions.executeFileSystemProviderReadFile': async (): Promise => ({ found: false }), diff --git a/packages/e2e/extension/main.js b/packages/e2e/extension/main.js index 146af22c..423c31f8 100644 --- a/packages/e2e/extension/main.js +++ b/packages/e2e/extension/main.js @@ -3,7 +3,19 @@ const webViewProvider = { async create() {}, } +const fileSystemProvider = { + id: 'blob-fixture', + async readFile(uri) { + if (uri.endsWith('/empty.txt')) { + return new Blob([]) + } + return new Blob(['remote 😀 content']) + }, +} + export const activate = () => { // @ts-ignore vscode.registerWebViewProvider(webViewProvider) + // @ts-ignore + vscode.registerFileSystemProvider(fileSystemProvider) } diff --git a/packages/e2e/src/diff.extension-blob-file-system-provider.ts b/packages/e2e/src/diff.extension-blob-file-system-provider.ts new file mode 100644 index 00000000..f70c1c88 --- /dev/null +++ b/packages/e2e/src/diff.extension-blob-file-system-provider.ts @@ -0,0 +1,15 @@ +import type { Test } from '@lvce-editor/test-with-playwright' + +export const name = 'diff.extension-blob-file-system-provider' + +export const test: Test = async ({ DiffView, expect, FileSystem, Locator, Workspace }) => { + const tmpDir = await FileSystem.getTmpDir() + await Workspace.setPath(tmpDir) + await DiffView.open('data://before content', 'blob-fixture:///workspace/file.txt') + + const leftRows = Locator('.DiffEditorContentLeft .DiffEditorRows') + const rightRows = Locator('.DiffEditorContentRight .DiffEditorRows') + + await expect(leftRows).toHaveText('before content') + await expect(rightRows).toHaveText('remote 😀 content') +} From 8ffa57ee38d5470b109c12e991b3e24bd1993785 Mon Sep 17 00:00:00 2001 From: levivilet <72156503+levivilet@users.noreply.github.com> Date: Wed, 23 Sep 2026 13:40:41 +0000 Subject: [PATCH 02/10] fix: avoid DOM Blob type in diff reader --- packages/diff-view/src/parts/ReadFile/ReadFile.ts | 10 +++++++++- packages/diff-view/test/ReadFile.test.ts | 9 +++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/diff-view/src/parts/ReadFile/ReadFile.ts b/packages/diff-view/src/parts/ReadFile/ReadFile.ts index 6eeba23b..f97c7dc3 100644 --- a/packages/diff-view/src/parts/ReadFile/ReadFile.ts +++ b/packages/diff-view/src/parts/ReadFile/ReadFile.ts @@ -7,6 +7,14 @@ interface FileSystemProviderResult { readonly result?: unknown } +interface BlobLike { + readonly text: () => Promise +} + +const isBlobLike = (value: unknown): value is BlobLike => { + return typeof value === 'object' && value !== null && Object.prototype.toString.call(value) === '[object Blob]' && 'text' in value && typeof value.text === 'function' +} + const readExtensionFile = async (protocol: string, uri: string): Promise => { const response = (await ExtensionManagementWorker.invoke('Extensions.executeFileSystemProviderReadFile', protocol, uri)) as FileSystemProviderResult if (!response.found) { @@ -15,7 +23,7 @@ const readExtensionFile = async (protocol: string, uri: string): Promise if (typeof response.result === 'string') { return response.result } - if (response.result instanceof Blob) { + if (isBlobLike(response.result)) { return response.result.text() } throw new TypeError(`expected file system provider ${protocol} to return a string or Blob`) diff --git a/packages/diff-view/test/ReadFile.test.ts b/packages/diff-view/test/ReadFile.test.ts index e9c17a26..ab7dc8da 100644 --- a/packages/diff-view/test/ReadFile.test.ts +++ b/packages/diff-view/test/ReadFile.test.ts @@ -2,6 +2,11 @@ import { expect, test } from '@jest/globals' import { ExtensionManagementWorker, FileSystemWorker, RendererWorker } from '@lvce-editor/rpc-registry' import { readFile } from '../src/parts/ReadFile/ReadFile.ts' +const createBlob = (parts: readonly string[]): unknown => { + const BlobConstructor = (globalThis as unknown as { readonly Blob: new (parts: readonly string[]) => unknown }).Blob + return new BlobConstructor(parts) +} + test('readFile returns empty content for untitled uri', async (): Promise => { const result = await readFile('untitled://Untitled-1') @@ -84,7 +89,7 @@ test('readFile decodes Blob content from extension file system providers', async ExtensionManagementWorker.registerMockRpc({ 'Extensions.executeFileSystemProviderReadFile': async (): Promise => ({ found: true, - result: new Blob(['before 😀\nafter'], { type: 'text/plain' }), + result: createBlob(['before 😀\nafter']), }), }) @@ -95,7 +100,7 @@ test('readFile returns empty content from an empty Blob extension provider', asy ExtensionManagementWorker.registerMockRpc({ 'Extensions.executeFileSystemProviderReadFile': async (): Promise => ({ found: true, - result: new Blob([]), + result: createBlob([]), }), }) From 582376df723ee48d39ebb5ce1511388e65999f11 Mon Sep 17 00:00:00 2001 From: levivilet <72156503+levivilet@users.noreply.github.com> Date: Wed, 23 Sep 2026 13:46:59 +0000 Subject: [PATCH 03/10] test: declare Blob fixture file system provider --- packages/e2e/extension/extension.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/e2e/extension/extension.json b/packages/e2e/extension/extension.json index 5504e052..9d267a85 100644 --- a/packages/e2e/extension/extension.json +++ b/packages/e2e/extension/extension.json @@ -1,6 +1,7 @@ { "name": "diff-view-e2e", - "activation": ["onWebView:diff-prototype"], + "activation": ["onWebView:diff-prototype", "onFileSystem:blob-fixture"], + "fileSystemProviders": [{ "id": "blob-fixture" }], "browser": "main.js", "contentSecurityPolicy": ["default-src 'none'", "script-src 'self'"], "rpc": [ From 7f59c3228ea721634b928751e706af7b1207592b Mon Sep 17 00:00:00 2001 From: levivilet <72156503+levivilet@users.noreply.github.com> Date: Wed, 23 Sep 2026 13:53:34 +0000 Subject: [PATCH 04/10] test: isolate Blob filesystem fixture --- packages/e2e/extension/extension.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/e2e/extension/extension.json b/packages/e2e/extension/extension.json index 9d267a85..f22c2114 100644 --- a/packages/e2e/extension/extension.json +++ b/packages/e2e/extension/extension.json @@ -1,5 +1,6 @@ { "name": "diff-view-e2e", + "isolated": true, "activation": ["onWebView:diff-prototype", "onFileSystem:blob-fixture"], "fileSystemProviders": [{ "id": "blob-fixture" }], "browser": "main.js", From 1a33afa295c251823f3c141e4ece3a9036793e03 Mon Sep 17 00:00:00 2001 From: levivilet <72156503+levivilet@users.noreply.github.com> Date: Wed, 23 Sep 2026 14:11:12 +0000 Subject: [PATCH 05/10] Fix isolated Blob filesystem e2e fixture --- package-lock.json | 27 ++++++++++++++++++++++- package.json | 5 +++++ packages/e2e/extension/main.js | 8 ++++--- packages/e2e/package.json | 17 ++++++++------ packages/e2e/scripts/prepare-extension.js | 21 ++++++++++++++++++ 5 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 packages/e2e/scripts/prepare-extension.js diff --git a/package-lock.json b/package-lock.json index b9518fcb..b7c33a84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2891,6 +2891,29 @@ "license": "MIT", "optional": true }, + "node_modules/@lvce-editor/api": { + "version": "8.84.0", + "resolved": "https://registry.npmjs.org/@lvce-editor/api/-/api-8.84.0.tgz", + "integrity": "sha512-7Zck/G4gOz75lw25KHNuI3YPSjEPRgrYeMlWnWkSNph7Gi8oxPFiE3LLTnF8Ip7Xd2qkWk45LqulUmo68yRU4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lvce-editor/command": "^2.0.0", + "@lvce-editor/rpc": "^6.4.0", + "@lvce-editor/rpc-registry": "^9.24.0", + "@lvce-editor/virtual-dom-worker": "^10.0.0" + } + }, + "node_modules/@lvce-editor/api/node_modules/@lvce-editor/virtual-dom-worker": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@lvce-editor/virtual-dom-worker/-/virtual-dom-worker-10.2.0.tgz", + "integrity": "sha512-URtDWcAFadP7SLOqfepRxomJmNRQDmON8GFKRfsA1dOgcqBnoBR4G5xwo6oDeZvP4pnRAzHR3QB3b8I6nASU+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lvce-editor/constants": "^5.14.0" + } + }, "node_modules/@lvce-editor/assert": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@lvce-editor/assert/-/assert-1.9.0.tgz", @@ -15808,7 +15831,9 @@ "version": "0.0.0-dev", "license": "MIT", "devDependencies": { - "@lvce-editor/test-with-playwright": "^22.29.0" + "@lvce-editor/api": "^8.84.0", + "@lvce-editor/test-with-playwright": "^22.29.0", + "esbuild": "^0.28.2" } }, "packages/server": { diff --git a/package.json b/package.json index f8a80323..8460f6fb 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,11 @@ "trigger-ci-branches": "bash packages/build/trigger-ci-branches.sh", "type-check": "tsc -b" }, + "knip": { + "ignoreDependencies": [ + "@lvce-editor/api" + ] + }, "prettier": { "semi": false, "singleQuote": true, diff --git a/packages/e2e/extension/main.js b/packages/e2e/extension/main.js index 423c31f8..aa8718cd 100644 --- a/packages/e2e/extension/main.js +++ b/packages/e2e/extension/main.js @@ -1,3 +1,5 @@ +import { activate as activateExtensionApi, registerFileSystemProvider } from '@lvce-editor/api' + const webViewProvider = { id: 'diff-prototype', async create() {}, @@ -13,9 +15,9 @@ const fileSystemProvider = { }, } -export const activate = () => { +export const activate = async () => { + await activateExtensionApi() // @ts-ignore vscode.registerWebViewProvider(webViewProvider) - // @ts-ignore - vscode.registerFileSystemProvider(fileSystemProvider) + registerFileSystemProvider(fileSystemProvider) } diff --git a/packages/e2e/package.json b/packages/e2e/package.json index 8c8f0661..470a52fb 100644 --- a/packages/e2e/package.json +++ b/packages/e2e/package.json @@ -5,15 +5,18 @@ "type": "module", "main": "index.js", "scripts": { - "e2e": "test-with-playwright --only-extension=. --test-path=. --reuse-page", - "e2e:firefox": "test-with-playwright --only-extension=. --test-path=. --browser=firefox --reuse-page", - "e2e:firefox:headless": "test-with-playwright --only-extension=. --test-path=. --browser=firefox --headless --reuse-page", - "e2e:headless": "test-with-playwright --only-extension=. --test-path=. --headless --reuse-page", - "e2e:webkit": "test-with-playwright --only-extension=. --test-path=. --browser=webkit --reuse-page", - "e2e:webkit:headless": "test-with-playwright --only-extension=. --test-path=. --browser=webkit --headless --reuse-page", + "e2e": "npm run e2e:prepare && test-with-playwright --only-extension=./.tmp/extension --test-path=. --reuse-page", + "e2e:firefox": "npm run e2e:prepare && test-with-playwright --only-extension=./.tmp/extension --test-path=. --browser=firefox --reuse-page", + "e2e:firefox:headless": "npm run e2e:prepare && test-with-playwright --only-extension=./.tmp/extension --test-path=. --browser=firefox --headless --reuse-page", + "e2e:headless": "npm run e2e:prepare && test-with-playwright --only-extension=./.tmp/extension --test-path=. --headless --reuse-page", + "e2e:prepare": "node ./scripts/prepare-extension.js", + "e2e:webkit": "npm run e2e:prepare && test-with-playwright --only-extension=./.tmp/extension --test-path=. --browser=webkit --reuse-page", + "e2e:webkit:headless": "npm run e2e:prepare && test-with-playwright --only-extension=./.tmp/extension --test-path=. --browser=webkit --headless --reuse-page", "type-check": "tsc" }, "devDependencies": { - "@lvce-editor/test-with-playwright": "^22.29.0" + "@lvce-editor/api": "^8.84.0", + "@lvce-editor/test-with-playwright": "^22.29.0", + "esbuild": "^0.28.2" } } diff --git a/packages/e2e/scripts/prepare-extension.js b/packages/e2e/scripts/prepare-extension.js new file mode 100644 index 00000000..496a1131 --- /dev/null +++ b/packages/e2e/scripts/prepare-extension.js @@ -0,0 +1,21 @@ +import { cp, mkdir, rm } from 'node:fs/promises' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { build } from 'esbuild' + +const packageRoot = join(dirname(fileURLToPath(import.meta.url)), '..') +const temporaryDirectory = join(packageRoot, '.tmp') +const outputDirectory = join(temporaryDirectory, 'extension') + +await rm(temporaryDirectory, { force: true, recursive: true }) +await mkdir(outputDirectory, { recursive: true }) + +await cp(join(packageRoot, 'extension', 'extension.json'), join(outputDirectory, 'extension.json')) +await build({ + bundle: true, + entryPoints: [join(packageRoot, 'extension', 'main.js')], + external: ['electron', 'node:*'], + format: 'esm', + outfile: join(outputDirectory, 'main.js'), + platform: 'browser', +}) From 7fe19b1cf53760751b3030e7de7a88b321e92ccd Mon Sep 17 00:00:00 2001 From: levivilet <72156503+levivilet@users.noreply.github.com> Date: Wed, 23 Sep 2026 14:35:08 +0000 Subject: [PATCH 06/10] Keep e2e extension root when bundling --- packages/e2e/extension/extension.json | 2 +- packages/e2e/package.json | 12 ++++++------ packages/e2e/scripts/prepare-extension.js | 12 +++++------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/packages/e2e/extension/extension.json b/packages/e2e/extension/extension.json index f22c2114..383d5249 100644 --- a/packages/e2e/extension/extension.json +++ b/packages/e2e/extension/extension.json @@ -3,7 +3,7 @@ "isolated": true, "activation": ["onWebView:diff-prototype", "onFileSystem:blob-fixture"], "fileSystemProviders": [{ "id": "blob-fixture" }], - "browser": "main.js", + "browser": ".tmp/main.js", "contentSecurityPolicy": ["default-src 'none'", "script-src 'self'"], "rpc": [ { diff --git a/packages/e2e/package.json b/packages/e2e/package.json index 470a52fb..64bf3b62 100644 --- a/packages/e2e/package.json +++ b/packages/e2e/package.json @@ -5,13 +5,13 @@ "type": "module", "main": "index.js", "scripts": { - "e2e": "npm run e2e:prepare && test-with-playwright --only-extension=./.tmp/extension --test-path=. --reuse-page", - "e2e:firefox": "npm run e2e:prepare && test-with-playwright --only-extension=./.tmp/extension --test-path=. --browser=firefox --reuse-page", - "e2e:firefox:headless": "npm run e2e:prepare && test-with-playwright --only-extension=./.tmp/extension --test-path=. --browser=firefox --headless --reuse-page", - "e2e:headless": "npm run e2e:prepare && test-with-playwright --only-extension=./.tmp/extension --test-path=. --headless --reuse-page", + "e2e": "npm run e2e:prepare && test-with-playwright --only-extension=. --test-path=. --reuse-page", + "e2e:firefox": "npm run e2e:prepare && test-with-playwright --only-extension=. --test-path=. --browser=firefox --reuse-page", + "e2e:firefox:headless": "npm run e2e:prepare && test-with-playwright --only-extension=. --test-path=. --browser=firefox --headless --reuse-page", + "e2e:headless": "npm run e2e:prepare && test-with-playwright --only-extension=. --test-path=. --headless --reuse-page", "e2e:prepare": "node ./scripts/prepare-extension.js", - "e2e:webkit": "npm run e2e:prepare && test-with-playwright --only-extension=./.tmp/extension --test-path=. --browser=webkit --reuse-page", - "e2e:webkit:headless": "npm run e2e:prepare && test-with-playwright --only-extension=./.tmp/extension --test-path=. --browser=webkit --headless --reuse-page", + "e2e:webkit": "npm run e2e:prepare && test-with-playwright --only-extension=. --test-path=. --browser=webkit --reuse-page", + "e2e:webkit:headless": "npm run e2e:prepare && test-with-playwright --only-extension=. --test-path=. --browser=webkit --headless --reuse-page", "type-check": "tsc" }, "devDependencies": { diff --git a/packages/e2e/scripts/prepare-extension.js b/packages/e2e/scripts/prepare-extension.js index 496a1131..f677a2c6 100644 --- a/packages/e2e/scripts/prepare-extension.js +++ b/packages/e2e/scripts/prepare-extension.js @@ -1,21 +1,19 @@ -import { cp, mkdir, rm } from 'node:fs/promises' +import { mkdir, rm } from 'node:fs/promises' import { dirname, join } from 'node:path' import { fileURLToPath } from 'node:url' import { build } from 'esbuild' const packageRoot = join(dirname(fileURLToPath(import.meta.url)), '..') -const temporaryDirectory = join(packageRoot, '.tmp') -const outputDirectory = join(temporaryDirectory, 'extension') +const extensionDirectory = join(packageRoot, 'extension') +const temporaryDirectory = join(extensionDirectory, '.tmp') await rm(temporaryDirectory, { force: true, recursive: true }) -await mkdir(outputDirectory, { recursive: true }) - -await cp(join(packageRoot, 'extension', 'extension.json'), join(outputDirectory, 'extension.json')) +await mkdir(temporaryDirectory, { recursive: true }) await build({ bundle: true, entryPoints: [join(packageRoot, 'extension', 'main.js')], external: ['electron', 'node:*'], format: 'esm', - outfile: join(outputDirectory, 'main.js'), + outfile: join(temporaryDirectory, 'main.js'), platform: 'browser', }) From fe4909dfb7c2ab6b8920bc9fc4c821ad2c275712 Mon Sep 17 00:00:00 2001 From: levivilet <72156503+levivilet@users.noreply.github.com> Date: Wed, 23 Sep 2026 14:45:23 +0000 Subject: [PATCH 07/10] Report Blob provider errors in e2e regression --- packages/e2e/src/diff.extension-blob-file-system-provider.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/e2e/src/diff.extension-blob-file-system-provider.ts b/packages/e2e/src/diff.extension-blob-file-system-provider.ts index f70c1c88..1586865e 100644 --- a/packages/e2e/src/diff.extension-blob-file-system-provider.ts +++ b/packages/e2e/src/diff.extension-blob-file-system-provider.ts @@ -8,8 +8,8 @@ export const test: Test = async ({ DiffView, expect, FileSystem, Locator, Worksp await DiffView.open('data://before content', 'blob-fixture:///workspace/file.txt') const leftRows = Locator('.DiffEditorContentLeft .DiffEditorRows') - const rightRows = Locator('.DiffEditorContentRight .DiffEditorRows') + const rightRowsOrError = Locator('.DiffEditorContentRight .DiffEditorRows, .DiffEditorContentRight .DiffEditorErrorMessage') await expect(leftRows).toHaveText('before content') - await expect(rightRows).toHaveText('remote 😀 content') + await expect(rightRowsOrError).toHaveText('remote 😀 content') } From 91ff87edfdbf534e408e81976573e22343a11590 Mon Sep 17 00:00:00 2001 From: levivilet <72156503+levivilet@users.noreply.github.com> Date: Wed, 23 Sep 2026 14:54:19 +0000 Subject: [PATCH 08/10] Register isolated file system fixture at startup --- packages/e2e/extension/main.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/e2e/extension/main.js b/packages/e2e/extension/main.js index aa8718cd..56702275 100644 --- a/packages/e2e/extension/main.js +++ b/packages/e2e/extension/main.js @@ -15,9 +15,11 @@ const fileSystemProvider = { }, } -export const activate = async () => { +const main = async () => { await activateExtensionApi() // @ts-ignore vscode.registerWebViewProvider(webViewProvider) registerFileSystemProvider(fileSystemProvider) } + +main().catch(console.error) From e6e065373e8d80826131dc306cb611f1632f7e54 Mon Sep 17 00:00:00 2001 From: levivilet <72156503+levivilet@users.noreply.github.com> Date: Wed, 23 Sep 2026 15:05:13 +0000 Subject: [PATCH 09/10] Add test extension manifest id --- packages/e2e/extension/extension.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/e2e/extension/extension.json b/packages/e2e/extension/extension.json index 383d5249..8179b9f1 100644 --- a/packages/e2e/extension/extension.json +++ b/packages/e2e/extension/extension.json @@ -1,4 +1,5 @@ { + "id": "test.diff-view-e2e", "name": "diff-view-e2e", "isolated": true, "activation": ["onWebView:diff-prototype", "onFileSystem:blob-fixture"], From 79adeb75cdd29155d7cefabd3e8cdf1295fe24db Mon Sep 17 00:00:00 2001 From: levivilet <72156503+levivilet@users.noreply.github.com> Date: Wed, 23 Sep 2026 15:16:30 +0000 Subject: [PATCH 10/10] fix: register Blob diff fixture with web extension registry --- packages/e2e/extension/extension.json | 7 ++----- packages/e2e/extension/main.js | 18 +----------------- .../fixtures/blob-file-system/extension.json | 10 ++++++++++ packages/e2e/fixtures/blob-file-system/main.js | 18 ++++++++++++++++++ packages/e2e/scripts/prepare-extension.js | 4 ++-- ...diff.extension-blob-file-system-provider.ts | 3 ++- 6 files changed, 35 insertions(+), 25 deletions(-) create mode 100644 packages/e2e/fixtures/blob-file-system/extension.json create mode 100644 packages/e2e/fixtures/blob-file-system/main.js diff --git a/packages/e2e/extension/extension.json b/packages/e2e/extension/extension.json index 8179b9f1..5504e052 100644 --- a/packages/e2e/extension/extension.json +++ b/packages/e2e/extension/extension.json @@ -1,10 +1,7 @@ { - "id": "test.diff-view-e2e", "name": "diff-view-e2e", - "isolated": true, - "activation": ["onWebView:diff-prototype", "onFileSystem:blob-fixture"], - "fileSystemProviders": [{ "id": "blob-fixture" }], - "browser": ".tmp/main.js", + "activation": ["onWebView:diff-prototype"], + "browser": "main.js", "contentSecurityPolicy": ["default-src 'none'", "script-src 'self'"], "rpc": [ { diff --git a/packages/e2e/extension/main.js b/packages/e2e/extension/main.js index 56702275..146af22c 100644 --- a/packages/e2e/extension/main.js +++ b/packages/e2e/extension/main.js @@ -1,25 +1,9 @@ -import { activate as activateExtensionApi, registerFileSystemProvider } from '@lvce-editor/api' - const webViewProvider = { id: 'diff-prototype', async create() {}, } -const fileSystemProvider = { - id: 'blob-fixture', - async readFile(uri) { - if (uri.endsWith('/empty.txt')) { - return new Blob([]) - } - return new Blob(['remote 😀 content']) - }, -} - -const main = async () => { - await activateExtensionApi() +export const activate = () => { // @ts-ignore vscode.registerWebViewProvider(webViewProvider) - registerFileSystemProvider(fileSystemProvider) } - -main().catch(console.error) diff --git a/packages/e2e/fixtures/blob-file-system/extension.json b/packages/e2e/fixtures/blob-file-system/extension.json new file mode 100644 index 00000000..b8f5c92b --- /dev/null +++ b/packages/e2e/fixtures/blob-file-system/extension.json @@ -0,0 +1,10 @@ +{ + "id": "test.blob-file-system", + "isolated": true, + "fileSystemProviders": [ + { + "id": "blob-fixture" + } + ], + "browser": ".tmp/main.js" +} diff --git a/packages/e2e/fixtures/blob-file-system/main.js b/packages/e2e/fixtures/blob-file-system/main.js new file mode 100644 index 00000000..e3464c4f --- /dev/null +++ b/packages/e2e/fixtures/blob-file-system/main.js @@ -0,0 +1,18 @@ +import { activate as activateExtensionApi, registerFileSystemProvider } from '@lvce-editor/api' + +const fileSystemProvider = { + id: 'blob-fixture', + async readFile(uri) { + if (uri.endsWith('/empty.txt')) { + return new Blob([]) + } + return new Blob(['remote 😀 content']) + }, +} + +const main = async () => { + await activateExtensionApi() + registerFileSystemProvider(fileSystemProvider) +} + +main().catch(console.error) diff --git a/packages/e2e/scripts/prepare-extension.js b/packages/e2e/scripts/prepare-extension.js index f677a2c6..d8a6c164 100644 --- a/packages/e2e/scripts/prepare-extension.js +++ b/packages/e2e/scripts/prepare-extension.js @@ -4,14 +4,14 @@ import { fileURLToPath } from 'node:url' import { build } from 'esbuild' const packageRoot = join(dirname(fileURLToPath(import.meta.url)), '..') -const extensionDirectory = join(packageRoot, 'extension') +const extensionDirectory = join(packageRoot, 'fixtures', 'blob-file-system') const temporaryDirectory = join(extensionDirectory, '.tmp') await rm(temporaryDirectory, { force: true, recursive: true }) await mkdir(temporaryDirectory, { recursive: true }) await build({ bundle: true, - entryPoints: [join(packageRoot, 'extension', 'main.js')], + entryPoints: [join(extensionDirectory, 'main.js')], external: ['electron', 'node:*'], format: 'esm', outfile: join(temporaryDirectory, 'main.js'), diff --git a/packages/e2e/src/diff.extension-blob-file-system-provider.ts b/packages/e2e/src/diff.extension-blob-file-system-provider.ts index 1586865e..9bcfd00f 100644 --- a/packages/e2e/src/diff.extension-blob-file-system-provider.ts +++ b/packages/e2e/src/diff.extension-blob-file-system-provider.ts @@ -2,9 +2,10 @@ import type { Test } from '@lvce-editor/test-with-playwright' export const name = 'diff.extension-blob-file-system-provider' -export const test: Test = async ({ DiffView, expect, FileSystem, Locator, Workspace }) => { +export const test: Test = async ({ DiffView, expect, Extension, FileSystem, Locator, Workspace }) => { const tmpDir = await FileSystem.getTmpDir() await Workspace.setPath(tmpDir) + await Extension.addWebExtension(import.meta.resolve('../fixtures/blob-file-system')) await DiffView.open('data://before content', 'blob-fixture:///workspace/file.txt') const leftRows = Locator('.DiffEditorContentLeft .DiffEditorRows')