From ad8bae9b809b6659a7d56085966842f8ea5afff7 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 2 Oct 2024 10:32:36 -0400 Subject: [PATCH 1/2] handle redirects in layout --- .../src/routes/docs/[...path]/+layout.server.ts | 12 +++++++++--- .../src/routes/docs/[...path]/+page.server.js | 6 +----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/apps/svelte.dev/src/routes/docs/[...path]/+layout.server.ts b/apps/svelte.dev/src/routes/docs/[...path]/+layout.server.ts index 56b4c3cb09..065cc72492 100644 --- a/apps/svelte.dev/src/routes/docs/[...path]/+layout.server.ts +++ b/apps/svelte.dev/src/routes/docs/[...path]/+layout.server.ts @@ -1,16 +1,22 @@ import { docs } from '$lib/server/content'; +import { redirect } from '@sveltejs/kit'; import { error } from '@sveltejs/kit'; export const prerender = true; export async function load({ params }) { - const page = docs.topics[params.path.split('/')[0]]; + const topic = params.path.split('/')[0]; + const document = docs.topics[topic]; - if (!page) { + if (!document) { error(404, 'Not found'); } + if (params.path === topic) { + redirect(307, `/${document.children[0].children[0].slug}`); + } + return { - sections: page.children + sections: document.children }; } diff --git a/apps/svelte.dev/src/routes/docs/[...path]/+page.server.js b/apps/svelte.dev/src/routes/docs/[...path]/+page.server.js index 6f224b0712..ff0def3ee9 100644 --- a/apps/svelte.dev/src/routes/docs/[...path]/+page.server.js +++ b/apps/svelte.dev/src/routes/docs/[...path]/+page.server.js @@ -1,15 +1,11 @@ import { docs } from '$lib/server/content'; import { render_content } from '$lib/server/renderer'; -import { error, redirect } from '@sveltejs/kit'; +import { error } from '@sveltejs/kit'; export async function load({ params }) { const document = docs.pages[params.path]; if (!document) { - const topic = docs.topics[params.path]; - if (topic) { - redirect(307, `/${topic.children[0].children[0].slug}`); - } error(404); } From a9356b8b1ee7caa2f59e9c5231312f8e408e269c Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 2 Oct 2024 10:36:34 -0400 Subject: [PATCH 2/2] throw error if pages conflict with each other --- .../98-reference/{01-state.md => 01-$state.md} | 0 apps/svelte.dev/src/lib/server/content.ts | 13 +++++++------ .../src/routes/docs/[...path]/+layout.server.ts | 2 +- .../src/routes/docs/[...path]/+page.server.js | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) rename apps/svelte.dev/content/docs/svelte/98-reference/{01-state.md => 01-$state.md} (100%) diff --git a/apps/svelte.dev/content/docs/svelte/98-reference/01-state.md b/apps/svelte.dev/content/docs/svelte/98-reference/01-$state.md similarity index 100% rename from apps/svelte.dev/content/docs/svelte/98-reference/01-state.md rename to apps/svelte.dev/content/docs/svelte/98-reference/01-$state.md diff --git a/apps/svelte.dev/src/lib/server/content.ts b/apps/svelte.dev/src/lib/server/content.ts index 3562d96867..6a02ca6131 100644 --- a/apps/svelte.dev/src/lib/server/content.ts +++ b/apps/svelte.dev/src/lib/server/content.ts @@ -60,10 +60,6 @@ function create_docs() { return slug.replace(/\/[^/]+(\/[^/]+)$/g, '$1'); } - function remove_docs(slugs: string) { - return slugs.replace(/^docs\//, ''); - } - let docs: { /** The top level entries/packages: svelte/kit/etc. Key is the topic */ topics: Record; @@ -74,7 +70,7 @@ function create_docs() { for (const topic of index.docs.children) { const pkg = topic.slug.split('/')[1]; const sections = topic.children; - const transformed_topic: Document = (docs.topics[remove_docs(topic.slug)] = { + const transformed_topic: Document = (docs.topics[topic.slug] = { ...topic, children: [] }); @@ -90,7 +86,12 @@ function create_docs() { for (const page of pages) { const slug = remove_section(page.slug); - const transformed_page: Document = (docs.pages[remove_docs(slug)] = { + + if (Object.hasOwn(docs.pages, slug)) { + throw new Error(`${docs.pages[slug].file} conflicts with ${page.file}`); + } + + const transformed_page: Document = (docs.pages[slug] = { ...page, slug, next: page.next?.slug.startsWith(`docs/${pkg}/`) diff --git a/apps/svelte.dev/src/routes/docs/[...path]/+layout.server.ts b/apps/svelte.dev/src/routes/docs/[...path]/+layout.server.ts index 065cc72492..739c6e5d25 100644 --- a/apps/svelte.dev/src/routes/docs/[...path]/+layout.server.ts +++ b/apps/svelte.dev/src/routes/docs/[...path]/+layout.server.ts @@ -6,7 +6,7 @@ export const prerender = true; export async function load({ params }) { const topic = params.path.split('/')[0]; - const document = docs.topics[topic]; + const document = docs.topics[`docs/${topic}`]; if (!document) { error(404, 'Not found'); diff --git a/apps/svelte.dev/src/routes/docs/[...path]/+page.server.js b/apps/svelte.dev/src/routes/docs/[...path]/+page.server.js index ff0def3ee9..286d0d0d8e 100644 --- a/apps/svelte.dev/src/routes/docs/[...path]/+page.server.js +++ b/apps/svelte.dev/src/routes/docs/[...path]/+page.server.js @@ -3,7 +3,7 @@ import { render_content } from '$lib/server/renderer'; import { error } from '@sveltejs/kit'; export async function load({ params }) { - const document = docs.pages[params.path]; + const document = docs.pages[`docs/${params.path}`]; if (!document) { error(404);