diff --git a/packages/kit/src/runtime/server/page/index.js b/packages/kit/src/runtime/server/page/index.js index edaa42016967..49ddf6d727e2 100644 --- a/packages/kit/src/runtime/server/page/index.js +++ b/packages/kit/src/runtime/server/page/index.js @@ -66,7 +66,9 @@ export async function render_page(event, route, options, state, resolve_opts) { // for non-GET requests, first call handler in +page.server.js // (this also determines status code) try { - const method = /** @type {'POST' | 'PATCH' | 'PUT' | 'DELETE'} */ (event.request.method); + const method = /** @type {'POST' | 'PATCH' | 'PUT' | 'DELETE' | 'OPTIONS'} */ ( + event.request.method + ); const handler = leaf_node.server[method]; if (handler) { const result = await handler.call(null, event); diff --git a/packages/kit/test/apps/basics/src/routes/endpoint-output/options/+server.js b/packages/kit/test/apps/basics/src/routes/endpoint-output/options/+server.js new file mode 100644 index 000000000000..3147607d2897 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/endpoint-output/options/+server.js @@ -0,0 +1,6 @@ +import { json } from '@sveltejs/kit'; + +/** @type {import('@sveltejs/kit').RequestHandler} */ +export function OPTIONS() { + return json({}); +} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/simple/options/+page.server.js b/packages/kit/test/apps/basics/src/routes/shadowed/simple/options/+page.server.js new file mode 100644 index 000000000000..e788221971a2 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/simple/options/+page.server.js @@ -0,0 +1,2 @@ +/** @type {import('./$types').Action} */ +export function OPTIONS() {} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/simple/options/+page.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/simple/options/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index 45615bcb5630..3d36dfdfd390 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -49,6 +49,17 @@ test.describe('Endpoints', () => { expect(headers.head).toEqual(headers.get); }); + test('OPTIONS request', async ({ request }) => { + const url = '/endpoint-output/options'; + + var response = await request.fetch(url, { + method: 'OPTIONS' + }); + + expect(response.status()).toBe(200); + expect(response.text()).toBe('{}'); + }); + // TODO all the remaining tests in this section are really only testing // setResponse, since we're not otherwise changing anything on the response. // might be worth making these unit tests instead diff --git a/packages/kit/types/internal.d.ts b/packages/kit/types/internal.d.ts index 4f386bab0c22..a3c75bbc99fc 100644 --- a/packages/kit/types/internal.d.ts +++ b/packages/kit/types/internal.d.ts @@ -220,6 +220,7 @@ export interface SSRNode { PATCH?: Action; PUT?: Action; DELETE?: Action; + OPTIONS?: Action; }; }