From ead8eee0be494afbcde3c59632476ead78d474e1 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 19 Aug 2021 09:55:27 -0700 Subject: [PATCH] [chore] separate RequestHeaders and ResponseHeaders types --- .changeset/empty-donuts-smell.md | 5 +++++ packages/kit/src/core/dev/index.js | 2 +- packages/kit/src/core/preview/index.js | 2 +- packages/kit/src/runtime/server/endpoint.js | 3 ++- packages/kit/src/runtime/server/page/load_node.js | 6 ++++-- packages/kit/src/runtime/server/page/render.js | 2 +- packages/kit/src/runtime/server/parse_body/index.js | 2 +- packages/kit/types/endpoint.d.ts | 4 ++-- packages/kit/types/helper.d.ts | 10 +++++----- packages/kit/types/hooks.d.ts | 13 ++++++++++--- packages/kit/types/internal.d.ts | 4 ++-- 11 files changed, 34 insertions(+), 19 deletions(-) create mode 100644 .changeset/empty-donuts-smell.md diff --git a/.changeset/empty-donuts-smell.md b/.changeset/empty-donuts-smell.md new file mode 100644 index 000000000000..ee3607010dc1 --- /dev/null +++ b/.changeset/empty-donuts-smell.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +[chore] separate RequestHeaders and ResponseHeaders types diff --git a/packages/kit/src/core/dev/index.js b/packages/kit/src/core/dev/index.js index 68dfc7037eac..9ca153a9f650 100644 --- a/packages/kit/src/core/dev/index.js +++ b/packages/kit/src/core/dev/index.js @@ -367,7 +367,7 @@ async function create_handler(vite, config, dir, cwd, get_manifest) { const rendered = await respond( { - headers: /** @type {import('types/helper').Headers} */ (req.headers), + headers: /** @type {import('types/helper').RequestHeaders} */ (req.headers), method: req.method, host, path: parsed.pathname.replace(config.kit.paths.base, ''), diff --git a/packages/kit/src/core/preview/index.js b/packages/kit/src/core/preview/index.js index 3cc4f934ccaf..945a5b5993b3 100644 --- a/packages/kit/src/core/preview/index.js +++ b/packages/kit/src/core/preview/index.js @@ -91,7 +91,7 @@ export async function preview({ host: /** @type {string} */ (config.kit.host || req.headers[config.kit.hostHeader || 'host']), method: req.method, - headers: /** @type {import('types/helper').Headers} */ (req.headers), + headers: /** @type {import('types/helper').RequestHeaders} */ (req.headers), path: parsed.pathname.replace(config.kit.paths.base, ''), query: parsed.searchParams, rawBody: body diff --git a/packages/kit/src/runtime/server/endpoint.js b/packages/kit/src/runtime/server/endpoint.js index f27f4ec4ca4a..cde1231cf410 100644 --- a/packages/kit/src/runtime/server/endpoint.js +++ b/packages/kit/src/runtime/server/endpoint.js @@ -81,7 +81,8 @@ export async function render_endpoint(request, route, match) { !(body instanceof Uint8Array) && (!type || type.startsWith('application/json')) ) { - headers = { ...headers, 'content-type': 'application/json; charset=utf-8' }; + headers = { ...headers }; + headers['content-type'] = 'application/json; charset=utf-8'; normalized_body = JSON.stringify(typeof body === 'undefined' ? {} : body); } else { normalized_body = /** @type {import('types/hooks').StrictBody} */ (body); diff --git a/packages/kit/src/runtime/server/page/load_node.js b/packages/kit/src/runtime/server/page/load_node.js index e4b4bcc19486..9a5a609180c0 100644 --- a/packages/kit/src/runtime/server/page/load_node.js +++ b/packages/kit/src/runtime/server/page/load_node.js @@ -120,7 +120,9 @@ export async function load_node({ } else if (resolved.startsWith('/') && !resolved.startsWith('//')) { const relative = resolved; - const headers = /** @type {import('types/helper').Headers} */ ({ ...opts.headers }); + const headers = /** @type {import('types/helper').RequestHeaders} */ ({ + ...opts.headers + }); // TODO: fix type https://github.com/node-fetch/node-fetch/issues/1113 if (opts.credentials !== 'omit') { @@ -211,7 +213,7 @@ export async function load_node({ async function text() { const body = await response.text(); - /** @type {import('types/helper').Headers} */ + /** @type {import('types/helper').ResponseHeaders} */ const headers = {}; for (const [key, value] of response.headers) { if (key !== 'etag' && key !== 'set-cookie') headers[key] = value; diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index 6a1f7a8a01bb..90e03659ecce 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -175,7 +175,7 @@ export async function render_response({ .join('\n\n\t\t\t')} `.replace(/^\t{2}/gm, ''); - /** @type {import('types/helper').Headers} */ + /** @type {import('types/helper').ResponseHeaders} */ const headers = { 'content-type': 'text/html' }; diff --git a/packages/kit/src/runtime/server/parse_body/index.js b/packages/kit/src/runtime/server/parse_body/index.js index 6e6d55cf1b7c..b76851417722 100644 --- a/packages/kit/src/runtime/server/parse_body/index.js +++ b/packages/kit/src/runtime/server/parse_body/index.js @@ -2,7 +2,7 @@ import { read_only_form_data } from './read_only_form_data.js'; /** * @param {import('types/helper').RawBody} raw - * @param {import('types/helper').Headers} headers + * @param {import('types/helper').RequestHeaders} headers */ export function parse_body(raw, headers) { if (!raw) return raw; diff --git a/packages/kit/types/endpoint.d.ts b/packages/kit/types/endpoint.d.ts index a9bce3727f7d..f23df7735d97 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, MaybePromise } from './helper'; +import { MaybePromise, ResponseHeaders } from './helper'; type ToJSON = { toJSON(...args: any[]): JSONValue }; type JSONValue = Exclude; @@ -16,7 +16,7 @@ type DefaultBody = JSONResponse | Uint8Array; export interface EndpointOutput { status?: number; - headers?: Headers; + headers?: ResponseHeaders; body?: Body; } diff --git a/packages/kit/types/helper.d.ts b/packages/kit/types/helper.d.ts index b56ff084f421..33195d033a2e 100644 --- a/packages/kit/types/helper.d.ts +++ b/packages/kit/types/helper.d.ts @@ -13,11 +13,11 @@ export type ParameterizedBody = Body extends FormData ? ReadOnlyFormData : (string | RawBody | ReadOnlyFormData) & Body; -// TODO we want to differentiate between request headers, which -// always follow this type, and response headers, in which -// 'set-cookie' is a `string[]` (or at least `string | string[]`) -// but this can't happen until TypeScript 4.3 -export type Headers = Record; +export type RequestHeaders = Record; + +export type ResponseHeaders = Record & { + 'Set-Cookie'?: string | string[]; +}; export type Location = Record> = { host: string; diff --git a/packages/kit/types/hooks.d.ts b/packages/kit/types/hooks.d.ts index a7997dd21527..6d460282d85b 100644 --- a/packages/kit/types/hooks.d.ts +++ b/packages/kit/types/hooks.d.ts @@ -1,10 +1,17 @@ -import { Headers, Location, MaybePromise, ParameterizedBody, RawBody } from './helper'; +import { + Location, + MaybePromise, + ParameterizedBody, + RawBody, + RequestHeaders, + ResponseHeaders +} from './helper'; export type StrictBody = string | Uint8Array; export interface ServerRequest, Body = unknown> extends Location { method: string; - headers: Headers; + headers: RequestHeaders; rawBody: RawBody; body: ParameterizedBody; locals: Locals; @@ -12,7 +19,7 @@ export interface ServerRequest, Body = unknown> ext export interface ServerResponse { status: number; - headers: Headers; + headers: ResponseHeaders; body?: StrictBody; } diff --git a/packages/kit/types/internal.d.ts b/packages/kit/types/internal.d.ts index eda2cfdfd461..356700c2a9af 100644 --- a/packages/kit/types/internal.d.ts +++ b/packages/kit/types/internal.d.ts @@ -1,5 +1,5 @@ import { RequestHandler } from './endpoint'; -import { Headers, Location, ParameterizedBody, RawBody } from './helper'; +import { Location, ParameterizedBody, RawBody, RequestHeaders } from './helper'; import { ExternalFetch, GetSession, @@ -14,7 +14,7 @@ type PageId = string; export interface Incoming extends Omit { method: string; - headers: Headers; + headers: RequestHeaders; rawBody: RawBody; body?: ParameterizedBody; }