/** * Cloudflare Worker entry point — auto-generated by vinext deploy. * Edit freely or delete to regenerate on next deploy. * * For apps without image optimization, you can use vinext/server/app-router-entry * directly in wrangler.jsonc: "main": "vinext/server/app-router-entry" */ import { handleImageOptimization, DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES } from "vinext/server/image-optimization"; import type { ImageConfig } from "vinext/server/image-optimization"; import handler from "vinext/server/app-router-entry"; interface Env { ASSETS: Fetcher; IMAGES: { input(stream: ReadableStream): { transform(options: Record): { output(options: { format: string; quality: number }): Promise<{ response(): Response }>; }; }; }; } interface ExecutionContext { waitUntil(promise: Promise): void; passThroughOnException(): void; } // Image security config. SVG sources with .svg extension auto-skip the // optimization endpoint on the client side (served directly, no proxy). // To route SVGs through the optimizer (with security headers), set // dangerouslyAllowSVG: true in next.config.js and uncomment below: // const imageConfig: ImageConfig = { dangerouslyAllowSVG: true }; export default { async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise { const url = new URL(request.url); // Image optimization via Cloudflare Images binding. // The parseImageParams validation inside handleImageOptimization // normalizes backslashes and validates the origin hasn't changed. if (url.pathname === "/_vinext/image") { const allowedWidths = [...DEFAULT_DEVICE_SIZES, ...DEFAULT_IMAGE_SIZES]; return handleImageOptimization(request, { fetchAsset: (path) => env.ASSETS.fetch(new Request(new URL(path, request.url))), transformImage: async (body, { width, format, quality }) => { const result = await env.IMAGES.input(body).transform(width > 0 ? { width } : {}).output({ format, quality }); return result.response(); }, }, allowedWidths); } // Delegate everything else to vinext, forwarding ctx so that // ctx.waitUntil() is available to background cache writes and // other deferred work via getRequestExecutionContext(). return handler.fetch(request, env, ctx); }, };