From 0b8410bd58dfb6fddbb3105d50a0c85041ee8c0f Mon Sep 17 00:00:00 2001 From: Nick K Date: Tue, 21 May 2024 21:04:04 +0300 Subject: [PATCH] fix(bun): Support application builds with Bun (#6344) --- packages/qwik/src/optimizer/src/platform.ts | 10 +++++----- starters/adapters/bun/adapters/bun/vite.config.ts | 5 +++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/qwik/src/optimizer/src/platform.ts b/packages/qwik/src/optimizer/src/platform.ts index e21e7bbdf7c..deea07dedb4 100644 --- a/packages/qwik/src/optimizer/src/platform.ts +++ b/packages/qwik/src/optimizer/src/platform.ts @@ -35,7 +35,7 @@ export async function getSystem() { } if (globalThis.IS_CJS) { - if (sysEnv === 'node') { + if (sysEnv === 'node' || sysEnv === 'bun') { // using this api object as a way to ensure bundlers // do not try to inline or rewrite require() sys.dynamicImport = (path) => require(path); @@ -62,7 +62,7 @@ export async function getSystem() { } } - if (sysEnv === 'node') { + if (sysEnv === 'node' || sysEnv === 'bun') { sys.path = await sys.dynamicImport('node:path'); sys.cwd = () => process.cwd(); sys.os = process.platform; @@ -135,7 +135,7 @@ export async function loadPlatformBinding(sys: OptimizerSystem) { const sysEnv = getEnv(); // Try native build - if (sysEnv === 'node') { + if (sysEnv === 'node' || sysEnv === 'bun') { // Node.js const platform = (QWIK_BINDING_MAP as any)[process.platform]; if (platform) { @@ -164,7 +164,7 @@ export async function loadPlatformBinding(sys: OptimizerSystem) { if (globalThis.IS_CJS) { // CJS WASM - if (sysEnv === 'node') { + if (sysEnv === 'node' || sysEnv === 'bun') { // CJS WASM Node.js const wasmPath = sys.path.join(__dirname, 'bindings', 'qwik_wasm_bg.wasm'); const mod = await sys.dynamicImport(`./bindings/qwik.wasm.cjs`); @@ -225,7 +225,7 @@ export async function loadPlatformBinding(sys: OptimizerSystem) { } if (globalThis.IS_ESM) { - if (sysEnv === 'node') { + if (sysEnv === 'node' || sysEnv === 'bun') { // CJS WASM Node.js const url: typeof import('url') = await sys.dynamicImport('node:url'); const __dirname = sys.path.dirname(url.fileURLToPath(import.meta.url)); diff --git a/starters/adapters/bun/adapters/bun/vite.config.ts b/starters/adapters/bun/adapters/bun/vite.config.ts index 4ba9c1d2452..7f4eb2f44fa 100644 --- a/starters/adapters/bun/adapters/bun/vite.config.ts +++ b/starters/adapters/bun/adapters/bun/vite.config.ts @@ -1,7 +1,11 @@ import { bunServerAdapter } from "@builder.io/qwik-city/adapters/bun-server/vite"; import { extendConfig } from "@builder.io/qwik-city/vite"; +import { _TextEncoderStream_polyfill } from "@builder.io/qwik-city/middleware/request-handler"; import baseConfig from "../../vite.config"; +// This polyfill is required when you use SSG and build your app with Bun, because Bun does not have TextEncoderStream. See: https://github.com/oven-sh/bun/issues/5648 +globalThis.TextEncoderStream ||= _TextEncoderStream_polyfill; + export default extendConfig(baseConfig, () => { return { build: { @@ -16,6 +20,7 @@ export default extendConfig(baseConfig, () => { ssg: { include: ["/*"], origin: "https://yoursite.dev", + maxWorkers: 1, // Limit Workers to 1, otherwise SSG will hang when compiling Qwik City app with `bun run --bun build`. }, }), ],