Skip to content

Conversation

@yoannfleurydev
Copy link
Member

@yoannfleurydev yoannfleurydev commented Oct 28, 2025

Summary by CodeRabbit

  • Chores
    • Added a dynamic-assets provider dependency and configured it for the site.
  • Refactor
    • Switched asset handling to the centralized dynamic-assets system across pages and endpoints.
  • Breaking-change (internal)
    • Internal image helpers and endpoint wiring were replaced with the new provider; end-user image outputs and behavior remain unchanged.

@vercel
Copy link

vercel bot commented Oct 28, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Comments Updated (UTC)
forkit-community Ready Ready Preview Comment Oct 29, 2025 0:54am

@coderabbitai
Copy link

coderabbitai bot commented Oct 28, 2025

Walkthrough

Image generation and API endpoint logic were moved from local generated modules into the external package @bearstudio/astro-dynamic-assets. A new wrapper src/lib/astro-dynamic-assets.ts was added, package.json updated, many imports and GET endpoint factories were switched to use the DynamicAssets instance, and two local generated modules were removed.

Changes

Cohort / File(s) Summary
Package manifest & wrapper
package.json, src/lib/astro-dynamic-assets.ts
Added dependency @bearstudio/astro-dynamic-assets and new wrapper module exporting a configured DynamicAssets instance.
Removed generated modules
src/generated-assets/api.ts, src/generated-assets/image.ts
Deleted local image helpers and API factory (image rendering, encoding, response helpers, NotFoundAssetError, AssetImageConfig type, and related utilities).
API route endpoints
src/pages/.../*/assets/[__image].[__type].ts
(examples: src/pages/events/[id]/assets/[__image].[__type].ts, src/pages/people/[id]/assets/[__image].[__type].ts, src/pages/news/article/[id]/assets/[__image].[__type].ts, src/pages/podcasts/.../assets/[__image].[__type].ts, ...)
Replaced apiImageEndpoint(...) + APIRoute-typed GET with DynamicAssets.apiImageEndpoint(...) and untyped GET. Imports changed to import DynamicAssets from "@/lib/astro-dynamic-assets";.
Asset pages & components
src/generated-assets/components/*, src/pages/**/assets/_*.tsx (events, talks, partners, attendee, people, podcasts, fr, locations, etc.)
Switched AssetImageConfig type imports to @bearstudio/astro-dynamic-assets, replaced direct utilities (getAstroImageBase64, imageBufferToBase64, etc.) with calls on DynamicAssets (e.g., DynamicAssets.getAstroImageBase64(...)). Some configs gained/updated height fields.
Utility files
src/pages/**/_utils.ts (events, talks, partners, locations, fr/events, people, podcasts, etc.)
Replaced imports of NotFoundAssetError and other formerly-local helpers with imports from @bearstudio/astro-dynamic-assets. No control-flow changes.
Example component changed
src/generated-assets/components/CfpCoverNoFlag.tsx
Import AssetImageConfig from external package and call DynamicAssets.getAstroImageBase64(...) via the new wrapper.

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant AstroGET as Astro GET file
  participant Wrapper as src/lib/astro-dynamic-assets
  participant External as @bearstudio/astro-dynamic-assets

  Client->>AstroGET: GET /assets/[__image].[__type]
  AstroGET->>Wrapper: call DynamicAssets.apiImageEndpoint(...) handler
  Wrapper->>External: delegate resolution & generation
  External-->>Wrapper: image/HTML response
  Wrapper-->>AstroGET: Response
  AstroGET-->>Client: HTTP response (SVG/JPG/HTML)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Areas to inspect closely:
    • src/lib/astro-dynamic-assets.ts initialization (site, fonts, ssr).
    • Callsite signature compatibility (names and behavior of methods on DynamicAssets vs. removed local exports).
    • Places where height was added to configs to ensure consistency across consumers.

Poem

🐰 I hopped through modules, made a swap so neat,
Old helpers gone, new package on my feet.
Fonts tucked in, DynamicAssets sings,
Endpoints hum and base64 wings.
A rabbit's nod — the pipeline's complete.

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Title Check ✅ Passed The title "feat: implement new image generation library" accurately reflects the primary change in this pull request. The changeset removes the local image generation implementations from src/generated-assets/api.ts and src/generated-assets/image.ts, removes all their exported utilities (SVG, JPG, DEBUG_HTML, getAstroImageBase64, etc.), and replaces them with an external library "@bearstudio/astro-dynamic-assets" by adding it as a dependency and creating a configuration module at src/lib/astro-dynamic-assets.ts. All subsequent file changes across the codebase are updates to import and usage patterns that result from this core refactoring. The title is concise, specific, and clearly communicates the main architectural change.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/astro-dynamic-assets

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (9)
src/pages/events/[id]/talks/[talkId]/assets/_instagram.tsx (1)

25-27: Use consistent pattern for getAstroImageBase64 calls.

Line 25 uses dynamicAssets.getAstroImageBase64, while lines 31, 37, and 41 use the directly imported getAstroImageBase64. Choose one approach for consistency.

Option 1 (preferred): Use the direct import consistently.

-  const postCover = await dynamicAssets.getAstroImageBase64(
-    event.data.image.media,
-  );
+  const postCover = await getAstroImageBase64(event.data.image.media);

Option 2: Remove the direct import and use dynamicAssets consistently.

Update the import:

-import { dynamicAssets, getAstroImageBase64 } from "@/lib/astro-dynamic-assets";
+import { dynamicAssets } from "@/lib/astro-dynamic-assets";

Then update all calls (lines 31, 37, 41) to use dynamicAssets.getAstroImageBase64.

src/pages/events/[id]/assets/_qrcode-bg.tsx (1)

26-28: Consider using the destructured export for consistency.

This file uses dynamicAssets.getAstroImageBase64() (line 26), while other files like _og-image.tsx (line 17) use the destructured getAstroImageBase64() directly. Both patterns work, but adopting a consistent approach across the codebase would improve readability.

If you prefer the destructured pattern, apply this diff:

-import {
-  imageBufferToBase64,
-  type AssetImageConfig,
-} from "@bearstudio/astro-dynamic-assets";
-import { dynamicAssets } from "@/lib/astro-dynamic-assets";
+import {
+  imageBufferToBase64,
+  type AssetImageConfig,
+} from "@bearstudio/astro-dynamic-assets";
+import { getAstroImageBase64 } from "@/lib/astro-dynamic-assets";

