{"version":3,"file":"get-resizing-properties.cjs","sources":["../../src/images/get-resizing-properties.ts"],"sourcesContent":["import { isRemotePatternMatch } from './is-remote-pattern-match';\nimport type { ImageFormatWithoutPrefix, ImagesConfig } from './types';\n\nexport type ResizingProperties = {\n\tisRelative: boolean;\n\timageUrl: URL;\n\toptions: { width: number; quality: number; format: string | undefined };\n};\n\n/**\n * Derives the properties to use for image resizing from the incoming request, respecting the\n * images configuration spec from the  build output config.\n *\n * https://vercel.com/docs/build-output-api/v3/configuration#images\n *\n * @param request Incoming request.\n * @param config Images configuration from the build output.\n * @returns Resizing properties if the request is valid, otherwise undefined.\n */\nexport const getResizingProperties = (\n\trequest: Request,\n\tconfig?: ImagesConfig,\n): ResizingProperties | undefined => {\n\tif (request.method !== 'GET') return undefined;\n\n\tconst { origin, searchParams } = new URL(request.url);\n\n\tconst rawUrl = searchParams.get('url');\n\tconst width = Number.parseInt(searchParams.get('w') ?? '', 10);\n\t// 75 is the default quality - https://nextjs.org/docs/app/api-reference/components/image#quality\n\tconst quality = Number.parseInt(searchParams.get('q') ?? '75', 10);\n\n\tif (!rawUrl || Number.isNaN(width) || Number.isNaN(quality)) return undefined;\n\tif (!config?.sizes?.includes(width)) return undefined;\n\tif (quality < 0 || quality > 100) return undefined;\n\n\tconst url = new URL(rawUrl, origin);\n\n\t// SVGs must be allowed by the config.\n\tif (url.pathname.endsWith('.svg') && !config?.dangerouslyAllowSVG) {\n\t\treturn undefined;\n\t}\n\n\tconst isProtocolRelative = rawUrl.startsWith('//');\n\tconst isRelative = rawUrl.startsWith('/') && !isProtocolRelative;\n\n\tif (\n\t\t// Relative URL means same origin as deployment and is allowed.\n\t\t!isRelative &&\n\t\t// External image URL must be allowed by domains or remote patterns.\n\t\t!config?.domains?.includes(url.hostname) &&\n\t\t!config?.remotePatterns?.find((pattern) => isRemotePatternMatch(url, pattern))\n\t) {\n\t\treturn undefined;\n\t}\n\n\tconst acceptHeader = request.headers.get('Accept') ?? '';\n\tconst format = config?.formats?.find((f) => acceptHeader.includes(f))?.replace('image/', '') as\n\t\t| ImageFormatWithoutPrefix\n\t\t| undefined;\n\n\treturn {\n\t\tisRelative,\n\t\timageUrl: url,\n\t\toptions: { width, quality, format },\n\t};\n};\n"],"names":["getResizingProperties","request","config","origin","searchParams","rawUrl","width","quality","_a","url","isProtocolRelative","isRelative","_b","_c","pattern","isRemotePatternMatch","acceptHeader","format","_e","_d","f"],"mappings":"iIAmBaA,EAAwB,CACpCC,EACAC,IACoC,eAChC,GAAAD,EAAQ,SAAW,MAAc,OAErC,KAAM,CAAE,OAAAE,EAAQ,aAAAC,GAAiB,IAAI,IAAIH,EAAQ,GAAG,EAE9CI,EAASD,EAAa,IAAI,KAAK,EAC/BE,EAAQ,OAAO,SAASF,EAAa,IAAI,GAAG,GAAK,GAAI,EAAE,EAEvDG,EAAU,OAAO,SAASH,EAAa,IAAI,GAAG,GAAK,KAAM,EAAE,EAIjE,GAFI,CAACC,GAAU,OAAO,MAAMC,CAAK,GAAK,OAAO,MAAMC,CAAO,GACtD,GAACC,EAAAN,GAAA,YAAAA,EAAQ,QAAR,MAAAM,EAAe,SAASF,KACzBC,EAAU,GAAKA,EAAU,IAAY,OAEzC,MAAME,EAAM,IAAI,IAAIJ,EAAQF,CAAM,EAGlC,GAAIM,EAAI,SAAS,SAAS,MAAM,GAAK,EAACP,GAAA,MAAAA,EAAQ,qBACtC,OAGF,MAAAQ,EAAqBL,EAAO,WAAW,IAAI,EAC3CM,EAAaN,EAAO,WAAW,GAAG,GAAK,CAACK,EAE9C,GAEC,CAACC,GAED,GAACC,EAAAV,GAAA,YAAAA,EAAQ,UAAR,MAAAU,EAAiB,SAASH,EAAI,YAC/B,GAACI,EAAAX,GAAA,YAAAA,EAAQ,iBAAR,MAAAW,EAAwB,KAAMC,GAAYC,EAAqB,qBAAAN,EAAKK,CAAO,IAErE,OAGR,MAAME,EAAef,EAAQ,QAAQ,IAAI,QAAQ,GAAK,GAChDgB,GAASC,GAAAC,EAAAjB,GAAA,YAAAA,EAAQ,UAAR,YAAAiB,EAAiB,KAAMC,GAAMJ,EAAa,SAASI,CAAC,KAApD,YAAAF,EAAwD,QAAQ,SAAU,IAIlF,MAAA,CACN,WAAAP,EACA,SAAUF,EACV,QAAS,CAAE,MAAAH,EAAO,QAAAC,EAAS,OAAAU,CAAO,CAAA,CAEpC"}