From f95e75510cf89373aeab253ad9f3eb2d92a0f3d8 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 4 Jan 2023 16:03:13 -0800 Subject: [PATCH 1/9] [fix] conditionally polyfill but better to support Deno --- .changeset/wise-adults-pull.md | 5 +++++ packages/kit/src/exports/node/polyfills.js | 14 ++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 .changeset/wise-adults-pull.md diff --git a/.changeset/wise-adults-pull.md b/.changeset/wise-adults-pull.md new file mode 100644 index 000000000000..f4769f629bfb --- /dev/null +++ b/.changeset/wise-adults-pull.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +[fix] conditionally polyfill but better to support Deno diff --git a/packages/kit/src/exports/node/polyfills.js b/packages/kit/src/exports/node/polyfills.js index ba0e49ef8d85..cf817e16a7df 100644 --- a/packages/kit/src/exports/node/polyfills.js +++ b/packages/kit/src/exports/node/polyfills.js @@ -17,6 +17,20 @@ const globals = { // exported for dev/preview and node environments export function installPolyfills() { + const version_string = globalThis.process?.versions?.node; + + // don't polyfill on non-Node platforms like Deno + if (!version_string) { + return; + } + + const version = version_string.split('.'); + // multipart/form-data was added in Undici 5.11: https://github.com/nodejs/undici/releases/tag/v5.11.0 + // Node 18.11 upgraded to Unidi 5.11: https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V18.md#2022-10-13-version-18110-current-danielleadams + // We don't need to polyfill if it's already available + if (parseInt(version[0]) > 18 || parseInt(version[1]) >= 11) { + return; + } for (const name in globals) { Object.defineProperty(globalThis, name, { enumerable: true, From f747f4daf5beb1965530989e645a89169e1f7f94 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 4 Jan 2023 16:09:59 -0800 Subject: [PATCH 2/9] fix --- packages/kit/src/exports/node/polyfills.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/kit/src/exports/node/polyfills.js b/packages/kit/src/exports/node/polyfills.js index cf817e16a7df..7410c8d18873 100644 --- a/packages/kit/src/exports/node/polyfills.js +++ b/packages/kit/src/exports/node/polyfills.js @@ -28,7 +28,9 @@ export function installPolyfills() { // multipart/form-data was added in Undici 5.11: https://github.com/nodejs/undici/releases/tag/v5.11.0 // Node 18.11 upgraded to Unidi 5.11: https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V18.md#2022-10-13-version-18110-current-danielleadams // We don't need to polyfill if it's already available - if (parseInt(version[0]) > 18 || parseInt(version[1]) >= 11) { + const major = parseInt(version[0]); + const minor = parseInt(version[1]); + if (major > 18 || (major >= 16 && minor >= 11)) { return; } for (const name in globals) { From 5ebe58a0c98aa72f9da2df678718866a20e6e67d Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 4 Jan 2023 16:10:41 -0800 Subject: [PATCH 3/9] oops --- packages/kit/src/exports/node/polyfills.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/exports/node/polyfills.js b/packages/kit/src/exports/node/polyfills.js index 7410c8d18873..00c14157357b 100644 --- a/packages/kit/src/exports/node/polyfills.js +++ b/packages/kit/src/exports/node/polyfills.js @@ -30,7 +30,7 @@ export function installPolyfills() { // We don't need to polyfill if it's already available const major = parseInt(version[0]); const minor = parseInt(version[1]); - if (major > 18 || (major >= 16 && minor >= 11)) { + if (major > 18 || (major === 18 && minor >= 11)) { return; } for (const name in globals) { From 1fd3f3fc58175505a836c677542c641f6c0cee3b Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 4 Jan 2023 16:34:18 -0800 Subject: [PATCH 4/9] always polyfill on node --- packages/kit/src/exports/node/polyfills.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/kit/src/exports/node/polyfills.js b/packages/kit/src/exports/node/polyfills.js index 00c14157357b..9c870518df61 100644 --- a/packages/kit/src/exports/node/polyfills.js +++ b/packages/kit/src/exports/node/polyfills.js @@ -24,15 +24,6 @@ export function installPolyfills() { return; } - const version = version_string.split('.'); - // multipart/form-data was added in Undici 5.11: https://github.com/nodejs/undici/releases/tag/v5.11.0 - // Node 18.11 upgraded to Unidi 5.11: https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V18.md#2022-10-13-version-18110-current-danielleadams - // We don't need to polyfill if it's already available - const major = parseInt(version[0]); - const minor = parseInt(version[1]); - if (major > 18 || (major === 18 && minor >= 11)) { - return; - } for (const name in globals) { Object.defineProperty(globalThis, name, { enumerable: true, From c35d066d2542e0d6c34430f3026f79066a945fe0 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 4 Jan 2023 16:34:44 -0800 Subject: [PATCH 5/9] simplify --- packages/kit/src/exports/node/polyfills.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/kit/src/exports/node/polyfills.js b/packages/kit/src/exports/node/polyfills.js index 9c870518df61..5b3a5bef0e9b 100644 --- a/packages/kit/src/exports/node/polyfills.js +++ b/packages/kit/src/exports/node/polyfills.js @@ -17,10 +17,8 @@ const globals = { // exported for dev/preview and node environments export function installPolyfills() { - const version_string = globalThis.process?.versions?.node; - // don't polyfill on non-Node platforms like Deno - if (!version_string) { + if (!globalThis.process?.versions?.node) { return; } From 4abdb0b0db6b609835cd8b49182bce19627eca5e Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 4 Jan 2023 16:36:25 -0800 Subject: [PATCH 6/9] add todo --- packages/kit/src/exports/node/polyfills.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/kit/src/exports/node/polyfills.js b/packages/kit/src/exports/node/polyfills.js index 5b3a5bef0e9b..06e4d51aea6a 100644 --- a/packages/kit/src/exports/node/polyfills.js +++ b/packages/kit/src/exports/node/polyfills.js @@ -16,6 +16,7 @@ const globals = { }; // exported for dev/preview and node environments +// TODO: remove this once we only support Node 18.11+ (the version multipart/form-data was added) export function installPolyfills() { // don't polyfill on non-Node platforms like Deno if (!globalThis.process?.versions?.node) { From 4f1f88b25c7bc7d8519de816a665b655633ce30d Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 5 Jan 2023 10:23:51 -0800 Subject: [PATCH 7/9] blacklist and check outside polyfill function --- packages/kit/src/core/prerender/prerender.js | 7 +++++-- packages/kit/src/exports/node/polyfills.js | 5 ----- packages/kit/src/exports/vite/dev/index.js | 5 ++++- packages/kit/src/exports/vite/preview/index.js | 7 +++++-- packages/kit/src/utils/platform.js | 3 +++ packages/kit/types/internal.d.ts | 2 ++ 6 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 packages/kit/src/utils/platform.js diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index 65ece5d73de9..8c12e5cb677a 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -1,8 +1,9 @@ import { readFileSync, writeFileSync } from 'fs'; import { dirname, join } from 'path'; import { pathToFileURL, URL } from 'url'; -import { mkdirp, posixify, walk } from '../../utils/filesystem.js'; import { installPolyfills } from '../../exports/node/polyfills.js'; +import { mkdirp, posixify, walk } from '../../utils/filesystem.js'; +import { non_node_runtime } from '../../utils/platform.js'; import { is_root_relative, resolve } from '../../utils/url.js'; import { queue } from './queue.js'; import { crawl } from './crawl.js'; @@ -89,7 +90,9 @@ export async function prerender() { verbose: verbose === 'true' }); - installPolyfills(); + if (!non_node_runtime()) { + installPolyfills(); + } const server_root = join(config.outDir, 'output'); diff --git a/packages/kit/src/exports/node/polyfills.js b/packages/kit/src/exports/node/polyfills.js index 06e4d51aea6a..88805160b547 100644 --- a/packages/kit/src/exports/node/polyfills.js +++ b/packages/kit/src/exports/node/polyfills.js @@ -18,11 +18,6 @@ const globals = { // exported for dev/preview and node environments // TODO: remove this once we only support Node 18.11+ (the version multipart/form-data was added) export function installPolyfills() { - // don't polyfill on non-Node platforms like Deno - if (!globalThis.process?.versions?.node) { - return; - } - for (const name in globals) { Object.defineProperty(globalThis, name, { enumerable: true, diff --git a/packages/kit/src/exports/vite/dev/index.js b/packages/kit/src/exports/vite/dev/index.js index 545af8d1f464..8a38c3093206 100644 --- a/packages/kit/src/exports/vite/dev/index.js +++ b/packages/kit/src/exports/vite/dev/index.js @@ -8,6 +8,7 @@ import { getRequest, setResponse } from '../../../exports/node/index.js'; import { installPolyfills } from '../../../exports/node/polyfills.js'; import { coalesce_to_error } from '../../../utils/error.js'; import { posixify, resolve_entry, to_fs } from '../../../utils/filesystem.js'; +import { non_node_runtime } from '../../../utils/platform.js'; import { load_error_page, load_template } from '../../../core/config/index.js'; import { SVELTE_KIT_ASSETS } from '../../../constants.js'; import * as sync from '../../../core/sync/sync.js'; @@ -24,7 +25,9 @@ const cwd = process.cwd(); * @return {Promise void>>} */ export async function dev(vite, vite_config, svelte_config) { - installPolyfills(); + if (!non_node_runtime()) { + installPolyfills(); + } sync.init(svelte_config, vite_config.mode); diff --git a/packages/kit/src/exports/vite/preview/index.js b/packages/kit/src/exports/vite/preview/index.js index 45ac7344b018..068944602176 100644 --- a/packages/kit/src/exports/vite/preview/index.js +++ b/packages/kit/src/exports/vite/preview/index.js @@ -2,10 +2,11 @@ import fs from 'fs'; import { join } from 'path'; import sirv from 'sirv'; import { pathToFileURL } from 'url'; +import { loadEnv, normalizePath } from 'vite'; import { getRequest, setResponse } from '../../../exports/node/index.js'; import { installPolyfills } from '../../../exports/node/polyfills.js'; import { SVELTE_KIT_ASSETS } from '../../../constants.js'; -import { loadEnv, normalizePath } from 'vite'; +import { non_node_runtime } from '../../../utils/platform.js'; import { not_found } from '../utils.js'; /** @typedef {import('http').IncomingMessage} Req */ @@ -21,7 +22,9 @@ import { not_found } from '../utils.js'; * @param {import('types').ValidatedConfig} svelte_config */ export async function preview(vite, vite_config, svelte_config) { - installPolyfills(); + if (!non_node_runtime()) { + installPolyfills(); + } const { paths } = svelte_config.kit; const base = paths.base; diff --git a/packages/kit/src/utils/platform.js b/packages/kit/src/utils/platform.js new file mode 100644 index 000000000000..9a2f4fbdd211 --- /dev/null +++ b/packages/kit/src/utils/platform.js @@ -0,0 +1,3 @@ +export function non_node_runtime() { + return typeof globalThis.Deno !== 'undefined' || typeof globalThis.Bun !== 'undefined'; +} diff --git a/packages/kit/types/internal.d.ts b/packages/kit/types/internal.d.ts index f45b76390da2..4d558c88e58a 100644 --- a/packages/kit/types/internal.d.ts +++ b/packages/kit/types/internal.d.ts @@ -389,4 +389,6 @@ declare global { const __SVELTEKIT_BROWSER__: boolean; const __SVELTEKIT_DEV__: boolean; const __SVELTEKIT_EMBEDDED__: boolean; + var Bun: object; + var Deno: object; } From c03c14eebeb5a0bacaa3fd30760996e9a559fd76 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 5 Jan 2023 10:34:52 -0800 Subject: [PATCH 8/9] Update .changeset/wise-adults-pull.md --- .changeset/wise-adults-pull.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/wise-adults-pull.md b/.changeset/wise-adults-pull.md index f4769f629bfb..5bde68e010bb 100644 --- a/.changeset/wise-adults-pull.md +++ b/.changeset/wise-adults-pull.md @@ -2,4 +2,4 @@ '@sveltejs/kit': patch --- -[fix] conditionally polyfill but better to support Deno +[fix] don't polyfill undici if using Deno or Bun From c55bdca9ef346d272179becae03001458540857d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 5 Jan 2023 15:38:20 -0500 Subject: [PATCH 9/9] un-negate --- packages/kit/src/core/prerender/prerender.js | 4 ++-- packages/kit/src/exports/vite/dev/index.js | 4 ++-- packages/kit/src/exports/vite/preview/index.js | 4 ++-- packages/kit/src/utils/platform.js | 4 +--- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/kit/src/core/prerender/prerender.js b/packages/kit/src/core/prerender/prerender.js index 8c12e5cb677a..aa3e732c6835 100644 --- a/packages/kit/src/core/prerender/prerender.js +++ b/packages/kit/src/core/prerender/prerender.js @@ -3,7 +3,7 @@ import { dirname, join } from 'path'; import { pathToFileURL, URL } from 'url'; import { installPolyfills } from '../../exports/node/polyfills.js'; import { mkdirp, posixify, walk } from '../../utils/filesystem.js'; -import { non_node_runtime } from '../../utils/platform.js'; +import { should_polyfill } from '../../utils/platform.js'; import { is_root_relative, resolve } from '../../utils/url.js'; import { queue } from './queue.js'; import { crawl } from './crawl.js'; @@ -90,7 +90,7 @@ export async function prerender() { verbose: verbose === 'true' }); - if (!non_node_runtime()) { + if (should_polyfill) { installPolyfills(); } diff --git a/packages/kit/src/exports/vite/dev/index.js b/packages/kit/src/exports/vite/dev/index.js index 8a38c3093206..571db3d223b9 100644 --- a/packages/kit/src/exports/vite/dev/index.js +++ b/packages/kit/src/exports/vite/dev/index.js @@ -8,7 +8,7 @@ import { getRequest, setResponse } from '../../../exports/node/index.js'; import { installPolyfills } from '../../../exports/node/polyfills.js'; import { coalesce_to_error } from '../../../utils/error.js'; import { posixify, resolve_entry, to_fs } from '../../../utils/filesystem.js'; -import { non_node_runtime } from '../../../utils/platform.js'; +import { should_polyfill } from '../../../utils/platform.js'; import { load_error_page, load_template } from '../../../core/config/index.js'; import { SVELTE_KIT_ASSETS } from '../../../constants.js'; import * as sync from '../../../core/sync/sync.js'; @@ -25,7 +25,7 @@ const cwd = process.cwd(); * @return {Promise void>>} */ export async function dev(vite, vite_config, svelte_config) { - if (!non_node_runtime()) { + if (should_polyfill) { installPolyfills(); } diff --git a/packages/kit/src/exports/vite/preview/index.js b/packages/kit/src/exports/vite/preview/index.js index 068944602176..b62db099cc6c 100644 --- a/packages/kit/src/exports/vite/preview/index.js +++ b/packages/kit/src/exports/vite/preview/index.js @@ -6,7 +6,7 @@ import { loadEnv, normalizePath } from 'vite'; import { getRequest, setResponse } from '../../../exports/node/index.js'; import { installPolyfills } from '../../../exports/node/polyfills.js'; import { SVELTE_KIT_ASSETS } from '../../../constants.js'; -import { non_node_runtime } from '../../../utils/platform.js'; +import { should_polyfill } from '../../../utils/platform.js'; import { not_found } from '../utils.js'; /** @typedef {import('http').IncomingMessage} Req */ @@ -22,7 +22,7 @@ import { not_found } from '../utils.js'; * @param {import('types').ValidatedConfig} svelte_config */ export async function preview(vite, vite_config, svelte_config) { - if (!non_node_runtime()) { + if (should_polyfill) { installPolyfills(); } diff --git a/packages/kit/src/utils/platform.js b/packages/kit/src/utils/platform.js index 9a2f4fbdd211..e32dd5f5abce 100644 --- a/packages/kit/src/utils/platform.js +++ b/packages/kit/src/utils/platform.js @@ -1,3 +1 @@ -export function non_node_runtime() { - return typeof globalThis.Deno !== 'undefined' || typeof globalThis.Bun !== 'undefined'; -} +export const should_polyfill = typeof Deno === 'undefined' && typeof Bun === 'undefined';