And update the usage:

-  const postCover = await dynamicAssets.getAstroImageBase64(
-    event.data.image.media,
-  );
+  const postCover = await getAstroImageBase64(event.data.image.media);
src/pages/fr/events/for-kids/[id]/assets/_og-image.tsx (1)

9-10: Consider using consistent import pattern.

This file imports dynamicAssets and uses dynamicAssets.getAstroImageBase64 (line 19), while other files like src/pages/events/[id]/assets/_cfp-cover.tsx import getAstroImageBase64 directly. Both patterns work, but consistency improves maintainability.

If you prefer the direct import pattern, apply this diff:

-import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets";
-import { dynamicAssets } from "@/lib/astro-dynamic-assets";
+import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets";
+import { getAstroImageBase64 } from "@/lib/astro-dynamic-assets";

-  const postCover = await dynamicAssets.getAstroImageBase64(coverImage);
+  const postCover = await getAstroImageBase64(coverImage);

Also applies to: 19-19

src/pages/people/[id]/assets/_og-image.tsx (1)

7-8: Standardize the import pattern for consistency.

This file imports dynamicAssets and uses dynamicAssets.getAstroImageBase64(...) on line 22, while other component files (e.g., src/pages/events/[id]/talks/[talkId]/assets/_square.tsx and src/pages/events/[id]/partners/[partnerId]/assets/_square.tsx) import getAstroImageBase64 directly and use it without the dynamicAssets. prefix.

For consistency across the codebase, standardize on the destructured import pattern:

-import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets";
-import { dynamicAssets } from "@/lib/astro-dynamic-assets";
+import type { AssetImageConfig } from "@bearstudio/astro-dynamic-assets";
+import { getAstroImageBase64 } from "@/lib/astro-dynamic-assets";

Then update line 22:

