diff --git a/astro.config.ts b/astro.config.ts index 434d125..571c185 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -7,6 +7,7 @@ import rehypeExternalLinks from 'rehype-external-links'; import rehypeSlug from 'rehype-slug'; import options from './options'; import { astroImage } from './plugins/images'; +import { openGraph } from './plugins/open-graph'; // https://astro.build/config export default defineConfig({ @@ -37,6 +38,8 @@ export default defineConfig({ ARTALK_PORT: envField.number({ context: 'server', access: 'secret' }), // Build the Open Graph BUILD_OPEN_GRAPH: envField.boolean({ context: 'server', access: 'public', default: true }), + // Upload the files + UPLOAD_STATIC_FILES: envField.boolean({ context: 'server', access: 'public', default: false }), }, validateSecrets: true, }, @@ -51,12 +54,19 @@ export default defineConfig({ ], }), uploader({ - paths: ['images', 'assets'], + enable: + process.env.BUILD_OPEN_GRAPH === undefined || + process.env.BUILD_OPEN_GRAPH === 'true' || + process.env.UPLOAD_STATIC_FILES === 'true', + paths: [{ path: 'images', recursive: true, keep: false, override: false }, 'assets'], + recursive: true, + keep: false, endpoint: process.env.S3_ENDPOINT, bucket: process.env.S3_BUCKET as string, accessKey: process.env.S3_ACCESS_KEY as string, secretAccessKey: process.env.S3_SECRET_ACCESS_KEY as string, }), + openGraph(), ], adapter: zeabur(), markdown: { diff --git a/package-lock.json b/package-lock.json index 5227e4a..aa85533 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "fuse.js": "^7.0.0", "lodash": "^4.17.21", "luxon": "^3.5.0", - "marked": "^15.0.2", + "marked": "^15.0.3", "pg": "^8.13.1", "pinyin-pro": "^3.26.0", "qrcode-svg": "^1.1.0", @@ -35,7 +35,7 @@ "@types/qrcode-svg": "^1.1.5", "@types/unist": "^3.0.3", "aplayer": "^1.10.1", - "astro-uploader": "^1.1.3", + "astro-uploader": "^1.2.1", "bootstrap": "^5.3.3", "prettier": "^3.4.1", "prettier-plugin-astro": "^0.14.1", @@ -2058,17 +2058,6 @@ "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", "license": "MIT" }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2969,88 +2958,15 @@ } }, "node_modules/astro-uploader": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/astro-uploader/-/astro-uploader-1.1.3.tgz", - "integrity": "sha512-Ij5IJj1J2Fb/Ik8RcQ2kaaOIFxvWQmfE4zrAUjIpg/RvH9sb9LpsgRRkqUkPRDxhlzNCguwo6awjrdcdnOwcRQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/astro-uploader/-/astro-uploader-1.2.1.tgz", + "integrity": "sha512-H7XXuBc5qwUXL4YlZv7K9oixrZAMbhbMdbyb6Wjhd6d+3Zb/2zS3zTuMXAPOQRthOiSVcI+Dsiq4sU9u7Al9SQ==", "dev": true, "license": "MIT", "dependencies": { "mime": "^4.0.4", - "opendal": "^0.47.0", - "rimraf": "^5.0.8" - } - }, - "node_modules/astro-uploader/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/astro-uploader/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/astro-uploader/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/astro-uploader/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/astro-uploader/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "opendal": "^0.47.7", + "rimraf": "^6.0.1" } }, "node_modules/astro/node_modules/@rollup/pluginutils": { @@ -5089,19 +5005,19 @@ "license": "ISC" }, "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/js-tokens": { @@ -5356,9 +5272,9 @@ } }, "node_modules/marked": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.2.tgz", - "integrity": "sha512-85RUkoYKIVB21PbMKrnD6aCl9ws+XKEyhJNMbLn206NyD3jbBo7Ec7Wi4Jrsn4dV1a2ng7K/jfkmIN0DNoS41w==", + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.3.tgz", + "integrity": "sha512-Ai0cepvl2NHnTcO9jYDtcOEtVBNVYR31XnEA3BndO7f5As1wzpcOceSUM8FDkNLJNIODcLpDTWay/qQhqbuMvg==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -6940,28 +6856,41 @@ } }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", "dev": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } }, "node_modules/pg": { "version": "8.13.1", @@ -7944,32 +7873,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/jackspeak": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", - "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/lru-cache": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", - "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, "node_modules/rimraf/node_modules/minimatch": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", @@ -7996,23 +7899,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/rimraf/node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { "version": "4.27.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz", diff --git a/package.json b/package.json index 469fc9d..b4cfefd 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "fuse.js": "^7.0.0", "lodash": "^4.17.21", "luxon": "^3.5.0", - "marked": "^15.0.2", + "marked": "^15.0.3", "pg": "^8.13.1", "pinyin-pro": "^3.26.0", "qrcode-svg": "^1.1.0", @@ -68,7 +68,7 @@ "@types/qrcode-svg": "^1.1.5", "@types/unist": "^3.0.3", "aplayer": "^1.10.1", - "astro-uploader": "^1.1.3", + "astro-uploader": "^1.2.1", "bootstrap": "^5.3.3", "prettier": "^3.4.1", "prettier-plugin-astro": "^0.14.1", diff --git a/plugins/open-graph.ts b/plugins/open-graph.ts new file mode 100644 index 0000000..db101bc --- /dev/null +++ b/plugins/open-graph.ts @@ -0,0 +1,12 @@ +import type { AstroIntegration, RouteOptions } from 'astro'; + +export const openGraph = (): AstroIntegration => ({ + name: 'Open Graph Generator', + hooks: { + 'astro:route:setup': (options: { route: RouteOptions }) => { + if (options.route.component === 'src/pages/images/og/[slug].png.ts') { + options.route.prerender = process.env.BUILD_OPEN_GRAPH === undefined || process.env.BUILD_OPEN_GRAPH === 'true'; + } + }, + }, +}); diff --git a/src/pages/images/og/[slug].png.ts b/src/pages/images/og/[slug].png.ts index 8dfc2bb..871b7f6 100644 --- a/src/pages/images/og/[slug].png.ts +++ b/src/pages/images/og/[slug].png.ts @@ -7,9 +7,6 @@ const fallback = async () => headers: { 'Content-Type': 'image/png' }, }); -// This endpoint can be controlled by using environment variable. -export const prerender = import.meta.env.BUILD_OPEN_GRAPH; - export const GET: APIRoute = async ({ params }) => { const slug = params.slug; if (!slug) {