From e711d4ea63dafd160e6548d86a818f56ad6210cf Mon Sep 17 00:00:00 2001 From: saberzero1 Date: Sat, 14 Mar 2026 22:00:34 +0100 Subject: [PATCH] chore: commit dist/ and remove prepare script Pre-built output is now committed to the repository so that Quartz can skip the build step during plugin installation. The prepare script is removed to prevent redundant builds when installing from npm/git. --- .gitignore | 1 - dist/index.js | 522 +++++++++++++++++++++++++++++++++++ dist/index.js.map | 1 + package-lock.json | 689 ++-------------------------------------------- package.json | 1 - 5 files changed, 546 insertions(+), 668 deletions(-) create mode 100644 dist/index.js create mode 100644 dist/index.js.map diff --git a/.gitignore b/.gitignore index 657842b..ef88793 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ node_modules/ .pnp.js # Build output -dist/ build/ *.tsbuildinfo diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..c6802cb --- /dev/null +++ b/dist/index.js @@ -0,0 +1,522 @@ +import path from 'path'; +import fs from 'fs/promises'; +import { styleText } from 'util'; +import satori from 'satori'; +import sharp from 'sharp'; +import readingTime from 'reading-time'; +import { joinSegments } from '@quartz-community/types'; +import { unescapeHTML } from '@quartz-community/utils'; +import { jsxs, Fragment, jsx } from 'preact/jsx-runtime'; + +// src/emitter.tsx + +// src/theme.ts +function getFontSpecificationName(spec) { + if (typeof spec === "string") { + return spec; + } + return spec.name; +} + +// src/emoji.ts +var U200D = String.fromCharCode(8205); +var UFE0Fg = /\uFE0F/g; +function getIconCode(char) { + return toCodePoint(char.indexOf(U200D) < 0 ? char.replace(UFE0Fg, "") : char); +} +function toCodePoint(unicodeSurrogates) { + const r = []; + let c = 0, p = 0, i = 0; + while (i < unicodeSurrogates.length) { + c = unicodeSurrogates.charCodeAt(i++); + if (p) { + r.push((65536 + (p - 55296 << 10) + (c - 56320)).toString(16)); + p = 0; + } else if (55296 <= c && c <= 56319) { + p = c; + } else { + r.push(c.toString(16)); + } + } + return r.join("-"); +} +var emojimap = void 0; +async function loadEmoji(code) { + if (!emojimap) { + const path2 = await import('path'); + const fs2 = await import('fs/promises'); + const mapPath = path2.join("quartz", "util", "emojimap.json"); + const data = JSON.parse(await fs2.readFile(mapPath, "utf-8")); + emojimap = data; + } + const name = emojimap.codePointToName[`${code.toUpperCase()}`]; + if (!name) throw new Error(`codepoint ${code} not found in map`); + const b64 = emojimap.nameToBase64[name]; + if (!b64) throw new Error(`name ${name} not found in map`); + return b64; +} +var QUARTZ = "quartz"; +var defaultHeaderWeight = [700]; +var defaultBodyWeight = [400]; +var write = async (args) => { + const pathToPage = joinSegments(args.ctx.argv.output, args.slug + args.ext); + const dir = path.dirname(pathToPage); + await fs.mkdir(dir, { recursive: true }); + await fs.writeFile(pathToPage, args.content); + return pathToPage; +}; +function getFileExtension(path2) { + return path2.match(/\.([^./?#]+)(?:[?#]|$)/)?.[1]; +} +function isAbsoluteURL(url) { + return /^https?:\/\//.test(url); +} +function getDate(cfg, data) { + return data.dates?.[cfg.defaultDateType ?? "modified"]; +} +function formatDate(d, locale = "en-US") { + return d.toLocaleDateString(locale, { + year: "numeric", + month: "short", + day: "2-digit" + }); +} +async function getSatoriFonts(headerFont, bodyFont) { + const headerWeights = typeof headerFont === "string" ? defaultHeaderWeight : headerFont.weights ?? defaultHeaderWeight; + const bodyWeights = typeof bodyFont === "string" ? defaultBodyWeight : bodyFont.weights ?? defaultBodyWeight; + const headerFontName = typeof headerFont === "string" ? headerFont : headerFont.name; + const bodyFontName = typeof bodyFont === "string" ? bodyFont : bodyFont.name; + const headerFontPromises = headerWeights.map(async (weight) => { + const data = await fetchTtf(headerFontName, weight); + if (!data) return null; + return { + name: headerFontName, + data, + weight, + style: "normal" + }; + }); + const bodyFontPromises = bodyWeights.map(async (weight) => { + const data = await fetchTtf(bodyFontName, weight); + if (!data) return null; + return { + name: bodyFontName, + data, + weight, + style: "normal" + }; + }); + const [headerFonts, bodyFonts] = await Promise.all([ + Promise.all(headerFontPromises), + Promise.all(bodyFontPromises) + ]); + const fonts = [ + ...headerFonts.filter((font) => font !== null), + ...bodyFonts.filter((font) => font !== null) + ]; + return fonts; +} +async function fetchTtf(rawFontName, weight) { + const fontName = rawFontName.replaceAll(" ", "+"); + const cacheKey = `${fontName}-${weight}`; + const cacheDir = path.join(QUARTZ, ".quartz-cache", "fonts"); + const cachePath = path.join(cacheDir, cacheKey); + try { + await fs.access(cachePath); + return fs.readFile(cachePath); + } catch { + } + const cssResponse = await fetch( + `https://fonts.googleapis.com/css2?family=${fontName}:wght@${weight}` + ); + const css = await cssResponse.text(); + const urlRegex = /url\((https:\/\/fonts.gstatic.com\/s\/.*?.ttf)\)/g; + const match = urlRegex.exec(css); + if (!match) { + console.log( + styleText( + "yellow", + ` +Warning: Failed to fetch font ${rawFontName} with weight ${weight}, got ${cssResponse.statusText}` + ) + ); + return; + } + const fontUrl = match[1]; + if (!fontUrl) { + return; + } + const fontResponse = await fetch(fontUrl); + const fontData = Buffer.from(await fontResponse.arrayBuffer()); + await fs.mkdir(cacheDir, { recursive: true }); + await fs.writeFile(cachePath, fontData); + return fontData; +} +var defaultImage = ({ + cfg, + userOpts, + title, + description, + fileData, + iconBase64 +}) => { + const { colorScheme } = userOpts; + const theme = cfg.theme; + const fontBreakPoint = 32; + const useSmallerFont = title.length > fontBreakPoint; + const rawDate = getDate(cfg, fileData); + const date = rawDate ? formatDate(rawDate, cfg.locale) : null; + const { minutes } = readingTime(fileData.text ?? ""); + const readingTimeText = (userOpts.readingTimeText ?? ((time) => `${time} min read`))( + Math.ceil(minutes) + ); + const tags = fileData.frontmatter?.tags ?? []; + const bodyFont = getFontSpecificationName(theme.typography.body); + const headerFont = getFontSpecificationName(theme.typography.header); + return /* @__PURE__ */ jsxs( + "div", + { + style: { + display: "flex", + flexDirection: "column", + height: "100%", + width: "100%", + backgroundColor: theme.colors[colorScheme].light, + padding: "2.5rem", + fontFamily: bodyFont + }, + children: [ + /* @__PURE__ */ jsxs( + "div", + { + style: { + display: "flex", + alignItems: "center", + gap: "1rem", + marginBottom: "0.5rem" + }, + children: [ + iconBase64 && /* @__PURE__ */ jsx( + "img", + { + src: iconBase64, + alt: "", + width: 56, + height: 56, + style: { + borderRadius: "50%" + } + } + ), + /* @__PURE__ */ jsx( + "div", + { + style: { + display: "flex", + fontSize: 32, + color: theme.colors[colorScheme].gray, + fontFamily: bodyFont + }, + children: cfg.baseUrl + } + ) + ] + } + ), + /* @__PURE__ */ jsx( + "div", + { + style: { + display: "flex", + marginTop: "1rem", + marginBottom: "1.5rem" + }, + children: /* @__PURE__ */ jsx( + "h1", + { + style: { + margin: 0, + fontSize: useSmallerFont ? 64 : 72, + fontFamily: headerFont, + fontWeight: 700, + color: theme.colors[colorScheme].dark, + lineHeight: 1.2, + display: "-webkit-box", + WebkitBoxOrient: "vertical", + WebkitLineClamp: 2, + overflow: "hidden", + textOverflow: "ellipsis" + }, + children: title + } + ) + } + ), + /* @__PURE__ */ jsx( + "div", + { + style: { + display: "flex", + flex: 1, + fontSize: 36, + color: theme.colors[colorScheme].darkgray, + lineHeight: 1.4 + }, + children: /* @__PURE__ */ jsx( + "p", + { + style: { + margin: 0, + display: "-webkit-box", + WebkitBoxOrient: "vertical", + WebkitLineClamp: 5, + overflow: "hidden", + textOverflow: "ellipsis" + }, + children: description + } + ) + } + ), + /* @__PURE__ */ jsxs( + "div", + { + style: { + display: "flex", + alignItems: "center", + justifyContent: "space-between", + marginTop: "2rem", + paddingTop: "2rem", + borderTop: `1px solid ${theme.colors[colorScheme].lightgray}` + }, + children: [ + /* @__PURE__ */ jsxs( + "div", + { + style: { + display: "flex", + alignItems: "center", + gap: "2rem", + color: theme.colors[colorScheme].gray, + fontSize: 28 + }, + children: [ + date && /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center" }, children: [ + /* @__PURE__ */ jsxs( + "svg", + { + style: { marginRight: "0.5rem" }, + width: "28", + height: "28", + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + role: "img", + "aria-label": "Date", + children: [ + /* @__PURE__ */ jsx("rect", { x: "3", y: "4", width: "18", height: "18", rx: "2", ry: "2" }), + /* @__PURE__ */ jsx("line", { x1: "16", y1: "2", x2: "16", y2: "6" }), + /* @__PURE__ */ jsx("line", { x1: "8", y1: "2", x2: "8", y2: "6" }), + /* @__PURE__ */ jsx("line", { x1: "3", y1: "10", x2: "21", y2: "10" }) + ] + } + ), + date + ] }), + /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center" }, children: [ + /* @__PURE__ */ jsxs( + "svg", + { + style: { marginRight: "0.5rem" }, + width: "28", + height: "28", + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + role: "img", + "aria-label": "Reading time", + children: [ + /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }), + /* @__PURE__ */ jsx("polyline", { points: "12 6 12 12 16 14" }) + ] + } + ), + readingTimeText + ] }) + ] + } + ), + /* @__PURE__ */ jsx( + "div", + { + style: { + display: "flex", + gap: "0.5rem", + flexWrap: "wrap", + justifyContent: "flex-end", + maxWidth: "60%" + }, + children: tags.slice(0, 3).map((tag) => /* @__PURE__ */ jsxs( + "div", + { + style: { + display: "flex", + padding: "0.5rem 1rem", + backgroundColor: theme.colors[colorScheme].highlight, + color: theme.colors[colorScheme].secondary, + borderRadius: "10px", + fontSize: 24 + }, + children: [ + "#", + tag + ] + } + )) + } + ) + ] + } + ) + ] + } + ); +}; +var defaultOptions = { + colorScheme: "lightMode", + width: 1200, + height: 630, + imageStructure: defaultImage, + excludeRoot: false, + defaultTitle: "Untitled", + defaultDescription: "No description provided", + readingTimeText: (minutes) => `${minutes} min read` +}; +async function generateSocialImage({ cfg, description, fonts, title, fileData }, userOpts) { + const { width, height } = userOpts; + const iconPath = joinSegments(QUARTZ, "static", "icon.png"); + let iconBase64 = void 0; + try { + const iconData = await fs.readFile(iconPath); + iconBase64 = `data:image/png;base64,${iconData.toString("base64")}`; + } catch { + console.warn(styleText("yellow", `Warning: Could not find icon at ${iconPath}`)); + } + const imageComponent = userOpts.imageStructure({ + cfg, + userOpts, + title, + description, + fonts, + fileData, + iconBase64 + }); + const svg = await satori(imageComponent, { + width, + height, + fonts, + loadAdditionalAsset: async (languageCode, segment) => { + if (languageCode === "emoji") { + return await loadEmoji(getIconCode(segment)); + } + return languageCode; + } + }); + return sharp(Buffer.from(svg)).webp({ quality: 40 }); +} +async function processOgImage(ctx, fileData, fonts, fullOptions) { + const cfg = ctx.cfg.configuration; + const slug = fileData.slug; + const titleSuffix = cfg.pageTitleSuffix ?? ""; + const frontmatter = fileData.frontmatter; + const title = (frontmatter?.title ?? fullOptions.defaultTitle ?? "") + titleSuffix; + const description = frontmatter?.socialDescription ?? frontmatter?.description ?? unescapeHTML(fileData.description?.trim() ?? fullOptions.defaultDescription ?? ""); + const stream = await generateSocialImage( + { + title, + description, + fonts, + cfg, + fileData + }, + fullOptions + ); + return write({ + ctx, + content: stream, + slug: `${slug}-og-image`, + ext: ".webp" + }); +} +var CustomOgImagesEmitterName = "CustomOgImages"; +var CustomOgImages = (userOpts) => { + const fullOptions = { ...defaultOptions, ...userOpts }; + return { + name: CustomOgImagesEmitterName, + getQuartzComponents() { + return []; + }, + async *emit(ctx, content, _resources) { + const cfg = ctx.cfg.configuration; + const theme = cfg.theme; + const headerFont = theme.typography.header; + const bodyFont = theme.typography.body; + const fonts = await getSatoriFonts(headerFont, bodyFont); + for (const [_tree, vfile] of content) { + const data = vfile.data; + if (data.frontmatter?.socialImage !== void 0) continue; + yield processOgImage(ctx, data, fonts, fullOptions); + } + }, + async *partialEmit(ctx, _content, _resources, changeEvents) { + const cfg = ctx.cfg.configuration; + const theme = cfg.theme; + const headerFont = theme.typography.header; + const bodyFont = theme.typography.body; + const fonts = await getSatoriFonts(headerFont, bodyFont); + for (const changeEvent of changeEvents) { + if (!changeEvent.file) continue; + const data = changeEvent.file.data; + if (data.frontmatter?.socialImage !== void 0) continue; + if (changeEvent.type === "add" || changeEvent.type === "change") { + yield processOgImage(ctx, data, fonts, fullOptions); + } + } + }, + externalResources: (ctx) => { + if (!ctx.cfg.configuration.baseUrl) { + return {}; + } + const baseUrl = ctx.cfg.configuration.baseUrl; + return { + additionalHead: [ + (pageData) => { + const isRealFile = pageData.filePath !== void 0; + let userDefinedOgImagePath = pageData.frontmatter?.socialImage; + if (userDefinedOgImagePath) { + userDefinedOgImagePath = isAbsoluteURL(userDefinedOgImagePath) ? userDefinedOgImagePath : `https://${baseUrl}/static/${userDefinedOgImagePath}`; + } + const generatedOgImagePath = isRealFile ? `https://${baseUrl}/${pageData.slug}-og-image.webp` : void 0; + const defaultOgImagePath = `https://${baseUrl}/static/og-image.png`; + const ogImagePath = userDefinedOgImagePath ?? generatedOgImagePath ?? defaultOgImagePath; + const ogImageMimeType = `image/${getFileExtension(ogImagePath) ?? "png"}`; + return /* @__PURE__ */ jsxs(Fragment, { children: [ + !userDefinedOgImagePath && /* @__PURE__ */ jsxs(Fragment, { children: [ + /* @__PURE__ */ jsx("meta", { property: "og:image:width", content: fullOptions.width.toString() }), + /* @__PURE__ */ jsx("meta", { property: "og:image:height", content: fullOptions.height.toString() }) + ] }), + /* @__PURE__ */ jsx("meta", { property: "og:image", content: ogImagePath }), + /* @__PURE__ */ jsx("meta", { property: "og:image:url", content: ogImagePath }), + /* @__PURE__ */ jsx("meta", { name: "twitter:image", content: ogImagePath }), + /* @__PURE__ */ jsx("meta", { property: "og:image:type", content: ogImageMimeType }) + ] }); + } + ] + }; + } + }; +}; + +export { CustomOgImages, CustomOgImagesEmitterName }; +//# sourceMappingURL=index.js.map +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map new file mode 100644 index 0000000..d443405 --- /dev/null +++ b/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/theme.ts","../src/emoji.ts","../src/emitter.tsx"],"names":["path","fs"],"mappings":"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","file":"index.js","sourcesContent":["export interface ColorScheme {\n light: string;\n lightgray: string;\n gray: string;\n darkgray: string;\n dark: string;\n secondary: string;\n tertiary: string;\n highlight: string;\n textHighlight: string;\n}\n\ninterface Colors {\n lightMode: ColorScheme;\n darkMode: ColorScheme;\n}\n\nexport type FontSpecification =\n | string\n | {\n name: string;\n weights?: number[];\n includeItalic?: boolean;\n };\n\nexport interface Theme {\n typography: {\n title?: FontSpecification;\n header: FontSpecification;\n body: FontSpecification;\n code: FontSpecification;\n };\n cdnCaching: boolean;\n colors: Colors;\n fontOrigin: \"googleFonts\" | \"local\";\n}\n\nexport type ThemeKey = keyof Colors;\n\nexport function getFontSpecificationName(spec: FontSpecification): string {\n if (typeof spec === \"string\") {\n return spec;\n }\n return spec.name;\n}\n","const U200D = String.fromCharCode(8205);\nconst UFE0Fg = /\\uFE0F/g;\n\nexport function getIconCode(char: string) {\n return toCodePoint(char.indexOf(U200D) < 0 ? char.replace(UFE0Fg, \"\") : char);\n}\n\nfunction toCodePoint(unicodeSurrogates: string) {\n const r: string[] = [];\n let c = 0,\n p = 0,\n i = 0;\n\n while (i < unicodeSurrogates.length) {\n c = unicodeSurrogates.charCodeAt(i++);\n if (p) {\n r.push((65536 + ((p - 55296) << 10) + (c - 56320)).toString(16));\n p = 0;\n } else if (55296 <= c && c <= 56319) {\n p = c;\n } else {\n r.push(c.toString(16));\n }\n }\n return r.join(\"-\");\n}\n\ntype EmojiMap = {\n codePointToName: Record;\n nameToBase64: Record;\n};\n\nlet emojimap: EmojiMap | undefined = undefined;\nexport async function loadEmoji(code: string) {\n if (!emojimap) {\n const path = await import(\"node:path\");\n const fs = await import(\"node:fs/promises\");\n const mapPath = path.join(\"quartz\", \"util\", \"emojimap.json\");\n const data = JSON.parse(await fs.readFile(mapPath, \"utf-8\"));\n emojimap = data;\n }\n\n const name = emojimap!.codePointToName[`${code.toUpperCase()}`];\n if (!name) throw new Error(`codepoint ${code} not found in map`);\n\n const b64 = emojimap!.nameToBase64[name];\n if (!b64) throw new Error(`name ${name} not found in map`);\n\n return b64;\n}\n","import path from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport type { Readable } from \"node:stream\";\nimport { styleText } from \"node:util\";\nimport satori, { type FontWeight, type SatoriOptions } from \"satori\";\nimport sharp from \"sharp\";\nimport readingTime from \"reading-time\";\nimport type {\n QuartzEmitterPlugin,\n BuildCtx,\n FilePath,\n FullSlug,\n GlobalConfiguration,\n} from \"@quartz-community/types\";\nimport { joinSegments } from \"@quartz-community/types\";\nimport { unescapeHTML } from \"@quartz-community/utils\";\nimport type { JSX } from \"preact\";\nimport {\n type FontSpecification,\n type Theme,\n type ThemeKey,\n getFontSpecificationName,\n} from \"./theme.js\";\nimport { loadEmoji, getIconCode } from \"./emoji.js\";\n\nconst QUARTZ = \"quartz\";\n\ntype Frontmatter = {\n title?: string;\n description?: string;\n socialDescription?: string;\n socialImage?: string;\n tags?: string[];\n} & Record;\n\ntype QuartzPluginData = {\n slug?: FullSlug;\n frontmatter?: Frontmatter;\n description?: string;\n text?: string;\n filePath?: string;\n dates?: Record;\n};\n\nconst defaultHeaderWeight = [700];\nconst defaultBodyWeight = [400];\n\nconst write = async (args: {\n ctx: BuildCtx;\n content: string | Buffer | Readable;\n slug: FullSlug;\n ext: string;\n}): Promise => {\n const pathToPage = joinSegments(args.ctx.argv.output, args.slug + args.ext) as FilePath;\n const dir = path.dirname(pathToPage);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(pathToPage, args.content);\n return pathToPage;\n};\n\nfunction getFileExtension(path: string): string | undefined {\n return path.match(/\\.([^./?#]+)(?:[?#]|$)/)?.[1];\n}\n\nfunction isAbsoluteURL(url: string): boolean {\n return /^https?:\\/\\//.test(url);\n}\n\nfunction getDate(cfg: GlobalConfiguration, data: Record): Date | undefined {\n return (data.dates as Record | undefined)?.[cfg.defaultDateType ?? \"modified\"];\n}\n\nfunction formatDate(d: Date, locale: string = \"en-US\"): string {\n return d.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"2-digit\",\n });\n}\n\nexport async function getSatoriFonts(headerFont: FontSpecification, bodyFont: FontSpecification) {\n const headerWeights: FontWeight[] = (\n typeof headerFont === \"string\"\n ? defaultHeaderWeight\n : (headerFont.weights ?? defaultHeaderWeight)\n ) as FontWeight[];\n const bodyWeights: FontWeight[] = (\n typeof bodyFont === \"string\" ? defaultBodyWeight : (bodyFont.weights ?? defaultBodyWeight)\n ) as FontWeight[];\n\n const headerFontName = typeof headerFont === \"string\" ? headerFont : headerFont.name;\n const bodyFontName = typeof bodyFont === \"string\" ? bodyFont : bodyFont.name;\n\n const headerFontPromises = headerWeights.map(async (weight) => {\n const data = await fetchTtf(headerFontName, weight);\n if (!data) return null;\n return {\n name: headerFontName,\n data,\n weight,\n style: \"normal\" as const,\n };\n });\n\n const bodyFontPromises = bodyWeights.map(async (weight) => {\n const data = await fetchTtf(bodyFontName, weight);\n if (!data) return null;\n return {\n name: bodyFontName,\n data,\n weight,\n style: \"normal\" as const,\n };\n });\n\n const [headerFonts, bodyFonts] = await Promise.all([\n Promise.all(headerFontPromises),\n Promise.all(bodyFontPromises),\n ]);\n\n const fonts: SatoriOptions[\"fonts\"] = [\n ...headerFonts.filter((font): font is NonNullable => font !== null),\n ...bodyFonts.filter((font): font is NonNullable => font !== null),\n ];\n\n return fonts;\n}\n\nexport async function fetchTtf(\n rawFontName: string,\n weight: FontWeight,\n): Promise {\n const fontName = rawFontName.replaceAll(\" \", \"+\");\n const cacheKey = `${fontName}-${weight}`;\n const cacheDir = path.join(QUARTZ, \".quartz-cache\", \"fonts\");\n const cachePath = path.join(cacheDir, cacheKey);\n\n try {\n await fs.access(cachePath);\n return fs.readFile(cachePath);\n } catch {\n /* file not cached, will fetch below */\n }\n\n const cssResponse = await fetch(\n `https://fonts.googleapis.com/css2?family=${fontName}:wght@${weight}`,\n );\n const css = await cssResponse.text();\n\n const urlRegex = /url\\((https:\\/\\/fonts.gstatic.com\\/s\\/.*?.ttf)\\)/g;\n const match = urlRegex.exec(css);\n\n if (!match) {\n console.log(\n styleText(\n \"yellow\",\n `\\nWarning: Failed to fetch font ${rawFontName} with weight ${weight}, got ${cssResponse.statusText}`,\n ),\n );\n return;\n }\n\n const fontUrl = match[1];\n if (!fontUrl) {\n return;\n }\n const fontResponse = await fetch(fontUrl);\n const fontData = Buffer.from(await fontResponse.arrayBuffer());\n await fs.mkdir(cacheDir, { recursive: true });\n await fs.writeFile(cachePath, fontData);\n\n return fontData;\n}\n\nexport type SocialImageOptions = {\n colorScheme: ThemeKey;\n height: number;\n width: number;\n excludeRoot: boolean;\n defaultTitle?: string;\n defaultDescription?: string;\n readingTimeText?: (minutes: number) => string;\n imageStructure: (\n options: ImageOptions & {\n userOpts: UserOpts;\n iconBase64?: string;\n },\n ) => JSX.Element;\n};\n\nexport type UserOpts = Omit;\n\nexport type ImageOptions = {\n title: string;\n description: string;\n fonts: SatoriOptions[\"fonts\"];\n cfg: GlobalConfiguration;\n fileData: QuartzPluginData;\n};\n\nexport const defaultImage: SocialImageOptions[\"imageStructure\"] = ({\n cfg,\n userOpts,\n title,\n description,\n fileData,\n iconBase64,\n}) => {\n const { colorScheme } = userOpts;\n const theme = cfg.theme as Theme;\n const fontBreakPoint = 32;\n const useSmallerFont = title.length > fontBreakPoint;\n\n const rawDate = getDate(cfg, fileData);\n const date = rawDate ? formatDate(rawDate, cfg.locale) : null;\n\n const { minutes } = readingTime(fileData.text ?? \"\");\n const readingTimeText = (userOpts.readingTimeText ?? ((time) => `${time} min read`))(\n Math.ceil(minutes),\n );\n\n const tags = fileData.frontmatter?.tags ?? [];\n const bodyFont = getFontSpecificationName(theme.typography.body);\n const headerFont = getFontSpecificationName(theme.typography.header);\n\n return (\n \n \n {iconBase64 && (\n \n )}\n \n {cfg.baseUrl}\n \n \n\n \n \n {title}\n \n \n\n \n \n {description}\n

