From e27b2d633b80c37c010d7445e672ee2d36fef37e Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Tue, 10 Jun 2025 12:32:20 +0800 Subject: [PATCH 1/3] add test and fix --- packages/kit/src/runtime/app/forms.js | 6 +++--- .../options-2/src/routes/deserialize/+page.svelte | 5 +++++ .../options-2/src/routes/deserialize/+page.ts | 15 +++++++++++++++ packages/kit/test/apps/options-2/test/test.js | 8 +++++++- 4 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 packages/kit/test/apps/options-2/src/routes/deserialize/+page.svelte create mode 100644 packages/kit/test/apps/options-2/src/routes/deserialize/+page.ts diff --git a/packages/kit/src/runtime/app/forms.js b/packages/kit/src/runtime/app/forms.js index d9bbd573990e..f4d0a352f628 100644 --- a/packages/kit/src/runtime/app/forms.js +++ b/packages/kit/src/runtime/app/forms.js @@ -6,8 +6,6 @@ import { app as server_app } from '../server/app.js'; export { applyAction }; -const decoders = BROWSER ? client_app.decoders : server_app?.decoders; - /** * Use this function to deserialize the response from a form submission. * Usage: @@ -34,7 +32,9 @@ export function deserialize(result) { const parsed = JSON.parse(result); if (parsed.data) { - parsed.data = devalue.parse(parsed.data, decoders); + // the decoders should never be initialised at the top-level because `app` + // will not initialised yet if `kit.output.bundleStrategy` is 'single' or 'inline' + parsed.data = devalue.parse(parsed.data, BROWSER ? client_app.decoders : server_app.decoders); } return parsed; diff --git a/packages/kit/test/apps/options-2/src/routes/deserialize/+page.svelte b/packages/kit/test/apps/options-2/src/routes/deserialize/+page.svelte new file mode 100644 index 000000000000..a35e3cf30df1 --- /dev/null +++ b/packages/kit/test/apps/options-2/src/routes/deserialize/+page.svelte @@ -0,0 +1,5 @@ + + +

{data.data.text}

diff --git a/packages/kit/test/apps/options-2/src/routes/deserialize/+page.ts b/packages/kit/test/apps/options-2/src/routes/deserialize/+page.ts new file mode 100644 index 000000000000..f0a4017994c9 --- /dev/null +++ b/packages/kit/test/apps/options-2/src/routes/deserialize/+page.ts @@ -0,0 +1,15 @@ +import { deserialize } from '$app/forms'; + +export const ssr = false; + +export function load() { + const result = deserialize( + JSON.stringify({ + type: 'success', + status: 200, + data: '[{"text":1},"Hello world!"]' + }) + ); + + return result; +} diff --git a/packages/kit/test/apps/options-2/test/test.js b/packages/kit/test/apps/options-2/test/test.js index ba5f10003284..b7fb132aa510 100644 --- a/packages/kit/test/apps/options-2/test/test.js +++ b/packages/kit/test/apps/options-2/test/test.js @@ -108,7 +108,7 @@ test.describe('Service worker', () => { }); expect(self.base).toBe('/basepath'); - expect(self.build[0]).toMatch(/\/basepath\/_app\/immutable\/bundle\.[\w-]+\.js/); + expect(self.build?.[0]).toMatch(/\/basepath\/_app\/immutable\/bundle\.[\w-]+\.js/); expect(self.image_src).toMatch(/\/basepath\/_app\/immutable\/assets\/image\.[\w-]+\.jpg/); }); @@ -120,6 +120,7 @@ test.describe('Service worker', () => { test.describe("bundleStrategy: 'single'", () => { test.skip(({ javaScriptEnabled }) => !javaScriptEnabled || !!process.env.DEV); + test('loads a single js file and a single css file', async ({ page }) => { /** @type {string[]} */ const requests = []; @@ -135,4 +136,9 @@ test.describe("bundleStrategy: 'single'", () => { expect(requests.filter((req) => req.endsWith('.js')).length).toBe(1); expect(requests.filter((req) => req.endsWith('.css')).length).toBe(1); }); + + test('app.decoders is accessed only after app has been initialised', async ({ page }) => { + await page.goto('/basepath/deserialize'); + await expect(page.locator('p')).toHaveText('Hello world!'); + }); }); From e57ba99b3bc9631af534b1c5dbae1bc225f504a9 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Tue, 10 Jun 2025 12:33:06 +0800 Subject: [PATCH 2/3] changeset --- .changeset/stupid-singers-talk.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/stupid-singers-talk.md diff --git a/.changeset/stupid-singers-talk.md b/.changeset/stupid-singers-talk.md new file mode 100644 index 000000000000..2d1dfb99c375 --- /dev/null +++ b/.changeset/stupid-singers-talk.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly access transport decoders on the client when building for a single or inline output app From f10be15249ba561455ea92ecab0cd501366378da Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Tue, 10 Jun 2025 12:41:27 +0800 Subject: [PATCH 3/3] format --- .../kit/test/apps/options-2/src/routes/deserialize/+page.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/test/apps/options-2/src/routes/deserialize/+page.ts b/packages/kit/test/apps/options-2/src/routes/deserialize/+page.ts index f0a4017994c9..b3e20666383e 100644 --- a/packages/kit/test/apps/options-2/src/routes/deserialize/+page.ts +++ b/packages/kit/test/apps/options-2/src/routes/deserialize/+page.ts @@ -11,5 +11,5 @@ export function load() { }) ); - return result; + return result; }