diff --git a/.changeset/tricky-rockets-agree.md b/.changeset/tricky-rockets-agree.md new file mode 100644 index 000000000000..583a23f68b7b --- /dev/null +++ b/.changeset/tricky-rockets-agree.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Make it possible to type context, page params and props for LoadInput and LoadOutput diff --git a/packages/kit/types/endpoint.d.ts b/packages/kit/types/endpoint.d.ts index 91ab6296a0f5..7eca51a34faf 100644 --- a/packages/kit/types/endpoint.d.ts +++ b/packages/kit/types/endpoint.d.ts @@ -1,5 +1,5 @@ import { ServerRequest } from './hooks'; -import { Headers } from './helper'; +import { Headers, MaybePromise } from './helper'; type JSONValue = | string @@ -18,4 +18,4 @@ export type EndpointOutput = { export type RequestHandler, Body = unknown> = ( request: ServerRequest -) => void | EndpointOutput | Promise; +) => void | MaybePromise; diff --git a/packages/kit/types/helper.d.ts b/packages/kit/types/helper.d.ts index 764dc7c9d6f5..5660a255763f 100644 --- a/packages/kit/types/helper.d.ts +++ b/packages/kit/types/helper.d.ts @@ -18,9 +18,14 @@ export type ParameterizedBody = Body extends FormData // but this can't happen until TypeScript 4.3 export type Headers = Record; -export type Location = { +export type Location = Record> = { host: string; path: string; - params: Record; + params: Params; query: URLSearchParams; }; + +export type MaybePromise = T | Promise; +export type InferValue = T extends Record + ? Val + : Default; diff --git a/packages/kit/types/hooks.d.ts b/packages/kit/types/hooks.d.ts index fc5e42baf94e..0966a8cce287 100644 --- a/packages/kit/types/hooks.d.ts +++ b/packages/kit/types/hooks.d.ts @@ -1,4 +1,4 @@ -import { Headers, Location, ParameterizedBody } from './helper'; +import { Headers, Location, MaybePromise, ParameterizedBody } from './helper'; export type StrictBody = string | Uint8Array; @@ -24,10 +24,10 @@ export type ServerResponse = { }; export type GetSession, Session = any> = { - (request: ServerRequest): Session | Promise; + (request: ServerRequest): MaybePromise; }; export type Handle> = (input: { request: ServerRequest; - resolve: (request: ServerRequest) => ServerResponse | Promise; -}) => ServerResponse | Promise; + resolve: (request: ServerRequest) => MaybePromise; +}) => MaybePromise; diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index ff6d4d57ca94..2dbba49b0657 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -5,7 +5,7 @@ import './ambient-modules'; export { Adapter, AdapterUtils, Config, ValidatedConfig } from './config'; export { EndpointOutput, RequestHandler } from './endpoint'; -export { ErrorLoad, Load, Page } from './page'; +export { ErrorLoad, Load, Page, LoadInput, LoadOutput, ErrorLoadInput } from './page'; export { Incoming, GetSession, diff --git a/packages/kit/types/page.d.ts b/packages/kit/types/page.d.ts index 5b80353cb7c0..2b938b8e89e3 100644 --- a/packages/kit/types/page.d.ts +++ b/packages/kit/types/page.d.ts @@ -1,27 +1,64 @@ -import { Location as Page } from './helper'; +import { Location as Page, MaybePromise, InferValue } from './helper'; -export type LoadInput = { - page: Page; +export type LoadInput< + PageParams extends Record = Record, + Context extends Record = Record +> = { + page: Page; fetch: (info: RequestInfo, init?: RequestInit) => Promise; session: any; - context: Record; + context: Context; }; -export type ErrorLoadInput = LoadInput & { +export type ErrorLoadInput< + PageParams extends Record = Record, + Context extends Record = Record +> = LoadInput & { status: number; error: Error; }; -export type LoadOutput = { +export type LoadOutput< + Props extends Record = Record, + Context extends Record = Record +> = { status?: number; error?: string | Error; redirect?: string; - props?: Record | Promise>; - context?: Record; + props?: Props; + context?: Context; maxage?: number; }; -/* Publicized Types */ -export type Load = (input: LoadInput) => LoadOutput | Promise; -export type ErrorLoad = (input: ErrorLoadInput) => LoadOutput | Promise; +// Publicized Types +export type Load< + Input extends { context?: Record; pageParams?: Record } = {}, + Output extends { context?: Record; props?: Record } = {} +> = ( + input: LoadInput< + InferValue>, + InferValue> + > +) => MaybePromise< + LoadOutput< + InferValue>, + InferValue> + > +>; + +export type ErrorLoad< + Input extends { context?: Record; pageParams?: Record } = {}, + Output extends { context?: Record; props?: Record } = {} +> = ( + input: ErrorLoadInput< + InferValue>, + InferValue> + > +) => MaybePromise< + LoadOutput< + InferValue>, + InferValue> + > +>; + export { Page };