From 402e4eb5e4a2c0bdb098e354b1b992c503eb3887 Mon Sep 17 00:00:00 2001 From: Eddie Pace Date: Mon, 19 Jan 2026 23:37:57 +0000 Subject: [PATCH 1/4] add tests for dev flag in production --- package.json | 2 +- src/lib/utils/post.ts | 12 +++- src/posts/diorama-strike-at-dawn.md | 1 - src/routes/[slug]/+page.ts | 2 +- src/routes/api/posts/+server.ts | 2 +- src/test/data/posts.test.valid.json | 3 +- src/test/posts/posts.test.ts | 86 ++++++++++++++++++++++++++++- 7 files changed, 100 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 61024218..f6cf9668 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "type": "module", "scripts": { "dev": "vite dev", - "build": "vite build", + "build": "vite build --mode production", "prod": "vite dev --mode=production --host 0.0.0.0 --port 8080", "preview": "vite preview --host 0.0.0.0 --port 8080", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", diff --git a/src/lib/utils/post.ts b/src/lib/utils/post.ts index db373ad1..8b6d7751 100644 --- a/src/lib/utils/post.ts +++ b/src/lib/utils/post.ts @@ -3,7 +3,9 @@ const parsePinned = (pinned: boolean | undefined) => Number(pinned ?? 0); // eslint-disable-next-line @typescript-eslint/no-explicit-any const propIsType = (obj: any, prop: string, type: string) => typeof obj[prop] === type; -const isDevPost = (post: Post) => (import.meta.env.DEV && post.dev) ?? false; +const isDevPost = (post: Post) => post.dev ?? false; + +const canLoadProdPost = (post: Post) => !post.dev && post.published; export function comparePinnedPosts(p1: Post, p2: Post) { return parsePinned(p2.pinned) - parsePinned(p1.pinned); @@ -21,6 +23,12 @@ export function isPost(obj: unknown): obj is Post { ); } -export function canLoadPost(post: unknown): boolean { +export function canLoadPost(post: unknown, isEnvProd: boolean): boolean { + if (isEnvProd || import.meta.env.PROD) // fallback to env + { + // if prod ignore dev posts + return isPost(post) && canLoadProdPost(post); + } + // if dev - load dev posts return isPost(post) && (post.published || isDevPost(post)); } diff --git a/src/posts/diorama-strike-at-dawn.md b/src/posts/diorama-strike-at-dawn.md index 7c101a72..da960ebc 100644 --- a/src/posts/diorama-strike-at-dawn.md +++ b/src/posts/diorama-strike-at-dawn.md @@ -4,7 +4,6 @@ description: I made a miniature diorama for a good friend of mine. date: 01/18/2025 projectId: miniatures published: true -dev: true icon: umbrella-beach coverImage: miniatures/diorama-strike-at-dawn/diorama-backdrop.webp footnotes: diff --git a/src/routes/[slug]/+page.ts b/src/routes/[slug]/+page.ts index ef966ab2..91f1acda 100644 --- a/src/routes/[slug]/+page.ts +++ b/src/routes/[slug]/+page.ts @@ -7,7 +7,7 @@ export async function load({ params }) { const file = await import(`../../posts/${params.slug}.md`); const post = parsePostFile(file, params.slug); - if (!canLoadPost(post)) { + if (!canLoadPost(post, import.meta.env.PROD)) { throw new Error(`cannot load post: ${params.slug}`) } diff --git a/src/routes/api/posts/+server.ts b/src/routes/api/posts/+server.ts index 7b32313e..9f1d0e6e 100644 --- a/src/routes/api/posts/+server.ts +++ b/src/routes/api/posts/+server.ts @@ -11,7 +11,7 @@ async function getPosts() { for (const path in paths) { const file = paths[path]; const post = parsePostFile(file, path); - post && canLoadPost(post) && posts.push(post); + post && canLoadPost(post, import.meta.env.PROD) && posts.push(post); } posts = posts.sort( diff --git a/src/test/data/posts.test.valid.json b/src/test/data/posts.test.valid.json index e0e53e83..f03bae6f 100644 --- a/src/test/data/posts.test.valid.json +++ b/src/test/data/posts.test.valid.json @@ -30,6 +30,7 @@ "technologies": [ "tech1", "tech2" - ] + ], + "dev": true } ] diff --git a/src/test/posts/posts.test.ts b/src/test/posts/posts.test.ts index e3a0ef1b..0d9c9d7b 100644 --- a/src/test/posts/posts.test.ts +++ b/src/test/posts/posts.test.ts @@ -2,6 +2,7 @@ import { test, describe, expect } from 'vitest'; import * as fs from 'fs'; import path from 'path'; import { parsePostFile } from '$lib/utils/parse'; +import { canLoadPost, isPost } from '$lib/utils/post'; const iconCssPath = path.join( __dirname, @@ -65,5 +66,88 @@ describe('post validation', () => { expect(icons).toContain(`fa-${post.icon}`); }); } + test(`published post is not marked for dev: ${post.title}`, () => { + if (post.published) + { + expect(post.dev).toBeFalsy(); + } + }) }); -}); +}) + +describe('post loading', () => { + + // such a post should fail validation anyway, but for peace of mind + const postPublishedAndDev = { + "title": "Test", + "slug": "a-valid-slug", + "description": "A valid description", + "published": true, + "dev": true, + "date": "01/04/2021" + }; + + const PostDevOnly = { + "title": "Test", + "slug": "a-valid-slug", + "description": "A valid description", + "dev": true, + "published": false, + "date": "01/04/2021" + }; + + const PostPublishedOnly = { + "title": "Test", + "slug": "a-valid-slug", + "description": "A valid description", + "published": true, + "date": "01/04/2021", + }; + + const PostPublishedOnlyDevFalse = { + "title": "Test", + "slug": "a-valid-slug", + "description": "A valid description", + "published": true, + "dev": false, + "date": "01/04/2021", + }; + + const PostNoDevOrPublished = { + "title": "Test", + "slug": "a-valid-slug", + "description": "A valid description", + "date": "01/04/2021", + "published": false, + }; + + test("test posts are valid", () => { + expect(isPost(postPublishedAndDev)).toBe(true); + expect(isPost(PostDevOnly)).toBe(true); + expect(isPost(PostPublishedOnly)).toBe(true); + expect(isPost(PostNoDevOrPublished)).toBe(true); + expect(isPost(PostPublishedOnlyDevFalse)).toBe(true); + }) + + test("when in PROD post with 'dev' is not loaded", () => { + expect(canLoadPost(postPublishedAndDev, true)).toBe(false); + expect(canLoadPost(PostDevOnly, true)).toBe(false); + }); + + test("when in PROD post with 'published' and not 'dev' is loaded", () => { + expect(canLoadPost(PostPublishedOnly, true)).toBe(true); + expect(canLoadPost(PostPublishedOnlyDevFalse, true)).toBe(true); + }); + + test("when not in PROD post with 'dev' or 'published' is always loaded", () => { + expect(canLoadPost(postPublishedAndDev, false)).toBe(true); + expect(canLoadPost(PostDevOnly, false)).toBe(true); + expect(canLoadPost(PostPublishedOnly, false)).toBe(true); + expect(canLoadPost(PostPublishedOnlyDevFalse, false)).toBe(true); + }); + + test("post without 'dev' or 'published' is never loaded", () => { + expect(canLoadPost(PostNoDevOrPublished, false)).toBe(false); + expect(canLoadPost(PostNoDevOrPublished, true)).toBe(false); + }) +}) From 0c2db3329e02d671151d6504c98d09fd0a1ea9b3 Mon Sep 17 00:00:00 2001 From: Eddie Pace Date: Mon, 19 Jan 2026 23:49:04 +0000 Subject: [PATCH 2/4] fix zindex wizard behind H1 on firefox --- src/lib/pages/HomePage.svelte | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib/pages/HomePage.svelte b/src/lib/pages/HomePage.svelte index 11b905e4..160a58a5 100644 --- a/src/lib/pages/HomePage.svelte +++ b/src/lib/pages/HomePage.svelte @@ -24,6 +24,8 @@