diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 663c4a3..7600404 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -160,6 +160,19 @@ importers:
specifier: ^3.3.7
version: 3.3.7(typescript@5.2.2)
+ test/error-repros/missing-zlib-imports:
+ dependencies:
+ fast-zlib:
+ specifier: ^2.0.1
+ version: 2.0.1
+ vite-plugin-node-polyfills:
+ specifier: workspace:*
+ version: link:../../..
+ devDependencies:
+ vite:
+ specifier: ^5.0.2
+ version: 5.1.0(@types/node@18.18.8)
+
test/error-repros/vite-scan-buffer-import-error:
devDependencies:
vite-plugin-node-polyfills:
@@ -2710,6 +2723,10 @@ packages:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
dev: true
+ /fast-zlib@2.0.1:
+ resolution: {integrity: sha512-DCoYgNagM2Bt1VIpXpdGnRx4LzqJeYG0oh6Nf/7cWo6elTXkFGMw9CrRCYYUIapYNrozYMoyDRflx9mgT3Awyw==}
+ dev: false
+
/fastq@1.15.0:
resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
dependencies:
@@ -4871,7 +4888,7 @@ packages:
mlly: 1.4.2
pathe: 1.1.1
picocolors: 1.0.0
- vite: 5.0.2(@types/node@18.18.8)
+ vite: 5.1.0(@types/node@18.18.8)
transitivePeerDependencies:
- '@types/node'
- less
diff --git a/shims/buffer/index.ts b/shims/buffer/index.ts
index 4e0c9e4..3bf292b 100644
--- a/shims/buffer/index.ts
+++ b/shims/buffer/index.ts
@@ -1,5 +1,43 @@
-// eslint-disable-next-line unicorn/prefer-node-protocol, n/no-deprecated-api
-import { Buffer, SlowBuffer, kMaxLength } from 'buffer'
+import {
+ Blob,
+ BlobOptions,
+ Buffer,
+ File,
+ FileOptions,
+ INSPECT_MAX_BYTES,
+ // eslint-disable-next-line n/no-deprecated-api
+ SlowBuffer,
+ TranscodeEncoding,
+ atob,
+ btoa,
+ constants,
+ isAscii,
+ isUtf8,
+ kMaxLength,
+ kStringMaxLength,
+ resolveObjectURL,
+ transcode,
+// eslint-disable-next-line unicorn/prefer-node-protocol
+} from 'buffer'
+
+export {
+ Blob,
+ BlobOptions,
+ Buffer,
+ File,
+ FileOptions,
+ INSPECT_MAX_BYTES,
+ SlowBuffer,
+ TranscodeEncoding,
+ atob,
+ btoa,
+ constants,
+ isAscii,
+ isUtf8,
+ kMaxLength,
+ kStringMaxLength,
+ resolveObjectURL,
+ transcode,
+}
-export { Buffer, SlowBuffer, kMaxLength }
export default Buffer
diff --git a/test/error-repros/missing-zlib-imports/index.html b/test/error-repros/missing-zlib-imports/index.html
new file mode 100644
index 0000000..b412659
--- /dev/null
+++ b/test/error-repros/missing-zlib-imports/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ missing-zlib-imports
+
+
+
+
+
+
diff --git a/test/error-repros/missing-zlib-imports/package.json b/test/error-repros/missing-zlib-imports/package.json
new file mode 100644
index 0000000..fa7c825
--- /dev/null
+++ b/test/error-repros/missing-zlib-imports/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "missing-zlib-imports",
+ "type": "module",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "build": "vite build",
+ "dev": "vite",
+ "test:e2e": "CI=true run-p test:e2e:*",
+ "test:e2e:build": "VITE_COMMAND=build WEB_SERVER_COMMAND='vite build && vite preview --port 15176' WEB_SERVER_URL='http://localhost:15176' playwright test",
+ "test:e2e:dev": "VITE_COMMAND=dev WEB_SERVER_COMMAND='vite dev --port 15175' WEB_SERVER_URL='http://localhost:15175' playwright test"
+ },
+ "dependencies": {
+ "fast-zlib": "^2.0.1",
+ "vite-plugin-node-polyfills": "workspace:*"
+ },
+ "devDependencies": {
+ "vite": "^5.1.1"
+ }
+}
diff --git a/test/error-repros/missing-zlib-imports/playwright.config.ts b/test/error-repros/missing-zlib-imports/playwright.config.ts
new file mode 100644
index 0000000..c9de5c4
--- /dev/null
+++ b/test/error-repros/missing-zlib-imports/playwright.config.ts
@@ -0,0 +1,29 @@
+import { defineConfig, devices } from '@playwright/test'
+
+const webServerCommand = process.env.WEB_SERVER_COMMAND || 'pnpm dev'
+const webServerUrl = process.env.WEB_SERVER_URL || 'http://localhost:5173'
+
+// https://playwright.dev/docs/test-configuration
+export default defineConfig({
+ forbidOnly: !!process.env.CI,
+ fullyParallel: true,
+ projects: [
+ {
+ name: 'chromium',
+ use: { ...devices['Desktop Chrome'] },
+ },
+ ],
+ reporter: 'html',
+ retries: process.env.CI ? 2 : 0,
+ testDir: './test/e2e',
+ use: {
+ baseURL: webServerUrl,
+ trace: 'on-first-retry',
+ },
+ webServer: {
+ command: webServerCommand,
+ stdout: 'ignore',
+ url: webServerUrl,
+ },
+ workers: process.env.CI ? 1 : undefined,
+})
diff --git a/test/error-repros/missing-zlib-imports/src/index.ts b/test/error-repros/missing-zlib-imports/src/index.ts
new file mode 100644
index 0000000..74db2ad
--- /dev/null
+++ b/test/error-repros/missing-zlib-imports/src/index.ts
@@ -0,0 +1,4 @@
+import zlib from 'fast-zlib'
+
+// eslint-disable-next-line no-console
+console.log(Object.keys(zlib))
diff --git a/test/error-repros/missing-zlib-imports/test/e2e/main.spec.ts b/test/error-repros/missing-zlib-imports/test/e2e/main.spec.ts
new file mode 100644
index 0000000..696f2ef
--- /dev/null
+++ b/test/error-repros/missing-zlib-imports/test/e2e/main.spec.ts
@@ -0,0 +1,27 @@
+import { expect, test } from '@playwright/test'
+
+test('sets the page title', async ({ page }) => {
+ await page.goto('/')
+
+ await expect(page).toHaveTitle('missing-zlib-imports')
+})
+
+test('logs the correct values', async ({ page }) => {
+ const errors = []
+ const logs = []
+
+ page.on('console', (message) => {
+ logs.push(message.text())
+ })
+
+ page.on('pageerror', (error) => {
+ errors.push(error.message)
+ })
+
+ await page.goto('/')
+
+ expect(errors).toEqual([])
+ expect(logs).toContainEqual(
+ '[Inflate, Deflate, InflateRaw, DeflateRaw, Gzip, Gunzip, Unzip, BrotliCompress, BrotliDecompress, constants, default]',
+ )
+})
diff --git a/test/error-repros/missing-zlib-imports/vite.config.ts b/test/error-repros/missing-zlib-imports/vite.config.ts
new file mode 100644
index 0000000..e7c529d
--- /dev/null
+++ b/test/error-repros/missing-zlib-imports/vite.config.ts
@@ -0,0 +1,12 @@
+import { defineConfig } from 'vite'
+import { nodePolyfills } from 'vite-plugin-node-polyfills'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ optimizeDeps: {
+ force: true,
+ },
+ plugins: [
+ nodePolyfills(),
+ ],
+})
diff --git a/vitest.config.ts b/vitest.config.ts
new file mode 100644
index 0000000..2b1650a
--- /dev/null
+++ b/vitest.config.ts
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vitest/config'
+
+export default defineConfig({
+ test: {
+ include: ['**/*.test.ts'],
+ },
+})