diff --git a/CHANGES.md b/CHANGES.md index 9a7d04c95..58c89899e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -116,6 +116,11 @@ To be released. - Created SvelteKit integration as the *@fedify/sveltekit* package. Separated from `@fedify/fedify/x/sveltekit` to improve modularity and reduce bundle size. [[#375] by Chanhaeng Lee] + - Fixed SvelteKit integration hook types to correctly infer the request + and response types in hooks. [[#271], [#394] by Chanhaeng Lee] + +[#271]: https://github.com/fedify-dev/fedify/pull/271 +[#394]: https://github.com/fedify-dev/fedify/pull/394 Version 1.8.8 diff --git a/packages/sveltekit/deno.json b/packages/sveltekit/deno.json index d5efedee6..0830a7103 100644 --- a/packages/sveltekit/deno.json +++ b/packages/sveltekit/deno.json @@ -3,15 +3,13 @@ "version": "1.9.0", "license": "MIT", "imports": { - "@std/assert": "jsr:@std/assert@^1.0.13" + "@std/assert": "jsr:@std/assert@^1.0.13", + "@sveltejs/kit": "npm:@sveltejs/kit@^2.0.0" }, "exports": { ".": "./src/mod.ts" }, - "exclude": [ - "dist", - "node_modules" - ], + "exclude": ["dist", "node_modules"], "tasks": { "check": "deno fmt --check && deno lint && deno check src/*.ts", "test": "deno test --allow-net --allow-env" diff --git a/packages/sveltekit/src/mod.test.ts b/packages/sveltekit/src/mod.test.ts index 042237490..71fd62fb2 100644 --- a/packages/sveltekit/src/mod.test.ts +++ b/packages/sveltekit/src/mod.test.ts @@ -1,29 +1,19 @@ import { strictEqual } from "node:assert/strict"; import { describe, test } from "node:test"; import { fedifyHook } from "./mod.ts"; +import type { RequestEvent } from "@sveltejs/kit"; -interface MockRequestEvent { - request: Request; -} - -interface MockHookParams { - event: MockRequestEvent; - resolve: (event: MockRequestEvent) => Promise; -} - -interface MockFederation { +interface MockFederation { fetch(request: Request, options: unknown): Promise; } describe("fedifyHook", () => { test("creates hook handler function", () => { - const mockFederation: MockFederation = { + const mockFederation = { fetch: () => Promise.resolve(new Response("OK")), }; - const createContextData = () => undefined; - - const hookHandler = fedifyHook(mockFederation as never, createContextData); + const hookHandler = fedifyHook(mockFederation as never); strictEqual(typeof hookHandler, "function"); }); @@ -31,7 +21,7 @@ describe("fedifyHook", () => { let capturedRequest: Request | undefined; let capturedOptions: unknown; - const mockFederation: MockFederation = { + const mockFederation: MockFederation = { fetch: (request, options) => { capturedRequest = request; capturedOptions = options; @@ -44,7 +34,7 @@ describe("fedifyHook", () => { const hookHandler = fedifyHook(mockFederation as never, createContextData); const mockRequest = new Request("https://example.com/test"); - const mockEvent: MockRequestEvent = { request: mockRequest }; + const mockEvent: RequestEvent = { request: mockRequest } as RequestEvent; const mockResolve = () => Promise.resolve(new Response("SvelteKit response")); @@ -64,7 +54,7 @@ describe("fedifyHook", () => { test("handles async context data creation", async () => { let capturedContextData: unknown; - const mockFederation: MockFederation = { + const mockFederation: MockFederation = { fetch: (_request, options) => { capturedContextData = (options as { contextData: string }).contextData; return Promise.resolve(new Response("OK")); @@ -79,7 +69,7 @@ describe("fedifyHook", () => { const hookHandler = fedifyHook(mockFederation as never, createContextData); const mockRequest = new Request("https://example.com/test"); - const mockEvent: MockRequestEvent = { request: mockRequest }; + const mockEvent: RequestEvent = { request: mockRequest } as RequestEvent; const mockResolve = () => Promise.resolve(new Response("SvelteKit response")); diff --git a/packages/sveltekit/src/mod.ts b/packages/sveltekit/src/mod.ts index 05c6ea123..b8bc3ad1e 100644 --- a/packages/sveltekit/src/mod.ts +++ b/packages/sveltekit/src/mod.ts @@ -14,15 +14,7 @@ import type { Federation, FederationFetchOptions, } from "@fedify/fedify/federation"; - -type RequestEvent = { - request: Request; -}; - -type HookParams = { - event: RequestEvent; - resolve: (event: RequestEvent) => Promise; -}; +import type { Handle, RequestEvent } from "@sveltejs/kit"; /** * Create a SvelteKit hook handler to integrate with the {@link Federation} @@ -32,7 +24,7 @@ type HookParams = { * ``` typescript * import { federation } from "./federation"; // Import the `Federation` object * - * export const handle = fedifyHook(federation, () => undefined); + * export const handle = fedifyHook(federation); * ``` * * @template TContextData A type of the context data for the {@link Federation} @@ -47,9 +39,9 @@ export function fedifyHook( federation: Federation, createContextData: ( event: RequestEvent, - ) => TContextData | Promise, -): (params: HookParams) => Promise { - return async ({ event, resolve }: HookParams) => { + ) => TContextData | Promise = () => undefined as TContextData, +): Handle { + return async ({ event, resolve }) => { return await federation.fetch(event.request, { contextData: await createContextData(event), ...integrateFetchOptions({ event, resolve }), @@ -58,7 +50,7 @@ export function fedifyHook( } function integrateFetchOptions( - { event, resolve }: HookParams, + { event, resolve }: Parameters[0], ): Omit, "contextData"> { return { async onNotFound(): Promise {