diff --git a/.changeset/six-goats-ring.md b/.changeset/six-goats-ring.md new file mode 100644 index 000000000000..b18993387de4 --- /dev/null +++ b/.changeset/six-goats-ring.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': patch +--- + +fix: prevent vitest from hanging diff --git a/packages/adapter-cloudflare-workers/index.js b/packages/adapter-cloudflare-workers/index.js index 8a4f9252d1ac..9c842a7dddbe 100644 --- a/packages/adapter-cloudflare-workers/index.js +++ b/packages/adapter-cloudflare-workers/index.js @@ -149,29 +149,35 @@ export default function ({ config = 'wrangler.toml', platformProxy = {} } = {}) builder.writePrerendered(bucket_dir); }, - async emulate() { - const proxy = await getPlatformProxy(platformProxy); - const platform = /** @type {App.Platform} */ ({ - env: proxy.env, - context: proxy.ctx, - caches: proxy.caches, - cf: proxy.cf - }); + emulate() { + // we want to invoke `getPlatformProxy` only once, but await it only when it is accessed. + // If we would await it here, it would hang indefinitely because the platform proxy only resolves once a request happens + const getting_platform = (async () => { + const proxy = await getPlatformProxy(platformProxy); + const platform = /** @type {App.Platform} */ ({ + env: proxy.env, + context: proxy.ctx, + caches: proxy.caches, + cf: proxy.cf + }); - /** @type {Record} */ - const env = {}; - const prerender_platform = /** @type {App.Platform} */ (/** @type {unknown} */ ({ env })); + /** @type {Record} */ + const env = {}; + const prerender_platform = /** @type {App.Platform} */ (/** @type {unknown} */ ({ env })); - for (const key in proxy.env) { - Object.defineProperty(env, key, { - get: () => { - throw new Error(`Cannot access platform.env.${key} in a prerenderable route`); - } - }); - } + for (const key in proxy.env) { + Object.defineProperty(env, key, { + get: () => { + throw new Error(`Cannot access platform.env.${key} in a prerenderable route`); + } + }); + } + return { platform, prerender_platform }; + })(); return { - platform: ({ prerender }) => { + platform: async ({ prerender }) => { + const { platform, prerender_platform } = await getting_platform; return prerender ? prerender_platform : platform; } }; diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index 0fe55898e569..cd2c62986cd8 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -144,29 +144,35 @@ export default function (options = {}) { ); } }, - async emulate() { - const proxy = await getPlatformProxy(options.platformProxy); - const platform = /** @type {App.Platform} */ ({ - env: proxy.env, - context: proxy.ctx, - caches: proxy.caches, - cf: proxy.cf - }); + emulate() { + // we want to invoke `getPlatformProxy` only once, but await it only when it is accessed. + // If we would await it here, it would hang indefinitely because the platform proxy only resolves once a request happens + const getting_platform = (async () => { + const proxy = await getPlatformProxy(options.platformProxy); + const platform = /** @type {App.Platform} */ ({ + env: proxy.env, + context: proxy.ctx, + caches: proxy.caches, + cf: proxy.cf + }); - /** @type {Record} */ - const env = {}; - const prerender_platform = /** @type {App.Platform} */ (/** @type {unknown} */ ({ env })); + /** @type {Record} */ + const env = {}; + const prerender_platform = /** @type {App.Platform} */ (/** @type {unknown} */ ({ env })); - for (const key in proxy.env) { - Object.defineProperty(env, key, { - get: () => { - throw new Error(`Cannot access platform.env.${key} in a prerenderable route`); - } - }); - } + for (const key in proxy.env) { + Object.defineProperty(env, key, { + get: () => { + throw new Error(`Cannot access platform.env.${key} in a prerenderable route`); + } + }); + } + return { platform, prerender_platform }; + })(); return { - platform: ({ prerender }) => { + platform: async ({ prerender }) => { + const { platform, prerender_platform } = await getting_platform; return prerender ? prerender_platform : platform; } };