diff --git a/.changeset/nice-timers-explain.md b/.changeset/nice-timers-explain.md new file mode 100644 index 000000000000..179b0a9924c7 --- /dev/null +++ b/.changeset/nice-timers-explain.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Add status and error to page store diff --git a/packages/kit/src/runtime/app/stores.js b/packages/kit/src/runtime/app/stores.js index 01aff2cadba2..9a8f52b679ae 100644 --- a/packages/kit/src/runtime/app/stores.js +++ b/packages/kit/src/runtime/app/stores.js @@ -56,7 +56,7 @@ export const navigating = { }; /** @param {string} verb */ -const error = (verb) => { +const throw_error = (verb) => { throw new Error( ssr ? `Can only ${verb} session store in browser` @@ -76,6 +76,6 @@ export const session = { return store.subscribe(fn); }, - set: () => error('set'), - update: () => error('update') + set: () => throw_error('set'), + update: () => throw_error('update') }; diff --git a/packages/kit/src/runtime/client/renderer.js b/packages/kit/src/runtime/client/renderer.js index 0b2ea28337b4..cd997a6d95c2 100644 --- a/packages/kit/src/runtime/client/renderer.js +++ b/packages/kit/src/runtime/client/renderer.js @@ -180,7 +180,7 @@ export class Renderer { result = error_args ? await this._load_error(error_args) - : await this._get_navigation_result_from_branch({ url, params, branch }); + : await this._get_navigation_result_from_branch({ url, params, branch, status, error }); } catch (e) { if (error) throw e; @@ -417,9 +417,11 @@ export class Renderer { * url: URL; * params: Record; * branch: Array; + * status: number; + * error?: Error; * }} opts */ - async _get_navigation_result_from_branch({ url, params, branch }) { + async _get_navigation_result_from_branch({ url, params, branch, status, error }) { const filtered = /** @type {import('./types').BranchNode[] } */ (branch.filter(Boolean)); const redirect = filtered.find((f) => f.loaded && f.loaded.redirect); @@ -443,7 +445,7 @@ export class Renderer { } if (!this.current.url || url.href !== this.current.url.href) { - result.props.page = { url, params }; + result.props.page = { url, params, status, error }; // TODO remove this for 1.0 /** @@ -737,12 +739,12 @@ export class Renderer { } } - return await this._get_navigation_result_from_branch({ url, params, branch }); + return await this._get_navigation_result_from_branch({ url, params, branch, status, error }); } /** * @param {{ - * status?: number; + * status: number; * error: Error; * url: URL; * }} opts @@ -770,6 +772,6 @@ export class Renderer { }) ]; - return await this._get_navigation_result_from_branch({ url, params, branch }); + return await this._get_navigation_result_from_branch({ url, params, branch, status, error }); } } diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index 624fbcc11dfd..a9af0c160f67 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -68,7 +68,7 @@ export async function render_response({ navigating: writable(null), session }, - page: { url, params }, + page: { url, params, status, error }, components: branch.map(({ node }) => node.module.default) }; diff --git a/packages/kit/test/apps/basics/src/routes/__error.svelte b/packages/kit/test/apps/basics/src/routes/__error.svelte index 40487254525c..6c781b667e83 100644 --- a/packages/kit/test/apps/basics/src/routes/__error.svelte +++ b/packages/kit/test/apps/basics/src/routes/__error.svelte @@ -8,11 +8,17 @@ diff --git a/packages/kit/types/ambient-modules.d.ts b/packages/kit/types/ambient-modules.d.ts index 8b376f6a942a..ceafe16edab5 100644 --- a/packages/kit/types/ambient-modules.d.ts +++ b/packages/kit/types/ambient-modules.d.ts @@ -93,6 +93,8 @@ declare module '$app/stores' { page: Readable<{ url: URL; params: Record; + status: number; + error: Error | null; }>; session: Writable; }; @@ -103,6 +105,8 @@ declare module '$app/stores' { export const page: Readable<{ url: URL; params: Record; + status: number; + error: Error | null; }>; /** * A readable store.