\n \n\n \n \n {date && (\n
\n \n \n \n \n \n \n {date}\n
\n )}\n
\n \n \n \n \n {readingTimeText}\n
\n \n\n \n {tags.slice(0, 3).map((tag) => (\n \n #{tag}\n \n ))}\n \n \n \n );\n};\n\nconst defaultOptions: SocialImageOptions = {\n colorScheme: \"lightMode\",\n width: 1200,\n height: 630,\n imageStructure: defaultImage,\n excludeRoot: false,\n defaultTitle: \"Untitled\",\n defaultDescription: \"No description provided\",\n readingTimeText: (minutes) => `${minutes} min read`,\n};\n\nasync function generateSocialImage(\n { cfg, description, fonts, title, fileData }: ImageOptions,\n userOpts: SocialImageOptions,\n): Promise {\n const { width, height } = userOpts;\n const iconPath = joinSegments(QUARTZ, \"static\", \"icon.png\");\n let iconBase64: string | undefined = undefined;\n\n try {\n const iconData = await fs.readFile(iconPath);\n iconBase64 = `data:image/png;base64,${iconData.toString(\"base64\")}`;\n } catch {\n console.warn(styleText(\"yellow\", `Warning: Could not find icon at ${iconPath}`));\n }\n\n const imageComponent = userOpts.imageStructure({\n cfg,\n userOpts,\n title,\n description,\n fonts,\n fileData,\n iconBase64,\n });\n\n const svg = await satori(imageComponent as Parameters[0], {\n width,\n height,\n fonts,\n loadAdditionalAsset: async (languageCode: string, segment: string) => {\n if (languageCode === \"emoji\") {\n return await loadEmoji(getIconCode(segment));\n }\n\n return languageCode;\n },\n });\n\n return sharp(Buffer.from(svg)).webp({ quality: 40 });\n}\n\nasync function processOgImage(\n ctx: BuildCtx,\n fileData: QuartzPluginData,\n fonts: SatoriOptions[\"fonts\"],\n fullOptions: SocialImageOptions,\n) {\n const cfg = ctx.cfg.configuration;\n const slug = fileData.slug!;\n const titleSuffix = cfg.pageTitleSuffix ?? \"\";\n const frontmatter = fileData.frontmatter;\n const title = (frontmatter?.title ?? fullOptions.defaultTitle ?? \"\") + titleSuffix;\n const description =\n frontmatter?.socialDescription ??\n frontmatter?.description ??\n unescapeHTML(fileData.description?.trim() ?? fullOptions.defaultDescription ?? \"\");\n\n const stream = await generateSocialImage(\n {\n title,\n description,\n fonts,\n cfg,\n fileData,\n },\n fullOptions,\n );\n\n return write({\n ctx,\n content: stream,\n slug: `${slug}-og-image` as FullSlug,\n ext: \".webp\",\n });\n}\n\nexport const CustomOgImagesEmitterName = \"CustomOgImages\";\nexport const CustomOgImages: QuartzEmitterPlugin> = (userOpts) => {\n const fullOptions = { ...defaultOptions, ...userOpts };\n\n return {\n name: CustomOgImagesEmitterName,\n getQuartzComponents() {\n return [];\n },\n async *emit(ctx, content, _resources) {\n const cfg = ctx.cfg.configuration;\n const theme = cfg.theme as Theme;\n const headerFont = theme.typography.header;\n const bodyFont = theme.typography.body;\n const fonts = await getSatoriFonts(headerFont, bodyFont);\n\n for (const [_tree, vfile] of content) {\n const data = vfile.data as QuartzPluginData;\n if (data.frontmatter?.socialImage !== undefined) continue;\n yield processOgImage(ctx, data, fonts, fullOptions);\n }\n },\n async *partialEmit(ctx, _content, _resources, changeEvents) {\n const cfg = ctx.cfg.configuration;\n const theme = cfg.theme as Theme;\n const headerFont = theme.typography.header;\n const bodyFont = theme.typography.body;\n const fonts = await getSatoriFonts(headerFont, bodyFont);\n\n for (const changeEvent of changeEvents) {\n if (!changeEvent.file) continue;\n const data = changeEvent.file.data as QuartzPluginData;\n if (data.frontmatter?.socialImage !== undefined) continue;\n if (changeEvent.type === \"add\" || changeEvent.type === \"change\") {\n yield processOgImage(ctx, data, fonts, fullOptions);\n }\n }\n },\n externalResources: (ctx) => {\n if (!ctx.cfg.configuration.baseUrl) {\n return {};\n }\n\n const baseUrl = ctx.cfg.configuration.baseUrl;\n return {\n additionalHead: [\n (pageData: QuartzPluginData) => {\n const isRealFile = pageData.filePath !== undefined;\n let userDefinedOgImagePath = pageData.frontmatter?.socialImage;\n\n if (userDefinedOgImagePath) {\n userDefinedOgImagePath = isAbsoluteURL(userDefinedOgImagePath)\n ? userDefinedOgImagePath\n : `https://${baseUrl}/static/${userDefinedOgImagePath}`;\n }\n\n const generatedOgImagePath = isRealFile\n ? `https://${baseUrl}/${pageData.slug!}-og-image.webp`\n : undefined;\n const defaultOgImagePath = `https://${baseUrl}/static/og-image.png`;\n const ogImagePath =\n userDefinedOgImagePath ?? generatedOgImagePath ?? defaultOgImagePath;\n const ogImageMimeType = `image/${getFileExtension(ogImagePath) ?? \"png\"}`;\n return (\n <>\n {!userDefinedOgImagePath && (\n <>\n \n \n \n )}\n \n \n \n \n \n );\n },\n ],\n };\n },\n };\n};\n"]} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4d101c2..101025c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,13 +10,7 @@ "license": "MIT", "dependencies": { "@quartz-community/types": "github:quartz-community/types", - "@quartz-community/utils": "github:quartz-community/utils", - "reading-time": "^1.5.0", - "satori": "^0.12.0", - "sharp": "^0.33.0", - "tsup": "^8.5.0", - "typescript": "^5.9.3", - "vfile": "^6.0.3" + "@quartz-community/utils": "github:quartz-community/utils" }, "devDependencies": { "@types/hast": "^3.0.4", @@ -28,6 +22,8 @@ "eslint-config-prettier": "^9.1.0", "preact": "^10.28.2", "prettier": "^3.6.2", + "tsup": "^8.5.0", + "typescript": "^5.9.3", "vitest": "^2.1.9" }, "engines": { @@ -36,7 +32,11 @@ }, "peerDependencies": { "@jackyzha0/quartz": "^4.5.2", - "preact": "^10.0.0" + "preact": "^10.0.0", + "reading-time": "^1.5.0", + "satori": "^0.12.0", + "sharp": "^0.33.0", + "vfile": "^6.0.3" }, "peerDependenciesMeta": { "@jackyzha0/quartz": { @@ -44,19 +44,21 @@ }, "preact": { "optional": false + }, + "reading-time": { + "optional": true + }, + "satori": { + "optional": true + }, + "sharp": { + "optional": true + }, + "vfile": { + "optional": true } } }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", @@ -622,367 +624,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.2.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -1417,22 +1058,6 @@ "win32" ] }, - "node_modules/@shuding/opentype.js": { - "version": "1.4.0-beta.0", - "resolved": "https://registry.npmjs.org/@shuding/opentype.js/-/opentype.js-1.4.0-beta.0.tgz", - "integrity": "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==", - "license": "MIT", - "dependencies": { - "fflate": "^0.7.3", - "string.prototype.codepointat": "^0.2.1" - }, - "bin": { - "ot": "bin/ot" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -1942,15 +1567,6 @@ "dev": true, "license": "MIT" }, - "node_modules/base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -2008,15 +1624,6 @@ "node": ">=6" } }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -2126,23 +1733,11 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -2155,18 +1750,9 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -2223,47 +1809,6 @@ "node": ">= 8" } }, - "node_modules/css-background-parser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/css-background-parser/-/css-background-parser-0.1.0.tgz", - "integrity": "sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==", - "license": "MIT" - }, - "node_modules/css-box-shadow": { - "version": "1.0.0-3", - "resolved": "https://registry.npmjs.org/css-box-shadow/-/css-box-shadow-1.0.0-3.tgz", - "integrity": "sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==", - "license": "MIT" - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-gradient-parser": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/css-gradient-parser/-/css-gradient-parser-0.0.16.tgz", - "integrity": "sha512-3O5QdqgFRUbXvK1x5INf1YkBz1UKSWqrd63vWsum8MNHDBYD5urm3QtxZbKU259OrEXNM26lP/MPY3d1IGkBgA==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "license": "MIT", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -2320,15 +1865,6 @@ "node": ">=6" } }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -2368,12 +1904,6 @@ "node": ">=6.0.0" } }, - "node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, "node_modules/es-module-lexer": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", @@ -2423,12 +1953,6 @@ "@esbuild/win32-x64": "0.27.3" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2728,12 +2252,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fflate": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", - "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==", - "license": "MIT" - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -2990,18 +2508,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hex-rgb": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-4.3.0.tgz", - "integrity": "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3088,12 +2594,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "license": "MIT" - }, "node_modules/is-decimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", @@ -3255,16 +2755,6 @@ "url": "https://github.com/sponsors/antonk52" } }, - "node_modules/linebreak": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", - "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", - "license": "MIT", - "dependencies": { - "base64-js": "0.0.8", - "unicode-trie": "^2.0.0" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -4067,12 +3557,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "license": "MIT" - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4086,16 +3570,6 @@ "node": ">=6" } }, - "node_modules/parse-css-color": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/parse-css-color/-/parse-css-color-0.2.1.tgz", - "integrity": "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.1.4", - "hex-rgb": "^4.1.0" - } - }, "node_modules/parse-entities": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", @@ -4236,7 +3710,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -4288,12 +3761,6 @@ } } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, "node_modules/preact": { "version": "10.28.3", "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.3.tgz", @@ -4385,12 +3852,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/reading-time": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==", - "license": "MIT" - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -4497,32 +3958,11 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/satori": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/satori/-/satori-0.12.2.tgz", - "integrity": "sha512-3C/laIeE6UUe9A+iQ0A48ywPVCCMKCNSTU5Os101Vhgsjd3AAxGNjyq0uAA8kulMPK5n0csn8JlxPN9riXEjLA==", - "license": "MPL-2.0", - "dependencies": { - "@shuding/opentype.js": "1.4.0-beta.0", - "css-background-parser": "^0.1.0", - "css-box-shadow": "1.0.0-3", - "css-gradient-parser": "^0.0.16", - "css-to-react-native": "^3.0.0", - "emoji-regex": "^10.2.1", - "escape-html": "^1.0.3", - "linebreak": "^1.1.0", - "parse-css-color": "^0.2.1", - "postcss-value-parser": "^4.2.0", - "yoga-wasm-web": "^0.3.3" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4531,45 +3971,6 @@ "node": ">=10" } }, - "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4600,15 +4001,6 @@ "dev": true, "license": "ISC" }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -4662,12 +4054,6 @@ "dev": true, "license": "MIT" }, - "node_modules/string.prototype.codepointat": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", - "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==", - "license": "MIT" - }, "node_modules/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", @@ -4789,12 +4175,6 @@ "node": ">=0.8" } }, - "node_modules/tiny-inflate": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", - "license": "MIT" - }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -4935,13 +4315,6 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "license": "Apache-2.0" }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true - }, "node_modules/tsup": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", @@ -5056,16 +4429,6 @@ "dev": true, "license": "MIT" }, - "node_modules/unicode-trie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", - "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", - "license": "MIT", - "dependencies": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" - } - }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", @@ -5848,12 +5211,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yoga-wasm-web": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/yoga-wasm-web/-/yoga-wasm-web-0.3.3.tgz", - "integrity": "sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==", - "license": "MIT" - }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/package.json b/package.json index cdbb16c..87e2da2 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,6 @@ "sideEffects": false, "scripts": { "build": "tsup", - "prepare": "npm run build", "dev": "tsup --watch", "lint": "eslint . --max-warnings=0", "format": "prettier . --check",