From f31c838a3f0571a5dc49b8a23617827742150358 Mon Sep 17 00:00:00 2001 From: Johannes Date: Tue, 9 Dec 2025 15:59:18 +0100 Subject: [PATCH] Remove Node.js API dependencies (Buffer, path module) - Replace Buffer with Uint8Array and TextEncoder - Replace path module with native string manipulation - Replace NodeJS.Timeout with ReturnType Fixes microsoft/vscode-extension-samples#550 --- fsprovider-sample/src/extension.ts | 40 +++++++++++---------- fsprovider-sample/src/fileSystemProvider.ts | 17 +++++---- 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/fsprovider-sample/src/extension.ts b/fsprovider-sample/src/extension.ts index 057a8a33..d2ab8062 100644 --- a/fsprovider-sample/src/extension.ts +++ b/fsprovider-sample/src/extension.ts @@ -1,6 +1,8 @@ import * as vscode from 'vscode'; import { MemFS } from './fileSystemProvider'; +const encoder = new TextEncoder(); + export function activate(context: vscode.ExtensionContext) { console.log('MemFS says "Hello"'); @@ -18,7 +20,7 @@ export function activate(context: vscode.ExtensionContext) { context.subscriptions.push(vscode.commands.registerCommand('memfs.addFile', _ => { if (initialized) { - memFs.writeFile(vscode.Uri.parse(`memfs:/file.txt`), Buffer.from('foo'), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.txt`), encoder.encode('foo'), { create: true, overwrite: true }); } })); @@ -35,17 +37,17 @@ export function activate(context: vscode.ExtensionContext) { initialized = true; // most common files types - memFs.writeFile(vscode.Uri.parse(`memfs:/file.txt`), Buffer.from('foo'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.html`), Buffer.from('

Hello

'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.js`), Buffer.from('console.log("JavaScript")'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.json`), Buffer.from('{ "json": true }'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.ts`), Buffer.from('console.log("TypeScript")'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.css`), Buffer.from('* { color: green; }'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.md`), Buffer.from('Hello _World_'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.xml`), Buffer.from(''), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.py`), Buffer.from('import base64, sys; base64.decode(open(sys.argv[1], "rb"), open(sys.argv[2], "wb"))'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.php`), Buffer.from('&1\'); ?>'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/file.yaml`), Buffer.from('- just: write something'), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.txt`), encoder.encode('foo'), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.html`), encoder.encode('

Hello

'), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.js`), encoder.encode('console.log("JavaScript")'), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.json`), encoder.encode('{ "json": true }'), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.ts`), encoder.encode('console.log("TypeScript")'), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.css`), encoder.encode('* { color: green; }'), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.md`), encoder.encode('Hello _World_'), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.xml`), encoder.encode(''), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.py`), encoder.encode('import base64, sys; base64.decode(open(sys.argv[1], "rb"), open(sys.argv[2], "wb"))'), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.php`), encoder.encode('&1\'); ?>'), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/file.yaml`), encoder.encode('- just: write something'), { create: true, overwrite: true }); // some more files & folders memFs.createDirectory(vscode.Uri.parse(`memfs:/folder/`)); @@ -56,12 +58,12 @@ export function activate(context: vscode.ExtensionContext) { memFs.writeFile(vscode.Uri.parse(`memfs:/folder/empty.txt`), new Uint8Array(0), { create: true, overwrite: true }); memFs.writeFile(vscode.Uri.parse(`memfs:/folder/empty.foo`), new Uint8Array(0), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/folder/file.ts`), Buffer.from('let a:number = true; console.log(a);'), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/folder/file.ts`), encoder.encode('let a:number = true; console.log(a);'), { create: true, overwrite: true }); memFs.writeFile(vscode.Uri.parse(`memfs:/large/rnd.foo`), randomData(50000), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/UPPER.txt`), Buffer.from('UPPER'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/upper.txt`), Buffer.from('upper'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/def/foo.md`), Buffer.from('*MemFS*'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/def/foo.bin`), Buffer.from([0, 0, 0, 1, 7, 0, 0, 1, 1]), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/UPPER.txt`), encoder.encode('UPPER'), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/upper.txt`), encoder.encode('upper'), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/def/foo.md`), encoder.encode('*MemFS*'), { create: true, overwrite: true }); + memFs.writeFile(vscode.Uri.parse(`memfs:/xyz/def/foo.bin`), new Uint8Array([0, 0, 0, 1, 7, 0, 0, 1, 1]), { create: true, overwrite: true }); })); context.subscriptions.push(vscode.commands.registerCommand('memfs.workspaceInit', _ => { @@ -69,7 +71,7 @@ export function activate(context: vscode.ExtensionContext) { })); } -function randomData(lineCnt: number, lineLen = 155): Buffer { +function randomData(lineCnt: number, lineLen = 155): Uint8Array { const lines: string[] = []; for (let i = 0; i < lineCnt; i++) { let line = ''; @@ -78,5 +80,5 @@ function randomData(lineCnt: number, lineLen = 155): Buffer { } lines.push(line.substr(0, lineLen)); } - return Buffer.from(lines.join('\n'), 'utf8'); + return encoder.encode(lines.join('\n')); } diff --git a/fsprovider-sample/src/fileSystemProvider.ts b/fsprovider-sample/src/fileSystemProvider.ts index fda95edd..2fca110d 100644 --- a/fsprovider-sample/src/fileSystemProvider.ts +++ b/fsprovider-sample/src/fileSystemProvider.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ -import * as path from 'path'; import * as vscode from 'vscode'; export class File implements vscode.FileStat { @@ -78,7 +77,7 @@ export class MemFS implements vscode.FileSystemProvider { } writeFile(uri: vscode.Uri, content: Uint8Array, options: { create: boolean, overwrite: boolean }): void { - const basename = path.posix.basename(uri.path); + const basename = uri.path.split('/').pop()!; const parent = this._lookupParentDirectory(uri); let entry = parent.entries.get(basename); if (entry instanceof Directory) { @@ -114,7 +113,7 @@ export class MemFS implements vscode.FileSystemProvider { const oldParent = this._lookupParentDirectory(oldUri); const newParent = this._lookupParentDirectory(newUri); - const newName = path.posix.basename(newUri.path); + const newName = newUri.path.split('/').pop()!; oldParent.entries.delete(entry.name); entry.name = newName; @@ -127,8 +126,8 @@ export class MemFS implements vscode.FileSystemProvider { } delete(uri: vscode.Uri): void { - const dirname = uri.with({ path: path.posix.dirname(uri.path) }); - const basename = path.posix.basename(uri.path); + const dirname = uri.with({ path: uri.path.substring(0, uri.path.lastIndexOf('/')) }); + const basename = uri.path.split('/').pop()!; const parent = this._lookupAsDirectory(dirname, false); if (!parent.entries.has(basename)) { throw vscode.FileSystemError.FileNotFound(uri); @@ -140,8 +139,8 @@ export class MemFS implements vscode.FileSystemProvider { } createDirectory(uri: vscode.Uri): void { - const basename = path.posix.basename(uri.path); - const dirname = uri.with({ path: path.posix.dirname(uri.path) }); + const basename = uri.path.split('/').pop()!; + const dirname = uri.with({ path: uri.path.substring(0, uri.path.lastIndexOf('/')) }); const parent = this._lookupAsDirectory(dirname, false); const entry = new Directory(basename); @@ -195,7 +194,7 @@ export class MemFS implements vscode.FileSystemProvider { } private _lookupParentDirectory(uri: vscode.Uri): Directory { - const dirname = uri.with({ path: path.posix.dirname(uri.path) }); + const dirname = uri.with({ path: uri.path.substring(0, uri.path.lastIndexOf('/')) }); return this._lookupAsDirectory(dirname, false); } @@ -203,7 +202,7 @@ export class MemFS implements vscode.FileSystemProvider { private _emitter = new vscode.EventEmitter(); private _bufferedEvents: vscode.FileChangeEvent[] = []; - private _fireSoonHandle?: NodeJS.Timeout; + private _fireSoonHandle?: ReturnType; readonly onDidChangeFile: vscode.Event = this._emitter.event;