diff --git a/.changeset/bright-cherries-hug.md b/.changeset/bright-cherries-hug.md new file mode 100644 index 000000000000..03296d67d333 --- /dev/null +++ b/.changeset/bright-cherries-hug.md @@ -0,0 +1,5 @@ +--- +'create-svelte': patch +--- + +Fix usage of request.locals in starter project diff --git a/packages/create-svelte/templates/default/src/lib/types.d.ts b/packages/create-svelte/templates/default/src/lib/types.d.ts new file mode 100644 index 000000000000..6edddd1d6fb6 --- /dev/null +++ b/packages/create-svelte/templates/default/src/lib/types.d.ts @@ -0,0 +1,7 @@ +/** + * Can be made globally available by placing this + * inside `global.d.ts` and removing `export` keyword + */ +export interface Locals { + userid: string; +} diff --git a/packages/create-svelte/templates/default/src/routes/todos/[uid].json.ts b/packages/create-svelte/templates/default/src/routes/todos/[uid].json.ts index 4b16ef0c9ba4..17891faf5979 100644 --- a/packages/create-svelte/templates/default/src/routes/todos/[uid].json.ts +++ b/packages/create-svelte/templates/default/src/routes/todos/[uid].json.ts @@ -1,14 +1,16 @@ import { api } from './_api'; +import type { RequestHandler } from '@sveltejs/kit'; +import type { Locals } from '$lib/types'; // PATCH /todos/:uid.json -export const patch = async (request) => { - return api(request, `todos/${request.context.userid}/${request.params.uid}`, { +export const patch: RequestHandler = async (request) => { + return api(request, `todos/${request.locals.userid}/${request.params.uid}`, { text: request.body.get('text'), done: request.body.has('done') ? !!request.body.get('done') : undefined }); }; // DELETE /todos/:uid.json -export const del = async (request) => { - return api(request, `todos/${request.context.userid}/${request.params.uid}`); +export const del: RequestHandler = async (request) => { + return api(request, `todos/${request.locals.userid}/${request.params.uid}`); }; diff --git a/packages/create-svelte/templates/default/src/routes/todos/_api.ts b/packages/create-svelte/templates/default/src/routes/todos/_api.ts index 33eca61966f5..2319c187df76 100644 --- a/packages/create-svelte/templates/default/src/routes/todos/_api.ts +++ b/packages/create-svelte/templates/default/src/routes/todos/_api.ts @@ -1,4 +1,5 @@ import type { Request } from '@sveltejs/kit'; +import type { Locals } from '$lib/types'; /* This module is used by the /todos.json and /todos/[uid].json @@ -13,9 +14,9 @@ import type { Request } from '@sveltejs/kit'; const base = 'https://api.svelte.dev'; -export async function api(request: Request, resource: string, data?: {}) { +export async function api(request: Request, resource: string, data?: {}) { // user must have a cookie set - if (!request.context.userid) { + if (!request.locals.userid) { return { status: 401 }; } @@ -36,8 +37,7 @@ export async function api(request: Request, resource: string, data?: {}) { status: 303, headers: { location: '/todos' - }, - body: '' // TODO https://github.com/sveltejs/kit/issues/1047 + } }; } diff --git a/packages/create-svelte/templates/default/src/routes/todos/index.json.ts b/packages/create-svelte/templates/default/src/routes/todos/index.json.ts index 35b62f382c92..57d68a91dc2f 100644 --- a/packages/create-svelte/templates/default/src/routes/todos/index.json.ts +++ b/packages/create-svelte/templates/default/src/routes/todos/index.json.ts @@ -1,10 +1,11 @@ import { api } from './_api'; import type { RequestHandler } from '@sveltejs/kit'; +import type { Locals } from '$lib/types'; // GET /todos.json -export const get: RequestHandler = async (request) => { - // request.context.userid comes from src/hooks.js - const response = await api(request, `todos/${request.context.userid}`); +export const get: RequestHandler = async (request) => { + // request.locals.userid comes from src/hooks.js + const response = await api(request, `todos/${request.locals.userid}`); if (response.status === 404) { // user hasn't created a todo list. @@ -16,8 +17,8 @@ export const get: RequestHandler = async (request) => { }; // POST /todos.json -export const post: RequestHandler = async (request) => { - const response = await api(request, `todos/${request.context.userid}`, { +export const post: RequestHandler = async (request) => { + const response = await api(request, `todos/${request.locals.userid}`, { // because index.svelte posts a FormData object, // request.body is _also_ a (readonly) FormData // object, which allows us to get form data