-  const avatar = await dynamicAssets.getAstroImageBase64(
+  const avatar = await getAstroImageBase64(
src/pages/events/[id]/attendee/[name]/_ticket.tsx (2)

7-8: Standardize dynamic-assets API usage across files

Other files use dynamicAssets.getAstroImageBase64; here you import the named re‑export. Pick one convention repo‑wide for consistency.


30-34: Add alt attribute to the image

Non-informative image should have alt="" to avoid accessibility/SSR warnings.

Apply this diff:

-          <img
+          <img alt=""
             style={{ zIndex: 10, position: "relative" }}
             src={ticketImage}
             width={1600}
           />
src/pages/events/[id]/attendee/[name]/_social.tsx (2)

7-8: Consistent import style

Same note as other files: align on either named getAstroImageBase64 or dynamicAssets.getAstroImageBase64 project‑wide.


38-42: Add alt attribute to ticket image

Use empty alt for decorative image.

-          <img
+          <img alt=""
             style={{ zIndex: 10, position: "relative" }}
             src={ticketImage}
             width={1600}
           />
src/pages/events/[id]/assets/_tickets-available.tsx (1)

23-28: Remove unnecessary async/await in Promise.all map

Slight cleanup; no behavior change.

-    const coOrganizersLogos = await Promise.all(
-      event.__coOrganizers.map(
-        async (coOrganiser) =>
-          await getAstroImageBase64(coOrganiser.data.logos.noBgSquare),
-      ),
-    );
+    const coOrganizersLogos = await Promise.all(
+      event.__coOrganizers.map((coOrganiser) =>
+        getAstroImageBase64(coOrganiser.data.logos.noBgSquare),
+      ),
+    );
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8d98e37 and a9c6120.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (43)
  • package.json (1 hunks)
  • src/generated-assets/api.ts (0 hunks)
  • src/generated-assets/components/CfpCoverNoFlag.tsx (1 hunks)
  • src/generated-assets/image.ts (0 hunks)
  • src/lib/astro-dynamic-assets.ts (1 hunks)
  • src/pages/events/[id]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/events/[id]/assets/_cfp-cover.tsx (1 hunks)
  • src/pages/events/[id]/assets/_og-image.tsx (1 hunks)
  • src/pages/events/[id]/assets/_qrcode-bg.tsx (2 hunks)
  • src/pages/events/[id]/assets/_qrcode.tsx (1 hunks)
  • src/pages/events/[id]/assets/_save-the-date-square.tsx (1 hunks)
  • src/pages/events/[id]/assets/_save-the-date.tsx (1 hunks)
  • src/pages/events/[id]/assets/_tickets-available-square.tsx (1 hunks)
  • src/pages/events/[id]/assets/_tickets-available.tsx (1 hunks)
  • src/pages/events/[id]/assets/_utils.ts (1 hunks)
  • src/pages/events/[id]/attendee/[name]/[__image].[__type].ts (1 hunks)
  • src/pages/events/[id]/attendee/[name]/_social.tsx (1 hunks)
  • src/pages/events/[id]/attendee/[name]/_ticket.tsx (1 hunks)
  • src/pages/events/[id]/attendee/[name]/_utils.ts (1 hunks)
  • src/pages/events/[id]/partners/[partnerId]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/events/[id]/partners/[partnerId]/assets/_instagram.tsx (1 hunks)
  • src/pages/events/[id]/partners/[partnerId]/assets/_square.tsx (1 hunks)
  • src/pages/events/[id]/talks/[talkId]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/events/[id]/talks/[talkId]/assets/_instagram.tsx (2 hunks)
  • src/pages/events/[id]/talks/[talkId]/assets/_og-image.tsx (2 hunks)
  • src/pages/events/[id]/talks/[talkId]/assets/_square.tsx (1 hunks)
  • src/pages/events/[id]/talks/[talkId]/assets/_utils.ts (1 hunks)
  • src/pages/events/locations/[countryId]/[cityId]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/events/locations/[countryId]/[cityId]/assets/_og-image.tsx (2 hunks)
  • src/pages/events/locations/[countryId]/[cityId]/assets/_utils.ts (1 hunks)
  • src/pages/events/locations/[countryId]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/events/locations/[countryId]/assets/_og-image.tsx (2 hunks)
  • src/pages/events/locations/[countryId]/assets/_utils.ts (1 hunks)
  • src/pages/fr/events/for-kids/[id]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/fr/events/for-kids/[id]/assets/_og-image.tsx (2 hunks)
  • src/pages/fr/events/for-kids/[id]/assets/_utils.ts (1 hunks)
  • src/pages/news/article/[id]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/news/article/[id]/assets/_og-image.tsx (2 hunks)
  • src/pages/people/[id]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/people/[id]/assets/_og-image.tsx (2 hunks)
  • src/pages/people/[id]/assets/_utils.ts (1 hunks)
  • src/pages/podcasts/[id]/episodes/[episode]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/podcasts/[id]/episodes/[episode]/assets/_og-image.tsx (2 hunks)
💤 Files with no reviewable changes (2)
  • src/generated-assets/api.ts
  • src/generated-assets/image.ts
🧰 Additional context used
🧬 Code graph analysis (40)
src/pages/fr/events/for-kids/[id]/assets/_utils.ts (1)
src/generated-assets/api.ts (2)
  • NotFoundAssetError (11-17)
  • constructor (12-16)
src/pages/events/[id]/talks/[talkId]/assets/_utils.ts (1)
src/generated-assets/api.ts (2)
  • NotFoundAssetError (11-17)
  • constructor (12-16)
src/pages/events/[id]/assets/_save-the-date-square.tsx (1)
src/generated-assets/image.ts (2)
  • getAstroImagePath (137-141)
  • getAstroImageBuffer (143-169)
src/pages/events/locations/[countryId]/[cityId]/assets/_utils.ts (1)
src/generated-assets/api.ts (3)
  • NotFoundAssetError (11-17)
  • constructor (12-16)
  • files (21-72)
src/pages/events/[id]/assets/[__image].[__type].ts (2)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/generated-assets/api.ts (2)
  • files (21-72)
  • modules (20-72)
src/pages/events/[id]/attendee/[name]/[__image].[__type].ts (2)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/generated-assets/api.ts (2)
  • files (21-72)
  • modules (20-72)
src/pages/podcasts/[id]/episodes/[episode]/assets/[__image].[__type].ts (2)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/generated-assets/api.ts (2)
  • files (21-72)
  • modules (20-72)
src/pages/events/locations/[countryId]/assets/[__image].[__type].ts (2)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/generated-assets/api.ts (2)
  • files (21-72)
  • modules (20-72)
src/pages/people/[id]/assets/_utils.ts (1)
src/generated-assets/api.ts (2)
  • NotFoundAssetError (11-17)
  • constructor (12-16)
src/lib/astro-dynamic-assets.ts (3)
src/generated-assets/image.ts (3)
  • getAstroImagePath (137-141)
  • getAstroImageBuffer (143-169)
  • getAstroImageBase64 (171-174)
src/pages/events/[id]/assets/_d-1-announcement.tsx (2)
  • coOrganiser (25-26)
  • s (37-37)
src/pages/events/[id]/assets/_d-1-announcement-insta.tsx (1)
  • coOrganiser (28-29)
src/pages/events/locations/[countryId]/[cityId]/assets/[__image].[__type].ts (2)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/generated-assets/api.ts (3)
  • files (21-72)
  • modules (20-72)
  • path (26-35)
src/pages/events/[id]/attendee/[name]/_utils.ts (1)
src/generated-assets/api.ts (2)
  • NotFoundAssetError (11-17)
  • constructor (12-16)
src/pages/events/[id]/assets/_tickets-available-square.tsx (1)
src/generated-assets/image.ts (1)
  • getAstroImagePath (137-141)
src/pages/events/[id]/partners/[partnerId]/assets/[__image].[__type].ts (2)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/generated-assets/api.ts (1)
  • files (21-72)
src/pages/news/article/[id]/assets/_og-image.tsx (2)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/generated-assets/image.ts (3)
  • getAstroImagePath (137-141)
  • getAstroImageBuffer (143-169)
  • getAstroImageBase64 (171-174)
src/pages/events/[id]/assets/_qrcode.tsx (1)
src/generated-assets/image.ts (1)
  • getAstroImagePath (137-141)
src/generated-assets/components/CfpCoverNoFlag.tsx (1)
src/generated-assets/image.ts (3)
  • getAstroImagePath (137-141)
  • getAstroImageBuffer (143-169)
  • getAstroImageBase64 (171-174)
src/pages/events/[id]/partners/[partnerId]/assets/_square.tsx (2)
src/generated-assets/image.ts (2)
  • getAstroImagePath (137-141)
  • getAstroImageBuffer (143-169)
src/generated-assets/api.ts (1)
  • files (21-72)
src/pages/people/[id]/assets/[__image].[__type].ts (2)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/generated-assets/api.ts (2)
  • files (21-72)
  • modules (20-72)
src/pages/events/[id]/assets/_og-image.tsx (1)
src/generated-assets/image.ts (1)
  • getAstroImagePath (137-141)
src/pages/podcasts/[id]/episodes/[episode]/assets/_og-image.tsx (2)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/generated-assets/image.ts (3)
  • getAstroImagePath (137-141)
  • getAstroImageBase64 (171-174)
  • getAstroImageBuffer (143-169)
src/pages/events/[id]/assets/_utils.ts (2)
src/generated-assets/api.ts (1)
  • NotFoundAssetError (11-17)
src/generated-assets/image.ts (1)
  • getAstroImagePath (137-141)
src/pages/events/[id]/talks/[talkId]/assets/_instagram.tsx (2)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/generated-assets/image.ts (3)
  • getAstroImagePath (137-141)
  • getAstroImageBase64 (171-174)
  • getAstroImageBuffer (143-169)
src/pages/events/[id]/talks/[talkId]/assets/[__image].[__type].ts (2)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/generated-assets/api.ts (1)
  • files (21-72)
src/pages/fr/events/for-kids/[id]/assets/_og-image.tsx (1)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/pages/events/locations/[countryId]/assets/_utils.ts (1)
src/generated-assets/api.ts (2)
  • NotFoundAssetError (11-17)
  • constructor (12-16)
src/pages/events/[id]/assets/_tickets-available.tsx (2)
src/pages/events/[id]/assets/_d-1-announcement.tsx (3)
  • params (20-229)
  • d1announcement (19-230)
  • coOrganiser (25-26)
src/pages/events/[id]/assets/_d-1-announcement-insta.tsx (2)
  • params (23-244)
  • coOrganiser (28-29)
src/pages/events/[id]/assets/_save-the-date.tsx (1)
src/generated-assets/image.ts (1)
  • getAstroImagePath (137-141)
src/pages/events/locations/[countryId]/[cityId]/assets/_og-image.tsx (1)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/pages/events/[id]/talks/[talkId]/assets/_square.tsx (1)
src/generated-assets/image.ts (3)
  • getAstroImagePath (137-141)
  • getAstroImageBuffer (143-169)
  • getAstroImageBase64 (171-174)
src/pages/events/[id]/talks/[talkId]/assets/_og-image.tsx (2)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/pages/events/[id]/assets/_d-1-announcement.tsx (2)
  • coOrganiser (25-26)
  • d1announcement (19-230)
src/pages/news/article/[id]/assets/[__image].[__type].ts (2)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/generated-assets/api.ts (3)
  • files (21-72)
  • modules (20-72)
  • path (26-35)
src/pages/events/locations/[countryId]/assets/_og-image.tsx (1)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/pages/events/[id]/attendee/[name]/_social.tsx (2)
src/pages/events/[id]/assets/_d-1-announcement.tsx (3)
  • d1announcement (19-230)
  • params (20-229)
  • coOrganiser (25-26)
src/pages/events/[id]/assets/_d-1-announcement-insta.tsx (3)
  • params (23-244)
  • coOrganiser (28-29)
  • d1announcementInsta (19-245)
src/pages/fr/events/for-kids/[id]/assets/[__image].[__type].ts (2)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/generated-assets/api.ts (3)
  • files (21-72)
  • modules (20-72)
  • path (26-35)
src/pages/events/[id]/partners/[partnerId]/assets/_instagram.tsx (1)
src/generated-assets/image.ts (2)
  • getAstroImagePath (137-141)
  • getAstroImageBuffer (143-169)
src/pages/people/[id]/assets/_og-image.tsx (1)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/pages/events/[id]/attendee/[name]/_ticket.tsx (2)
src/pages/events/[id]/assets/_d-1-announcement.tsx (1)
  • params (20-229)
src/generated-assets/image.ts (1)
  • getAstroImagePath (137-141)
src/pages/events/[id]/assets/_qrcode-bg.tsx (2)
src/lib/astro-dynamic-assets.ts (2)
  • dynamicAssets (3-32)
  • dynamicAssets (34-34)
src/generated-assets/image.ts (3)
  • getAstroImageBase64 (171-174)
  • getAstroImagePath (137-141)
  • getAstroImageBuffer (143-169)
src/pages/events/[id]/assets/_cfp-cover.tsx (1)
src/generated-assets/image.ts (3)
  • getAstroImagePath (137-141)
  • getAstroImageBuffer (143-169)
  • getAstroImageBase64 (171-174)
🔇 Additional comments (35)
src/pages/events/[id]/assets/_tickets-available-square.tsx (3)

1-1: LGTM!

The migration to the external package @bearstudio/astro-dynamic-assets is correctly implemented with a type-only import.


4-7: Inconsistency between AI summary and code.

The AI summary states "width preserved (1920) and now height added as 1080," but the code shows both width and height as 1080. The current 1080×1080 configuration is correct for a square image as indicated by the filename suffix.


9-9: LGTM!

The default export correctly spreads the configuration and applies a custom fontScaling value for this square variant.

src/pages/events/[id]/assets/_save-the-date.tsx (3)

10-13: LGTM!

The config object correctly uses the AssetImageConfig type with standard dimensions for image generation.


15-24: LGTM!

The getAstroImageBase64 function usage is correct with proper async/await handling for both the event image and co-organizer logos.


7-8: Imports are correctly migrated with no compatibility issues.

Verified:

  • AssetImageConfig from @bearstudio/astro-dynamic-assets has the expected shape (width, height properties required) per 23+ usages across the codebase.
  • getAstroImageBase64 from the wrapper at @/lib/astro-dynamic-assets correctly re-exports the function from dynamicAssets and maintains consistent signature: single image parameter, returns Promise.
  • Usage in this file (lines 18, 22) aligns with all other asset components in the codebase.
src/pages/events/[id]/assets/_save-the-date-square.tsx (1)

1-1: LGTM! Clean type import migration.

The type-only import of AssetImageConfig has been successfully migrated to the new dynamic assets package.

src/pages/events/[id]/assets/_qrcode.tsx (1)

8-11: LGTM! Import migration successful.

Both the type and utility function imports have been cleanly migrated to the new dynamic assets package.

src/pages/events/[id]/talks/[talkId]/assets/_instagram.tsx (1)

9-10: LGTM! Import migration successful.

The imports have been correctly updated to use the new dynamic assets package and wrapper module.

src/pages/events/locations/[countryId]/assets/_utils.ts (1)

1-1: LGTM! Error class import migrated successfully.

The NotFoundAssetError import has been correctly moved to the new dynamic assets package.

src/pages/people/[id]/assets/_utils.ts (1)

1-1: LGTM! Error class import migrated successfully.

The NotFoundAssetError import has been correctly moved to the new dynamic assets package.

src/pages/events/[id]/attendee/[name]/_utils.ts (1)

2-2: LGTM! Error class import migrated successfully.

The NotFoundAssetError import has been correctly moved to the new dynamic assets package.

src/pages/events/[id]/talks/[talkId]/assets/_utils.ts (1)

1-1: LGTM! Error class import migrated successfully.

The NotFoundAssetError import has been correctly moved to the new dynamic assets package.

src/pages/events/[id]/assets/_utils.ts (1)

2-5: LGTM: Import migration is correct.

The migration from local @/generated-assets/api to the external @bearstudio/astro-dynamic-assets package is clean. The imported entities (NotFoundAssetError, getImageNameFromTsxPath) are used consistently throughout the file without any behavior changes.

src/pages/fr/events/for-kids/[id]/assets/_utils.ts (1)

1-1: LGTM: Import migration is correct.

The import source for NotFoundAssetError has been successfully migrated to the external dynamic assets package, aligning with the broader refactoring effort.

src/generated-assets/components/CfpCoverNoFlag.tsx (1)

4-5: LGTM: Import migration is correct.

The imports have been successfully migrated to the new dynamic assets ecosystem. The AssetImageConfig type now comes from the external package, and getAstroImageBase64 is sourced from the wrapper module, maintaining the same functionality.

src/pages/events/[id]/partners/[partnerId]/assets/_instagram.tsx (1)

9-13: LGTM: Import migration is correct.

The imports have been properly migrated to align with the new dynamic assets architecture. All imported entities maintain their usage patterns without any functional changes.

src/pages/events/locations/[countryId]/assets/[__image].[__type].ts (1)

1-7: LGTM: API endpoint migration is correct.

The migration from apiImageEndpoint to dynamicAssets.apiImageEndpoint is properly implemented. The removal of the explicit APIRoute type annotation is acceptable as TypeScript will infer the correct type from the dynamicAssets.apiImageEndpoint return value.

src/pages/events/[id]/assets/_qrcode-bg.tsx (1)

10-14: LGTM: Import migration is correct.

The imports have been successfully migrated to the dynamic assets ecosystem.

src/pages/fr/events/for-kids/[id]/assets/[__image].[__type].ts (1)

1-7: LGTM: API endpoint migration is correct.

The migration to dynamicAssets.apiImageEndpoint follows the established pattern and maintains the same functionality as the previous implementation.

src/pages/events/[id]/assets/_og-image.tsx (1)

7-8: LGTM: Import migration is correct.

The imports have been successfully migrated to the dynamic assets ecosystem. This file uses the destructured getAstroImageBase64 export pattern, which is clean and straightforward.

src/pages/events/[id]/assets/[__image].[__type].ts (1)

1-7: Type safety concern addressed in similar file.

Same migration pattern as other endpoint files. See comment on src/pages/events/[id]/attendee/[name]/[__image].[__type].ts regarding type safety verification.

src/pages/events/locations/[countryId]/assets/_og-image.tsx (1)

7-8: LGTM with minor note on import patterns.

The migration correctly updates the imports and usage. See comment on src/pages/fr/events/for-kids/[id]/assets/_og-image.tsx regarding import pattern consistency across the codebase.

Also applies to: 23-25

src/pages/events/[id]/talks/[talkId]/assets/_og-image.tsx (1)

9-10: LGTM: Migration correctly handles multiple image operations.

The migration properly updates all image processing calls to use dynamicAssets.getAstroImageBase64. The parallel processing with Promise.all is preserved correctly.

Also applies to: 25-45

src/pages/news/article/[id]/assets/[__image].[__type].ts (1)

1-7: Consistent endpoint migration.

Same migration pattern as other endpoint files. Type safety concerns already noted in earlier review comments.

src/pages/events/[id]/assets/_cfp-cover.tsx (1)

7-8: Direct import pattern used here.

This file imports getAstroImageBase64 directly (line 8) and uses it without the dynamicAssets prefix (lines 30-31). This is the cleaner pattern and could be applied consistently across all image component files for better readability.

Also applies to: 30-31

src/lib/astro-dynamic-assets.ts (1)

1-34: All configuration values verified and properly configured.

Font files, theme colors, and environment variables have been confirmed:

  • All three font files exist at the specified paths
  • Theme colors match the design system
  • SITE is configured via getSiteUrl() which correctly handles Vercel deployment URLs
  • SSR is available as a standard Astro environment variable

The code is ready for deployment with no configuration issues identified.

src/pages/events/[id]/attendee/[name]/[__image].[__type].ts (1)

1-7: Verify apiImageEndpoint return type compatibility with Astro's APIRoute.

The concern about removing explicit type annotation is valid. The codebase uses "astro/tsconfigs/strictest", the most strict TypeScript configuration, but all 10 similar [__image].[__type] endpoint files lack explicit APIRoute type annotations—unlike other endpoint files in the codebase (e.g., src/pages/events/rss.xml.ts, src/pages/events/[id]/assets/download.ts) which include them.

The @bearstudio/astro-dynamic-assets library is installed as a local link. Verify:

  1. Whether the library's apiImageEndpoint method properly types its return value as compatible with Astro's APIRoute
  2. Whether explicit APIRoute annotation should be added to this file for consistency and safety (like other endpoints)
src/pages/events/[id]/talks/[talkId]/assets/_square.tsx (1)

9-10: LGTM! Preferred import pattern.

The migration correctly updates the import sources, and the destructured import of getAstroImageBase64 is the cleaner pattern compared to accessing it via dynamicAssets.getAstroImageBase64.

src/pages/events/[id]/partners/[partnerId]/assets/_square.tsx (1)

8-12: LGTM! Consistent import pattern.

The import migration is correct and uses the preferred destructured pattern for getAstroImageBase64.

src/pages/podcasts/[id]/episodes/[episode]/assets/[__image].[__type].ts (1)

1-7: Migration to external package is complete and structurally sound.

All 10 image generation endpoints have been successfully migrated to the new dynamicAssets.apiImageEndpoint pattern with no remaining old references. The SSR behavior is properly configured via import.meta.env.SSR, ensuring correct handling in both development and production environments.

The actual runtime behavior regarding image format outputs (jpg, svg, debug) and error handling for missing assets depends on the @bearstudio/astro-dynamic-assets package implementation. Verify these aspects function correctly by testing the endpoints in your development and production environments, particularly checking:

  • Image format outputs match expected formats
  • Missing asset error responses are appropriate
  • Client-side and SSR rendering work as expected
src/pages/events/locations/[countryId]/[cityId]/assets/_og-image.tsx (1)

11-17: LGTM: type migration and config shape

AssetImageConfig import + height:1080 addition and dynamicAssets.getAstroImageBase64 usage look correct.

Also applies to: 29-29

src/pages/podcasts/[id]/episodes/[episode]/assets/_og-image.tsx (1)

8-13: LGTM: migrated to dynamic-assets and proper error signaling

NotFoundAssetError usage and dynamicAssets.getAstroImageBase64 look correct; alt="" on the is good.

Also applies to: 33-37

src/pages/news/article/[id]/assets/_og-image.tsx (1)

7-12: LGTM: dynamic-assets migration with sensible fallback

Type/error imports are correct; background base64 uses article image with default fallback.

Also applies to: 26-28

src/pages/events/locations/[countryId]/[cityId]/assets/_utils.ts (1)

1-1: Manual verification required for external package export.

The import has changed from a local module to @bearstudio/astro-dynamic-assets. While the package is linked and used elsewhere in the codebase, I cannot access the package source in the sandbox environment to definitively verify that NotFoundAssetError is exported.

Please verify that:

  1. The package @bearstudio/astro-dynamic-assets exports NotFoundAssetError
  2. The exported error class is compatible with the empty constructor usage on lines 8 and 18

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/pages/events/locations/[countryId]/assets/_og-image.tsx (1)

17-20: Incorrect route path in params type—must target country route, not city route.

The file is located at [countryId]/assets/_og-image.tsx, which corresponds to ROUTES.events.locations[":countryId"]["assets"] in routes.gen.ts, not the [":cityId"] branch. The current type annotation targets the wrong route, and the function body only uses params.countryId. This must be corrected to prevent type inconsistencies and refactoring issues.

Apply the proposed fix:

  params: ExtractParams<
-   (typeof ROUTES.events.locations)[":countryId"][":cityId"]["__path"]
+   (typeof ROUTES.events.locations)[":countryId"]["__path"]
  >;
🧹 Nitpick comments (6)
src/pages/events/[id]/talks/[talkId]/assets/_instagram.tsx (3)

27-33: Drop redundant async/await inside Promise.all mapping.

async (...) => await DynamicAssets.getAstroImageBase64(...) adds unnecessary micro-tasks. Return the promise directly.

-  const coOrganizersLogos = await Promise.all(
-    event.__coOrganizers.map(
-      async (coOrganiser) =>
-        await DynamicAssets.getAstroImageBase64(
-          coOrganiser.data.logos.noBgSquare,
-        ),
-    ),
-  );
+  const coOrganizersLogos = await Promise.all(
+    event.__coOrganizers.map((coOrganiser) =>
+      DynamicAssets.getAstroImageBase64(coOrganiser.data.logos.noBgSquare),
+    ),
+  );

36-51: Pre-slice speakers to 4 before fetching images.

Avoids generating base64 for speakers you won’t render.

-  const speakersImages = (
-    await Promise.all(
-      talk.__speakers.map(async (speaker) => {
-        const speakerImage = await DynamicAssets.getAstroImageBase64(
-          speaker.data.avatar ?? peoplePlaceholder,
-        );
-        const flag = speaker.data._computed.country?.data.flag;
-        const speakerFlag = flag
-          ? await DynamicAssets.getAstroImageBase64(flag)
-          : undefined;
-        return {
-          speakerImage,
-          speakerFlag,
-        };
-      }),
-    )
-  ).slice(0, 4);
+  const speakersImages = await Promise.all(
+    talk.__speakers.slice(0, 4).map(async (speaker) => {
+      const speakerImage = await DynamicAssets.getAstroImageBase64(
+        speaker.data.avatar ?? peoplePlaceholder,
+      );
+      const flag = speaker.data._computed.country?.data.flag;
+      const speakerFlag = flag
+        ? await DynamicAssets.getAstroImageBase64(flag)
+        : undefined;
+      return { speakerImage, speakerFlag };
+    }),
+  );

21-23: Optional: fetch event and talk concurrently.

Minor latency win; both are independent.

-  const event = await getEventData(params.id);
-  const talk = await getTalkData(params.talkId);
+  const [event, talk] = await Promise.all([
+    getEventData(params.id),
+    getTalkData(params.talkId),
+  ]);
src/pages/events/locations/[countryId]/assets/[__image].[__type].ts (1)

1-6: Endpoint migration is correct.

Import and GET wiring match the new wrapper. Consider explicit APIRoute typing if you prefer stricter contracts, otherwise inference is fine.

src/pages/events/[id]/assets/_tickets-available.tsx (1)

24-31: Remove redundant async/await in co-organizers map.

Simplifies and avoids extra micro-tasks.

-    const coOrganizersLogos = await Promise.all(
-      event.__coOrganizers.map(
-        async (coOrganiser) =>
-          await DynamicAssets.getAstroImageBase64(
-            coOrganiser.data.logos.noBgSquare,
-          ),
-      ),
-    );
+    const coOrganizersLogos = await Promise.all(
+      event.__coOrganizers.map((coOrganiser) =>
+        DynamicAssets.getAstroImageBase64(coOrganiser.data.logos.noBgSquare),
+      ),
+    );
src/pages/people/[id]/assets/[__image].[__type].ts (1)

1-7: LGTM! Migration to DynamicAssets wrapper.

The endpoint properly uses the new DynamicAssets.apiImageEndpoint method. The removal of the explicit APIRoute type annotation is consistent across all endpoint files in this PR.

Optional: Consider explicit return type.

If DynamicAssets.apiImageEndpoint doesn't automatically provide strong typing, you may want to add an explicit type annotation:

-export const GET = DynamicAssets.apiImageEndpoint(
+export const GET: APIRoute = DynamicAssets.apiImageEndpoint(
  import.meta.glob("./_*.tsx", { eager: true }),
 );

However, if the method already returns a properly typed value, the current approach is fine.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a9c6120 and f0e5fa5.

📒 Files selected for processing (30)
  • src/generated-assets/components/CfpCoverNoFlag.tsx (1 hunks)
  • src/lib/astro-dynamic-assets.ts (1 hunks)
  • src/pages/events/[id]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/events/[id]/assets/_cfp-cover.tsx (2 hunks)
  • src/pages/events/[id]/assets/_og-image.tsx (2 hunks)
  • src/pages/events/[id]/assets/_qrcode-bg.tsx (2 hunks)
  • src/pages/events/[id]/assets/_save-the-date.tsx (2 hunks)
  • src/pages/events/[id]/assets/_tickets-available.tsx (2 hunks)
  • src/pages/events/[id]/attendee/[name]/[__image].[__type].ts (1 hunks)
  • src/pages/events/[id]/attendee/[name]/_social.tsx (2 hunks)
  • src/pages/events/[id]/attendee/[name]/_ticket.tsx (2 hunks)
  • src/pages/events/[id]/partners/[partnerId]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/events/[id]/partners/[partnerId]/assets/_instagram.tsx (2 hunks)
  • src/pages/events/[id]/partners/[partnerId]/assets/_square.tsx (2 hunks)
  • src/pages/events/[id]/talks/[talkId]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/events/[id]/talks/[talkId]/assets/_instagram.tsx (2 hunks)
  • src/pages/events/[id]/talks/[talkId]/assets/_og-image.tsx (2 hunks)
  • src/pages/events/[id]/talks/[talkId]/assets/_square.tsx (2 hunks)
  • src/pages/events/locations/[countryId]/[cityId]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/events/locations/[countryId]/[cityId]/assets/_og-image.tsx (2 hunks)
  • src/pages/events/locations/[countryId]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/events/locations/[countryId]/assets/_og-image.tsx (2 hunks)
  • src/pages/fr/events/for-kids/[id]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/fr/events/for-kids/[id]/assets/_og-image.tsx (1 hunks)
  • src/pages/news/article/[id]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/news/article/[id]/assets/_og-image.tsx (2 hunks)
  • src/pages/people/[id]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/people/[id]/assets/_og-image.tsx (2 hunks)
  • src/pages/podcasts/[id]/episodes/[episode]/assets/[__image].[__type].ts (1 hunks)
  • src/pages/podcasts/[id]/episodes/[episode]/assets/_og-image.tsx (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (12)
  • src/pages/events/[id]/assets/_qrcode-bg.tsx
  • src/pages/podcasts/[id]/episodes/[episode]/assets/[__image].[__type].ts
  • src/pages/people/[id]/assets/_og-image.tsx
  • src/pages/events/[id]/assets/_og-image.tsx
  • src/pages/podcasts/[id]/episodes/[episode]/assets/_og-image.tsx
  • src/pages/events/[id]/talks/[talkId]/assets/_square.tsx
  • src/pages/events/[id]/assets/_cfp-cover.tsx
  • src/pages/events/locations/[countryId]/[cityId]/assets/[__image].[__type].ts
  • src/pages/fr/events/for-kids/[id]/assets/[__image].[__type].ts
  • src/pages/news/article/[id]/assets/[__image].[__type].ts
  • src/pages/events/[id]/attendee/[name]/_ticket.tsx
  • src/pages/events/locations/[countryId]/[cityId]/assets/_og-image.tsx
🧰 Additional context used
🧬 Code graph analysis (13)
src/pages/events/[id]/talks/[talkId]/assets/_instagram.tsx (5)
src/pages/events/[id]/assets/_d-30-announcement-insta.tsx (1)
  • coOrganiser (26-27)
src/pages/events/[id]/assets/_d-7-announcement.tsx (1)
  • coOrganiser (23-24)
src/pages/events/[id]/assets/_d-1-announcement.tsx (1)
  • coOrganiser (25-26)
src/pages/events/[id]/assets/_d-1-announcement-insta.tsx (1)
  • coOrganiser (28-29)
src/pages/events/[id]/assets/_d-30-announcement.tsx (1)
  • coOrganiser (23-24)
src/pages/events/[id]/partners/[partnerId]/assets/[__image].[__type].ts (1)
src/generated-assets/api.ts (1)
  • files (21-72)
src/lib/astro-dynamic-assets.ts (1)
src/generated-assets/image.ts (1)
  • font (22-35)
src/generated-assets/components/CfpCoverNoFlag.tsx (2)
src/generated-assets/image.ts (3)
  • getAstroImagePath (137-141)
  • getAstroImageBuffer (143-169)
  • getAstroImageBase64 (171-174)
src/pages/events/[id]/assets/_d-30-announcement-insta.tsx (1)
  • d30announcementInsta (17-224)
src/pages/events/[id]/talks/[talkId]/assets/[__image].[__type].ts (1)
src/generated-assets/api.ts (1)
  • files (21-72)
src/pages/events/[id]/assets/_tickets-available.tsx (5)
src/pages/events/[id]/assets/_d-1-announcement.tsx (1)
  • params (20-229)
src/pages/events/[id]/assets/_d-1-announcement-insta.tsx (1)
  • params (23-244)
src/pages/events/[id]/assets/_d-10-announcement.tsx (1)
  • d10announcement (17-208)
src/pages/events/[id]/assets/_d-30-announcement-insta.tsx (1)
  • coOrganiser (26-27)
src/pages/events/[id]/assets/_d-7-announcement.tsx (1)
  • coOrganiser (23-24)
src/pages/events/locations/[countryId]/assets/_og-image.tsx (2)
src/generated-assets/image.ts (1)
  • getAstroImagePath (137-141)
src/pages/events/[id]/assets/_d-30-announcement-insta.tsx (1)
  • d30announcementInsta (17-224)
src/pages/events/[id]/attendee/[name]/[__image].[__type].ts (9)
src/pages/events/[id]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/events/[id]/partners/[partnerId]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/events/[id]/talks/[talkId]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/events/locations/[countryId]/[cityId]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/events/locations/[countryId]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/fr/events/for-kids/[id]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/news/article/[id]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/people/[id]/assets/[__image].[__type].ts (2)
  • prerender (3-3)
  • GET (5-7)
src/pages/podcasts/[id]/episodes/[episode]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/events/[id]/assets/_save-the-date.tsx (7)
src/pages/events/[id]/assets/_d-30-announcement-insta.tsx (1)
  • coOrganiser (26-27)
src/pages/events/[id]/assets/_d-1-announcement.tsx (1)
  • coOrganiser (25-26)
src/pages/events/[id]/assets/_d-7-announcement.tsx (1)
  • coOrganiser (23-24)
src/pages/events/[id]/assets/_d-1-announcement-insta.tsx (1)
  • coOrganiser (28-29)
src/pages/events/[id]/assets/_d-30-announcement.tsx (1)
  • coOrganiser (23-24)
src/pages/events/[id]/assets/_d-10-announcement.tsx (1)
  • coOrganiser (23-24)
src/pages/events/[id]/assets/_d-10-announcement-insta.tsx (1)
  • coOrganiser (26-27)
src/pages/events/locations/[countryId]/assets/[__image].[__type].ts (9)
src/pages/events/[id]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/events/[id]/attendee/[name]/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/events/[id]/partners/[partnerId]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/events/[id]/talks/[talkId]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/events/locations/[countryId]/[cityId]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/fr/events/for-kids/[id]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/news/article/[id]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/people/[id]/assets/[__image].[__type].ts (2)
  • prerender (3-3)
  • GET (5-7)
src/pages/podcasts/[id]/episodes/[episode]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/events/[id]/partners/[partnerId]/assets/_square.tsx (2)
src/generated-assets/image.ts (3)
  • getAstroImagePath (137-141)
  • getAstroImageBuffer (143-169)
  • getAstroImageBase64 (171-174)
src/generated-assets/api.ts (1)
  • NotFoundAssetError (11-17)
src/pages/fr/events/for-kids/[id]/assets/_og-image.tsx (1)
src/pages/fr/events/for-kids/[id]/assets/_utils.ts (1)
  • getEventData (40-49)
src/pages/people/[id]/assets/[__image].[__type].ts (9)
src/pages/events/[id]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/events/[id]/attendee/[name]/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/events/[id]/partners/[partnerId]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/events/[id]/talks/[talkId]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/events/locations/[countryId]/[cityId]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/events/locations/[countryId]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/fr/events/for-kids/[id]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/news/article/[id]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
src/pages/podcasts/[id]/episodes/[episode]/assets/[__image].[__type].ts (2)
  • prerender (2-2)
  • GET (4-6)
🔇 Additional comments (19)
src/pages/fr/events/for-kids/[id]/assets/_og-image.tsx (2)

9-10: LGTM: Clean migration to external package.

The import changes correctly migrate AssetImageConfig and the DynamicAssets wrapper to use the new external package.


18-18: LGTM: Consistent usage of DynamicAssets API.

The migration from direct getAstroImageBase64 to DynamicAssets.getAstroImageBase64 is correct and consistent with the broader refactoring pattern.

src/pages/events/[id]/talks/[talkId]/assets/_og-image.tsx (2)

9-10: LGTM: Import migration is correct.

The imports are properly updated to use the external package for types and the local DynamicAssets wrapper.


24-44: LGTM: Consistent image processing migration.

All image base64 encoding calls have been successfully migrated to DynamicAssets.getAstroImageBase64, including the event cover, co-organizer logos, speaker images, and flags. The migration is thorough and consistent.

src/generated-assets/components/CfpCoverNoFlag.tsx (1)

4-7: LGTM: Migration is correct.

The import and usage changes are consistent with the broader refactoring pattern. The component correctly uses DynamicAssets.getAstroImageBase64 from the new wrapper module.

Note: This component remains in the src/generated-assets/ directory while now depending on the external package. Consider whether components in this directory should be relocated as part of the migration to better reflect the new architecture.

src/pages/events/[id]/partners/[partnerId]/assets/_square.tsx (2)

8-12: LGTM: Error handling and types migrated correctly.

The import of NotFoundAssetError and AssetImageConfig from the external package is correct. This ensures error handling remains consistent with the new library.


24-34: LGTM: Image processing migration is correct.

Both the event cover and partner logo processing have been successfully migrated to use DynamicAssets.getAstroImageBase64. The error handling with NotFoundAssetError is properly preserved.

src/pages/events/[id]/assets/[__image].[__type].ts (1)

1-6: Endpoint migration follows consistent pattern.

The migration is consistent with other endpoint files in the PR. Same consideration as other endpoints regarding the removal of explicit APIRoute type annotation.

src/pages/events/[id]/attendee/[name]/[__image].[__type].ts (1)

1-6: LGTM: Consistent endpoint migration.

The migration follows the established pattern across all endpoint files. The change correctly uses DynamicAssets.apiImageEndpoint with the glob import pattern.

src/lib/astro-dynamic-assets.ts (1)

3-26: Font files verified; environment variables are Astro framework-guaranteed.

The font paths (Tomorrow-Regular.ttf, Tomorrow-Medium.ttf, Tomorrow-Bold.ttf) are all present in public/fonts/tomorrow/.

Regarding the environment variables: import.meta.env.SITE and import.meta.env.SSR are built-in Astro framework variables automatically provided by the framework, not custom or optional values. The astro.config.mjs defines the site via getSiteUrl() and does not list SITE or SSR in the custom env.schema, confirming these are framework-managed. The risk of runtime failures from undefined variables is mitigated by Astro's contract to provide them.

Adding explicit runtime validation (as suggested in the original comment) is defensive programming but not critical for framework-guaranteed variables. Verify that your team's pattern aligns with this understanding of Astro's environment variable handling.

src/pages/events/[id]/talks/[talkId]/assets/[__image].[__type].ts (1)

1-6: Pattern is system-wide across all dynamic asset endpoints; requires verification of external package types.

The code follows an established codebase pattern. All 11+ dynamic asset endpoint files use the same pattern without explicit APIRoute type annotations:

export const GET = DynamicAssets.apiImageEndpoint(...)

This differs from other API routes (like rss.xml, download.ts) which explicitly type export const GET: APIRoute.

The @bearstudio/astro-dynamic-assets package is a local linked dependency with no public documentation. Without access to its type definitions, I cannot verify whether apiImageEndpoint properly returns an APIRoute-compatible type.

Confirm: (1) whether this pattern is intentional across the codebase, and (2) whether the external package's apiImageEndpoint method has proper return type annotations.

src/pages/events/[id]/talks/[talkId]/assets/_instagram.tsx (1)

9-14: Migration to DynamicAssets looks good.

Type source and wrapper import align with the new library. No issues.

src/pages/events/locations/[countryId]/assets/_og-image.tsx (1)

7-12: DynamicAssets adoption is consistent.

Type import + base64 usage look good and match the new library.

Also applies to: 22-24

src/pages/events/[id]/partners/[partnerId]/assets/[__image].[__type].ts (1)

1-6: Good swap to DynamicAssets.apiImageEndpoint.

Consistent with the new library integration. No further action.

src/pages/events/[id]/assets/_tickets-available.tsx (1)

7-12: Type/source migration looks clean.

Config typing and base64 call align with the new package.

Also applies to: 21-23

src/pages/events/[id]/attendee/[name]/_social.tsx (1)

7-20: LGTM! Clean migration to external package.

The import updates and method call changes are consistent with the migration pattern. The logic remains unchanged, only the API surface has been updated to use the DynamicAssets wrapper.

src/pages/events/[id]/partners/[partnerId]/assets/_instagram.tsx (1)

8-35: LGTM! Consistent migration pattern.

The migration updates both the image encoding calls and the NotFoundAssetError import to use the external package. All changes are consistent with the broader refactoring effort.

src/pages/news/article/[id]/assets/_og-image.tsx (1)

7-27: LGTM! Migration applied correctly.

The changes properly migrate to the external package for both type imports and the image encoding utility.

src/pages/events/[id]/assets/_save-the-date.tsx (1)

7-27: LGTM! Migration properly handles both single and batched image encoding with verified configuration.

The changes correctly migrate both the individual postCover and batched coOrganizersLogos encoding to use the DynamicAssets wrapper. Verification confirms:

  • The wrapper at src/lib/astro-dynamic-assets.ts is properly configured with site URL, fonts, and SSR settings
  • The external package is available via local link in package.json
  • All necessary fonts are configured and accessible

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f0e5fa5 and 2f0fffd.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (1)
  • package.json (1 hunks)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants