diff --git a/package.json b/package.json index 04a4de544..a2718e05b 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "@astrojs/sitemap": "3.6.0", "@astrojs/tailwind": "6.0.2", "@astrojs/vercel": "8.2.10", + "@bearstudio/astro-dynamic-assets": "0.1.0", "@bearstudio/astro-typed-routes": "0.1.3", "@bearstudio/lunalink": "0.3.1", "@fontsource-variable/inter": "5.2.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9c92e56b..e53a34575 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,6 +29,9 @@ importers: '@astrojs/vercel': specifier: 8.2.10 version: 8.2.10(astro@5.14.5(@types/node@24.7.2)(@vercel/functions@2.2.13)(jiti@2.4.2)(lightningcss@1.29.1)(rollup@4.52.4)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1))(react@18.3.1)(rollup@4.52.4) + '@bearstudio/astro-dynamic-assets': + specifier: 0.1.0 + version: 0.1.0(@types/node@24.7.2)(@vercel/functions@2.2.13)(jiti@2.4.2)(lightningcss@1.29.1)(rollup@4.52.4)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1) '@bearstudio/astro-typed-routes': specifier: 0.1.3 version: 0.1.3 @@ -432,6 +435,9 @@ packages: resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} + '@bearstudio/astro-dynamic-assets@0.1.0': + resolution: {integrity: sha512-jMrmRxs89OxVTVLg7wXVxVrtp/DZ2D/6Yk4Q405fYwZCi5HIixqvqHbaQAA6idqTWFvMXYR68KEWWP4/8SL6Lw==} + '@bearstudio/astro-typed-routes@0.1.3': resolution: {integrity: sha512-6g6SJmhPF6OPHSLAXrvxD7RqQEE1Cys++LwXejeYQDf4+rtSjNPuFxUD3rT5Wxe4s2C9cux6z74vd5Vu6OT4RQ==} @@ -2069,6 +2075,11 @@ packages: engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true + astro@5.14.7: + resolution: {integrity: sha512-vdZmRN2MFf60ZTjFkZNrQQkrmeeZzTI1c6N3ZRQN55rPGHjywM2VplJwJ68q496DfpaoDoAroDBpdm+eTgHUtQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + astrobook@0.9.0: resolution: {integrity: sha512-DM27cK9Kz3YIdHkuL+42LPjHUFLQyzWia/Vg868k1pmFgOXNA09NiC48DDkmWp3SsK09zzNQYNb2WaNGfDUs+w==} peerDependencies: @@ -3572,6 +3583,11 @@ packages: peerDependencies: react: ^18.3.1 + react-dom@19.2.0: + resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} + peerDependencies: + react: ^19.2.0 + react-icons@5.5.0: resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} peerDependencies: @@ -3615,6 +3631,10 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + engines: {node: '>=0.10.0'} + read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -3775,6 +3795,9 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + schema-dts@1.1.5: resolution: {integrity: sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==} @@ -4955,6 +4978,49 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@bearstudio/astro-dynamic-assets@0.1.0(@types/node@24.7.2)(@vercel/functions@2.2.13)(jiti@2.4.2)(lightningcss@1.29.1)(rollup@4.52.4)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1)': + dependencies: + astro: 5.14.7(@types/node@24.7.2)(@vercel/functions@2.2.13)(jiti@2.4.2)(lightningcss@1.29.1)(rollup@4.52.4)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + satori: 0.18.3 + sharp: 0.34.4 + ts-pattern: 5.8.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - yaml + '@bearstudio/astro-typed-routes@0.1.3': {} '@bearstudio/lunalink@0.3.1': @@ -6691,6 +6757,107 @@ snapshots: - uploadthing - yaml + astro@5.14.7(@types/node@24.7.2)(@vercel/functions@2.2.13)(jiti@2.4.2)(lightningcss@1.29.1)(rollup@4.52.4)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1): + dependencies: + '@astrojs/compiler': 2.13.0 + '@astrojs/internal-helpers': 0.7.4 + '@astrojs/markdown-remark': 6.3.8 + '@astrojs/telemetry': 3.3.0 + '@capsizecss/unpack': 3.0.0 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.3.0(rollup@4.52.4) + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + boxen: 8.0.1 + ci-info: 4.3.1 + clsx: 2.1.1 + common-ancestor-path: 1.0.1 + cookie: 1.0.2 + cssesc: 3.0.0 + debug: 4.4.3 + deterministic-object-hash: 2.0.2 + devalue: 5.3.2 + diff: 5.2.0 + dlv: 1.1.3 + dset: 3.1.4 + es-module-lexer: 1.7.0 + esbuild: 0.25.10 + estree-walker: 3.0.3 + flattie: 1.1.1 + fontace: 0.3.1 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.2.0 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.19 + magicast: 0.3.5 + mrmime: 2.0.1 + neotraverse: 0.6.18 + p-limit: 6.2.0 + p-queue: 8.1.1 + package-manager-detector: 1.4.0 + picomatch: 4.0.3 + prompts: 2.4.2 + rehype: 13.0.2 + semver: 7.7.3 + shiki: 3.13.0 + smol-toml: 1.4.2 + tinyexec: 1.0.1 + tinyglobby: 0.2.15 + tsconfck: 3.1.6(typescript@5.9.2) + ultrahtml: 1.6.0 + unifont: 0.6.0 + unist-util-visit: 5.0.0 + unstorage: 1.17.1(@vercel/functions@2.2.13) + vfile: 6.0.3 + vite: 6.3.7(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(tsx@4.20.5)(yaml@2.8.1) + vitefu: 1.1.1(vite@6.3.7(@types/node@24.7.2)(jiti@2.4.2)(lightningcss@1.29.1)(tsx@4.20.5)(yaml@2.8.1)) + xxhash-wasm: 1.1.0 + yargs-parser: 21.1.1 + yocto-spinner: 0.2.3 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + zod-to-ts: 1.2.0(typescript@5.9.2)(zod@3.25.76) + optionalDependencies: + sharp: 0.34.4 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - yaml + astrobook@0.9.0(astro@5.14.5(@types/node@24.7.2)(@vercel/functions@2.2.13)(jiti@2.4.2)(lightningcss@1.29.1)(rollup@4.52.4)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1)): dependencies: '@astrobook/core': 0.9.0(astro@5.14.5(@types/node@24.7.2)(@vercel/functions@2.2.13)(jiti@2.4.2)(lightningcss@1.29.1)(rollup@4.52.4)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1)) @@ -8380,6 +8547,11 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 + react-dom@19.2.0(react@19.2.0): + dependencies: + react: 19.2.0 + scheduler: 0.27.0 + react-icons@5.5.0(react@18.3.1): dependencies: react: 18.3.1 @@ -8417,6 +8589,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + react@19.2.0: {} + read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -8705,6 +8879,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + scheduler@0.27.0: {} + schema-dts@1.1.5: {} semver@6.3.1: {} diff --git a/src/generated-assets/api.ts b/src/generated-assets/api.ts deleted file mode 100644 index 72cbdcf97..000000000 --- a/src/generated-assets/api.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { - DEBUG_HTML, - generateImageResponseHTML, - generateImageResponseJPG, - generateImageResponseSVG, - JPG, - SVG, -} from "@/generated-assets/image"; -import type { APIRoute } from "astro"; - -export class NotFoundAssetError extends Error { - constructor({ cause }: { cause?: unknown } = {}) { - super("Asset not found"); - this.cause = cause; - this.name = "NotFoundAssetError"; - } -} - -export const apiImageEndpoint: (modules: Record) => APIRoute = - (modules) => - async ({ params, site }) => { - try { - const files = Object.entries(modules); - - const content = files - .map(([path, file]) => { - return { - fileName: path - .split("/") - .at(-1) - ?.replace(/\.tsx$/, "") - .replace(/^_/, ""), - file, - }; - }) - .find(({ fileName }) => fileName === params.__image)?.file as any; - - const component = await content.default({ params, site }); - const config = content.config; - - if (params.__type === "debug") { - const html = await DEBUG_HTML(component, config); - return generateImageResponseHTML(html); - } - - if (params.__type === "jpg") { - const jpg = await JPG(component, config); - return generateImageResponseJPG(jpg); - } - - if (params.__type === "svg") { - const svg = await SVG(component, config); - return generateImageResponseSVG(svg); - } - - return new Response(null, { - status: 404, - statusText: "Not found", - }); - } catch (error) { - console.log(error); - if (error instanceof NotFoundAssetError) { - return new Response(null, { - status: 404, - statusText: error.message, - }); - } - return new Response("Failed to generate asset", { - status: 500, - }); - } - }; diff --git a/src/generated-assets/components/CfpCoverNoFlag.tsx b/src/generated-assets/components/CfpCoverNoFlag.tsx index d9fa0a745..aa89a9992 100644 --- a/src/generated-assets/components/CfpCoverNoFlag.tsx +++ b/src/generated-assets/components/CfpCoverNoFlag.tsx @@ -1,13 +1,10 @@ import { LogoIcon } from "@/components/LogoIcon"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { COLORS } from "@/generated-assets/theme"; import worldImage from "@/assets/images/world.png"; - +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const CfpCoverNoFlag = async (props: { config: AssetImageConfig }) => { - const noFlagImage = await getAstroImageBase64(worldImage); + const noFlagImage = await DynamicAssets.getAstroImageBase64(worldImage); return (
({ - ...font, - data: await match(import.meta.env.DEV) - .with(true, async () => await fs.readFile(`./public/${url}`)) - .with(false, async () => { - const res = await fetch(new URL(url, import.meta.env.SITE)); - - if (!res.ok) { - throw new Error(`Failed to fetch font: ${url}`); - } - return Buffer.from(await res.arrayBuffer()); - }) - .run(), - })), - ); - - return await satori(component, { - width: params.width, - height: params.height, - fonts, - }); -} - -export async function JPG(component: JSX.Element, params: AssetImageConfig) { - return await sharp(Buffer.from(await SVG(component, params))) - .jpeg() - .toBuffer(); -} - -export async function DEBUG_HTML( - component: JSX.Element, - params: AssetImageConfig, -) { - const html = renderToStaticMarkup(component); - return ` - - - Debug - - - -
-
- ${html} -
-
- - `; -} - -export async function generateImageResponseSVG(svg: string) { - return new Response(svg, { - headers: { - "Content-Type": "image/svg+xml", - }, - }); -} - -export async function generateImageResponseJPG(jpg: Buffer) { - return new Response(new Uint8Array(jpg), { - headers: { - "Content-Type": "image/jpeg", - }, - }); -} - -export async function generateImageResponseHTML(html: string) { - return new Response(html, { - headers: { - "Content-Type": "text/html; charset=utf-8", - }, - }); -} - -function getAstroImagePath(image: ImageMetadata) { - return import.meta.env.DEV - ? path.resolve(image.src.replace(/\?.*/, "").replace("/@fs", "")) - : image.src; -} - -async function getAstroImageBuffer(image: ImageMetadata) { - const fileExtension = RegExp(/.(jpg|jpeg|png)$/) - .exec(image.src)?.[0] - .slice(1); - const fileToRead = getAstroImagePath(image); - - return { - buffer: await match(import.meta.env.DEV || !import.meta.env.SSR) - .with(true, async () => await fs.readFile(fileToRead)) - .with(false, async () => { - const res = await fetch(new URL(fileToRead, import.meta.env.SITE)); - - if (!res.ok) { - throw new Error(`Failed to fetch image: ${fileToRead}`); - } - - return Buffer.from(await res.arrayBuffer()); - }) - .run(), - fileType: match(fileExtension) - .with("jpg", "jpeg", () => "jpeg") - .with("png", () => "png") - .otherwise(() => { - throw new Error(`Must be a jpg, jpeg or png`); - }), - }; -} - -export async function getAstroImageBase64(image: ImageMetadata) { - const { buffer, fileType } = await getAstroImageBuffer(image); - return imageBufferToBase64(buffer, fileType); -} - -export function imageBufferToBase64(buffer: Buffer, fileType: string) { - return `data:image/${fileType};base64, ${buffer.toString("base64")}`; -} - -export function getImageNameFromTsxPath(path: string) { - return path - .split("/") - .at(-1) - ?.replace(/\.tsx$/, "") - .replace(/^_/, ""); -} diff --git a/src/lib/astro-dynamic-assets.ts b/src/lib/astro-dynamic-assets.ts new file mode 100644 index 000000000..8dd69bbdc --- /dev/null +++ b/src/lib/astro-dynamic-assets.ts @@ -0,0 +1,26 @@ +import { astroDynamicAssets } from "@bearstudio/astro-dynamic-assets"; + +export default astroDynamicAssets({ + site: import.meta.env.SITE, + fonts: [ + { + name: "Tomorrow", + url: "/fonts/tomorrow/Tomorrow-Regular.ttf", + style: "normal", + weight: 400, + }, + { + name: "Tomorrow", + url: "/fonts/tomorrow/Tomorrow-Medium.ttf", + style: "normal", + weight: 500, + }, + { + name: "Tomorrow", + url: "/fonts/tomorrow/Tomorrow-Bold.ttf", + style: "normal", + weight: 700, + }, + ], + ssr: import.meta.env.SSR, +}); diff --git a/src/pages/events/[id]/assets/[__image].[__type].ts b/src/pages/events/[id]/assets/[__image].[__type].ts index 3da217be7..a6a637b68 100644 --- a/src/pages/events/[id]/assets/[__image].[__type].ts +++ b/src/pages/events/[id]/assets/[__image].[__type].ts @@ -1,8 +1,6 @@ -import { apiImageEndpoint } from "@/generated-assets/api"; -import type { APIRoute } from "astro"; - +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const prerender = false; -export const GET: APIRoute = apiImageEndpoint( +export const GET = DynamicAssets.apiImageEndpoint( import.meta.glob("./_*.tsx", { eager: true }), ); diff --git a/src/pages/events/[id]/assets/_cfp-cover.tsx b/src/pages/events/[id]/assets/_cfp-cover.tsx index ccfc3ddf1..e7aadfc86 100644 --- a/src/pages/events/[id]/assets/_cfp-cover.tsx +++ b/src/pages/events/[id]/assets/_cfp-cover.tsx @@ -1,13 +1,11 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { COLORS } from "@/generated-assets/theme"; import { getEventData } from "./_utils"; import { LogoIcon } from "@/components/LogoIcon"; import { CfpCoverNoFlag } from "@/generated-assets/components/CfpCoverNoFlag"; import { getCoverImage } from "@/lib/events"; +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1080, @@ -29,8 +27,8 @@ export default async function cfpCover({ params }: { params: { id: string } }) { ); } const cover = await getCoverImage("events", event.id); - const eventflag = await getAstroImageBase64(flag); - const postCover = await getAstroImageBase64(cover.media); + const eventflag = await DynamicAssets.getAstroImageBase64(flag); + const postCover = await DynamicAssets.getAstroImageBase64(cover.media); return ( diff --git a/src/pages/events/[id]/assets/_og-image.tsx b/src/pages/events/[id]/assets/_og-image.tsx index eb18af0ec..fdfe157a1 100644 --- a/src/pages/events/[id]/assets/_og-image.tsx +++ b/src/pages/events/[id]/assets/_og-image.tsx @@ -1,13 +1,11 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { BgImage } from "@/generated-assets/components/BgImage"; import { COLORS } from "@/generated-assets/theme"; import { Logo } from "@/components/Logo"; import { getEventDisplayDate, getEventDisplayType } from "@/lib/events"; import { getEventData } from "./_utils"; +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1920, @@ -16,7 +14,9 @@ export const config: AssetImageConfig = { export default async function ({ params }: { params: { id: string } }) { const event = await getEventData(params.id); - const postCover = await getAstroImageBase64(event.data.image.media); + const postCover = await DynamicAssets.getAstroImageBase64( + event.data.image.media, + ); return ( diff --git a/src/pages/events/[id]/assets/_qrcode-bg.tsx b/src/pages/events/[id]/assets/_qrcode-bg.tsx index 3e21e63c4..5234ae58f 100644 --- a/src/pages/events/[id]/assets/_qrcode-bg.tsx +++ b/src/pages/events/[id]/assets/_qrcode-bg.tsx @@ -1,9 +1,5 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - imageBufferToBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; + import { BgImage } from "@/generated-assets/components/BgImage"; import { COLORS } from "@/generated-assets/theme"; import { getEventData } from "./_utils"; @@ -11,7 +7,11 @@ import { lunalink } from "@bearstudio/lunalink"; import { ROUTES } from "@/routes.gen"; import QRCode from "qrcode"; import type { APIContext } from "astro"; - +import { + imageBufferToBase64, + type AssetImageConfig, +} from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1080, height: 1080, @@ -22,7 +22,9 @@ export default async function ({ site, }: { params: { id: string } } & APIContext) { const event = await getEventData(params.id); - const postCover = await getAstroImageBase64(event.data.image.media); + const postCover = await DynamicAssets.getAstroImageBase64( + event.data.image.media, + ); const url = new URL( lunalink(ROUTES.events[":id"].__path, { id: event.id }), site, diff --git a/src/pages/events/[id]/assets/_qrcode.tsx b/src/pages/events/[id]/assets/_qrcode.tsx index 1b7e513a9..efd88d471 100644 --- a/src/pages/events/[id]/assets/_qrcode.tsx +++ b/src/pages/events/[id]/assets/_qrcode.tsx @@ -1,14 +1,14 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - imageBufferToBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { COLORS } from "@/generated-assets/theme"; import { getEventData } from "./_utils"; import { lunalink } from "@bearstudio/lunalink"; import { ROUTES } from "@/routes.gen"; import QRCode from "qrcode"; import type { APIContext } from "astro"; +import { + imageBufferToBase64, + type AssetImageConfig, +} from "@bearstudio/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1080, diff --git a/src/pages/events/[id]/assets/_save-the-date-square.tsx b/src/pages/events/[id]/assets/_save-the-date-square.tsx index 330c17ad0..6fb95d2cb 100644 --- a/src/pages/events/[id]/assets/_save-the-date-square.tsx +++ b/src/pages/events/[id]/assets/_save-the-date-square.tsx @@ -1,4 +1,4 @@ -import { type AssetImageConfig } from "@/generated-assets/image"; +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; import { saveTheDate } from "./_save-the-date"; export const config: AssetImageConfig = { diff --git a/src/pages/events/[id]/assets/_save-the-date.tsx b/src/pages/events/[id]/assets/_save-the-date.tsx index 72eaadc82..6cf8bf3ef 100644 --- a/src/pages/events/[id]/assets/_save-the-date.tsx +++ b/src/pages/events/[id]/assets/_save-the-date.tsx @@ -1,14 +1,11 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { BgImage } from "@/generated-assets/components/BgImage"; import { COLORS } from "@/generated-assets/theme"; import { getEventDisplayDate, getEventDisplayType } from "@/lib/events"; import { getEventData } from "./_utils"; import { LogoWithFriends } from "@/generated-assets/components/LogoWithFriends"; - +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1920, height: 1080, @@ -17,11 +14,15 @@ export const config: AssetImageConfig = { export function saveTheDate(options: { width: number; height: number }) { return async ({ params }: { params: { id: string } }) => { const event = await getEventData(params.id); - const postCover = await getAstroImageBase64(event.data.image.media); + const postCover = await DynamicAssets.getAstroImageBase64( + event.data.image.media, + ); const coOrganizersLogos = await Promise.all( event.__coOrganizers.map( async (coOrganiser) => - await getAstroImageBase64(coOrganiser.data.logos.noBgSquare), + await DynamicAssets.getAstroImageBase64( + coOrganiser.data.logos.noBgSquare, + ), ), ); diff --git a/src/pages/events/[id]/assets/_tickets-available-square.tsx b/src/pages/events/[id]/assets/_tickets-available-square.tsx index 7dd3a75bf..9cf569fd8 100644 --- a/src/pages/events/[id]/assets/_tickets-available-square.tsx +++ b/src/pages/events/[id]/assets/_tickets-available-square.tsx @@ -1,4 +1,4 @@ -import { type AssetImageConfig } from "@/generated-assets/image"; +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; import { ticketsAvailable } from "./_tickets-available"; export const config: AssetImageConfig = { diff --git a/src/pages/events/[id]/assets/_tickets-available.tsx b/src/pages/events/[id]/assets/_tickets-available.tsx index 97d49739d..d025f97e0 100644 --- a/src/pages/events/[id]/assets/_tickets-available.tsx +++ b/src/pages/events/[id]/assets/_tickets-available.tsx @@ -1,14 +1,11 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { BgImage } from "@/generated-assets/components/BgImage"; import { COLORS } from "@/generated-assets/theme"; import { getEventDisplayDate, getEventDisplayType } from "@/lib/events"; import { getEventData } from "./_utils"; import { LogoWithFriends } from "@/generated-assets/components/LogoWithFriends"; - +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1920, height: 1080, @@ -21,11 +18,15 @@ export function ticketsAvailable(options: { }) { return async ({ params }: { params: { id: string } }) => { const event = await getEventData(params.id); - const postCover = await getAstroImageBase64(event.data.image.media); + const postCover = await DynamicAssets.getAstroImageBase64( + event.data.image.media, + ); const coOrganizersLogos = await Promise.all( event.__coOrganizers.map( async (coOrganiser) => - await getAstroImageBase64(coOrganiser.data.logos.noBgSquare), + await DynamicAssets.getAstroImageBase64( + coOrganiser.data.logos.noBgSquare, + ), ), ); diff --git a/src/pages/events/[id]/assets/_utils.ts b/src/pages/events/[id]/assets/_utils.ts index 16fae8e6b..94249e9c3 100644 --- a/src/pages/events/[id]/assets/_utils.ts +++ b/src/pages/events/[id]/assets/_utils.ts @@ -1,6 +1,8 @@ -import { NotFoundAssetError } from "@/generated-assets/api"; -import { getImageNameFromTsxPath } from "@/generated-assets/image"; import { eventWithComputed } from "@/lib/events"; +import { + getImageNameFromTsxPath, + NotFoundAssetError, +} from "@bearstudio/astro-dynamic-assets"; import { getCollection, getEntries, diff --git a/src/pages/events/[id]/attendee/[name]/[__image].[__type].ts b/src/pages/events/[id]/attendee/[name]/[__image].[__type].ts index 3da217be7..a6a637b68 100644 --- a/src/pages/events/[id]/attendee/[name]/[__image].[__type].ts +++ b/src/pages/events/[id]/attendee/[name]/[__image].[__type].ts @@ -1,8 +1,6 @@ -import { apiImageEndpoint } from "@/generated-assets/api"; -import type { APIRoute } from "astro"; - +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const prerender = false; -export const GET: APIRoute = apiImageEndpoint( +export const GET = DynamicAssets.apiImageEndpoint( import.meta.glob("./_*.tsx", { eager: true }), ); diff --git a/src/pages/events/[id]/attendee/[name]/_social.tsx b/src/pages/events/[id]/attendee/[name]/_social.tsx index ab7aea167..b16359924 100644 --- a/src/pages/events/[id]/attendee/[name]/_social.tsx +++ b/src/pages/events/[id]/attendee/[name]/_social.tsx @@ -1,14 +1,11 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { BgImage } from "@/generated-assets/components/BgImage"; import ticketBg from "./_ticket.png"; import { getEventData } from "./_utils"; import { COLORS } from "@/generated-assets/theme"; import { getEventDisplayDate } from "@/lib/events"; - +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1920, height: 1080, @@ -17,8 +14,10 @@ export const config: AssetImageConfig = { export function saveTheDate(options: { width: number; height: number }) { return async ({ params }: { params: { id: string; name: string } }) => { const event = await getEventData(params.id); - const postCover = await getAstroImageBase64(event.data.image.media); - const ticketImage = await getAstroImageBase64(ticketBg); + const postCover = await DynamicAssets.getAstroImageBase64( + event.data.image.media, + ); + const ticketImage = await DynamicAssets.getAstroImageBase64(ticketBg); return ( diff --git a/src/pages/events/[id]/attendee/[name]/_ticket.tsx b/src/pages/events/[id]/attendee/[name]/_ticket.tsx index 64e415676..c72b763de 100644 --- a/src/pages/events/[id]/attendee/[name]/_ticket.tsx +++ b/src/pages/events/[id]/attendee/[name]/_ticket.tsx @@ -1,13 +1,11 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; + import ticketBg from "./_ticket.png"; import { getEventData } from "./_utils"; import { COLORS } from "@/generated-assets/theme"; import { getEventDisplayDate } from "@/lib/events"; - +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1920, height: 1080, @@ -16,7 +14,7 @@ export const config: AssetImageConfig = { export function saveTheDate(options: { width: number; height: number }) { return async ({ params }: { params: { id: string; name: string } }) => { const event = await getEventData(params.id); - const ticketImage = await getAstroImageBase64(ticketBg); + const ticketImage = await DynamicAssets.getAstroImageBase64(ticketBg); return ( diff --git a/src/pages/events/[id]/attendee/[name]/_utils.ts b/src/pages/events/[id]/attendee/[name]/_utils.ts index f5c222fad..e78a4cc68 100644 --- a/src/pages/events/[id]/attendee/[name]/_utils.ts +++ b/src/pages/events/[id]/attendee/[name]/_utils.ts @@ -1,5 +1,5 @@ -import { NotFoundAssetError } from "@/generated-assets/api"; import { eventWithComputed } from "@/lib/events"; +import { NotFoundAssetError } from "@bearstudio/astro-dynamic-assets"; import { getEntry } from "astro:content"; export const getEventData = async (id: string) => { diff --git a/src/pages/events/[id]/partners/[partnerId]/assets/[__image].[__type].ts b/src/pages/events/[id]/partners/[partnerId]/assets/[__image].[__type].ts index 3da217be7..a6a637b68 100644 --- a/src/pages/events/[id]/partners/[partnerId]/assets/[__image].[__type].ts +++ b/src/pages/events/[id]/partners/[partnerId]/assets/[__image].[__type].ts @@ -1,8 +1,6 @@ -import { apiImageEndpoint } from "@/generated-assets/api"; -import type { APIRoute } from "astro"; - +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const prerender = false; -export const GET: APIRoute = apiImageEndpoint( +export const GET = DynamicAssets.apiImageEndpoint( import.meta.glob("./_*.tsx", { eager: true }), ); diff --git a/src/pages/events/[id]/partners/[partnerId]/assets/_instagram.tsx b/src/pages/events/[id]/partners/[partnerId]/assets/_instagram.tsx index 88da4c378..fed2f50cc 100644 --- a/src/pages/events/[id]/partners/[partnerId]/assets/_instagram.tsx +++ b/src/pages/events/[id]/partners/[partnerId]/assets/_instagram.tsx @@ -1,16 +1,16 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { BgImage } from "@/generated-assets/components/BgImage"; import { COLORS } from "@/generated-assets/theme"; import { getEventDisplayDate } from "@/lib/events"; import { getEventData } from "@/pages/events/[id]/assets/_utils"; import { getEntry } from "astro:content"; -import { NotFoundAssetError } from "@/generated-assets/api"; -import { Logo } from "@/components/Logo"; +import { Logo } from "@/components/Logo"; +import { + NotFoundAssetError, + type AssetImageConfig, +} from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1080, height: 1350, @@ -22,13 +22,17 @@ export default async function ({ params: { id: string; partnerId: string }; }) { const event = await getEventData(params.id); - const postCover = await getAstroImageBase64(event.data.image.media); + const postCover = await DynamicAssets.getAstroImageBase64( + event.data.image.media, + ); const partner = await getEntry("partners", params.partnerId); if (!partner) { throw new NotFoundAssetError(); } - const partnerLogo = await getAstroImageBase64(partner.data.logos.bgWhite); + const partnerLogo = await DynamicAssets.getAstroImageBase64( + partner.data.logos.bgWhite, + ); return ( diff --git a/src/pages/events/[id]/partners/[partnerId]/assets/_square.tsx b/src/pages/events/[id]/partners/[partnerId]/assets/_square.tsx index 62b319074..c3525e75a 100644 --- a/src/pages/events/[id]/partners/[partnerId]/assets/_square.tsx +++ b/src/pages/events/[id]/partners/[partnerId]/assets/_square.tsx @@ -1,16 +1,15 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { BgImage } from "@/generated-assets/components/BgImage"; import { COLORS } from "@/generated-assets/theme"; import { getEventDisplayDate } from "@/lib/events"; import { getEventData } from "@/pages/events/[id]/assets/_utils"; import { getEntry } from "astro:content"; -import { NotFoundAssetError } from "@/generated-assets/api"; import { Logo } from "@/components/Logo"; - +import { + NotFoundAssetError, + type AssetImageConfig, +} from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1080, height: 1080, @@ -22,13 +21,17 @@ export default async function ({ params: { id: string; partnerId: string }; }) { const event = await getEventData(params.id); - const postCover = await getAstroImageBase64(event.data.image.media); + const postCover = await DynamicAssets.getAstroImageBase64( + event.data.image.media, + ); const partner = await getEntry("partners", params.partnerId); if (!partner) { throw new NotFoundAssetError(); } - const partnerLogo = await getAstroImageBase64(partner.data.logos.bgWhite); + const partnerLogo = await DynamicAssets.getAstroImageBase64( + partner.data.logos.bgWhite, + ); return ( diff --git a/src/pages/events/[id]/talks/[talkId]/assets/[__image].[__type].ts b/src/pages/events/[id]/talks/[talkId]/assets/[__image].[__type].ts index 3da217be7..a6a637b68 100644 --- a/src/pages/events/[id]/talks/[talkId]/assets/[__image].[__type].ts +++ b/src/pages/events/[id]/talks/[talkId]/assets/[__image].[__type].ts @@ -1,8 +1,6 @@ -import { apiImageEndpoint } from "@/generated-assets/api"; -import type { APIRoute } from "astro"; - +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const prerender = false; -export const GET: APIRoute = apiImageEndpoint( +export const GET = DynamicAssets.apiImageEndpoint( import.meta.glob("./_*.tsx", { eager: true }), ); diff --git a/src/pages/events/[id]/talks/[talkId]/assets/_instagram.tsx b/src/pages/events/[id]/talks/[talkId]/assets/_instagram.tsx index ef3395b07..4d95a8d2f 100644 --- a/src/pages/events/[id]/talks/[talkId]/assets/_instagram.tsx +++ b/src/pages/events/[id]/talks/[talkId]/assets/_instagram.tsx @@ -1,8 +1,4 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { BgImage } from "@/generated-assets/components/BgImage"; import { COLORS } from "@/generated-assets/theme"; import peoplePlaceholder from "@/assets/images/people-placeholder.jpeg"; @@ -10,7 +6,8 @@ import { getEventDisplayDate } from "@/lib/events"; import { getEventData } from "@/pages/events/[id]/assets/_utils"; import { LogoWithFriends } from "@/generated-assets/components/LogoWithFriends"; import { getTalkData } from "@/pages/events/[id]/talks/[talkId]/assets/_utils"; - +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1080, height: 1350, @@ -24,21 +21,27 @@ export default async function ({ const event = await getEventData(params.id); const talk = await getTalkData(params.talkId); - const postCover = await getAstroImageBase64(event.data.image.media); + const postCover = await DynamicAssets.getAstroImageBase64( + event.data.image.media, + ); const coOrganizersLogos = await Promise.all( event.__coOrganizers.map( async (coOrganiser) => - await getAstroImageBase64(coOrganiser.data.logos.noBgSquare), + await DynamicAssets.getAstroImageBase64( + coOrganiser.data.logos.noBgSquare, + ), ), ); const speakersImages = ( await Promise.all( talk.__speakers.map(async (speaker) => { - const speakerImage = await getAstroImageBase64( + const speakerImage = await DynamicAssets.getAstroImageBase64( speaker.data.avatar ?? peoplePlaceholder, ); const flag = speaker.data._computed.country?.data.flag; - const speakerFlag = flag ? await getAstroImageBase64(flag) : undefined; + const speakerFlag = flag + ? await DynamicAssets.getAstroImageBase64(flag) + : undefined; return { speakerImage, speakerFlag, diff --git a/src/pages/events/[id]/talks/[talkId]/assets/_og-image.tsx b/src/pages/events/[id]/talks/[talkId]/assets/_og-image.tsx index eab1a265c..19e8013ff 100644 --- a/src/pages/events/[id]/talks/[talkId]/assets/_og-image.tsx +++ b/src/pages/events/[id]/talks/[talkId]/assets/_og-image.tsx @@ -1,8 +1,4 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { BgImage } from "@/generated-assets/components/BgImage"; import { COLORS } from "@/generated-assets/theme"; import peoplePlaceholder from "@/assets/images/people-placeholder.jpeg"; @@ -10,7 +6,8 @@ import { getEventDisplayDate } from "@/lib/events"; import { getEventData } from "@/pages/events/[id]/assets/_utils"; import { LogoWithFriends } from "@/generated-assets/components/LogoWithFriends"; import { getTalkData } from "@/pages/events/[id]/talks/[talkId]/assets/_utils"; - +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1920, height: 1080, @@ -24,21 +21,27 @@ export default async function ({ const event = await getEventData(params.id); const talk = await getTalkData(params.talkId); - const postCover = await getAstroImageBase64(event.data.image.media); + const postCover = await DynamicAssets.getAstroImageBase64( + event.data.image.media, + ); const coOrganizersLogos = await Promise.all( event.__coOrganizers.map( async (coOrganiser) => - await getAstroImageBase64(coOrganiser.data.logos.noBgSquare), + await DynamicAssets.getAstroImageBase64( + coOrganiser.data.logos.noBgSquare, + ), ), ); const speakersImages = ( await Promise.all( talk.__speakers.map(async (speaker) => { - const speakerImage = await getAstroImageBase64( + const speakerImage = await DynamicAssets.getAstroImageBase64( speaker.data.avatar ?? peoplePlaceholder, ); const flag = speaker.data._computed.country?.data.flag; - const speakerFlag = flag ? await getAstroImageBase64(flag) : undefined; + const speakerFlag = flag + ? await DynamicAssets.getAstroImageBase64(flag) + : undefined; return { speakerImage, speakerFlag, diff --git a/src/pages/events/[id]/talks/[talkId]/assets/_square.tsx b/src/pages/events/[id]/talks/[talkId]/assets/_square.tsx index 8593593a6..bf37a397d 100644 --- a/src/pages/events/[id]/talks/[talkId]/assets/_square.tsx +++ b/src/pages/events/[id]/talks/[talkId]/assets/_square.tsx @@ -1,8 +1,4 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { BgImage } from "@/generated-assets/components/BgImage"; import { COLORS } from "@/generated-assets/theme"; import peoplePlaceholder from "@/assets/images/people-placeholder.jpeg"; @@ -10,6 +6,8 @@ import { getEventDisplayDate } from "@/lib/events"; import { getEventData } from "@/pages/events/[id]/assets/_utils"; import { LogoWithFriends } from "@/generated-assets/components/LogoWithFriends"; import { getTalkData } from "@/pages/events/[id]/talks/[talkId]/assets/_utils"; +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1080, @@ -24,21 +22,27 @@ export default async function ({ const event = await getEventData(params.id); const talk = await getTalkData(params.talkId); - const postCover = await getAstroImageBase64(event.data.image.media); + const postCover = await DynamicAssets.getAstroImageBase64( + event.data.image.media, + ); const coOrganizersLogos = await Promise.all( event.__coOrganizers.map( async (coOrganiser) => - await getAstroImageBase64(coOrganiser.data.logos.noBgSquare), + await DynamicAssets.getAstroImageBase64( + coOrganiser.data.logos.noBgSquare, + ), ), ); const speakersImages = ( await Promise.all( talk.__speakers.map(async (speaker) => { - const speakerImage = await getAstroImageBase64( + const speakerImage = await DynamicAssets.getAstroImageBase64( speaker.data.avatar ?? peoplePlaceholder, ); const flag = speaker.data._computed.country?.data.flag; - const speakerFlag = flag ? await getAstroImageBase64(flag) : undefined; + const speakerFlag = flag + ? await DynamicAssets.getAstroImageBase64(flag) + : undefined; return { speakerImage, speakerFlag, diff --git a/src/pages/events/[id]/talks/[talkId]/assets/_utils.ts b/src/pages/events/[id]/talks/[talkId]/assets/_utils.ts index 29bf2f4c1..05478731a 100644 --- a/src/pages/events/[id]/talks/[talkId]/assets/_utils.ts +++ b/src/pages/events/[id]/talks/[talkId]/assets/_utils.ts @@ -1,4 +1,4 @@ -import { NotFoundAssetError } from "@/generated-assets/api"; +import { NotFoundAssetError } from "@bearstudio/astro-dynamic-assets"; import { getEntry } from "astro:content"; export const getTalkData = async (talkId: string) => { diff --git a/src/pages/events/locations/[countryId]/[cityId]/assets/[__image].[__type].ts b/src/pages/events/locations/[countryId]/[cityId]/assets/[__image].[__type].ts index 3da217be7..a6a637b68 100644 --- a/src/pages/events/locations/[countryId]/[cityId]/assets/[__image].[__type].ts +++ b/src/pages/events/locations/[countryId]/[cityId]/assets/[__image].[__type].ts @@ -1,8 +1,6 @@ -import { apiImageEndpoint } from "@/generated-assets/api"; -import type { APIRoute } from "astro"; - +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const prerender = false; -export const GET: APIRoute = apiImageEndpoint( +export const GET = DynamicAssets.apiImageEndpoint( import.meta.glob("./_*.tsx", { eager: true }), ); diff --git a/src/pages/events/locations/[countryId]/[cityId]/assets/_og-image.tsx b/src/pages/events/locations/[countryId]/[cityId]/assets/_og-image.tsx index c6c14cbe7..548d51c95 100644 --- a/src/pages/events/locations/[countryId]/[cityId]/assets/_og-image.tsx +++ b/src/pages/events/locations/[countryId]/[cityId]/assets/_og-image.tsx @@ -1,8 +1,4 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { BgImage } from "@/generated-assets/components/BgImage"; import { Logo } from "@/components/Logo"; import { @@ -12,7 +8,8 @@ import { import type { ExtractParams } from "@bearstudio/lunalink"; import type { ROUTES } from "@/routes.gen"; import { getCoverImage } from "@/lib/events"; - +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1920, height: 1080, @@ -28,7 +25,7 @@ export default async function ({ const city = await getCityData(params.cityId); const country = await getCountryData(city.data.country.id); const coverImage = await getCoverImage("cities", params.cityId); - const postCover = await getAstroImageBase64(coverImage.media); + const postCover = await DynamicAssets.getAstroImageBase64(coverImage.media); return ( diff --git a/src/pages/events/locations/[countryId]/[cityId]/assets/_utils.ts b/src/pages/events/locations/[countryId]/[cityId]/assets/_utils.ts index 3f349e2d8..b8c0341eb 100644 --- a/src/pages/events/locations/[countryId]/[cityId]/assets/_utils.ts +++ b/src/pages/events/locations/[countryId]/[cityId]/assets/_utils.ts @@ -1,4 +1,4 @@ -import { NotFoundAssetError } from "@/generated-assets/api"; +import { NotFoundAssetError } from "@bearstudio/astro-dynamic-assets"; import { getEntry } from "astro:content"; export const getCityData = async (id: string) => { diff --git a/src/pages/events/locations/[countryId]/assets/[__image].[__type].ts b/src/pages/events/locations/[countryId]/assets/[__image].[__type].ts index 3da217be7..a6a637b68 100644 --- a/src/pages/events/locations/[countryId]/assets/[__image].[__type].ts +++ b/src/pages/events/locations/[countryId]/assets/[__image].[__type].ts @@ -1,8 +1,6 @@ -import { apiImageEndpoint } from "@/generated-assets/api"; -import type { APIRoute } from "astro"; - +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const prerender = false; -export const GET: APIRoute = apiImageEndpoint( +export const GET = DynamicAssets.apiImageEndpoint( import.meta.glob("./_*.tsx", { eager: true }), ); diff --git a/src/pages/events/locations/[countryId]/assets/_og-image.tsx b/src/pages/events/locations/[countryId]/assets/_og-image.tsx index 465e8f465..7704efa50 100644 --- a/src/pages/events/locations/[countryId]/assets/_og-image.tsx +++ b/src/pages/events/locations/[countryId]/assets/_og-image.tsx @@ -1,14 +1,11 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { BgImage } from "@/generated-assets/components/BgImage"; import { Logo } from "@/components/Logo"; import { getCountryData } from "@/pages/events/locations/[countryId]/[cityId]/assets/_utils"; import type { ExtractParams } from "@bearstudio/lunalink"; import type { ROUTES } from "@/routes.gen"; - +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1920, height: 1080, @@ -22,7 +19,9 @@ export default async function ({ >; }) { const country = await getCountryData(params.countryId); - const postCover = await getAstroImageBase64(country.data.cover.media); + const postCover = await DynamicAssets.getAstroImageBase64( + country.data.cover.media, + ); return ( diff --git a/src/pages/events/locations/[countryId]/assets/_utils.ts b/src/pages/events/locations/[countryId]/assets/_utils.ts index 361a260b7..95fc3e5af 100644 --- a/src/pages/events/locations/[countryId]/assets/_utils.ts +++ b/src/pages/events/locations/[countryId]/assets/_utils.ts @@ -1,4 +1,4 @@ -import { NotFoundAssetError } from "@/generated-assets/api"; +import { NotFoundAssetError } from "@bearstudio/astro-dynamic-assets"; import { getEntry } from "astro:content"; export const getCountryData = async (id: string) => { diff --git a/src/pages/fr/events/for-kids/[id]/assets/[__image].[__type].ts b/src/pages/fr/events/for-kids/[id]/assets/[__image].[__type].ts index 3da217be7..a6a637b68 100644 --- a/src/pages/fr/events/for-kids/[id]/assets/[__image].[__type].ts +++ b/src/pages/fr/events/for-kids/[id]/assets/[__image].[__type].ts @@ -1,8 +1,6 @@ -import { apiImageEndpoint } from "@/generated-assets/api"; -import type { APIRoute } from "astro"; - +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const prerender = false; -export const GET: APIRoute = apiImageEndpoint( +export const GET = DynamicAssets.apiImageEndpoint( import.meta.glob("./_*.tsx", { eager: true }), ); diff --git a/src/pages/fr/events/for-kids/[id]/assets/_og-image.tsx b/src/pages/fr/events/for-kids/[id]/assets/_og-image.tsx index 16998dc7b..23d206727 100644 --- a/src/pages/fr/events/for-kids/[id]/assets/_og-image.tsx +++ b/src/pages/fr/events/for-kids/[id]/assets/_og-image.tsx @@ -1,8 +1,4 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { BgImage } from "@/generated-assets/components/BgImage"; import { COLORS } from "@/generated-assets/theme"; @@ -10,7 +6,8 @@ import { getEventData } from "./_utils"; import { LogoForKids } from "@/components/LogoForKids"; import coverImage from "@/assets/images/for-kids-event.jpg"; import { getForKidsEventFrenchDisplayDate } from "@/lib/forKidsEvents"; - +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1920, height: 1080, @@ -18,7 +15,7 @@ export const config: AssetImageConfig = { export default async function ({ params }: { params: { id: string } }) { const event = await getEventData(params.id); - const postCover = await getAstroImageBase64(coverImage); + const postCover = await DynamicAssets.getAstroImageBase64(coverImage); return ( diff --git a/src/pages/fr/events/for-kids/[id]/assets/_utils.ts b/src/pages/fr/events/for-kids/[id]/assets/_utils.ts index 53631f7ba..d4f5114a8 100644 --- a/src/pages/fr/events/for-kids/[id]/assets/_utils.ts +++ b/src/pages/fr/events/for-kids/[id]/assets/_utils.ts @@ -1,4 +1,4 @@ -import { NotFoundAssetError } from "@/generated-assets/api"; +import { NotFoundAssetError } from "@bearstudio/astro-dynamic-assets"; import { getEntry, type CollectionEntry } from "astro:content"; export async function forKidsEventWithComputed< diff --git a/src/pages/news/article/[id]/assets/[__image].[__type].ts b/src/pages/news/article/[id]/assets/[__image].[__type].ts index 3da217be7..a6a637b68 100644 --- a/src/pages/news/article/[id]/assets/[__image].[__type].ts +++ b/src/pages/news/article/[id]/assets/[__image].[__type].ts @@ -1,8 +1,6 @@ -import { apiImageEndpoint } from "@/generated-assets/api"; -import type { APIRoute } from "astro"; - +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const prerender = false; -export const GET: APIRoute = apiImageEndpoint( +export const GET = DynamicAssets.apiImageEndpoint( import.meta.glob("./_*.tsx", { eager: true }), ); diff --git a/src/pages/news/article/[id]/assets/_og-image.tsx b/src/pages/news/article/[id]/assets/_og-image.tsx index ba71d4985..c66675e42 100644 --- a/src/pages/news/article/[id]/assets/_og-image.tsx +++ b/src/pages/news/article/[id]/assets/_og-image.tsx @@ -1,15 +1,14 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { BgImage } from "@/generated-assets/components/BgImage"; import { Logo } from "@/components/Logo"; import { getNewsCollection } from "@/lib/news"; import defaultBackgroundImage from "@/assets/images/news.jpeg"; import dayjs from "dayjs"; -import { NotFoundAssetError } from "@/generated-assets/api"; - +import { + NotFoundAssetError, + type AssetImageConfig, +} from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1920, height: 1080, @@ -23,7 +22,7 @@ export default async function ({ params }: { params: { id: string } }) { throw new NotFoundAssetError(); } - const background = await getAstroImageBase64( + const background = await DynamicAssets.getAstroImageBase64( article.data.featuredImage ?? defaultBackgroundImage, ); return ( diff --git a/src/pages/people/[id]/assets/[__image].[__type].ts b/src/pages/people/[id]/assets/[__image].[__type].ts index 3da217be7..f8e72ea45 100644 --- a/src/pages/people/[id]/assets/[__image].[__type].ts +++ b/src/pages/people/[id]/assets/[__image].[__type].ts @@ -1,8 +1,7 @@ -import { apiImageEndpoint } from "@/generated-assets/api"; -import type { APIRoute } from "astro"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const prerender = false; -export const GET: APIRoute = apiImageEndpoint( +export const GET = DynamicAssets.apiImageEndpoint( import.meta.glob("./_*.tsx", { eager: true }), ); diff --git a/src/pages/people/[id]/assets/_og-image.tsx b/src/pages/people/[id]/assets/_og-image.tsx index 5113fee93..71360ad18 100644 --- a/src/pages/people/[id]/assets/_og-image.tsx +++ b/src/pages/people/[id]/assets/_og-image.tsx @@ -1,13 +1,11 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { BgImage } from "@/generated-assets/components/BgImage"; import { COLORS } from "@/generated-assets/theme"; import peoplePlaceholder from "@/assets/images/people-placeholder.jpeg"; import { getPersonData } from "@/pages/people/[id]/assets/_utils"; import { Logo } from "@/components/Logo"; +import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1920, @@ -21,7 +19,7 @@ export default async function ({ }) { const person = await getPersonData(params.id); - const avatar = await getAstroImageBase64( + const avatar = await DynamicAssets.getAstroImageBase64( person.data.avatar ?? peoplePlaceholder, ); diff --git a/src/pages/people/[id]/assets/_utils.ts b/src/pages/people/[id]/assets/_utils.ts index fe6f304b8..e1b122f13 100644 --- a/src/pages/people/[id]/assets/_utils.ts +++ b/src/pages/people/[id]/assets/_utils.ts @@ -1,4 +1,4 @@ -import { NotFoundAssetError } from "@/generated-assets/api"; +import { NotFoundAssetError } from "@bearstudio/astro-dynamic-assets"; import { getEntry, type CollectionEntry } from "astro:content"; export async function getPersonData(id: CollectionEntry<"people">["id"]) { diff --git a/src/pages/podcasts/[id]/episodes/[episode]/assets/[__image].[__type].ts b/src/pages/podcasts/[id]/episodes/[episode]/assets/[__image].[__type].ts index 3da217be7..a6a637b68 100644 --- a/src/pages/podcasts/[id]/episodes/[episode]/assets/[__image].[__type].ts +++ b/src/pages/podcasts/[id]/episodes/[episode]/assets/[__image].[__type].ts @@ -1,8 +1,6 @@ -import { apiImageEndpoint } from "@/generated-assets/api"; -import type { APIRoute } from "astro"; - +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const prerender = false; -export const GET: APIRoute = apiImageEndpoint( +export const GET = DynamicAssets.apiImageEndpoint( import.meta.glob("./_*.tsx", { eager: true }), ); diff --git a/src/pages/podcasts/[id]/episodes/[episode]/assets/_og-image.tsx b/src/pages/podcasts/[id]/episodes/[episode]/assets/_og-image.tsx index 5a01289fb..d2bc719b5 100644 --- a/src/pages/podcasts/[id]/episodes/[episode]/assets/_og-image.tsx +++ b/src/pages/podcasts/[id]/episodes/[episode]/assets/_og-image.tsx @@ -1,15 +1,15 @@ import { Frame } from "@/generated-assets/components/Frame"; -import { - getAstroImageBase64, - type AssetImageConfig, -} from "@/generated-assets/image"; import { BgImage } from "@/generated-assets/components/BgImage"; import { Logo } from "@/components/Logo"; import dayjs from "dayjs"; import { getPodcastsEpisodesCollection } from "@/lib/podcasts"; import backgroundImage from "@/assets/images/podcasts.jpeg"; import { COLORS } from "@/generated-assets/theme"; -import { NotFoundAssetError } from "@/generated-assets/api"; +import { + NotFoundAssetError, + type AssetImageConfig, +} from "@bearstudio/astro-dynamic-assets"; +import DynamicAssets from "@/lib/astro-dynamic-assets"; export const config: AssetImageConfig = { width: 1920, @@ -30,8 +30,10 @@ export default async function ({ throw new NotFoundAssetError(); } - const episodeCover = await getAstroImageBase64(episode.data.cover); - const background = await getAstroImageBase64(backgroundImage); + const episodeCover = await DynamicAssets.getAstroImageBase64( + episode.data.cover, + ); + const background = await DynamicAssets.getAstroImageBase64(backgroundImage); return (