From 4a18b2008e39d7a9f7f2e2500ddc1cb1e5ff7312 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Tue, 5 Aug 2025 15:46:24 +0800 Subject: [PATCH 1/7] add tests --- .../options/source/pages/remote/+page.svelte | 28 ++++++++++++++ .../source/pages/remote/count.remote.js | 27 ++++++++++++++ .../kit/test/apps/options/svelte.config.js | 3 ++ packages/kit/test/apps/options/test/test.js | 37 +++++++++++++++++++ 4 files changed, 95 insertions(+) create mode 100644 packages/kit/test/apps/options/source/pages/remote/+page.svelte create mode 100644 packages/kit/test/apps/options/source/pages/remote/count.remote.js diff --git a/packages/kit/test/apps/options/source/pages/remote/+page.svelte b/packages/kit/test/apps/options/source/pages/remote/+page.svelte new file mode 100644 index 000000000000..88ce6ecd4ec4 --- /dev/null +++ b/packages/kit/test/apps/options/source/pages/remote/+page.svelte @@ -0,0 +1,28 @@ + + +

{count}

+ + + + + +
{ + await submit().updates(get_count()); + count = await get_count(); + })} +> + + +
+ + + +

{prerendered_result}

diff --git a/packages/kit/test/apps/options/source/pages/remote/count.remote.js b/packages/kit/test/apps/options/source/pages/remote/count.remote.js new file mode 100644 index 000000000000..fc93f18dd9c2 --- /dev/null +++ b/packages/kit/test/apps/options/source/pages/remote/count.remote.js @@ -0,0 +1,27 @@ +import { building, dev } from '$app/environment'; +import { command, form, prerender, query } from '$app/server'; + +let count = 0; + +export const get_count = query(() => count); + +export const set_count = command( + 'unchecked', + /** @param {number} c */ + async (c) => { + return (count = c); + } +); + +export const prerendered = prerender(() => { + if (!building && !dev) { + throw new Error('this prerender should not be called at runtime in production'); + } + + return 'yes'; +}); + +export const set_count_form = form(async (form_data) => { + const c = /** @type {string} */ (form_data.get('count')); + return (count = parseInt(c)); +}); diff --git a/packages/kit/test/apps/options/svelte.config.js b/packages/kit/test/apps/options/svelte.config.js index 3c10a2826669..9c71242508b5 100644 --- a/packages/kit/test/apps/options/svelte.config.js +++ b/packages/kit/test/apps/options/svelte.config.js @@ -40,6 +40,9 @@ const config = { }, router: { resolution: /** @type {'client' | 'server'} */ (process.env.ROUTER_RESOLUTION) || 'client' + }, + experimental: { + remoteFunctions: true } } }; diff --git a/packages/kit/test/apps/options/test/test.js b/packages/kit/test/apps/options/test/test.js index 82a30b34f159..d2d34a423e3f 100644 --- a/packages/kit/test/apps/options/test/test.js +++ b/packages/kit/test/apps/options/test/test.js @@ -100,6 +100,43 @@ test.describe('base path', () => { expect(page.url()).toBe(`${baseURL}/path-base/resolve-route/resolved/`); expect(await page.textContent('h2')).toBe('resolved'); }); + + test('query remote function from client uses base path', async ({ page, javaScriptEnabled }) => { + test.skip(!javaScriptEnabled); + + await page.goto('/path-base/remote'); + await expect(page.locator('#count')).toHaveText(''); + await page.locator('button', { hasText: 'get count' }).click(); + await expect(page.locator('#count')).toHaveText('0'); + }); + + test('prerender remote function from client uses base path', async ({ page, javaScriptEnabled }) => { + test.skip(!javaScriptEnabled); + + await page.goto('/path-base/remote'); + await expect(page.locator('#prerendered')).toHaveText(''); + await page.locator('button', { hasText: 'get prerendered' }).click(); + await expect(page.locator('#prerendered')).toHaveText('yes'); + }); + + test('command remote function from client uses base path', async ({ page, javaScriptEnabled }) => { + test.skip(!javaScriptEnabled); + + await page.goto('/path-base/remote'); + await expect(page.locator('#count')).toHaveText(''); + await page.locator('button', { hasText: 'set count' }).click(); + await expect(page.locator('#count')).toHaveText('0'); + }); + + test('form remote function from client uses base path', async ({ page, javaScriptEnabled }) => { + test.skip(!javaScriptEnabled); + + await page.goto('/path-base/remote'); + await expect(page.locator('#count')).toHaveText(''); + await page.locator('input').fill('1'); + await page.locator('button', { hasText: 'submit' }).click(); + await expect(page.locator('#count')).toHaveText('1'); + }); }); test.describe('assets path', () => { From 55ca691e98a2cb78fc4705f5ac54a5cb74d1219a Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Tue, 5 Aug 2025 15:48:15 +0800 Subject: [PATCH 2/7] fix test --- packages/kit/test/apps/options/source/pages/remote/+page.svelte | 2 +- packages/kit/test/apps/options/test/test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kit/test/apps/options/source/pages/remote/+page.svelte b/packages/kit/test/apps/options/source/pages/remote/+page.svelte index 88ce6ecd4ec4..a7d595d09cde 100644 --- a/packages/kit/test/apps/options/source/pages/remote/+page.svelte +++ b/packages/kit/test/apps/options/source/pages/remote/+page.svelte @@ -25,4 +25,4 @@ get prerendered -

{prerendered_result}

+

{prerendered_result}

diff --git a/packages/kit/test/apps/options/test/test.js b/packages/kit/test/apps/options/test/test.js index d2d34a423e3f..d1eae633ba12 100644 --- a/packages/kit/test/apps/options/test/test.js +++ b/packages/kit/test/apps/options/test/test.js @@ -124,7 +124,7 @@ test.describe('base path', () => { await page.goto('/path-base/remote'); await expect(page.locator('#count')).toHaveText(''); - await page.locator('button', { hasText: 'set count' }).click(); + await page.locator('button', { hasText: 'reset' }).click(); await expect(page.locator('#count')).toHaveText('0'); }); From e6b70d3d96fa217b915107a94c5a55061e17e635 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Tue, 5 Aug 2025 15:48:25 +0800 Subject: [PATCH 3/7] add base path to client remote functions --- packages/kit/src/runtime/client/remote-functions/command.js | 4 ++-- .../kit/src/runtime/client/remote-functions/form.svelte.js | 4 ++-- .../src/runtime/client/remote-functions/prerender.svelte.js | 4 ++-- .../kit/src/runtime/client/remote-functions/query.svelte.js | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/kit/src/runtime/client/remote-functions/command.js b/packages/kit/src/runtime/client/remote-functions/command.js index d9351a289f72..4218228f3051 100644 --- a/packages/kit/src/runtime/client/remote-functions/command.js +++ b/packages/kit/src/runtime/client/remote-functions/command.js @@ -1,7 +1,7 @@ /** @import { RemoteCommand, RemoteQueryOverride } from '@sveltejs/kit' */ /** @import { RemoteFunctionResponse } from 'types' */ /** @import { Query } from './query.svelte.js' */ -import { app_dir } from '__sveltekit/paths'; +import { app_dir, base } from '__sveltekit/paths'; import * as devalue from 'devalue'; import { HttpError } from '@sveltejs/kit/internal'; import { app } from '../client.js'; @@ -25,7 +25,7 @@ export function command(id) { // Wait a tick to give room for the `updates` method to be called await Promise.resolve(); - const response = await fetch(`/${app_dir}/remote/${id}`, { + const response = await fetch(`${base}/${app_dir}/remote/${id}`, { method: 'POST', body: JSON.stringify({ payload: stringify_remote_arg(arg, app.hooks.transport), diff --git a/packages/kit/src/runtime/client/remote-functions/form.svelte.js b/packages/kit/src/runtime/client/remote-functions/form.svelte.js index 67b62e226b91..0dd004d4dedf 100644 --- a/packages/kit/src/runtime/client/remote-functions/form.svelte.js +++ b/packages/kit/src/runtime/client/remote-functions/form.svelte.js @@ -1,7 +1,7 @@ /** @import { RemoteForm, RemoteQueryOverride } from '@sveltejs/kit' */ /** @import { RemoteFunctionResponse } from 'types' */ /** @import { Query } from './query.svelte.js' */ -import { app_dir } from '__sveltekit/paths'; +import { app_dir, base } from '__sveltekit/paths'; import * as devalue from 'devalue'; import { DEV } from 'esm-env'; import { HttpError } from '@sveltejs/kit/internal'; @@ -64,7 +64,7 @@ export function form(id) { data.set('sveltekit:remote_refreshes', JSON.stringify(updates.map((u) => u._key))); } - const response = await fetch(`/${app_dir}/remote/${action_id}`, { + const response = await fetch(`${base}/${app_dir}/remote/${action_id}`, { method: 'POST', body: data }); diff --git a/packages/kit/src/runtime/client/remote-functions/prerender.svelte.js b/packages/kit/src/runtime/client/remote-functions/prerender.svelte.js index 2158d29afec4..7a919f899da3 100644 --- a/packages/kit/src/runtime/client/remote-functions/prerender.svelte.js +++ b/packages/kit/src/runtime/client/remote-functions/prerender.svelte.js @@ -1,5 +1,5 @@ /** @import { RemoteFunctionResponse } from 'types' */ -import { app_dir } from '__sveltekit/paths'; +import { app_dir, base } from '__sveltekit/paths'; import { version } from '__sveltekit/environment'; import * as devalue from 'devalue'; import { DEV } from 'esm-env'; @@ -124,7 +124,7 @@ export function prerender(id) { } } - const url = `/${app_dir}/remote/${id}${payload ? `/${payload}` : ''}`; + const url = `${base}/${app_dir}/remote/${id}${payload ? `/${payload}` : ''}`; // Check the Cache API first if (prerender_cache) { diff --git a/packages/kit/src/runtime/client/remote-functions/query.svelte.js b/packages/kit/src/runtime/client/remote-functions/query.svelte.js index edab579bb407..a6243bc85a1b 100644 --- a/packages/kit/src/runtime/client/remote-functions/query.svelte.js +++ b/packages/kit/src/runtime/client/remote-functions/query.svelte.js @@ -1,5 +1,5 @@ /** @import { RemoteQueryFunction } from '@sveltejs/kit' */ -import { app_dir } from '__sveltekit/paths'; +import { app_dir, base } from '__sveltekit/paths'; import { remote_responses, started } from '../client.js'; import { tick } from 'svelte'; import { create_remote_function, remote_request } from './shared.svelte.js'; @@ -18,7 +18,7 @@ export function query(id) { } } - const url = `/${app_dir}/remote/${id}${payload ? `?payload=${payload}` : ''}`; + const url = `${base}/${app_dir}/remote/${id}${payload ? `?payload=${payload}` : ''}`; return await remote_request(url); }); From 839eaaf4dd4d9094fbe42070ea6a61f312294818 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Tue, 5 Aug 2025 15:48:58 +0800 Subject: [PATCH 4/7] changeset --- .changeset/dry-owls-open.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/dry-owls-open.md diff --git a/.changeset/dry-owls-open.md b/.changeset/dry-owls-open.md new file mode 100644 index 000000000000..cd4d1e106be7 --- /dev/null +++ b/.changeset/dry-owls-open.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: use the configured base path when calling remote functions from the client From a3f271fc45b29f7ce5f6c356f0257810b04a1a79 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Tue, 5 Aug 2025 15:52:39 +0800 Subject: [PATCH 5/7] format --- packages/kit/test/apps/options/test/test.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/kit/test/apps/options/test/test.js b/packages/kit/test/apps/options/test/test.js index d1eae633ba12..ef1231b18914 100644 --- a/packages/kit/test/apps/options/test/test.js +++ b/packages/kit/test/apps/options/test/test.js @@ -110,7 +110,10 @@ test.describe('base path', () => { await expect(page.locator('#count')).toHaveText('0'); }); - test('prerender remote function from client uses base path', async ({ page, javaScriptEnabled }) => { + test('prerender remote function from client uses base path', async ({ + page, + javaScriptEnabled + }) => { test.skip(!javaScriptEnabled); await page.goto('/path-base/remote'); @@ -119,7 +122,10 @@ test.describe('base path', () => { await expect(page.locator('#prerendered')).toHaveText('yes'); }); - test('command remote function from client uses base path', async ({ page, javaScriptEnabled }) => { + test('command remote function from client uses base path', async ({ + page, + javaScriptEnabled + }) => { test.skip(!javaScriptEnabled); await page.goto('/path-base/remote'); From 282aa86c28717df1cde31852a204860b60336fa8 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Wed, 6 Aug 2025 14:04:57 +0800 Subject: [PATCH 6/7] move tests to options-2 test app --- .../src/routes}/remote/+page.svelte | 0 .../src/routes}/remote/count.remote.js | 0 .../kit/test/apps/options-2/svelte.config.js | 3 ++ packages/kit/test/apps/options-2/test/test.js | 43 +++++++++++++++++++ .../kit/test/apps/options/svelte.config.js | 3 -- packages/kit/test/apps/options/test/test.js | 43 ------------------- 6 files changed, 46 insertions(+), 46 deletions(-) rename packages/kit/test/apps/{options/source/pages => options-2/src/routes}/remote/+page.svelte (100%) rename packages/kit/test/apps/{options/source/pages => options-2/src/routes}/remote/count.remote.js (100%) diff --git a/packages/kit/test/apps/options/source/pages/remote/+page.svelte b/packages/kit/test/apps/options-2/src/routes/remote/+page.svelte similarity index 100% rename from packages/kit/test/apps/options/source/pages/remote/+page.svelte rename to packages/kit/test/apps/options-2/src/routes/remote/+page.svelte diff --git a/packages/kit/test/apps/options/source/pages/remote/count.remote.js b/packages/kit/test/apps/options-2/src/routes/remote/count.remote.js similarity index 100% rename from packages/kit/test/apps/options/source/pages/remote/count.remote.js rename to packages/kit/test/apps/options-2/src/routes/remote/count.remote.js diff --git a/packages/kit/test/apps/options-2/svelte.config.js b/packages/kit/test/apps/options-2/svelte.config.js index dd4414575a39..1fee777858a0 100644 --- a/packages/kit/test/apps/options-2/svelte.config.js +++ b/packages/kit/test/apps/options-2/svelte.config.js @@ -13,6 +13,9 @@ const config = { }, output: { bundleStrategy: 'single' + }, + experimental: { + remoteFunctions: true } } }; diff --git a/packages/kit/test/apps/options-2/test/test.js b/packages/kit/test/apps/options-2/test/test.js index b7fb132aa510..77f4016a967b 100644 --- a/packages/kit/test/apps/options-2/test/test.js +++ b/packages/kit/test/apps/options-2/test/test.js @@ -55,6 +55,49 @@ test.describe('paths', () => { await clicknav('[data-testid="link"]'); expect(new URL(page.url()).pathname).toBe('/basepath/hello'); }); + + test('query remote function from client accounts for base path', async ({ page, javaScriptEnabled }) => { + test.skip(!javaScriptEnabled); + + await page.goto('/basepath/remote'); + await expect(page.locator('#count')).toHaveText(''); + await page.locator('button', { hasText: 'get count' }).click(); + await expect(page.locator('#count')).toHaveText('0'); + }); + + test('prerender remote function from client accounts for base path', async ({ + page, + javaScriptEnabled + }) => { + test.skip(!javaScriptEnabled); + + await page.goto('/basepath/remote'); + await expect(page.locator('#prerendered')).toHaveText(''); + await page.locator('button', { hasText: 'get prerendered' }).click(); + await expect(page.locator('#prerendered')).toHaveText('yes'); + }); + + test('command remote function from client accounts for base path', async ({ + page, + javaScriptEnabled + }) => { + test.skip(!javaScriptEnabled); + + await page.goto('/basepath/remote'); + await expect(page.locator('#count')).toHaveText(''); + await page.locator('button', { hasText: 'reset' }).click(); + await expect(page.locator('#count')).toHaveText('0'); + }); + + test('form remote function from client accounts for base path', async ({ page, javaScriptEnabled }) => { + test.skip(!javaScriptEnabled); + + await page.goto('/basepath/remote'); + await expect(page.locator('#count')).toHaveText(''); + await page.locator('input').fill('1'); + await page.locator('button', { hasText: 'submit' }).click(); + await expect(page.locator('#count')).toHaveText('1'); + }); }); test.describe('trailing slash', () => { diff --git a/packages/kit/test/apps/options/svelte.config.js b/packages/kit/test/apps/options/svelte.config.js index 9c71242508b5..3c10a2826669 100644 --- a/packages/kit/test/apps/options/svelte.config.js +++ b/packages/kit/test/apps/options/svelte.config.js @@ -40,9 +40,6 @@ const config = { }, router: { resolution: /** @type {'client' | 'server'} */ (process.env.ROUTER_RESOLUTION) || 'client' - }, - experimental: { - remoteFunctions: true } } }; diff --git a/packages/kit/test/apps/options/test/test.js b/packages/kit/test/apps/options/test/test.js index ef1231b18914..82a30b34f159 100644 --- a/packages/kit/test/apps/options/test/test.js +++ b/packages/kit/test/apps/options/test/test.js @@ -100,49 +100,6 @@ test.describe('base path', () => { expect(page.url()).toBe(`${baseURL}/path-base/resolve-route/resolved/`); expect(await page.textContent('h2')).toBe('resolved'); }); - - test('query remote function from client uses base path', async ({ page, javaScriptEnabled }) => { - test.skip(!javaScriptEnabled); - - await page.goto('/path-base/remote'); - await expect(page.locator('#count')).toHaveText(''); - await page.locator('button', { hasText: 'get count' }).click(); - await expect(page.locator('#count')).toHaveText('0'); - }); - - test('prerender remote function from client uses base path', async ({ - page, - javaScriptEnabled - }) => { - test.skip(!javaScriptEnabled); - - await page.goto('/path-base/remote'); - await expect(page.locator('#prerendered')).toHaveText(''); - await page.locator('button', { hasText: 'get prerendered' }).click(); - await expect(page.locator('#prerendered')).toHaveText('yes'); - }); - - test('command remote function from client uses base path', async ({ - page, - javaScriptEnabled - }) => { - test.skip(!javaScriptEnabled); - - await page.goto('/path-base/remote'); - await expect(page.locator('#count')).toHaveText(''); - await page.locator('button', { hasText: 'reset' }).click(); - await expect(page.locator('#count')).toHaveText('0'); - }); - - test('form remote function from client uses base path', async ({ page, javaScriptEnabled }) => { - test.skip(!javaScriptEnabled); - - await page.goto('/path-base/remote'); - await expect(page.locator('#count')).toHaveText(''); - await page.locator('input').fill('1'); - await page.locator('button', { hasText: 'submit' }).click(); - await expect(page.locator('#count')).toHaveText('1'); - }); }); test.describe('assets path', () => { From 49de9f4da3ce4b3d2eb2d731b2ad23ad1c7e954c Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Wed, 6 Aug 2025 14:27:16 +0800 Subject: [PATCH 7/7] prettier --- packages/kit/test/apps/options-2/test/test.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/kit/test/apps/options-2/test/test.js b/packages/kit/test/apps/options-2/test/test.js index 77f4016a967b..4af842e6f7ee 100644 --- a/packages/kit/test/apps/options-2/test/test.js +++ b/packages/kit/test/apps/options-2/test/test.js @@ -56,7 +56,10 @@ test.describe('paths', () => { expect(new URL(page.url()).pathname).toBe('/basepath/hello'); }); - test('query remote function from client accounts for base path', async ({ page, javaScriptEnabled }) => { + test('query remote function from client accounts for base path', async ({ + page, + javaScriptEnabled + }) => { test.skip(!javaScriptEnabled); await page.goto('/basepath/remote'); @@ -89,7 +92,10 @@ test.describe('paths', () => { await expect(page.locator('#count')).toHaveText('0'); }); - test('form remote function from client accounts for base path', async ({ page, javaScriptEnabled }) => { + test('form remote function from client accounts for base path', async ({ + page, + javaScriptEnabled + }) => { test.skip(!javaScriptEnabled); await page.goto('/basepath/remote');