-
Notifications
You must be signed in to change notification settings - Fork 9
feat: implement new image generation library #454
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
WalkthroughImage generation and API endpoint logic were moved from local generated modules into the external package Changes
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)
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this 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 forgetAstroImageBase64calls.Line 25 uses
dynamicAssets.getAstroImageBase64, while lines 31, 37, and 41 use the directly importedgetAstroImageBase64. 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
dynamicAssetsconsistently.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 destructuredgetAstroImageBase64()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
dynamicAssetsand usesdynamicAssets.getAstroImageBase64(line 19), while other files likesrc/pages/events/[id]/assets/_cfp-cover.tsximportgetAstroImageBase64directly. 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
dynamicAssetsand usesdynamicAssets.getAstroImageBase64(...)on line 22, while other component files (e.g.,src/pages/events/[id]/talks/[talkId]/assets/_square.tsxandsrc/pages/events/[id]/partners/[partnerId]/assets/_square.tsx) importgetAstroImageBase64directly and use it without thedynamicAssets.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 filesOther 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 imageNon-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 styleSame note as other files: align on either named getAstroImageBase64 or dynamicAssets.getAstroImageBase64 project‑wide.
38-42: Add alt attribute to ticket imageUse 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 mapSlight 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
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis 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-assetsis 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
fontScalingvalue for this square variant.src/pages/events/[id]/assets/_save-the-date.tsx (3)
10-13: LGTM!The config object correctly uses the
AssetImageConfigtype with standard dimensions for image generation.
15-24: LGTM!The
getAstroImageBase64function 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:
AssetImageConfigfrom@bearstudio/astro-dynamic-assetshas the expected shape (width, height properties required) per 23+ usages across the codebase.getAstroImageBase64from the wrapper at@/lib/astro-dynamic-assetscorrectly re-exports the function fromdynamicAssetsand 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
AssetImageConfighas 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
NotFoundAssetErrorimport 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
NotFoundAssetErrorimport 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
NotFoundAssetErrorimport 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
NotFoundAssetErrorimport 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/apito the external@bearstudio/astro-dynamic-assetspackage 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
NotFoundAssetErrorhas 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
AssetImageConfigtype now comes from the external package, andgetAstroImageBase64is 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
apiImageEndpointtodynamicAssets.apiImageEndpointis properly implemented. The removal of the explicitAPIRoutetype annotation is acceptable as TypeScript will infer the correct type from thedynamicAssets.apiImageEndpointreturn 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.apiImageEndpointfollows 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
getAstroImageBase64export 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].tsregarding 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.tsxregarding 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 withPromise.allis 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
getAstroImageBase64directly (line 8) and uses it without thedynamicAssetsprefix (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
SITEis configured viagetSiteUrl()which correctly handles Vercel deployment URLsSSRis available as a standard Astro environment variableThe 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 explicitAPIRoutetype 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:
- Whether the library's
apiImageEndpointmethod properly types its return value as compatible with Astro'sAPIRoute- Whether explicit
APIRouteannotation 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
getAstroImageBase64is the cleaner pattern compared to accessing it viadynamicAssets.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.apiImageEndpointpattern with no remaining old references. The SSR behavior is properly configured viaimport.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-assetspackage 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 shapeAssetImageConfig 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 signalingNotFoundAssetError 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 fallbackType/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 thatNotFoundAssetErroris exported.Please verify that:
- The package
@bearstudio/astro-dynamic-assetsexportsNotFoundAssetError- The exported error class is compatible with the empty constructor usage on lines 8 and 18
There was a problem hiding this 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 toROUTES.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 usesparams.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
APIRoutetyping 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.apiImageEndpointmethod. The removal of the explicitAPIRoutetype annotation is consistent across all endpoint files in this PR.Optional: Consider explicit return type.
If
DynamicAssets.apiImageEndpointdoesn'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
📒 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
AssetImageConfigand theDynamicAssetswrapper to use the new external package.
18-18: LGTM: Consistent usage of DynamicAssets API.The migration from direct
getAstroImageBase64toDynamicAssets.getAstroImageBase64is 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.getAstroImageBase64from 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
NotFoundAssetErrorandAssetImageConfigfrom 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 withNotFoundAssetErroris 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
APIRoutetype 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.apiImageEndpointwith 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.SITEandimport.meta.env.SSRare built-in Astro framework variables automatically provided by the framework, not custom or optional values. Theastro.config.mjsdefines the site viagetSiteUrl()and does not list SITE or SSR in the customenv.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
APIRoutetype annotations:export const GET = DynamicAssets.apiImageEndpoint(...)This differs from other API routes (like
rss.xml,download.ts) which explicitly typeexport 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
apiImageEndpointproperly returns anAPIRoute-compatible type.Confirm: (1) whether this pattern is intentional across the codebase, and (2) whether the external package's
apiImageEndpointmethod 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
DynamicAssetswrapper.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
NotFoundAssetErrorimport 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
postCoverand batchedcoOrganizersLogosencoding to use theDynamicAssetswrapper. Verification confirms:
- The wrapper at
src/lib/astro-dynamic-assets.tsis 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
There was a problem hiding this 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
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (1)
package.json(1 hunks)
Summary by CodeRabbit