diff --git a/src/__tests__/extension-polyfill.spec.ts b/src/__tests__/extension-polyfill.spec.ts new file mode 100644 index 00000000000..76e5be9dc33 --- /dev/null +++ b/src/__tests__/extension-polyfill.spec.ts @@ -0,0 +1,52 @@ +import { describe, it, expect, vi } from "vitest" + +describe("getDefaultHighWaterMark polyfill", () => { + it("should add getDefaultHighWaterMark if it doesn't exist", () => { + // Mock the stream module without getDefaultHighWaterMark + const mockStream: any = {} + + // Execute the polyfill code + if (!mockStream.getDefaultHighWaterMark) { + mockStream.getDefaultHighWaterMark = function (objectMode: boolean): number { + return objectMode ? 16 : 16 * 1024 + } + } + + // Verify the function was added + expect(mockStream.getDefaultHighWaterMark).toBeDefined() + expect(typeof mockStream.getDefaultHighWaterMark).toBe("function") + }) + + it("should return correct values for objectMode", () => { + const mockStream: any = {} + mockStream.getDefaultHighWaterMark = function (objectMode: boolean): number { + return objectMode ? 16 : 16 * 1024 + } + + // Test objectMode = true + expect(mockStream.getDefaultHighWaterMark(true)).toBe(16) + + // Test objectMode = false + expect(mockStream.getDefaultHighWaterMark(false)).toBe(16 * 1024) + }) + + it("should not override existing getDefaultHighWaterMark", () => { + // Mock stream with existing getDefaultHighWaterMark + const originalFunction = vi.fn((objectMode: boolean) => (objectMode ? 32 : 32 * 1024)) + const mockStream: any = { + getDefaultHighWaterMark: originalFunction, + } + + // Execute polyfill check + if (!mockStream.getDefaultHighWaterMark) { + mockStream.getDefaultHighWaterMark = function (objectMode: boolean): number { + return objectMode ? 16 : 16 * 1024 + } + } + + // Verify original function is preserved + expect(mockStream.getDefaultHighWaterMark).toBe(originalFunction) + expect(mockStream.getDefaultHighWaterMark(true)).toBe(32) + expect(mockStream.getDefaultHighWaterMark(false)).toBe(32 * 1024) + }) +}) diff --git a/src/extension.ts b/src/extension.ts index bd43bcbf8a8..0250b58cfb1 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,3 +1,16 @@ +// Polyfill for getDefaultHighWaterMark to support older VS Code versions +// VS Code 1.85.x uses Node.js 16.14.2 which doesn't have getDefaultHighWaterMark +// (introduced in Node.js 16.7.0). This polyfill ensures compatibility. +// This must be added before any imports that might use the stream module. +// See: https://github.com/RooCodeInc/Roo-Code/issues/6240 +if (!require("stream").getDefaultHighWaterMark) { + const stream = require("stream") + stream.getDefaultHighWaterMark = function (objectMode: boolean): number { + // Default values from Node.js source + return objectMode ? 16 : 16 * 1024 + } +} + import * as vscode from "vscode" import * as dotenvx from "@dotenvx/dotenvx" import * as path from "path"