Skip to content

Commit 59a8b3a

Browse files
jaysin586claude
andcommitted
fix: remove gray-matter to fix Cloudflare Workers deploy
gray-matter is a CJS package that triggers Rolldown's createRequire shim, which throws on Cloudflare Workers where import.meta.url is undefined. The mdsvex blog path (loadBlogPostsMdsvex) never used gray-matter — frontmatter is parsed by mdsvex at build time. Remove parseBlogPost, loadBlogPosts (dead code), and gray-matter dep. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 03aa71b commit 59a8b3a

5 files changed

Lines changed: 4 additions & 146 deletions

File tree

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@
110110
"bits-ui": "^2.16.4",
111111
"clsx": "^2.1.1",
112112
"github-slugger": "^2.0.0",
113-
"gray-matter": "^4.0.3",
114113
"runed": "^0.37.1",
115114
"satori": "^0.26.0",
116115
"satori-html": "^0.3.2",

pnpm-lock.yaml

Lines changed: 0 additions & 77 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/lib/blog/index.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,6 @@ export { default as BlogPost } from '../components/BlogPost.svelte'
99
export type { BlogPostData, BlogPostMeta } from '../types/blog.js'
1010

1111
// Utilities
12-
export {
13-
filterByTag,
14-
getAllTags,
15-
loadBlogPosts,
16-
loadBlogPostsMdsvex,
17-
parseBlogPost
18-
} from '../utils/blog.js'
12+
export { filterByTag, getAllTags, loadBlogPostsMdsvex } from '../utils/blog.js'
1913
export { estimateReadingTime } from '../utils/reading-time.js'
2014
export { generateRssFeed } from '../utils/rss.js'

src/lib/scripts/generate-social-cards.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,8 @@ async function discoverBlogPosts(blogContentDir: string): Promise<PageSeoData[]>
199199

200200
try {
201201
const entries = await fs.readdir(blogContentDir, { withFileTypes: true })
202-
// Dynamic import to avoid requiring gray-matter when blog is not used
202+
// Dynamic import — gray-matter is optional (only needed for raw .md blog posts)
203+
// @ts-ignore gray-matter may not be installed
203204
const matter = (await import('gray-matter')).default
204205

205206
for (const entry of entries) {

src/lib/utils/blog.ts

Lines changed: 1 addition & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,11 @@
1-
import matter from 'gray-matter'
2-
import type { BlogPostData, BlogPostMeta } from '../types/blog.js'
1+
import type { BlogPostMeta } from '../types/blog.js'
32
import { estimateReadingTime } from './reading-time.js'
43

54
/** Shape of an mdsvex module returned by import.meta.glob on .svx files. */
65
interface MdsvexModule {
76
metadata?: Record<string, unknown>
87
}
98

10-
/**
11-
* Parses a raw markdown file (with YAML frontmatter) into structured blog post data.
12-
*
13-
* @param slug - The URL-safe slug (typically the filename without extension).
14-
* @param rawContent - The full markdown file content including frontmatter.
15-
* @param includeDrafts - Whether to include draft posts (defaults to false).
16-
* @returns Parsed blog post data, or null if the post is a draft and includeDrafts is false.
17-
*/
18-
export const parseBlogPost = (
19-
slug: string,
20-
rawContent: string,
21-
includeDrafts = false
22-
): BlogPostData | null => {
23-
const { data, content } = matter(rawContent)
24-
25-
const isDraft = data.draft === true
26-
if (isDraft && !includeDrafts) return null
27-
28-
const post: BlogPostData = {
29-
slug,
30-
title: data.title ?? slug,
31-
date: data.date instanceof Date ? data.date.toISOString() : String(data.date ?? ''),
32-
description: data.description ?? '',
33-
tags: Array.isArray(data.tags) ? data.tags.map(String) : [],
34-
author: data.author ?? 'Humanspeak',
35-
draft: isDraft || undefined,
36-
readingTime: estimateReadingTime(content),
37-
ogSlug: data.ogSlug ?? `blog-${slug}`,
38-
content
39-
}
40-
41-
return post
42-
}
43-
44-
/**
45-
* Loads and parses all blog posts from a Vite import.meta.glob result.
46-
*
47-
* @param globResult - Result of `import.meta.glob('/src/content/blog/*.md', { eager: true, query: '?raw', import: 'default' })`.
48-
* @param includeDrafts - Whether to include draft posts (defaults to false).
49-
* @returns Array of blog posts sorted by date (newest first).
50-
*/
51-
export const loadBlogPosts = (
52-
globResult: Record<string, string>,
53-
includeDrafts = false
54-
): BlogPostData[] => {
55-
const posts: BlogPostData[] = []
56-
57-
for (const [filepath, rawContent] of Object.entries(globResult)) {
58-
const slug = filepath.split('/').pop()?.replace(/\.md$/, '')
59-
if (!slug) continue
60-
61-
const post = parseBlogPost(slug, rawContent, includeDrafts)
62-
if (post) posts.push(post)
63-
}
64-
65-
return posts.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime())
66-
}
67-
689
/**
6910
* Loads blog post metadata from mdsvex `.svx` route files.
7011
*

0 commit comments

Comments
 (0)