From 6a83857163da964f8342165fbf883eb915e7b754 Mon Sep 17 00:00:00 2001 From: Chris Amico Date: Tue, 14 Jan 2025 12:33:00 -0500 Subject: [PATCH 1/5] Bust cache and fix canonical link --- netlify.toml | 3 +++ src/routes/(app)/documents/[id]-[slug]/+page.ts | 2 +- src/routes/(app)/projects/[id]/+page.ts | 8 ++++---- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/netlify.toml b/netlify.toml index b9954104b..94ab225b1 100644 --- a/netlify.toml +++ b/netlify.toml @@ -2,6 +2,9 @@ command = "npm run build" publish = "build" +[[context.production.plugins]] +package = "/plugins/cache-bust" + [[plugins]] package = "@netlify/plugin-lighthouse" # https://github.com/netlify/netlify-plugin-lighthouse diff --git a/src/routes/(app)/documents/[id]-[slug]/+page.ts b/src/routes/(app)/documents/[id]-[slug]/+page.ts index 63110c1eb..74a94e72b 100644 --- a/src/routes/(app)/documents/[id]-[slug]/+page.ts +++ b/src/routes/(app)/documents/[id]-[slug]/+page.ts @@ -29,7 +29,7 @@ export async function load({ depends(`document:${document.id}`); - const canonical = new URL(document.canonical_url); + const canonical = documents.canonicalUrl(document); if (document.slug !== params.slug) { redirect(302, canonical.pathname); } diff --git a/src/routes/(app)/projects/[id]/+page.ts b/src/routes/(app)/projects/[id]/+page.ts index 05aacc027..12cefc8b5 100644 --- a/src/routes/(app)/projects/[id]/+page.ts +++ b/src/routes/(app)/projects/[id]/+page.ts @@ -6,14 +6,14 @@ import * as projects from "$lib/api/projects"; export async function load({ params, fetch }) { const { data: project, error: err } = await projects.get(+params.id, fetch); - if (!project) { - return error(404, "Project not found"); - } - if (err) { return error(err.status, err.message); } + if (!project) { + return error(404, "Project not found"); + } + const url = projects.canonicalUrl(project); return redirect(302, url); From eac7f6a790905cdf5305b14a1ad2c582c14c560c Mon Sep 17 00:00:00 2001 From: Chris Amico Date: Tue, 14 Jan 2025 13:00:28 -0500 Subject: [PATCH 2/5] Add page handler for file extension routes --- .../documents/[id]-[slug].[format]/+page.ts | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/routes/(app)/documents/[id]-[slug].[format]/+page.ts diff --git a/src/routes/(app)/documents/[id]-[slug].[format]/+page.ts b/src/routes/(app)/documents/[id]-[slug].[format]/+page.ts new file mode 100644 index 000000000..d54d016d9 --- /dev/null +++ b/src/routes/(app)/documents/[id]-[slug].[format]/+page.ts @@ -0,0 +1,45 @@ +// handle .html and other file extension routes from old versions of DocumentCloud + +import { error, redirect } from "@sveltejs/kit"; +import * as documents from "$lib/api/documents"; + +export const trailingSlash = "never"; + +export async function load({ params, fetch }) { + const { id, slug, format } = params; + + const { data: document, error: err } = await documents.get(id, fetch); + + if (err) { + return error(err.status, err.message); + } + + if (!document) { + return error(404, "Not found"); + } + + const canonical = `/documents/${id}-${slug}/`; + + let url: URL; + + switch (format) { + // for .html, redirect to embed + case "html": + url = documents.embedUrl(document); + return redirect(302, url); + + case "txt": + url = documents.canonicalUrl(document); + url.searchParams.set("mode", "text"); + return redirect(302, url); + + // redirect to the PDF file, no-op for errors + case "pdf": + url = documents.pdfUrl(document); + return redirect(302, url); + + // fallback: redirect to the canonical path, on the same host + default: + return redirect(302, canonical); + } +} From 3c482b798178e20279f897925c08ea33e633e314 Mon Sep 17 00:00:00 2001 From: Chris Amico Date: Tue, 14 Jan 2025 13:12:42 -0500 Subject: [PATCH 3/5] cleanup --- src/routes/(app)/documents/[id]-[slug].[format]/+page.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/routes/(app)/documents/[id]-[slug].[format]/+page.ts b/src/routes/(app)/documents/[id]-[slug].[format]/+page.ts index d54d016d9..3e8006814 100644 --- a/src/routes/(app)/documents/[id]-[slug].[format]/+page.ts +++ b/src/routes/(app)/documents/[id]-[slug].[format]/+page.ts @@ -6,7 +6,7 @@ import * as documents from "$lib/api/documents"; export const trailingSlash = "never"; export async function load({ params, fetch }) { - const { id, slug, format } = params; + const { id, format } = params; const { data: document, error: err } = await documents.get(id, fetch); @@ -18,8 +18,6 @@ export async function load({ params, fetch }) { return error(404, "Not found"); } - const canonical = `/documents/${id}-${slug}/`; - let url: URL; switch (format) { @@ -40,6 +38,6 @@ export async function load({ params, fetch }) { // fallback: redirect to the canonical path, on the same host default: - return redirect(302, canonical); + return redirect(302, documents.canonicalUrl(document)); } } From 19c52f592d051278ebaf1bd01d71c174865a887e Mon Sep 17 00:00:00 2001 From: Chris Amico Date: Tue, 14 Jan 2025 13:36:46 -0500 Subject: [PATCH 4/5] add apple icons --- static/apple-touch-icon-precomposed.png | Bin 0 -> 5881 bytes static/apple-touch-icon.png | Bin 0 -> 5881 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 static/apple-touch-icon-precomposed.png create mode 100755 static/apple-touch-icon.png diff --git a/static/apple-touch-icon-precomposed.png b/static/apple-touch-icon-precomposed.png new file mode 100755 index 0000000000000000000000000000000000000000..497066d18643528eae8f86db23d3106f5c7cb935 GIT binary patch literal 5881 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 P00000NkvXXu0mjfzhD=1 literal 0 HcmV?d00001 diff --git a/static/apple-touch-icon.png b/static/apple-touch-icon.png new file mode 100755 index 0000000000000000000000000000000000000000..497066d18643528eae8f86db23d3106f5c7cb935 GIT binary patch literal 5881 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 P00000NkvXXu0mjfzhD=1 literal 0 HcmV?d00001 From 77aaeac4c96765b8740ae3d13498f0ff203b18f4 Mon Sep 17 00:00:00 2001 From: Chris Amico Date: Tue, 14 Jan 2025 13:40:44 -0500 Subject: [PATCH 5/5] one more --- static/apple-touch-icon-120x120-precomposed.png | Bin 0 -> 5881 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 static/apple-touch-icon-120x120-precomposed.png diff --git a/static/apple-touch-icon-120x120-precomposed.png b/static/apple-touch-icon-120x120-precomposed.png new file mode 100755 index 0000000000000000000000000000000000000000..497066d18643528eae8f86db23d3106f5c7cb935 GIT binary patch literal 5881 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 P00000NkvXXu0mjfzhD=1 literal 0 HcmV?d00001