vinext 0.0.26 → 0.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +89 -85
- package/dist/build/static-export.d.ts +1 -1
- package/dist/build/static-export.d.ts.map +1 -1
- package/dist/build/static-export.js +5 -9
- package/dist/build/static-export.js.map +1 -1
- package/dist/check.d.ts.map +1 -1
- package/dist/check.js +152 -48
- package/dist/check.js.map +1 -1
- package/dist/cli.js +10 -11
- package/dist/cli.js.map +1 -1
- package/dist/cloudflare/kv-cache-handler.d.ts +43 -1
- package/dist/cloudflare/kv-cache-handler.d.ts.map +1 -1
- package/dist/cloudflare/kv-cache-handler.js +135 -44
- package/dist/cloudflare/kv-cache-handler.js.map +1 -1
- package/dist/cloudflare/tpr.d.ts.map +1 -1
- package/dist/cloudflare/tpr.js +15 -4
- package/dist/cloudflare/tpr.js.map +1 -1
- package/dist/config/config-matchers.d.ts +28 -0
- package/dist/config/config-matchers.d.ts.map +1 -1
- package/dist/config/config-matchers.js +353 -79
- package/dist/config/config-matchers.js.map +1 -1
- package/dist/config/dotenv.d.ts.map +1 -1
- package/dist/config/dotenv.js +1 -6
- package/dist/config/dotenv.js.map +1 -1
- package/dist/config/next-config.d.ts +7 -0
- package/dist/config/next-config.d.ts.map +1 -1
- package/dist/config/next-config.js +44 -19
- package/dist/config/next-config.js.map +1 -1
- package/dist/deploy.d.ts +1 -1
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +81 -48
- package/dist/deploy.js.map +1 -1
- package/dist/entries/app-rsc-entry.d.ts +3 -1
- package/dist/entries/app-rsc-entry.d.ts.map +1 -1
- package/dist/entries/app-rsc-entry.js +584 -113
- package/dist/entries/app-rsc-entry.js.map +1 -1
- package/dist/entries/pages-client-entry.d.ts.map +1 -1
- package/dist/entries/pages-client-entry.js +5 -3
- package/dist/entries/pages-client-entry.js.map +1 -1
- package/dist/entries/pages-server-entry.d.ts.map +1 -1
- package/dist/entries/pages-server-entry.js +100 -32
- package/dist/entries/pages-server-entry.js.map +1 -1
- package/dist/index.d.ts +24 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +327 -154
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +6 -5
- package/dist/init.js.map +1 -1
- package/dist/plugins/client-reference-dedup.d.ts +19 -0
- package/dist/plugins/client-reference-dedup.d.ts.map +1 -0
- package/dist/plugins/client-reference-dedup.js +96 -0
- package/dist/plugins/client-reference-dedup.js.map +1 -0
- package/dist/routing/app-router.d.ts +2 -0
- package/dist/routing/app-router.d.ts.map +1 -1
- package/dist/routing/app-router.js +70 -107
- package/dist/routing/app-router.js.map +1 -1
- package/dist/routing/file-matcher.d.ts.map +1 -1
- package/dist/routing/file-matcher.js.map +1 -1
- package/dist/routing/pages-router.d.ts +3 -1
- package/dist/routing/pages-router.d.ts.map +1 -1
- package/dist/routing/pages-router.js +33 -18
- package/dist/routing/pages-router.js.map +1 -1
- package/dist/routing/route-validation.d.ts +8 -0
- package/dist/routing/route-validation.d.ts.map +1 -0
- package/dist/routing/route-validation.js +124 -0
- package/dist/routing/route-validation.js.map +1 -0
- package/dist/routing/utils.d.ts.map +1 -1
- package/dist/routing/utils.js.map +1 -1
- package/dist/server/api-handler.d.ts.map +1 -1
- package/dist/server/api-handler.js +31 -9
- package/dist/server/api-handler.js.map +1 -1
- package/dist/server/app-router-entry.d.ts +3 -2
- package/dist/server/app-router-entry.d.ts.map +1 -1
- package/dist/server/app-router-entry.js +8 -4
- package/dist/server/app-router-entry.js.map +1 -1
- package/dist/server/dev-module-runner.d.ts.map +1 -1
- package/dist/server/dev-module-runner.js +1 -1
- package/dist/server/dev-module-runner.js.map +1 -1
- package/dist/server/dev-origin-check.d.ts.map +1 -1
- package/dist/server/dev-origin-check.js.map +1 -1
- package/dist/server/dev-server.d.ts.map +1 -1
- package/dist/server/dev-server.js +39 -21
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/image-optimization.d.ts.map +1 -1
- package/dist/server/image-optimization.js.map +1 -1
- package/dist/server/instrumentation.js +1 -1
- package/dist/server/instrumentation.js.map +1 -1
- package/dist/server/isr-cache.d.ts +5 -1
- package/dist/server/isr-cache.d.ts.map +1 -1
- package/dist/server/isr-cache.js +13 -3
- package/dist/server/isr-cache.js.map +1 -1
- package/dist/server/metadata-routes.d.ts +8 -2
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata-routes.js +78 -45
- package/dist/server/metadata-routes.js.map +1 -1
- package/dist/server/middleware-codegen.d.ts +1 -1
- package/dist/server/middleware-codegen.d.ts.map +1 -1
- package/dist/server/middleware-codegen.js +177 -22
- package/dist/server/middleware-codegen.js.map +1 -1
- package/dist/server/middleware-request-headers.d.ts +9 -0
- package/dist/server/middleware-request-headers.d.ts.map +1 -0
- package/dist/server/middleware-request-headers.js +77 -0
- package/dist/server/middleware-request-headers.js.map +1 -0
- package/dist/server/middleware.d.ts +9 -8
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +112 -32
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/normalize-path.js.map +1 -1
- package/dist/server/prod-server.d.ts +1 -1
- package/dist/server/prod-server.d.ts.map +1 -1
- package/dist/server/prod-server.js +127 -82
- package/dist/server/prod-server.js.map +1 -1
- package/dist/server/request-pipeline.d.ts +2 -1
- package/dist/server/request-pipeline.d.ts.map +1 -1
- package/dist/server/request-pipeline.js +5 -7
- package/dist/server/request-pipeline.js.map +1 -1
- package/dist/shims/cache-runtime.d.ts.map +1 -1
- package/dist/shims/cache-runtime.js +21 -16
- package/dist/shims/cache-runtime.js.map +1 -1
- package/dist/shims/cache.d.ts +2 -0
- package/dist/shims/cache.d.ts.map +1 -1
- package/dist/shims/cache.js +38 -25
- package/dist/shims/cache.js.map +1 -1
- package/dist/shims/constants.d.ts.map +1 -1
- package/dist/shims/constants.js +1 -6
- package/dist/shims/constants.js.map +1 -1
- package/dist/shims/dynamic.d.ts.map +1 -1
- package/dist/shims/dynamic.js +1 -1
- package/dist/shims/dynamic.js.map +1 -1
- package/dist/shims/error-boundary.d.ts.map +1 -1
- package/dist/shims/error-boundary.js +2 -3
- package/dist/shims/error-boundary.js.map +1 -1
- package/dist/shims/error.d.ts.map +1 -1
- package/dist/shims/error.js +1 -3
- package/dist/shims/error.js.map +1 -1
- package/dist/shims/fetch-cache.d.ts.map +1 -1
- package/dist/shims/fetch-cache.js +57 -30
- package/dist/shims/fetch-cache.js.map +1 -1
- package/dist/shims/font-google-base.d.ts.map +1 -1
- package/dist/shims/font-google-base.js +16 -4
- package/dist/shims/font-google-base.js.map +1 -1
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.generated.d.ts.map +1 -1
- package/dist/shims/font-google.generated.js +412 -206
- package/dist/shims/font-google.generated.js.map +1 -1
- package/dist/shims/font-google.js +1 -1
- package/dist/shims/font-google.js.map +1 -1
- package/dist/shims/font-local.d.ts.map +1 -1
- package/dist/shims/font-local.js +13 -3
- package/dist/shims/font-local.js.map +1 -1
- package/dist/shims/form.d.ts.map +1 -1
- package/dist/shims/form.js +105 -10
- package/dist/shims/form.js.map +1 -1
- package/dist/shims/head.d.ts.map +1 -1
- package/dist/shims/head.js +10 -8
- package/dist/shims/head.js.map +1 -1
- package/dist/shims/headers.d.ts +34 -8
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/headers.js +268 -53
- package/dist/shims/headers.js.map +1 -1
- package/dist/shims/image.d.ts.map +1 -1
- package/dist/shims/image.js +35 -8
- package/dist/shims/image.js.map +1 -1
- package/dist/shims/internal/parse-cookie-header.d.ts +12 -0
- package/dist/shims/internal/parse-cookie-header.d.ts.map +1 -0
- package/dist/shims/internal/parse-cookie-header.js +32 -0
- package/dist/shims/internal/parse-cookie-header.js.map +1 -0
- package/dist/shims/legacy-image.d.ts.map +1 -1
- package/dist/shims/legacy-image.js +1 -1
- package/dist/shims/legacy-image.js.map +1 -1
- package/dist/shims/link.d.ts +2 -1
- package/dist/shims/link.d.ts.map +1 -1
- package/dist/shims/link.js +37 -17
- package/dist/shims/link.js.map +1 -1
- package/dist/shims/metadata.d.ts +12 -2
- package/dist/shims/metadata.d.ts.map +1 -1
- package/dist/shims/metadata.js +10 -8
- package/dist/shims/metadata.js.map +1 -1
- package/dist/shims/navigation-state.d.ts.map +1 -1
- package/dist/shims/navigation-state.js +3 -2
- package/dist/shims/navigation-state.js.map +1 -1
- package/dist/shims/navigation.d.ts +3 -7
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/shims/navigation.js +46 -29
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/readonly-url-search-params.d.ts +11 -0
- package/dist/shims/readonly-url-search-params.d.ts.map +1 -0
- package/dist/shims/readonly-url-search-params.js +24 -0
- package/dist/shims/readonly-url-search-params.js.map +1 -0
- package/dist/shims/request-context.d.ts +50 -0
- package/dist/shims/request-context.d.ts.map +1 -0
- package/dist/shims/request-context.js +59 -0
- package/dist/shims/request-context.js.map +1 -0
- package/dist/shims/router-state.d.ts.map +1 -1
- package/dist/shims/router-state.js +2 -1
- package/dist/shims/router-state.js.map +1 -1
- package/dist/shims/router.d.ts +4 -3
- package/dist/shims/router.d.ts.map +1 -1
- package/dist/shims/router.js +59 -53
- package/dist/shims/router.js.map +1 -1
- package/dist/shims/script.d.ts.map +1 -1
- package/dist/shims/script.js.map +1 -1
- package/dist/shims/server.d.ts +14 -1
- package/dist/shims/server.d.ts.map +1 -1
- package/dist/shims/server.js +107 -47
- package/dist/shims/server.js.map +1 -1
- package/dist/shims/url-utils.d.ts.map +1 -1
- package/dist/shims/url-utils.js +1 -3
- package/dist/shims/url-utils.js.map +1 -1
- package/dist/utils/base-path.d.ts +17 -0
- package/dist/utils/base-path.d.ts.map +1 -0
- package/dist/utils/base-path.js +25 -0
- package/dist/utils/base-path.js.map +1 -0
- package/dist/utils/manifest-paths.d.ts +4 -0
- package/dist/utils/manifest-paths.d.ts.map +1 -0
- package/dist/utils/manifest-paths.js +20 -0
- package/dist/utils/manifest-paths.js.map +1 -0
- package/dist/utils/project.d.ts.map +1 -1
- package/dist/utils/project.js +2 -4
- package/dist/utils/project.js.map +1 -1
- package/dist/utils/query.d.ts +9 -0
- package/dist/utils/query.d.ts.map +1 -1
- package/dist/utils/query.js +59 -7
- package/dist/utils/query.js.map +1 -1
- package/package.json +47 -33
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/shims/image.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAqB,MAAM,OAAO,CAAC;AAI1C,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/shims/image.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAqB,MAAM,OAAO,CAAC;AAI1C,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAyED,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,GAAG,eAAe,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,MAAM,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IACnD,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IACpD,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B;AA2CD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW,GAAG,MAAM,CAE7F;AAgBD,QAAA,MAAM,KAAK,qFAwLT,CAAC;AAEH;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG;IAChD,KAAK,EAAE,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;CAClD,CA8GA;AAED,eAAe,KAAK,CAAC"}
|
package/dist/shims/image.js
CHANGED
|
@@ -156,7 +156,14 @@ const Image = forwardRef(function Image({ src: srcProp, alt, width, height, fill
|
|
|
156
156
|
if (loader) {
|
|
157
157
|
const resolvedSrc = loader({ src, width: imgWidth ?? 0, quality: quality ?? 75 });
|
|
158
158
|
return (_jsx("img", { ref: ref, src: resolvedSrc, alt: alt, width: fill ? undefined : imgWidth, height: fill ? undefined : imgHeight, loading: priority ? "eager" : (loading ?? "lazy"), decoding: "async", sizes: sizes, className: className, style: fill
|
|
159
|
-
? {
|
|
159
|
+
? {
|
|
160
|
+
position: "absolute",
|
|
161
|
+
inset: 0,
|
|
162
|
+
width: "100%",
|
|
163
|
+
height: "100%",
|
|
164
|
+
objectFit: "cover",
|
|
165
|
+
...style,
|
|
166
|
+
}
|
|
160
167
|
: style, ...rest }));
|
|
161
168
|
}
|
|
162
169
|
// For remote URLs, validate against remotePatterns then use @unpic/react
|
|
@@ -174,9 +181,7 @@ const Image = forwardRef(function Image({ src: srcProp, alt, width, height, fill
|
|
|
174
181
|
}
|
|
175
182
|
}
|
|
176
183
|
const sanitizedBlur = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : undefined;
|
|
177
|
-
const bg = placeholder === "blur" && sanitizedBlur
|
|
178
|
-
? `url(${sanitizedBlur})`
|
|
179
|
-
: undefined;
|
|
184
|
+
const bg = placeholder === "blur" && sanitizedBlur ? `url(${sanitizedBlur})` : undefined;
|
|
180
185
|
if (fill) {
|
|
181
186
|
return (_jsx(UnpicImage, { src: src, alt: alt, layout: "fullWidth", priority: priority, sizes: sizes, className: className, background: bg }));
|
|
182
187
|
}
|
|
@@ -201,7 +206,9 @@ const Image = forwardRef(function Image({ src: srcProp, alt, width, height, fill
|
|
|
201
206
|
const srcSet = imgWidth && !fill && !skipOptimization
|
|
202
207
|
? generateSrcSet(src, imgWidth, imgQuality)
|
|
203
208
|
: imgWidth && !fill
|
|
204
|
-
? RESPONSIVE_WIDTHS.filter((w) => w <= imgWidth * 2)
|
|
209
|
+
? RESPONSIVE_WIDTHS.filter((w) => w <= imgWidth * 2)
|
|
210
|
+
.map((w) => `${src} ${w}w`)
|
|
211
|
+
.join(", ") || `${src} ${imgWidth}w`
|
|
205
212
|
: undefined;
|
|
206
213
|
// The main `src` also goes through the optimization endpoint. Use the
|
|
207
214
|
// declared width (or the first responsive width as fallback).
|
|
@@ -224,7 +231,15 @@ const Image = forwardRef(function Image({ src: srcProp, alt, width, height, fill
|
|
|
224
231
|
// For local images, render a standard <img> tag with srcSet and blur support.
|
|
225
232
|
// The src and srcSet point to the /_vinext/image optimization endpoint.
|
|
226
233
|
return (_jsx("img", { ref: ref, src: optimizedSrc, alt: alt, width: fill ? undefined : imgWidth, height: fill ? undefined : imgHeight, loading: priority ? "eager" : (loading ?? "lazy"), fetchPriority: priority ? "high" : undefined, decoding: "async", srcSet: srcSet, sizes: sizes ?? (fill ? "100vw" : undefined), className: className, "data-nimg": fill ? "fill" : "1", style: fill
|
|
227
|
-
? {
|
|
234
|
+
? {
|
|
235
|
+
position: "absolute",
|
|
236
|
+
inset: 0,
|
|
237
|
+
width: "100%",
|
|
238
|
+
height: "100%",
|
|
239
|
+
objectFit: "cover",
|
|
240
|
+
...blurStyle,
|
|
241
|
+
...style,
|
|
242
|
+
}
|
|
228
243
|
: { ...blurStyle, ...style }, ...rest }));
|
|
229
244
|
});
|
|
230
245
|
/**
|
|
@@ -262,7 +277,11 @@ export function getImageProps(props) {
|
|
|
262
277
|
// When `unoptimized` is true, bypass the endpoint entirely (Next.js compat).
|
|
263
278
|
// SVG sources auto-skip unless dangerouslyAllowSVG is enabled.
|
|
264
279
|
const isSvg = resolvedSrc.endsWith(".svg");
|
|
265
|
-
const skipOpt = _unoptimized === true ||
|
|
280
|
+
const skipOpt = _unoptimized === true ||
|
|
281
|
+
(isSvg && !__dangerouslyAllowSVG) ||
|
|
282
|
+
blockedInProd ||
|
|
283
|
+
!!loader ||
|
|
284
|
+
isRemoteUrl(resolvedSrc);
|
|
266
285
|
const optimizedSrc = skipOpt
|
|
267
286
|
? resolvedSrc
|
|
268
287
|
: imgWidth
|
|
@@ -296,7 +315,15 @@ export function getImageProps(props) {
|
|
|
296
315
|
className,
|
|
297
316
|
"data-nimg": fill ? "fill" : "1",
|
|
298
317
|
style: fill
|
|
299
|
-
? {
|
|
318
|
+
? {
|
|
319
|
+
position: "absolute",
|
|
320
|
+
inset: 0,
|
|
321
|
+
width: "100%",
|
|
322
|
+
height: "100%",
|
|
323
|
+
objectFit: "cover",
|
|
324
|
+
...blurStyle,
|
|
325
|
+
...style,
|
|
326
|
+
}
|
|
300
327
|
: { ...blurStyle, ...style },
|
|
301
328
|
...rest,
|
|
302
329
|
},
|
package/dist/shims/image.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/shims/image.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * next/image shim\n *\n * Translates Next.js Image props to @unpic/react Image component.\n * @unpic/react auto-detects CDN from URL and uses native transforms.\n * For local images (relative paths), routes through `/_vinext/image`\n * for server-side optimization (resize, format negotiation, quality).\n *\n * Remote images are validated against `images.remotePatterns` and\n * `images.domains` from next.config.js. Unmatched URLs are blocked\n * in production and warn in development, matching Next.js behavior.\n */\nimport React, { forwardRef } from \"react\";\nimport { Image as UnpicImage } from \"@unpic/react\";\nimport { hasRemoteMatch, type RemotePattern } from \"./image-config.js\";\n\nexport interface StaticImageData {\n src: string;\n height: number;\n width: number;\n blurDataURL?: string;\n}\n\n/**\n * Image config injected at build time via Vite define.\n * Serialized as JSON — parsed once at module level.\n */\nconst __imageRemotePatterns: RemotePattern[] = (() => {\n try {\n return JSON.parse(process.env.__VINEXT_IMAGE_REMOTE_PATTERNS ?? \"[]\");\n } catch {\n return [];\n }\n})();\nconst __imageDomains: string[] = (() => {\n try {\n return JSON.parse(process.env.__VINEXT_IMAGE_DOMAINS ?? \"[]\");\n } catch {\n return [];\n }\n})();\nconst __hasImageConfig = __imageRemotePatterns.length > 0 || __imageDomains.length > 0;\nconst __isDev = process.env.NODE_ENV !== \"production\";\nconst __imageDeviceSizes: number[] = (() => {\n try {\n return JSON.parse(process.env.__VINEXT_IMAGE_DEVICE_SIZES ?? \"[640,750,828,1080,1200,1920,2048,3840]\");\n } catch {\n return [640, 750, 828, 1080, 1200, 1920, 2048, 3840];\n }\n})();\n/**\n * Whether dangerouslyAllowSVG is enabled in next.config.js.\n * When false (default), .svg sources auto-skip the optimization endpoint\n * and are served directly, matching Next.js behavior.\n * When true, .svg sources are routed through the optimizer (served as-is\n * with security headers).\n */\nconst __dangerouslyAllowSVG = process.env.__VINEXT_IMAGE_DANGEROUSLY_ALLOW_SVG === \"true\";\n/**\n * Validate that a remote URL is allowed by the configured remote patterns.\n * Returns true if the URL is allowed, false otherwise.\n *\n * When no remotePatterns/domains are configured, all remote URLs are allowed\n * (backwards-compatible — user hasn't opted into restriction).\n *\n * When patterns ARE configured, only matching URLs are allowed.\n * In development, non-matching URLs produce a console warning.\n * In production, non-matching URLs are blocked (src replaced with empty string).\n */\nfunction validateRemoteUrl(src: string): { allowed: boolean; reason?: string } {\n if (!__hasImageConfig) {\n // No image config — allow everything (backwards-compatible)\n return { allowed: true };\n }\n\n let url: URL;\n try {\n url = new URL(src, \"http://n\");\n } catch {\n return { allowed: false, reason: `Invalid URL: ${src}` };\n }\n\n if (hasRemoteMatch(__imageDomains, __imageRemotePatterns, url)) {\n return { allowed: true };\n }\n\n return {\n allowed: false,\n reason: `Image URL \"${src}\" is not configured in images.remotePatterns or images.domains in next.config.js. See: https://nextjs.org/docs/messages/next-image-unconfigured-host`,\n };\n}\n\ninterface ImageProps {\n src: string | StaticImageData;\n alt: string;\n width?: number;\n height?: number;\n fill?: boolean;\n priority?: boolean;\n quality?: number;\n placeholder?: \"blur\" | \"empty\";\n blurDataURL?: string;\n loader?: (params: { src: string; width: number; quality?: number }) => string;\n sizes?: string;\n className?: string;\n style?: React.CSSProperties;\n onLoad?: React.ReactEventHandler<HTMLImageElement>;\n onError?: React.ReactEventHandler<HTMLImageElement>;\n onClick?: React.MouseEventHandler<HTMLImageElement>;\n id?: string;\n // Accept and ignore Next.js-specific props that don't apply\n unoptimized?: boolean;\n overrideSrc?: string;\n loading?: \"lazy\" | \"eager\";\n}\n\n/**\n * Sanitize a blurDataURL to prevent CSS injection.\n *\n * A crafted data URL containing `)` can break out of the `url()` CSS function,\n * allowing injection of arbitrary CSS properties or rules. Characters like `{`,\n * `}`, and `\\` can also assist in crafting injection payloads.\n *\n * This validates the URL starts with `data:image/` and rejects characters that\n * could escape the `url()` context. Semicolons are allowed since they're part\n * of valid data URLs (`data:image/png;base64,...`) and harmless inside `url()`.\n *\n * Returns undefined for invalid URLs, which causes the blur placeholder to be\n * skipped gracefully.\n */\nfunction sanitizeBlurDataURL(url: string): string | undefined {\n // Must be a data: image URL\n if (!url.startsWith(\"data:image/\")) return undefined;\n // Reject characters that can break out of CSS url():\n // ) - closes url()\n // ( - could open nested functions\n // { } - CSS rule boundaries\n // \\ - CSS escape sequences\n // newlines - break CSS parsing\n if (/[)(}{\\\\'\"\\n\\r]/.test(url)) return undefined;\n return url;\n}\n\n/**\n * Determine if a src is a remote URL (CDN-optimizable) or local.\n */\nfunction isRemoteUrl(src: string): boolean {\n return src.startsWith(\"http://\") || src.startsWith(\"https://\") || src.startsWith(\"//\");\n}\n\n/**\n * Responsive image widths matching Next.js's device sizes config.\n * These are the breakpoints used for srcSet generation.\n * Configurable via `images.deviceSizes` in next.config.js.\n */\nconst RESPONSIVE_WIDTHS = __imageDeviceSizes;\n\n/**\n * Build a `/_vinext/image` optimization URL.\n *\n * In production (Cloudflare Workers), the worker intercepts this path and uses\n * the Images binding to resize/transcode on the fly. In dev, the Vite dev\n * server handles it as a passthrough (serves the original file).\n */\nexport function imageOptimizationUrl(src: string, width: number, quality: number = 75): string {\n return `/_vinext/image?url=${encodeURIComponent(src)}&w=${width}&q=${quality}`;\n}\n\n/**\n * Generate a srcSet string for responsive images.\n *\n * Each width points to the `/_vinext/image` optimization endpoint so the\n * server can resize and transcode the image. Only includes widths that are\n * <= 2x the original image width to avoid pointless upscaling.\n */\nfunction generateSrcSet(src: string, originalWidth: number, quality: number = 75): string {\n const widths = RESPONSIVE_WIDTHS.filter((w) => w <= originalWidth * 2);\n if (widths.length === 0) return `${imageOptimizationUrl(src, originalWidth, quality)} ${originalWidth}w`;\n return widths.map((w) => `${imageOptimizationUrl(src, w, quality)} ${w}w`).join(\", \");\n}\n\nconst Image = forwardRef<HTMLImageElement, ImageProps>(function Image(\n {\n src: srcProp,\n alt,\n width,\n height,\n fill,\n priority,\n quality,\n placeholder,\n blurDataURL,\n loader,\n sizes,\n className,\n style,\n unoptimized: _unoptimized,\n overrideSrc: _overrideSrc,\n loading,\n ...rest\n },\n ref,\n) {\n // Handle StaticImageData (import result)\n const src = typeof srcProp === \"string\" ? srcProp : srcProp.src;\n const imgWidth = width ?? (typeof srcProp === \"object\" ? srcProp.width : undefined);\n const imgHeight = height ?? (typeof srcProp === \"object\" ? srcProp.height : undefined);\n const imgBlurDataURL = blurDataURL ?? (typeof srcProp === \"object\" ? srcProp.blurDataURL : undefined);\n\n // If a custom loader is provided, use basic img with loader URL\n if (loader) {\n const resolvedSrc = loader({ src, width: imgWidth ?? 0, quality: quality ?? 75 });\n return (\n <img\n ref={ref}\n src={resolvedSrc}\n alt={alt}\n width={fill ? undefined : imgWidth}\n height={fill ? undefined : imgHeight}\n loading={priority ? \"eager\" : (loading ?? \"lazy\")}\n decoding=\"async\"\n sizes={sizes}\n className={className}\n style={\n fill\n ? { position: \"absolute\", inset: 0, width: \"100%\", height: \"100%\", objectFit: \"cover\", ...style }\n : style\n }\n {...rest}\n />\n );\n }\n\n // For remote URLs, validate against remotePatterns then use @unpic/react\n if (isRemoteUrl(src)) {\n const validation = validateRemoteUrl(src);\n if (!validation.allowed) {\n if (__isDev) {\n console.warn(`[next/image] ${validation.reason}`);\n // In dev, render the image but with a warning — matches Next.js dev behavior\n } else {\n // In production, block the image entirely\n console.error(`[next/image] ${validation.reason}`);\n return null;\n }\n }\n\n const sanitizedBlur = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : undefined;\n const bg =\n placeholder === \"blur\" && sanitizedBlur\n ? `url(${sanitizedBlur})`\n : undefined;\n\n if (fill) {\n return (\n <UnpicImage\n src={src}\n alt={alt}\n layout=\"fullWidth\"\n priority={priority}\n sizes={sizes}\n className={className}\n background={bg}\n />\n );\n }\n // constrained layout requires width+height or aspectRatio\n if (imgWidth && imgHeight) {\n return (\n <UnpicImage\n src={src}\n alt={alt}\n width={imgWidth}\n height={imgHeight}\n layout=\"constrained\"\n priority={priority}\n sizes={sizes}\n className={className}\n background={bg}\n />\n );\n }\n // Fall through to basic <img> if dimensions not provided\n // (unpic requires them for constrained layout)\n }\n\n // Route local images through the /_vinext/image optimization endpoint.\n // In production on Cloudflare Workers, this resizes and transcodes via\n // the Images binding. In dev, it serves the original file as a passthrough.\n // When `unoptimized` is true, bypass the endpoint entirely (Next.js compat).\n // SVG sources auto-skip unless dangerouslyAllowSVG is enabled, matching\n // Next.js behavior where .svg triggers unoptimized=true by default.\n const imgQuality = quality ?? 75;\n const isSvg = src.endsWith(\".svg\");\n const skipOptimization = _unoptimized === true || (isSvg && !__dangerouslyAllowSVG);\n\n // Build srcSet for responsive local images (common breakpoints).\n // Each entry points to /_vinext/image with the appropriate width.\n const srcSet = imgWidth && !fill && !skipOptimization\n ? generateSrcSet(src, imgWidth, imgQuality)\n : imgWidth && !fill\n ? RESPONSIVE_WIDTHS.filter((w) => w <= imgWidth * 2).map((w) => `${src} ${w}w`).join(\", \") || `${src} ${imgWidth}w`\n : undefined;\n\n // The main `src` also goes through the optimization endpoint. Use the\n // declared width (or the first responsive width as fallback).\n const optimizedSrc = skipOptimization\n ? src\n : imgWidth\n ? imageOptimizationUrl(src, imgWidth, imgQuality)\n : imageOptimizationUrl(src, RESPONSIVE_WIDTHS[0], imgQuality);\n\n // Blur placeholder: show a low-quality background while the image loads.\n // Sanitize blurDataURL to prevent CSS injection via crafted data URLs.\n const sanitizedLocalBlur = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : undefined;\n const blurStyle = placeholder === \"blur\" && sanitizedLocalBlur\n ? {\n backgroundImage: `url(${sanitizedLocalBlur})`,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n backgroundPosition: \"center\",\n }\n : undefined;\n\n // For local images, render a standard <img> tag with srcSet and blur support.\n // The src and srcSet point to the /_vinext/image optimization endpoint.\n return (\n <img\n ref={ref}\n src={optimizedSrc}\n alt={alt}\n width={fill ? undefined : imgWidth}\n height={fill ? undefined : imgHeight}\n loading={priority ? \"eager\" : (loading ?? \"lazy\")}\n fetchPriority={priority ? \"high\" : undefined}\n decoding=\"async\"\n srcSet={srcSet}\n sizes={sizes ?? (fill ? \"100vw\" : undefined)}\n className={className}\n data-nimg={fill ? \"fill\" : \"1\"}\n style={\n fill\n ? { position: \"absolute\", inset: 0, width: \"100%\", height: \"100%\", objectFit: \"cover\", ...blurStyle, ...style }\n : { ...blurStyle, ...style }\n }\n {...rest}\n />\n );\n});\n\n/**\n * getImageProps — for advanced use cases (picture elements, background images).\n * Returns the props that would be passed to the underlying <img> element.\n */\nexport function getImageProps(props: ImageProps): {\n props: React.ImgHTMLAttributes<HTMLImageElement>;\n} {\n const {\n src: srcProp,\n alt,\n width,\n height,\n fill,\n priority,\n quality: _quality,\n placeholder,\n blurDataURL: blurDataURLProp,\n loader,\n sizes,\n className,\n style,\n unoptimized: _unoptimized,\n overrideSrc: _overrideSrc,\n loading,\n ...rest\n } = props;\n\n const src = typeof srcProp === \"string\" ? srcProp : srcProp.src;\n const imgWidth = width ?? (typeof srcProp === \"object\" ? srcProp.width : undefined);\n const imgHeight = height ?? (typeof srcProp === \"object\" ? srcProp.height : undefined);\n const imgBlurDataURL = blurDataURLProp ?? (typeof srcProp === \"object\" ? srcProp.blurDataURL : undefined);\n\n // Validate remote URLs against configured patterns\n let blockedInProd = false;\n if (isRemoteUrl(src)) {\n const validation = validateRemoteUrl(src);\n if (!validation.allowed) {\n if (__isDev) {\n console.warn(`[next/image] ${validation.reason}`);\n } else {\n console.error(`[next/image] ${validation.reason}`);\n blockedInProd = true;\n }\n }\n }\n\n // Resolve src through custom loader if provided\n const imgQuality = _quality ?? 75;\n const resolvedSrc = blockedInProd\n ? \"\"\n : loader\n ? loader({ src, width: imgWidth ?? 0, quality: imgQuality })\n : src;\n\n // For local images (no loader, not remote), route through optimization endpoint.\n // When `unoptimized` is true, bypass the endpoint entirely (Next.js compat).\n // SVG sources auto-skip unless dangerouslyAllowSVG is enabled.\n const isSvg = resolvedSrc.endsWith(\".svg\");\n const skipOpt = _unoptimized === true || (isSvg && !__dangerouslyAllowSVG) || blockedInProd || !!loader || isRemoteUrl(resolvedSrc);\n const optimizedSrc = skipOpt\n ? resolvedSrc\n : imgWidth\n ? imageOptimizationUrl(resolvedSrc, imgWidth, imgQuality)\n : imageOptimizationUrl(resolvedSrc, RESPONSIVE_WIDTHS[0], imgQuality);\n\n // Build srcSet for local images — each width points to /_vinext/image\n const srcSet = imgWidth && !fill && !isRemoteUrl(resolvedSrc) && !loader && !skipOpt\n ? generateSrcSet(resolvedSrc, imgWidth, imgQuality)\n : undefined;\n\n // Blur placeholder styles — sanitize to prevent CSS injection\n const sanitizedBlurURL = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : undefined;\n const blurStyle = placeholder === \"blur\" && sanitizedBlurURL\n ? {\n backgroundImage: `url(${sanitizedBlurURL})`,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\" as const,\n backgroundPosition: \"center\" as const,\n }\n : undefined;\n\n return {\n props: {\n src: optimizedSrc,\n alt,\n width: fill ? undefined : imgWidth,\n height: fill ? undefined : imgHeight,\n loading: priority ? \"eager\" : (loading ?? \"lazy\"),\n fetchPriority: priority ? (\"high\" as const) : undefined,\n decoding: \"async\" as const,\n srcSet,\n sizes: sizes ?? (fill ? \"100vw\" : undefined),\n className,\n \"data-nimg\": fill ? \"fill\" : \"1\",\n style: fill\n ? { position: \"absolute\" as const, inset: 0, width: \"100%\", height: \"100%\", objectFit: \"cover\" as const, ...blurStyle, ...style }\n : { ...blurStyle, ...style },\n ...rest,\n } as React.ImgHTMLAttributes<HTMLImageElement>,\n };\n}\n\nexport default Image;\n"]}
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/shims/image.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * next/image shim\n *\n * Translates Next.js Image props to @unpic/react Image component.\n * @unpic/react auto-detects CDN from URL and uses native transforms.\n * For local images (relative paths), routes through `/_vinext/image`\n * for server-side optimization (resize, format negotiation, quality).\n *\n * Remote images are validated against `images.remotePatterns` and\n * `images.domains` from next.config.js. Unmatched URLs are blocked\n * in production and warn in development, matching Next.js behavior.\n */\nimport React, { forwardRef } from \"react\";\nimport { Image as UnpicImage } from \"@unpic/react\";\nimport { hasRemoteMatch, type RemotePattern } from \"./image-config.js\";\n\nexport interface StaticImageData {\n src: string;\n height: number;\n width: number;\n blurDataURL?: string;\n}\n\n/**\n * Image config injected at build time via Vite define.\n * Serialized as JSON — parsed once at module level.\n */\nconst __imageRemotePatterns: RemotePattern[] = (() => {\n try {\n return JSON.parse(process.env.__VINEXT_IMAGE_REMOTE_PATTERNS ?? \"[]\");\n } catch {\n return [];\n }\n})();\nconst __imageDomains: string[] = (() => {\n try {\n return JSON.parse(process.env.__VINEXT_IMAGE_DOMAINS ?? \"[]\");\n } catch {\n return [];\n }\n})();\nconst __hasImageConfig = __imageRemotePatterns.length > 0 || __imageDomains.length > 0;\nconst __isDev = process.env.NODE_ENV !== \"production\";\nconst __imageDeviceSizes: number[] = (() => {\n try {\n return JSON.parse(\n process.env.__VINEXT_IMAGE_DEVICE_SIZES ?? \"[640,750,828,1080,1200,1920,2048,3840]\",\n );\n } catch {\n return [640, 750, 828, 1080, 1200, 1920, 2048, 3840];\n }\n})();\n/**\n * Whether dangerouslyAllowSVG is enabled in next.config.js.\n * When false (default), .svg sources auto-skip the optimization endpoint\n * and are served directly, matching Next.js behavior.\n * When true, .svg sources are routed through the optimizer (served as-is\n * with security headers).\n */\nconst __dangerouslyAllowSVG = process.env.__VINEXT_IMAGE_DANGEROUSLY_ALLOW_SVG === \"true\";\n/**\n * Validate that a remote URL is allowed by the configured remote patterns.\n * Returns true if the URL is allowed, false otherwise.\n *\n * When no remotePatterns/domains are configured, all remote URLs are allowed\n * (backwards-compatible — user hasn't opted into restriction).\n *\n * When patterns ARE configured, only matching URLs are allowed.\n * In development, non-matching URLs produce a console warning.\n * In production, non-matching URLs are blocked (src replaced with empty string).\n */\nfunction validateRemoteUrl(src: string): { allowed: boolean; reason?: string } {\n if (!__hasImageConfig) {\n // No image config — allow everything (backwards-compatible)\n return { allowed: true };\n }\n\n let url: URL;\n try {\n url = new URL(src, \"http://n\");\n } catch {\n return { allowed: false, reason: `Invalid URL: ${src}` };\n }\n\n if (hasRemoteMatch(__imageDomains, __imageRemotePatterns, url)) {\n return { allowed: true };\n }\n\n return {\n allowed: false,\n reason: `Image URL \"${src}\" is not configured in images.remotePatterns or images.domains in next.config.js. See: https://nextjs.org/docs/messages/next-image-unconfigured-host`,\n };\n}\n\ninterface ImageProps {\n src: string | StaticImageData;\n alt: string;\n width?: number;\n height?: number;\n fill?: boolean;\n priority?: boolean;\n quality?: number;\n placeholder?: \"blur\" | \"empty\";\n blurDataURL?: string;\n loader?: (params: { src: string; width: number; quality?: number }) => string;\n sizes?: string;\n className?: string;\n style?: React.CSSProperties;\n onLoad?: React.ReactEventHandler<HTMLImageElement>;\n onError?: React.ReactEventHandler<HTMLImageElement>;\n onClick?: React.MouseEventHandler<HTMLImageElement>;\n id?: string;\n // Accept and ignore Next.js-specific props that don't apply\n unoptimized?: boolean;\n overrideSrc?: string;\n loading?: \"lazy\" | \"eager\";\n}\n\n/**\n * Sanitize a blurDataURL to prevent CSS injection.\n *\n * A crafted data URL containing `)` can break out of the `url()` CSS function,\n * allowing injection of arbitrary CSS properties or rules. Characters like `{`,\n * `}`, and `\\` can also assist in crafting injection payloads.\n *\n * This validates the URL starts with `data:image/` and rejects characters that\n * could escape the `url()` context. Semicolons are allowed since they're part\n * of valid data URLs (`data:image/png;base64,...`) and harmless inside `url()`.\n *\n * Returns undefined for invalid URLs, which causes the blur placeholder to be\n * skipped gracefully.\n */\nfunction sanitizeBlurDataURL(url: string): string | undefined {\n // Must be a data: image URL\n if (!url.startsWith(\"data:image/\")) return undefined;\n // Reject characters that can break out of CSS url():\n // ) - closes url()\n // ( - could open nested functions\n // { } - CSS rule boundaries\n // \\ - CSS escape sequences\n // newlines - break CSS parsing\n if (/[)(}{\\\\'\"\\n\\r]/.test(url)) return undefined;\n return url;\n}\n\n/**\n * Determine if a src is a remote URL (CDN-optimizable) or local.\n */\nfunction isRemoteUrl(src: string): boolean {\n return src.startsWith(\"http://\") || src.startsWith(\"https://\") || src.startsWith(\"//\");\n}\n\n/**\n * Responsive image widths matching Next.js's device sizes config.\n * These are the breakpoints used for srcSet generation.\n * Configurable via `images.deviceSizes` in next.config.js.\n */\nconst RESPONSIVE_WIDTHS = __imageDeviceSizes;\n\n/**\n * Build a `/_vinext/image` optimization URL.\n *\n * In production (Cloudflare Workers), the worker intercepts this path and uses\n * the Images binding to resize/transcode on the fly. In dev, the Vite dev\n * server handles it as a passthrough (serves the original file).\n */\nexport function imageOptimizationUrl(src: string, width: number, quality: number = 75): string {\n return `/_vinext/image?url=${encodeURIComponent(src)}&w=${width}&q=${quality}`;\n}\n\n/**\n * Generate a srcSet string for responsive images.\n *\n * Each width points to the `/_vinext/image` optimization endpoint so the\n * server can resize and transcode the image. Only includes widths that are\n * <= 2x the original image width to avoid pointless upscaling.\n */\nfunction generateSrcSet(src: string, originalWidth: number, quality: number = 75): string {\n const widths = RESPONSIVE_WIDTHS.filter((w) => w <= originalWidth * 2);\n if (widths.length === 0)\n return `${imageOptimizationUrl(src, originalWidth, quality)} ${originalWidth}w`;\n return widths.map((w) => `${imageOptimizationUrl(src, w, quality)} ${w}w`).join(\", \");\n}\n\nconst Image = forwardRef<HTMLImageElement, ImageProps>(function Image(\n {\n src: srcProp,\n alt,\n width,\n height,\n fill,\n priority,\n quality,\n placeholder,\n blurDataURL,\n loader,\n sizes,\n className,\n style,\n unoptimized: _unoptimized,\n overrideSrc: _overrideSrc,\n loading,\n ...rest\n },\n ref,\n) {\n // Handle StaticImageData (import result)\n const src = typeof srcProp === \"string\" ? srcProp : srcProp.src;\n const imgWidth = width ?? (typeof srcProp === \"object\" ? srcProp.width : undefined);\n const imgHeight = height ?? (typeof srcProp === \"object\" ? srcProp.height : undefined);\n const imgBlurDataURL =\n blurDataURL ?? (typeof srcProp === \"object\" ? srcProp.blurDataURL : undefined);\n\n // If a custom loader is provided, use basic img with loader URL\n if (loader) {\n const resolvedSrc = loader({ src, width: imgWidth ?? 0, quality: quality ?? 75 });\n return (\n <img\n ref={ref}\n src={resolvedSrc}\n alt={alt}\n width={fill ? undefined : imgWidth}\n height={fill ? undefined : imgHeight}\n loading={priority ? \"eager\" : (loading ?? \"lazy\")}\n decoding=\"async\"\n sizes={sizes}\n className={className}\n style={\n fill\n ? {\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n ...style,\n }\n : style\n }\n {...rest}\n />\n );\n }\n\n // For remote URLs, validate against remotePatterns then use @unpic/react\n if (isRemoteUrl(src)) {\n const validation = validateRemoteUrl(src);\n if (!validation.allowed) {\n if (__isDev) {\n console.warn(`[next/image] ${validation.reason}`);\n // In dev, render the image but with a warning — matches Next.js dev behavior\n } else {\n // In production, block the image entirely\n console.error(`[next/image] ${validation.reason}`);\n return null;\n }\n }\n\n const sanitizedBlur = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : undefined;\n const bg = placeholder === \"blur\" && sanitizedBlur ? `url(${sanitizedBlur})` : undefined;\n\n if (fill) {\n return (\n <UnpicImage\n src={src}\n alt={alt}\n layout=\"fullWidth\"\n priority={priority}\n sizes={sizes}\n className={className}\n background={bg}\n />\n );\n }\n // constrained layout requires width+height or aspectRatio\n if (imgWidth && imgHeight) {\n return (\n <UnpicImage\n src={src}\n alt={alt}\n width={imgWidth}\n height={imgHeight}\n layout=\"constrained\"\n priority={priority}\n sizes={sizes}\n className={className}\n background={bg}\n />\n );\n }\n // Fall through to basic <img> if dimensions not provided\n // (unpic requires them for constrained layout)\n }\n\n // Route local images through the /_vinext/image optimization endpoint.\n // In production on Cloudflare Workers, this resizes and transcodes via\n // the Images binding. In dev, it serves the original file as a passthrough.\n // When `unoptimized` is true, bypass the endpoint entirely (Next.js compat).\n // SVG sources auto-skip unless dangerouslyAllowSVG is enabled, matching\n // Next.js behavior where .svg triggers unoptimized=true by default.\n const imgQuality = quality ?? 75;\n const isSvg = src.endsWith(\".svg\");\n const skipOptimization = _unoptimized === true || (isSvg && !__dangerouslyAllowSVG);\n\n // Build srcSet for responsive local images (common breakpoints).\n // Each entry points to /_vinext/image with the appropriate width.\n const srcSet =\n imgWidth && !fill && !skipOptimization\n ? generateSrcSet(src, imgWidth, imgQuality)\n : imgWidth && !fill\n ? RESPONSIVE_WIDTHS.filter((w) => w <= imgWidth * 2)\n .map((w) => `${src} ${w}w`)\n .join(\", \") || `${src} ${imgWidth}w`\n : undefined;\n\n // The main `src` also goes through the optimization endpoint. Use the\n // declared width (or the first responsive width as fallback).\n const optimizedSrc = skipOptimization\n ? src\n : imgWidth\n ? imageOptimizationUrl(src, imgWidth, imgQuality)\n : imageOptimizationUrl(src, RESPONSIVE_WIDTHS[0], imgQuality);\n\n // Blur placeholder: show a low-quality background while the image loads.\n // Sanitize blurDataURL to prevent CSS injection via crafted data URLs.\n const sanitizedLocalBlur = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : undefined;\n const blurStyle =\n placeholder === \"blur\" && sanitizedLocalBlur\n ? {\n backgroundImage: `url(${sanitizedLocalBlur})`,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\",\n backgroundPosition: \"center\",\n }\n : undefined;\n\n // For local images, render a standard <img> tag with srcSet and blur support.\n // The src and srcSet point to the /_vinext/image optimization endpoint.\n return (\n <img\n ref={ref}\n src={optimizedSrc}\n alt={alt}\n width={fill ? undefined : imgWidth}\n height={fill ? undefined : imgHeight}\n loading={priority ? \"eager\" : (loading ?? \"lazy\")}\n fetchPriority={priority ? \"high\" : undefined}\n decoding=\"async\"\n srcSet={srcSet}\n sizes={sizes ?? (fill ? \"100vw\" : undefined)}\n className={className}\n data-nimg={fill ? \"fill\" : \"1\"}\n style={\n fill\n ? {\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n ...blurStyle,\n ...style,\n }\n : { ...blurStyle, ...style }\n }\n {...rest}\n />\n );\n});\n\n/**\n * getImageProps — for advanced use cases (picture elements, background images).\n * Returns the props that would be passed to the underlying <img> element.\n */\nexport function getImageProps(props: ImageProps): {\n props: React.ImgHTMLAttributes<HTMLImageElement>;\n} {\n const {\n src: srcProp,\n alt,\n width,\n height,\n fill,\n priority,\n quality: _quality,\n placeholder,\n blurDataURL: blurDataURLProp,\n loader,\n sizes,\n className,\n style,\n unoptimized: _unoptimized,\n overrideSrc: _overrideSrc,\n loading,\n ...rest\n } = props;\n\n const src = typeof srcProp === \"string\" ? srcProp : srcProp.src;\n const imgWidth = width ?? (typeof srcProp === \"object\" ? srcProp.width : undefined);\n const imgHeight = height ?? (typeof srcProp === \"object\" ? srcProp.height : undefined);\n const imgBlurDataURL =\n blurDataURLProp ?? (typeof srcProp === \"object\" ? srcProp.blurDataURL : undefined);\n\n // Validate remote URLs against configured patterns\n let blockedInProd = false;\n if (isRemoteUrl(src)) {\n const validation = validateRemoteUrl(src);\n if (!validation.allowed) {\n if (__isDev) {\n console.warn(`[next/image] ${validation.reason}`);\n } else {\n console.error(`[next/image] ${validation.reason}`);\n blockedInProd = true;\n }\n }\n }\n\n // Resolve src through custom loader if provided\n const imgQuality = _quality ?? 75;\n const resolvedSrc = blockedInProd\n ? \"\"\n : loader\n ? loader({ src, width: imgWidth ?? 0, quality: imgQuality })\n : src;\n\n // For local images (no loader, not remote), route through optimization endpoint.\n // When `unoptimized` is true, bypass the endpoint entirely (Next.js compat).\n // SVG sources auto-skip unless dangerouslyAllowSVG is enabled.\n const isSvg = resolvedSrc.endsWith(\".svg\");\n const skipOpt =\n _unoptimized === true ||\n (isSvg && !__dangerouslyAllowSVG) ||\n blockedInProd ||\n !!loader ||\n isRemoteUrl(resolvedSrc);\n const optimizedSrc = skipOpt\n ? resolvedSrc\n : imgWidth\n ? imageOptimizationUrl(resolvedSrc, imgWidth, imgQuality)\n : imageOptimizationUrl(resolvedSrc, RESPONSIVE_WIDTHS[0], imgQuality);\n\n // Build srcSet for local images — each width points to /_vinext/image\n const srcSet =\n imgWidth && !fill && !isRemoteUrl(resolvedSrc) && !loader && !skipOpt\n ? generateSrcSet(resolvedSrc, imgWidth, imgQuality)\n : undefined;\n\n // Blur placeholder styles — sanitize to prevent CSS injection\n const sanitizedBlurURL = imgBlurDataURL ? sanitizeBlurDataURL(imgBlurDataURL) : undefined;\n const blurStyle =\n placeholder === \"blur\" && sanitizedBlurURL\n ? {\n backgroundImage: `url(${sanitizedBlurURL})`,\n backgroundSize: \"cover\",\n backgroundRepeat: \"no-repeat\" as const,\n backgroundPosition: \"center\" as const,\n }\n : undefined;\n\n return {\n props: {\n src: optimizedSrc,\n alt,\n width: fill ? undefined : imgWidth,\n height: fill ? undefined : imgHeight,\n loading: priority ? \"eager\" : (loading ?? \"lazy\"),\n fetchPriority: priority ? (\"high\" as const) : undefined,\n decoding: \"async\" as const,\n srcSet,\n sizes: sizes ?? (fill ? \"100vw\" : undefined),\n className,\n \"data-nimg\": fill ? \"fill\" : \"1\",\n style: fill\n ? {\n position: \"absolute\" as const,\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\" as const,\n ...blurStyle,\n ...style,\n }\n : { ...blurStyle, ...style },\n ...rest,\n } as React.ImgHTMLAttributes<HTMLImageElement>,\n };\n}\n\nexport default Image;\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port of the current Next.js/@edge-runtime request cookie parser semantics.
|
|
3
|
+
*
|
|
4
|
+
* Important details:
|
|
5
|
+
* - split on a semicolon-plus-optional-spaces pattern
|
|
6
|
+
* - preserve whitespace around names/values otherwise
|
|
7
|
+
* - bare tokens become "true"
|
|
8
|
+
* - malformed percent-encoded values are skipped
|
|
9
|
+
* - duplicate names collapse to the last value via Map.set()
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseCookieHeader(cookieHeader: string): Map<string, string>;
|
|
12
|
+
//# sourceMappingURL=parse-cookie-header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-cookie-header.d.ts","sourceRoot":"","sources":["../../../src/shims/internal/parse-cookie-header.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAqB3E"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port of the current Next.js/@edge-runtime request cookie parser semantics.
|
|
3
|
+
*
|
|
4
|
+
* Important details:
|
|
5
|
+
* - split on a semicolon-plus-optional-spaces pattern
|
|
6
|
+
* - preserve whitespace around names/values otherwise
|
|
7
|
+
* - bare tokens become "true"
|
|
8
|
+
* - malformed percent-encoded values are skipped
|
|
9
|
+
* - duplicate names collapse to the last value via Map.set()
|
|
10
|
+
*/
|
|
11
|
+
export function parseCookieHeader(cookieHeader) {
|
|
12
|
+
const cookies = new Map();
|
|
13
|
+
for (const pair of cookieHeader.split(/; */)) {
|
|
14
|
+
if (!pair)
|
|
15
|
+
continue;
|
|
16
|
+
const splitAt = pair.indexOf("=");
|
|
17
|
+
if (splitAt === -1) {
|
|
18
|
+
cookies.set(pair, "true");
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const key = pair.slice(0, splitAt);
|
|
22
|
+
const value = pair.slice(splitAt + 1);
|
|
23
|
+
try {
|
|
24
|
+
cookies.set(key, decodeURIComponent(value));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Match Next.js/@edge-runtime behavior: ignore malformed cookie values.
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return cookies;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=parse-cookie-header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-cookie-header.js","sourceRoot":"","sources":["../../../src/shims/internal/parse-cookie-header.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAAoB;IACpD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAEtC,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,wEAAwE;QAC1E,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["/**\n * Port of the current Next.js/@edge-runtime request cookie parser semantics.\n *\n * Important details:\n * - split on a semicolon-plus-optional-spaces pattern\n * - preserve whitespace around names/values otherwise\n * - bare tokens become \"true\"\n * - malformed percent-encoded values are skipped\n * - duplicate names collapse to the last value via Map.set()\n */\nexport function parseCookieHeader(cookieHeader: string): Map<string, string> {\n const cookies = new Map<string, string>();\n for (const pair of cookieHeader.split(/; */)) {\n if (!pair) continue;\n\n const splitAt = pair.indexOf(\"=\");\n if (splitAt === -1) {\n cookies.set(pair, \"true\");\n continue;\n }\n\n const key = pair.slice(0, splitAt);\n const value = pair.slice(splitAt + 1);\n\n try {\n cookies.set(key, decodeURIComponent(value));\n } catch {\n // Match Next.js/@edge-runtime behavior: ignore malformed cookie values.\n }\n }\n return cookies;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacy-image.d.ts","sourceRoot":"","sources":["../../src/shims/legacy-image.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAqB,MAAM,OAAO,CAAC;AAG1C,UAAU,gBAAgB;IACxB,GAAG,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,yBAAyB;IACzB,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,MAAM,CAAC;IACvD,+CAA+C;IAC/C,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC7C,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,MAAM,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IACnD,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACtF,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,QAAA,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"legacy-image.d.ts","sourceRoot":"","sources":["../../src/shims/legacy-image.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAqB,MAAM,OAAO,CAAC;AAG1C,UAAU,gBAAgB;IACxB,GAAG,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,yBAAyB;IACzB,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,MAAM,CAAC;IACvD,+CAA+C;IAC/C,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC7C,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,MAAM,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IACnD,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACtF,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,QAAA,MAAM,WAAW,2FAiDhB,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -30,7 +30,7 @@ const LegacyImage = forwardRef(function LegacyImage(props, ref) {
|
|
|
30
30
|
}
|
|
31
31
|
: onLoad;
|
|
32
32
|
if (layout === "fill") {
|
|
33
|
-
return
|
|
33
|
+
return _jsx(Image, { ref: ref, fill: true, style: modernStyle, onLoad: handleLoad, ...rest });
|
|
34
34
|
}
|
|
35
35
|
if (layout === "responsive") {
|
|
36
36
|
// Responsive: takes full width, maintains aspect ratio
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacy-image.js","sourceRoot":"","sources":["../../src/shims/legacy-image.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;AACH,OAAc,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,MAAM,YAAY,CAAC;AA6B/B,MAAM,WAAW,GAAG,UAAU,CAC5B,SAAS,WAAW,CAAC,KAAK,EAAE,GAAG;IAC7B,MAAM,EACJ,MAAM,GAAG,WAAW,EACpB,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,MAAM,EACN,KAAK,EACL,MAAM,EACN,KAAK,EACL,GAAG,IAAI,EACR,GAAG,KAAK,CAAC;IAEV,+CAA+C;IAC/C,MAAM,WAAW,GAAwB,EAAE,GAAG,KAAK,EAAE,CAAC;IAEtD,IAAI,SAAS;QAAE,WAAW,CAAC,SAAS,GAAG,SAAS,CAAC;IACjD,IAAI,cAAc;QAAE,WAAW,CAAC,cAAc,GAAG,cAAc,CAAC;IAEhE,MAAM,UAAU,GAAG,iBAAiB;QAClC,CAAC,CAAC,CAAC,CAAyC,EAAE,EAAE;YAC5C,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,CAAC;YAC5B,iBAAiB,CAAC;gBAChB,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,aAAa,EAAE,GAAG,CAAC,aAAa;aACjC,CAAC,CAAC;YACH,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;QACH,CAAC,CAAC,MAAM,CAAC;IAEX,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,
|
|
1
|
+
{"version":3,"file":"legacy-image.js","sourceRoot":"","sources":["../../src/shims/legacy-image.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;AACH,OAAc,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,MAAM,YAAY,CAAC;AA6B/B,MAAM,WAAW,GAAG,UAAU,CAC5B,SAAS,WAAW,CAAC,KAAK,EAAE,GAAG;IAC7B,MAAM,EACJ,MAAM,GAAG,WAAW,EACpB,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,MAAM,EACN,KAAK,EACL,MAAM,EACN,KAAK,EACL,GAAG,IAAI,EACR,GAAG,KAAK,CAAC;IAEV,+CAA+C;IAC/C,MAAM,WAAW,GAAwB,EAAE,GAAG,KAAK,EAAE,CAAC;IAEtD,IAAI,SAAS;QAAE,WAAW,CAAC,SAAS,GAAG,SAAS,CAAC;IACjD,IAAI,cAAc;QAAE,WAAW,CAAC,cAAc,GAAG,cAAc,CAAC;IAEhE,MAAM,UAAU,GAAG,iBAAiB;QAClC,CAAC,CAAC,CAAC,CAAyC,EAAE,EAAE;YAC5C,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,CAAC;YAC5B,iBAAiB,CAAC;gBAChB,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,aAAa,EAAE,GAAG,CAAC,aAAa;aACjC,CAAC,CAAC;YACH,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;QACH,CAAC,CAAC,MAAM,CAAC;IAEX,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,KAAC,KAAK,IAAC,GAAG,EAAE,GAAG,EAAE,IAAI,QAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,KAAM,IAAI,GAAI,CAAC;IACpF,CAAC;IAED,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC5B,uDAAuD;QACvD,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC;QAC3B,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;IAC9B,CAAC;IAED,0DAA0D;IAC1D,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,MAAM,CAAC,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAErE,OAAO,CACL,KAAC,KAAK,IAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,KAAM,IAAI,GAAI,CAC3F,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["/**\n * next/legacy/image shim\n *\n * Provides the pre-Next.js 13 Image component API with layout prop.\n * Translates legacy props (layout, objectFit, objectPosition) to the\n * modern Image component's fill/style props.\n *\n * This module is used by apps that ran the `next-image-to-legacy-image`\n * codemod when upgrading from Next.js 12.\n */\nimport React, { forwardRef } from \"react\";\nimport Image from \"./image.js\";\n\ninterface LegacyImageProps {\n src: string | { src: string; width: number; height: number; blurDataURL?: string };\n alt: string;\n width?: number | string;\n height?: number | string;\n /** Legacy layout mode */\n layout?: \"fixed\" | \"intrinsic\" | \"responsive\" | \"fill\";\n /** CSS object-fit (used with layout=\"fill\") */\n objectFit?: React.CSSProperties[\"objectFit\"];\n /** CSS object-position (used with layout=\"fill\") */\n objectPosition?: string;\n priority?: boolean;\n quality?: number;\n placeholder?: \"blur\" | \"empty\";\n blurDataURL?: string;\n loader?: (params: { src: string; width: number; quality?: number }) => string;\n sizes?: string;\n className?: string;\n style?: React.CSSProperties;\n onLoad?: React.ReactEventHandler<HTMLImageElement>;\n onLoadingComplete?: (result: { naturalWidth: number; naturalHeight: number }) => void;\n onError?: React.ReactEventHandler<HTMLImageElement>;\n loading?: \"lazy\" | \"eager\";\n unoptimized?: boolean;\n id?: string;\n}\n\nconst LegacyImage = forwardRef<HTMLImageElement, LegacyImageProps>(\n function LegacyImage(props, ref) {\n const {\n layout = \"intrinsic\",\n objectFit,\n objectPosition,\n onLoadingComplete,\n onLoad,\n width,\n height,\n style,\n ...rest\n } = props;\n\n // Translate legacy props to modern Image props\n const modernStyle: React.CSSProperties = { ...style };\n\n if (objectFit) modernStyle.objectFit = objectFit;\n if (objectPosition) modernStyle.objectPosition = objectPosition;\n\n const handleLoad = onLoadingComplete\n ? (e: React.SyntheticEvent<HTMLImageElement>) => {\n const img = e.currentTarget;\n onLoadingComplete({\n naturalWidth: img.naturalWidth,\n naturalHeight: img.naturalHeight,\n });\n onLoad?.(e);\n }\n : onLoad;\n\n if (layout === \"fill\") {\n return <Image ref={ref} fill style={modernStyle} onLoad={handleLoad} {...rest} />;\n }\n\n if (layout === \"responsive\") {\n // Responsive: takes full width, maintains aspect ratio\n modernStyle.width = \"100%\";\n modernStyle.height = \"auto\";\n }\n\n // For \"fixed\" and \"intrinsic\", pass width/height directly\n const w = typeof width === \"string\" ? parseInt(width, 10) : width;\n const h = typeof height === \"string\" ? parseInt(height, 10) : height;\n\n return (\n <Image ref={ref} width={w} height={h} style={modernStyle} onLoad={handleLoad} {...rest} />\n );\n },\n);\n\nexport default LegacyImage;\n"]}
|
package/dist/shims/link.d.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* page swap via the router's navigation system.
|
|
7
7
|
*/
|
|
8
8
|
import React, { type AnchorHTMLAttributes } from "react";
|
|
9
|
+
import { type UrlQuery } from "../utils/query.js";
|
|
9
10
|
interface NavigateEvent {
|
|
10
11
|
url: URL;
|
|
11
12
|
/** Call to prevent the Link's default navigation (e.g. for View Transitions). */
|
|
@@ -16,7 +17,7 @@ interface NavigateEvent {
|
|
|
16
17
|
interface LinkProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, "href"> {
|
|
17
18
|
href: string | {
|
|
18
19
|
pathname?: string;
|
|
19
|
-
query?:
|
|
20
|
+
query?: UrlQuery;
|
|
20
21
|
};
|
|
21
22
|
/** URL displayed in the browser (when href is a route pattern like /user/[id]) */
|
|
22
23
|
as?: string;
|
package/dist/shims/link.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/shims/link.tsx"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/shims/link.tsx"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,EAQZ,KAAK,oBAAoB,EAE1B,MAAM,OAAO,CAAC;AAMf,OAAO,EAA2B,KAAK,QAAQ,EAA0B,MAAM,mBAAmB,CAAC;AAGnG,UAAU,aAAa;IACrB,GAAG,EAAE,GAAG,CAAC;IACT,iFAAiF;IACjF,cAAc,IAAI,IAAI,CAAC;IACvB,gDAAgD;IAChD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,SAAU,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC/E,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;KAAE,CAAC;IACvD,kFAAkF;IAClF,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kDAAkD;IAClD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAMD,UAAU,sBAAsB;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB;AAID;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,sBAAsB,CAEtD;AA0OD,QAAA,MAAM,IAAI,qFAiPR,CAAC;AAEH,eAAe,IAAI,CAAC"}
|
package/dist/shims/link.js
CHANGED
|
@@ -7,12 +7,13 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
7
7
|
* On click, prevents full page reload and triggers client-side
|
|
8
8
|
* page swap via the router's navigation system.
|
|
9
9
|
*/
|
|
10
|
-
import React, { forwardRef, useRef, useEffect, useCallback, useContext, createContext, useState } from "react";
|
|
10
|
+
import React, { forwardRef, useRef, useEffect, useCallback, useContext, createContext, useState, } from "react";
|
|
11
11
|
// Import shared RSC prefetch utilities from navigation shim (relative path
|
|
12
12
|
// so this resolves both via the Vite plugin and in direct vitest imports)
|
|
13
13
|
import { toRscUrl, getPrefetchedUrls, storePrefetchResponse } from "./navigation.js";
|
|
14
14
|
import { isDangerousScheme } from "./url-safety.js";
|
|
15
15
|
import { toSameOriginPath } from "./url-utils.js";
|
|
16
|
+
import { appendSearchParamsToUrl, urlQueryToSearchParams } from "../utils/query.js";
|
|
16
17
|
const LinkStatusContext = createContext({ pending: false });
|
|
17
18
|
/**
|
|
18
19
|
* useLinkStatus returns the pending state of the enclosing <Link>.
|
|
@@ -29,14 +30,17 @@ function resolveHref(href) {
|
|
|
29
30
|
return href;
|
|
30
31
|
let url = href.pathname ?? "/";
|
|
31
32
|
if (href.query) {
|
|
32
|
-
const params =
|
|
33
|
-
url
|
|
33
|
+
const params = urlQueryToSearchParams(href.query);
|
|
34
|
+
url = appendSearchParamsToUrl(url, params);
|
|
34
35
|
}
|
|
35
36
|
return url;
|
|
36
37
|
}
|
|
37
38
|
/** Prepend basePath to an internal path for browser URLs / fetches */
|
|
38
39
|
function withBasePath(path) {
|
|
39
|
-
if (!__basePath ||
|
|
40
|
+
if (!__basePath ||
|
|
41
|
+
path.startsWith("http://") ||
|
|
42
|
+
path.startsWith("https://") ||
|
|
43
|
+
path.startsWith("//")) {
|
|
40
44
|
return path;
|
|
41
45
|
}
|
|
42
46
|
return __basePath + path;
|
|
@@ -65,7 +69,10 @@ function resolveRelativeHref(href) {
|
|
|
65
69
|
if (typeof window === "undefined")
|
|
66
70
|
return href;
|
|
67
71
|
// Already absolute
|
|
68
|
-
if (href.startsWith("/") ||
|
|
72
|
+
if (href.startsWith("/") ||
|
|
73
|
+
href.startsWith("http://") ||
|
|
74
|
+
href.startsWith("https://") ||
|
|
75
|
+
href.startsWith("//")) {
|
|
69
76
|
return href;
|
|
70
77
|
}
|
|
71
78
|
// Relative: resolve against current location
|
|
@@ -133,7 +140,8 @@ function prefetchUrl(href) {
|
|
|
133
140
|
priority: "low",
|
|
134
141
|
// @ts-expect-error — purpose is a valid fetch option in some browsers
|
|
135
142
|
purpose: "prefetch",
|
|
136
|
-
})
|
|
143
|
+
})
|
|
144
|
+
.then((response) => {
|
|
137
145
|
if (response.ok) {
|
|
138
146
|
storePrefetchResponse(rscUrl, response);
|
|
139
147
|
}
|
|
@@ -141,7 +149,8 @@ function prefetchUrl(href) {
|
|
|
141
149
|
// Non-ok response: allow retry on next viewport intersection
|
|
142
150
|
prefetched.delete(rscUrl);
|
|
143
151
|
}
|
|
144
|
-
})
|
|
152
|
+
})
|
|
153
|
+
.catch(() => {
|
|
145
154
|
// Network error: allow retry on next viewport intersection
|
|
146
155
|
prefetched.delete(rscUrl);
|
|
147
156
|
});
|
|
@@ -210,6 +219,11 @@ function applyLocaleToHref(href, locale) {
|
|
|
210
219
|
// No locale prop: keep current behavior (href as-is)
|
|
211
220
|
return href;
|
|
212
221
|
}
|
|
222
|
+
// Absolute and protocol-relative URLs must not be prefixed — locale
|
|
223
|
+
// only applies to local paths.
|
|
224
|
+
if (href.startsWith("http://") || href.startsWith("https://") || href.startsWith("//")) {
|
|
225
|
+
return href;
|
|
226
|
+
}
|
|
213
227
|
// locale is a string: prepend the locale prefix if not already present
|
|
214
228
|
const defaultLocale = getDefaultLocale();
|
|
215
229
|
// For the default locale, Next.js doesn't add a prefix
|
|
@@ -239,7 +253,9 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
|
|
|
239
253
|
const mountedRef = useRef(true);
|
|
240
254
|
useEffect(() => {
|
|
241
255
|
mountedRef.current = true;
|
|
242
|
-
return () => {
|
|
256
|
+
return () => {
|
|
257
|
+
mountedRef.current = false;
|
|
258
|
+
};
|
|
243
259
|
}, []);
|
|
244
260
|
// Prefetching: observe the element when it enters the viewport.
|
|
245
261
|
// prefetch={false} disables, prefetch={true} or undefined/null (default) enables.
|
|
@@ -260,7 +276,9 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
|
|
|
260
276
|
return;
|
|
261
277
|
// Normalize same-origin absolute URLs; skip truly external ones
|
|
262
278
|
let hrefToPrefetch = localizedHref;
|
|
263
|
-
if (localizedHref.startsWith("http://") ||
|
|
279
|
+
if (localizedHref.startsWith("http://") ||
|
|
280
|
+
localizedHref.startsWith("https://") ||
|
|
281
|
+
localizedHref.startsWith("//")) {
|
|
264
282
|
const localPath = toSameOriginPath(localizedHref);
|
|
265
283
|
if (localPath == null)
|
|
266
284
|
return; // truly external
|
|
@@ -282,11 +300,7 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
|
|
|
282
300
|
if (e.defaultPrevented)
|
|
283
301
|
return;
|
|
284
302
|
// Only intercept left clicks without modifiers (standard link behavior)
|
|
285
|
-
if (e.button !== 0 ||
|
|
286
|
-
e.metaKey ||
|
|
287
|
-
e.ctrlKey ||
|
|
288
|
-
e.shiftKey ||
|
|
289
|
-
e.altKey) {
|
|
303
|
+
if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {
|
|
290
304
|
return;
|
|
291
305
|
}
|
|
292
306
|
// Don't intercept links with target (e.g. target="_blank")
|
|
@@ -313,8 +327,12 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
|
|
|
313
327
|
let prevented = false;
|
|
314
328
|
const navEvent = {
|
|
315
329
|
url: navUrl,
|
|
316
|
-
preventDefault() {
|
|
317
|
-
|
|
330
|
+
preventDefault() {
|
|
331
|
+
prevented = true;
|
|
332
|
+
},
|
|
333
|
+
get defaultPrevented() {
|
|
334
|
+
return prevented;
|
|
335
|
+
},
|
|
318
336
|
};
|
|
319
337
|
onNavigate(navEvent);
|
|
320
338
|
// If the callback called preventDefault(), skip Link's default navigation.
|
|
@@ -337,7 +355,9 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
|
|
|
337
355
|
const absoluteFullHref = withBasePath(absoluteHref);
|
|
338
356
|
// Hash-only change: update URL and scroll to target, skip RSC fetch
|
|
339
357
|
if (typeof window !== "undefined" && isHashOnlyChange(absoluteFullHref)) {
|
|
340
|
-
const hash = absoluteFullHref.includes("#")
|
|
358
|
+
const hash = absoluteFullHref.includes("#")
|
|
359
|
+
? absoluteFullHref.slice(absoluteFullHref.indexOf("#"))
|
|
360
|
+
: "";
|
|
341
361
|
if (replace) {
|
|
342
362
|
window.history.replaceState(null, "", absoluteFullHref);
|
|
343
363
|
}
|