@wular/pnext 0.0.4 → 0.0.7
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 +22 -16
- package/bin/pnext +6 -1
- package/config/lint/base.js +7 -7
- package/config/ts/base.json +2 -4
- package/config/ts/react.json +2 -6
- package/package.json +23 -2
- package/reference/compat.md +87 -22
- package/reference/config.md +40 -93
- package/reference/css.md +42 -33
- package/reference/dev.md +26 -33
- package/reference/env.md +18 -20
- package/reference/getting-started.md +132 -0
- package/reference/metadata.md +31 -46
- package/reference/navigation.md +65 -105
- package/reference/performance.md +21 -142
- package/reference/rendering.md +78 -75
- package/reference/routing.md +97 -107
- package/reference/typegen.md +27 -29
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +121 -114
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +52 -53
- package/src/api/navigation.ts +59 -58
- package/src/api/server.ts +152 -144
- package/src/api/suspense.ts +4 -4
- package/src/cli/adapters/vercel-warm.ts +126 -121
- package/src/cli/adapters/vercel.ts +437 -443
- package/src/cli/analyze.ts +333 -144
- package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
- package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
- package/src/cli/build.ts +976 -978
- package/src/cli/create.ts +72 -64
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +94 -85
- package/src/cli/migrate/package-json.ts +73 -71
- package/src/cli/migrate/report.ts +32 -33
- package/src/cli/migrate/{index.ts → run.ts} +48 -49
- package/src/cli/migrate/scan.ts +46 -46
- package/src/cli/migrate/spinner.ts +9 -9
- package/src/cli/migrate/tsconfig.ts +35 -35
- package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
- package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
- package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
- package/src/cli/start.ts +65 -66
- package/src/{typegen.ts → cli/typegen.ts} +59 -59
- package/src/client/build.ts +802 -768
- package/src/client/chunk-fold.ts +245 -240
- package/src/client/{paths.ts → chunk-name.ts} +6 -6
- package/src/client/entry.ts +162 -147
- package/src/client/prebuilt.ts +231 -223
- package/src/client/profile.ts +29 -29
- package/src/client/react-compiler.ts +20 -15
- package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
- package/src/client/reference-stub.ts +51 -51
- package/src/client/reference.ts +19 -19
- package/src/{api → client}/router/events.ts +32 -17
- package/src/{api → client}/router/history.ts +16 -16
- package/src/{api → client}/router/hub.ts +52 -53
- package/src/{api/router.ts → client/router/index.ts} +61 -60
- package/src/{api → client}/router/policies.ts +24 -24
- package/src/{api → client}/router/runtime.ts +2022 -1995
- package/src/{api → client}/router/types.ts +98 -98
- package/src/compat/actions/client-plugin.ts +42 -43
- package/src/compat/actions/client-stub.ts +14 -14
- package/src/compat/actions/{action-client.ts → client.ts} +194 -193
- package/src/compat/actions/config.ts +63 -64
- package/src/compat/actions/detect.ts +68 -68
- package/src/compat/actions/discovery.ts +105 -105
- package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
- package/src/compat/actions/early-submit.ts +1 -1
- package/src/compat/actions/endpoint.ts +198 -198
- package/src/compat/actions/extensions.ts +811 -0
- package/src/compat/actions/flight.ts +23 -23
- package/src/compat/actions/form-state.ts +34 -34
- package/src/compat/actions/hoist.ts +382 -236
- package/src/compat/actions/ids.ts +7 -12
- package/src/compat/actions/index.ts +8 -8
- package/src/compat/actions/instances.ts +46 -46
- package/src/compat/actions/origin.ts +47 -48
- package/src/compat/actions/protocol.ts +22 -22
- package/src/compat/actions/registry.ts +19 -19
- package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
- package/src/compat/actions/rewrite.ts +125 -125
- package/src/compat/actions/{action-router.ts → router.ts} +10 -10
- package/src/compat/actions/serve.ts +132 -136
- package/src/compat/actions/server-tag.ts +4 -4
- package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
- package/src/compat/actions/unrecognized-error.ts +4 -4
- package/src/compat/{index.ts → aliases.ts} +112 -109
- package/src/compat/bundler/bun-externals.ts +18 -18
- package/src/compat/bundler/cjs-exports.ts +271 -223
- package/src/compat/bundler/config.ts +116 -111
- package/src/compat/bundler/externals.ts +12 -12
- package/src/compat/bundler/import-meta-url.ts +19 -19
- package/src/compat/bundler/modularize-imports.ts +36 -33
- package/src/compat/bundler/new-url-asset.ts +22 -24
- package/src/compat/bundler/optimize-package-imports.ts +111 -107
- package/src/compat/bundler/polyfill.ts +28 -28
- package/src/compat/bundler/react-compiler.ts +35 -29
- package/src/compat/bundler/react-profiler.tsx +11 -11
- package/src/compat/bundler/relay-transform.ts +48 -47
- package/src/compat/bundler/require-context.ts +119 -113
- package/src/compat/bundler/resolve-extensions.ts +19 -19
- package/src/compat/bundler/source-cache.ts +25 -25
- package/src/compat/bundler/static-imports.ts +7 -7
- package/src/compat/bundler/symlink-imports.ts +46 -46
- package/src/compat/bundler/tsconfig-paths.ts +13 -15
- package/src/compat/bundler/wasm.ts +58 -60
- package/src/compat/bundler/webpack-loaders.ts +254 -241
- package/src/compat/bundler/worker.ts +101 -104
- package/src/compat/cache/build-flags.ts +29 -29
- package/src/compat/cache/build-prerender-errors.ts +40 -44
- package/src/compat/cache/custom-handler.ts +60 -53
- package/src/compat/cache/fetch-patch.ts +240 -240
- package/src/compat/cache/handler.ts +27 -31
- package/src/compat/cache/modern-handler.ts +148 -126
- package/src/compat/cache/resume-data-cache.ts +47 -45
- package/src/compat/cache/revalidate.ts +233 -232
- package/src/compat/cache/runtime-error.ts +35 -35
- package/src/compat/cache/use-cache-transform.ts +442 -417
- package/src/compat/cache/use-cache.ts +650 -614
- package/src/compat/cache-control.ts +140 -142
- package/src/compat/client/base-path.ts +21 -20
- package/src/compat/client/css-order.ts +18 -18
- package/src/compat/client/errors/bare-boundary.ts +11 -11
- package/src/compat/client/errors/control-flow.ts +23 -23
- package/src/compat/client/errors/error-boundary.ts +61 -61
- package/src/compat/client/errors/global-error.ts +101 -91
- package/src/compat/client/errors/install.ts +71 -72
- package/src/compat/client/errors/lazy.ts +23 -23
- package/src/compat/client/errors/primitive-throw.ts +47 -45
- package/src/compat/client/errors/soft-refresh.ts +4 -4
- package/src/compat/client/link-status.ts +33 -33
- package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
- package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
- package/src/compat/client/navigation-scroll.ts +63 -63
- package/src/compat/client/optimistic-routing.ts +93 -88
- package/src/compat/client/prefetch-cache.ts +23 -24
- package/src/compat/client/route-announcer.ts +35 -35
- package/src/compat/client/segment-cache-policy.ts +20 -20
- package/src/compat/client/segment-cache.ts +309 -315
- package/src/compat/client/segment-prefetch.ts +127 -132
- package/src/compat/client/trailing-slash.ts +5 -4
- package/src/compat/css/chunking.ts +113 -116
- package/src/compat/css/inline-css.ts +21 -21
- package/src/compat/css/lightningcss.ts +37 -38
- package/src/compat/css/modules.ts +161 -175
- package/src/compat/css/nonce.ts +7 -7
- package/src/compat/css/sass-plugin.ts +18 -21
- package/src/compat/css/sass.ts +150 -152
- package/src/compat/css/styled-jsx-runtime.ts +27 -27
- package/src/compat/css/styled-jsx.ts +21 -21
- package/src/compat/edge-runtime.ts +27 -27
- package/src/compat/{adapter → export}/build-complete.ts +72 -75
- package/src/compat/export/client.ts +29 -31
- package/src/compat/export/{index.ts → emit.ts} +111 -110
- package/src/compat/export/standalone.ts +62 -54
- package/src/compat/image-optimizer/cache.ts +51 -49
- package/src/compat/image-optimizer/detect.ts +52 -52
- package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
- package/src/compat/image-optimizer/source.ts +77 -80
- package/src/compat/lifecycle/after-scope.ts +26 -26
- package/src/compat/lifecycle/after.ts +48 -45
- package/src/compat/lifecycle/error-funnel.ts +98 -102
- package/src/compat/lifecycle/error-serialize.ts +30 -26
- package/src/compat/lifecycle/error-ui.ts +67 -32
- package/src/compat/lifecycle/instrumentation-client.ts +36 -38
- package/src/compat/lifecycle/instrumentation.ts +85 -85
- package/src/compat/lifecycle/node-console.ts +11 -11
- package/src/compat/lifecycle/testmode.ts +160 -132
- package/src/compat/mdx/compile.ts +60 -57
- package/src/compat/mdx/plugin.ts +11 -11
- package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
- package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
- package/src/compat/metadata.ts +75 -81
- package/src/compat/next/cache.ts +68 -69
- package/src/compat/next/canonical-url.ts +9 -9
- package/src/compat/next/client-cache.ts +19 -19
- package/src/compat/next/client-navigation.ts +112 -116
- package/src/compat/next/client-only.ts +1 -1
- package/src/compat/next/client-script.tsx +99 -93
- package/src/compat/next/client-server.ts +10 -10
- package/src/compat/next/config-loader.ts +176 -173
- package/src/compat/next/config.ts +7 -7
- package/src/compat/next/constants.cjs +6 -6
- package/src/compat/next/constants.ts +6 -6
- package/src/compat/next/custom-server.ts +26 -24
- package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
- package/src/compat/next/dynamic.tsx +21 -18
- package/src/compat/next/error.tsx +52 -52
- package/src/compat/next/font/cache.ts +74 -74
- package/src/compat/next/font/google.ts +2 -2
- package/src/compat/next/font/index.ts +1 -1
- package/src/compat/next/font/local.ts +3 -3
- package/src/compat/next/font/runtime-client.ts +17 -15
- package/src/compat/next/font/runtime.ts +443 -408
- package/src/compat/next/font/shared.ts +120 -108
- package/src/compat/next/form.tsx +63 -63
- package/src/compat/next/head.tsx +2 -2
- package/src/compat/next/headers.ts +103 -95
- package/src/compat/next/image/client.tsx +220 -0
- package/src/compat/next/image/config.ts +56 -58
- package/src/compat/next/image/optimizer.ts +40 -36
- package/src/compat/next/image/patterns.ts +37 -40
- package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
- package/src/compat/next/image/shared.ts +65 -57
- package/src/compat/next/image/static-metadata.ts +98 -107
- package/src/compat/next/image/validate.ts +79 -88
- package/src/compat/next/image.tsx +19 -23
- package/src/compat/next/index.ts +1 -1
- package/src/compat/next/legacy-image.tsx +59 -60
- package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
- package/src/compat/next/link.tsx +158 -158
- package/src/compat/next/navigation.cjs +12 -3
- package/src/compat/next/navigation.ts +48 -50
- package/src/compat/next/offline.ts +27 -27
- package/src/compat/next/og.ts +121 -124
- package/src/compat/next/preferred-region.ts +13 -14
- package/src/compat/next/redirects.ts +58 -56
- package/src/compat/next/resource-hints.ts +73 -76
- package/src/compat/next/rewrites.ts +130 -133
- package/src/compat/next/root-params.ts +45 -45
- package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
- package/src/compat/next/router.cjs +4 -2
- package/src/compat/next/router.ts +58 -61
- package/src/compat/next/script.tsx +108 -108
- package/src/compat/next/server-only.ts +1 -1
- package/src/compat/next/server.ts +19 -19
- package/src/compat/next/svgr.ts +18 -17
- package/src/compat/next/telemetry.ts +24 -24
- package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
- package/src/compat/next/user-agent.ts +53 -49
- package/src/compat/next/web-vitals.ts +22 -24
- package/src/compat/otel/api.ts +41 -41
- package/src/compat/otel/client-trace-metadata.ts +25 -27
- package/src/compat/otel/fetch-span.ts +29 -29
- package/src/compat/otel/tracer.ts +331 -331
- package/src/compat/pages/api.ts +456 -0
- package/src/compat/pages/client-plugin.ts +36 -36
- package/src/compat/pages/router-state.ts +34 -34
- package/src/compat/pages/{index.ts → router.ts} +130 -135
- package/src/compat/ppr/io.ts +12 -12
- package/src/compat/ppr/missing-root-params.ts +34 -38
- package/src/compat/ppr/root-params-scan.ts +66 -66
- package/src/compat/ppr/root-params-transform.ts +24 -26
- package/src/compat/ppr/root-params.ts +30 -30
- package/src/compat/ppr/segment-config-incompat.ts +6 -7
- package/src/compat/protocol.ts +71 -70
- package/src/compat/react/action-state.ts +47 -48
- package/src/compat/react/client-lite.ts +15 -15
- package/src/compat/react/client.ts +4 -4
- package/src/compat/react/compiler-runtime.ts +11 -11
- package/src/compat/react/dom-client.ts +44 -44
- package/src/compat/react/dom-react-server.ts +10 -16
- package/src/compat/react/dom-server.ts +10 -10
- package/src/compat/react/dom.ts +52 -52
- package/src/compat/react/hooks-extra.ts +34 -35
- package/src/compat/react/parity.ts +64 -61
- package/src/compat/react/preact.ts +81 -82
- package/src/compat/react/react-server.ts +28 -28
- package/src/compat/react/router-shim.ts +1 -1
- package/src/compat/react/server-component-use.ts +8 -8
- package/src/compat/react/server-inserted-html.ts +30 -31
- package/src/compat/react/server.ts +53 -55
- package/src/compat/react/use.ts +32 -32
- package/src/compat/react/view-transition.ts +20 -20
- package/src/compat/register/actions.ts +35 -824
- package/src/compat/register/boot.ts +41 -41
- package/src/compat/register/build-tier.ts +5 -5
- package/src/compat/register/build.ts +74 -70
- package/src/compat/register/bundler.ts +161 -156
- package/src/compat/register/cache.ts +20 -20
- package/src/compat/register/client-errors.ts +3 -3
- package/src/compat/register/config.ts +6 -6
- package/src/compat/register/css-extras.ts +30 -34
- package/src/compat/register/edge-runtime.ts +3 -3
- package/src/compat/register/errors.ts +10 -12
- package/src/compat/register/export.ts +16 -16
- package/src/compat/register/font.ts +11 -11
- package/src/compat/register/hooks.ts +2 -2
- package/src/compat/register/image.ts +40 -40
- package/src/compat/register/index.ts +59 -62
- package/src/compat/register/instrumentation-client.ts +10 -10
- package/src/compat/register/lifecycle.ts +25 -28
- package/src/compat/register/mdx.ts +10 -10
- package/src/compat/register/middleware.ts +226 -16
- package/src/compat/register/otel.ts +80 -88
- package/src/compat/register/pages-api.ts +10 -463
- package/src/compat/register/ppr.ts +16 -16
- package/src/compat/register/protocol.ts +17 -18
- package/src/compat/register/proxy.ts +49 -51
- package/src/compat/register/render.ts +79 -76
- package/src/compat/register/routing.ts +162 -159
- package/src/compat/register/segment.ts +24 -1897
- package/src/compat/register/static-image.ts +3 -3
- package/src/compat/register/{misc.ts → taint.ts} +9 -9
- package/src/compat/register/typed-routes.ts +14 -14
- package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
- package/src/compat/register/validation.ts +18 -18
- package/src/compat/segment/loading-boundary.ts +43 -45
- package/src/compat/segment/page-slot.ts +69 -69
- package/src/compat/segment/serve.ts +1884 -0
- package/src/compat/segment/tree.ts +113 -112
- package/src/compat/segment/vary-key.ts +38 -38
- package/src/compat/segment/vary-params.ts +138 -142
- package/src/compat/static-params.ts +14 -12
- package/src/compat/tsconfig-defaults.ts +87 -91
- package/src/compat/typecheck/{index.ts → check.ts} +234 -212
- package/src/compat/typecheck/worker.ts +15 -12
- package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
- package/src/compat/typed-routes/manifest.ts +174 -170
- package/src/compat/typed-routes/typegen.ts +127 -110
- package/src/compat/validation/errors.ts +16 -19
- package/src/compat/validation/prerender-diagnostics.ts +521 -504
- package/src/compat/validation/{index.ts → validate.ts} +647 -648
- package/src/compat-bootstrap.ts +16 -16
- package/src/config.ts +86 -69
- package/src/css/build.ts +230 -227
- package/src/css/postcss.ts +79 -80
- package/src/css/worker.ts +14 -15
- package/src/dev/client-actions.ts +10 -10
- package/src/dev/client-chunk-store.ts +27 -27
- package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
- package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
- package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
- package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
- package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
- package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
- package/src/dev/server.ts +804 -820
- package/src/env.ts +46 -43
- package/src/extensions.ts +491 -478
- package/src/index.ts +8 -8
- package/src/internal.ts +20 -23
- package/src/{islands → render}/boundary-error.ts +3 -3
- package/src/render/hooks.ts +71 -71
- package/src/render/island-context.ts +14 -14
- package/src/render/metadata.ts +310 -310
- package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
- package/src/{ppr.ts → render/ppr.ts} +244 -245
- package/src/render/renderer.ts +2087 -2082
- package/src/render/resource-hints.ts +16 -17
- package/src/render/slots.tsx +224 -235
- package/src/{islands → render}/static-children.ts +9 -12
- package/src/{islands → render}/static-slots.ts +37 -37
- package/src/{cache/context.ts → request/cache.ts} +20 -20
- package/src/request/context.ts +107 -107
- package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
- package/src/resolve/engine.ts +90 -77
- package/src/resolve/imports.ts +475 -463
- package/src/resolve/scan-facts.ts +318 -296
- package/src/resolve/source-text.ts +37 -37
- package/src/{dynamic → resolve}/tree-shake.ts +132 -128
- package/src/routing/forwarded.ts +19 -19
- package/src/routing/handler.ts +84 -91
- package/src/routing/href.ts +87 -70
- package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
- package/src/{proxy.ts → routing/proxy.ts} +306 -312
- package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
- package/src/routing/routes.ts +827 -815
- package/src/routing/slots.ts +164 -160
- package/src/runtime/loader.ts +954 -0
- package/src/{dev → runtime}/module-cache.ts +309 -287
- package/src/{dev → runtime}/module-generations.ts +9 -9
- package/src/{dev → runtime}/module-transform.ts +81 -72
- package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
- package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
- package/src/runtime/vendor.ts +428 -406
- package/src/styles.d.ts +9 -0
- package/src/types.ts +324 -335
- package/src/utils/ansi.ts +5 -5
- package/src/utils/{source.ts → code.ts} +15 -12
- package/src/utils/content-type.ts +3 -3
- package/src/utils/decode.ts +2 -2
- package/src/utils/dev-profile.ts +13 -13
- package/src/utils/error-log.ts +6 -6
- package/src/utils/esbuild.ts +18 -18
- package/src/utils/fs-cache.ts +13 -13
- package/src/utils/fs.ts +57 -49
- package/src/utils/html.ts +20 -24
- package/src/utils/native-require.ts +8 -8
- package/src/utils/serialize.ts +139 -146
- package/src/utils/verbose.ts +18 -18
- package/reference/overview.md +0 -35
- package/src/cli/analyze-print.ts +0 -181
- package/src/compat/middleware/manifest.ts +0 -210
- package/src/compat/next/image-client.tsx +0 -215
- package/src/compat/next/link-usage.ts +0 -29
- package/src/css/index.ts +0 -2
- package/src/render/index.ts +0 -1
- package/src/style-modules.d.ts +0 -9
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
import type { JSX } from 'preact'
|
|
1
|
+
import type { JSX } from 'preact'
|
|
2
2
|
|
|
3
3
|
interface LocalPattern {
|
|
4
|
-
pathname?: string
|
|
5
|
-
search?: string
|
|
4
|
+
pathname?: string
|
|
5
|
+
search?: string
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
interface RemotePattern {
|
|
9
|
-
protocol?: string
|
|
10
|
-
hostname?: string
|
|
11
|
-
port?: string
|
|
12
|
-
pathname?: string
|
|
13
|
-
search?: string
|
|
9
|
+
protocol?: string
|
|
10
|
+
hostname?: string
|
|
11
|
+
port?: string
|
|
12
|
+
pathname?: string
|
|
13
|
+
search?: string
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export interface ResolvedImagesConfig {
|
|
17
|
-
deviceSizes: number[]
|
|
18
|
-
imageSizes: number[]
|
|
19
|
-
allSizes: number[]
|
|
20
|
-
qualities: number[] | undefined
|
|
21
|
-
formats: string[]
|
|
22
|
-
path: string
|
|
23
|
-
loader: string
|
|
24
|
-
loaderFile: string
|
|
25
|
-
domains: string[]
|
|
26
|
-
disableStaticImages: boolean
|
|
27
|
-
minimumCacheTTL: number
|
|
28
|
-
maximumRedirects: number
|
|
29
|
-
maximumResponseBody: number
|
|
30
|
-
dangerouslyAllowLocalIP: boolean
|
|
31
|
-
dangerouslyAllowSVG: boolean
|
|
32
|
-
contentSecurityPolicy: string
|
|
33
|
-
contentDispositionType: string
|
|
34
|
-
localPatterns: LocalPattern[] | undefined
|
|
35
|
-
remotePatterns: RemotePattern[]
|
|
36
|
-
unoptimized: boolean
|
|
37
|
-
customCacheHandler: boolean
|
|
17
|
+
deviceSizes: number[]
|
|
18
|
+
imageSizes: number[]
|
|
19
|
+
allSizes: number[]
|
|
20
|
+
qualities: number[] | undefined
|
|
21
|
+
formats: string[]
|
|
22
|
+
path: string
|
|
23
|
+
loader: string
|
|
24
|
+
loaderFile: string
|
|
25
|
+
domains: string[]
|
|
26
|
+
disableStaticImages: boolean
|
|
27
|
+
minimumCacheTTL: number
|
|
28
|
+
maximumRedirects: number
|
|
29
|
+
maximumResponseBody: number
|
|
30
|
+
dangerouslyAllowLocalIP: boolean
|
|
31
|
+
dangerouslyAllowSVG: boolean
|
|
32
|
+
contentSecurityPolicy: string
|
|
33
|
+
contentDispositionType: string
|
|
34
|
+
localPatterns: LocalPattern[] | undefined
|
|
35
|
+
remotePatterns: RemotePattern[]
|
|
36
|
+
unoptimized: boolean
|
|
37
|
+
customCacheHandler: boolean
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
declare global {
|
|
41
|
-
var __PNEXT_IMAGE_CONFIG__: ResolvedImagesConfig | undefined
|
|
41
|
+
var __PNEXT_IMAGE_CONFIG__: ResolvedImagesConfig | undefined
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
// Client-graph bundler defines (see compat/register/bundler.ts). The boolean
|
|
45
45
|
// twin gates the branch on a literal so DEFAULT_IMAGES_CONFIG is dropped from
|
|
46
46
|
// every client bundle — a `??` against an object define never folds.
|
|
47
|
-
declare const __PNEXT_IMAGE_CONFIG_INLINE__: ResolvedImagesConfig
|
|
48
|
-
declare const __PNEXT_IMAGE_CONFIG_INLINED__: boolean
|
|
47
|
+
declare const __PNEXT_IMAGE_CONFIG_INLINE__: ResolvedImagesConfig
|
|
48
|
+
declare const __PNEXT_IMAGE_CONFIG_INLINED__: boolean
|
|
49
49
|
|
|
50
50
|
const DEFAULT_IMAGES_CONFIG: ResolvedImagesConfig = {
|
|
51
51
|
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
|
|
@@ -69,73 +69,73 @@ const DEFAULT_IMAGES_CONFIG: ResolvedImagesConfig = {
|
|
|
69
69
|
remotePatterns: [],
|
|
70
70
|
unoptimized: false,
|
|
71
71
|
customCacheHandler: false,
|
|
72
|
-
}
|
|
72
|
+
}
|
|
73
73
|
|
|
74
74
|
export interface StaticImageData {
|
|
75
|
-
src: string
|
|
76
|
-
width: number
|
|
77
|
-
height: number
|
|
78
|
-
blurDataURL?: string
|
|
79
|
-
blurWidth?: number
|
|
80
|
-
blurHeight?: number
|
|
75
|
+
src: string
|
|
76
|
+
width: number
|
|
77
|
+
height: number
|
|
78
|
+
blurDataURL?: string
|
|
79
|
+
blurWidth?: number
|
|
80
|
+
blurHeight?: number
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
type StaticImport = StaticImageData | { default: StaticImageData }
|
|
83
|
+
type StaticImport = StaticImageData | { default: StaticImageData }
|
|
84
84
|
|
|
85
85
|
interface LoaderProps {
|
|
86
|
-
src: string
|
|
87
|
-
width: number
|
|
88
|
-
quality?: number
|
|
86
|
+
src: string
|
|
87
|
+
width: number
|
|
88
|
+
quality?: number
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
export type ImageLoader = (props: LoaderProps) => string
|
|
91
|
+
export type ImageLoader = (props: LoaderProps) => string
|
|
92
92
|
|
|
93
93
|
export type ImageProps = Omit<
|
|
94
94
|
JSX.HTMLAttributes<HTMLImageElement>,
|
|
95
95
|
'src' | 'srcset' | 'width' | 'height' | 'loading' | 'ref' | 'alt' | 'style'
|
|
96
96
|
> & {
|
|
97
|
-
src: string | StaticImport
|
|
98
|
-
alt?: string
|
|
99
|
-
width?: number | string
|
|
100
|
-
height?: number | string
|
|
101
|
-
fill?: boolean
|
|
102
|
-
loader?: ImageLoader
|
|
103
|
-
quality?: number | string
|
|
104
|
-
priority?: boolean
|
|
97
|
+
src: string | StaticImport
|
|
98
|
+
alt?: string
|
|
99
|
+
width?: number | string
|
|
100
|
+
height?: number | string
|
|
101
|
+
fill?: boolean
|
|
102
|
+
loader?: ImageLoader
|
|
103
|
+
quality?: number | string
|
|
104
|
+
priority?: boolean
|
|
105
105
|
/** Preload the image without opting into the `priority` LCP warning gating. */
|
|
106
|
-
preload?: boolean
|
|
107
|
-
loading?: 'lazy' | 'eager'
|
|
108
|
-
placeholder?: 'blur' | 'empty' | `data:image/${string}
|
|
109
|
-
blurDataURL?: string
|
|
110
|
-
unoptimized?: boolean
|
|
111
|
-
overrideSrc?: string
|
|
112
|
-
sizes?: string
|
|
113
|
-
fetchPriority?: 'high' | 'low' | 'auto'
|
|
114
|
-
decoding?: 'async' | 'auto' | 'sync'
|
|
115
|
-
style?: JSX.CSSProperties | string
|
|
116
|
-
onLoad?: JSX.GenericEventHandler<HTMLImageElement
|
|
117
|
-
onError?: JSX.GenericEventHandler<HTMLImageElement
|
|
118
|
-
onLoadingComplete?: (img: HTMLImageElement) => void
|
|
119
|
-
layout?: 'fill' | 'responsive' | 'intrinsic' | 'fixed'
|
|
120
|
-
objectFit?: string
|
|
121
|
-
objectPosition?: string
|
|
122
|
-
}
|
|
106
|
+
preload?: boolean
|
|
107
|
+
loading?: 'lazy' | 'eager'
|
|
108
|
+
placeholder?: 'blur' | 'empty' | `data:image/${string}`
|
|
109
|
+
blurDataURL?: string
|
|
110
|
+
unoptimized?: boolean
|
|
111
|
+
overrideSrc?: string
|
|
112
|
+
sizes?: string
|
|
113
|
+
fetchPriority?: 'high' | 'low' | 'auto'
|
|
114
|
+
decoding?: 'async' | 'auto' | 'sync'
|
|
115
|
+
style?: JSX.CSSProperties | string
|
|
116
|
+
onLoad?: JSX.GenericEventHandler<HTMLImageElement>
|
|
117
|
+
onError?: JSX.GenericEventHandler<HTMLImageElement>
|
|
118
|
+
onLoadingComplete?: (img: HTMLImageElement) => void
|
|
119
|
+
layout?: 'fill' | 'responsive' | 'intrinsic' | 'fixed'
|
|
120
|
+
objectFit?: string
|
|
121
|
+
objectPosition?: string
|
|
122
|
+
}
|
|
123
123
|
|
|
124
124
|
export interface ResolvedImageProps {
|
|
125
|
-
props: Record<string, unknown
|
|
125
|
+
props: Record<string, unknown>
|
|
126
126
|
meta: {
|
|
127
|
-
preload: boolean
|
|
128
|
-
fill: boolean
|
|
129
|
-
unoptimized: boolean
|
|
130
|
-
placeholder: string
|
|
131
|
-
imgAttributes: { src: string; srcSet?: string; sizes?: string }
|
|
127
|
+
preload: boolean
|
|
128
|
+
fill: boolean
|
|
129
|
+
unoptimized: boolean
|
|
130
|
+
placeholder: string
|
|
131
|
+
imgAttributes: { src: string; srcSet?: string; sizes?: string }
|
|
132
132
|
/**
|
|
133
133
|
* Serialized style WITHOUT the placeholder background props - what the img should carry once loaded.
|
|
134
134
|
* Set only while a placeholder is applied; the server render stamps it as `data-nimg-ph` so the
|
|
135
135
|
* non-hydrated placeholder script can restore it on load.
|
|
136
136
|
*/
|
|
137
|
-
loadedStyle?: string
|
|
138
|
-
}
|
|
137
|
+
loadedStyle?: string
|
|
138
|
+
}
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
const INVALID_BACKGROUND_SIZE = new Set<string | undefined>([
|
|
@@ -144,17 +144,17 @@ const INVALID_BACKGROUND_SIZE = new Set<string | undefined>([
|
|
|
144
144
|
'none',
|
|
145
145
|
'scale-down',
|
|
146
146
|
undefined,
|
|
147
|
-
])
|
|
147
|
+
])
|
|
148
148
|
|
|
149
149
|
function unwrapStaticImport(src: StaticImport): StaticImageData {
|
|
150
|
-
return 'default' in src ? src.default : src
|
|
150
|
+
return 'default' in src ? src.default : src
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
function toNumber(value: number | string | undefined): number | undefined {
|
|
154
|
-
if (value === undefined) return undefined
|
|
155
|
-
if (typeof value === 'number') return value
|
|
156
|
-
const n = parseInt(value, 10)
|
|
157
|
-
return Number.isNaN(n) ? undefined : n
|
|
154
|
+
if (value === undefined) return undefined
|
|
155
|
+
if (typeof value === 'number') return value
|
|
156
|
+
const n = parseInt(value, 10)
|
|
157
|
+
return Number.isNaN(n) ? undefined : n
|
|
158
158
|
}
|
|
159
159
|
|
|
160
160
|
// The client reads the inlined define, the server the global registerImageExtensions
|
|
@@ -162,7 +162,7 @@ function toNumber(value: number | string | undefined): number | undefined {
|
|
|
162
162
|
export function getImagesConfig(): ResolvedImagesConfig {
|
|
163
163
|
return typeof __PNEXT_IMAGE_CONFIG_INLINED__ === 'boolean'
|
|
164
164
|
? __PNEXT_IMAGE_CONFIG_INLINE__
|
|
165
|
-
: (globalThis.__PNEXT_IMAGE_CONFIG__ ?? DEFAULT_IMAGES_CONFIG)
|
|
165
|
+
: (globalThis.__PNEXT_IMAGE_CONFIG__ ?? DEFAULT_IMAGES_CONFIG)
|
|
166
166
|
}
|
|
167
167
|
|
|
168
168
|
function defaultLoader(
|
|
@@ -171,34 +171,34 @@ function defaultLoader(
|
|
|
171
171
|
width: number,
|
|
172
172
|
quality?: number,
|
|
173
173
|
): string {
|
|
174
|
-
const q = findClosestQuality(config, quality)
|
|
175
|
-
return `${config.path}?url=${encodeURIComponent(src)}&w=${width}&q=${q}
|
|
174
|
+
const q = findClosestQuality(config, quality)
|
|
175
|
+
return `${config.path}?url=${encodeURIComponent(src)}&w=${width}&q=${q}`
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
export function findClosestQuality(config: ResolvedImagesConfig, quality?: number): number {
|
|
179
|
-
const qualities = config.qualities
|
|
180
|
-
if (!qualities || qualities.length === 0) return quality ?? 75
|
|
181
|
-
if (quality === undefined) return closest(qualities, 75)
|
|
182
|
-
return closest(qualities, quality)
|
|
179
|
+
const qualities = config.qualities
|
|
180
|
+
if (!qualities || qualities.length === 0) return quality ?? 75
|
|
181
|
+
if (quality === undefined) return closest(qualities, 75)
|
|
182
|
+
return closest(qualities, quality)
|
|
183
183
|
}
|
|
184
184
|
|
|
185
185
|
function closest(values: number[], target: number): number {
|
|
186
|
-
let best = values[0]
|
|
187
|
-
let bestDelta = Math.abs(best - target)
|
|
186
|
+
let best = values[0]!
|
|
187
|
+
let bestDelta = Math.abs(best - target)
|
|
188
188
|
for (const value of values) {
|
|
189
|
-
const delta = Math.abs(value - target)
|
|
189
|
+
const delta = Math.abs(value - target)
|
|
190
190
|
if (delta < bestDelta) {
|
|
191
|
-
best = value
|
|
192
|
-
bestDelta = delta
|
|
191
|
+
best = value
|
|
192
|
+
bestDelta = delta
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
|
-
return best
|
|
195
|
+
return best
|
|
196
196
|
}
|
|
197
197
|
|
|
198
198
|
interface GenImgAttrsResult {
|
|
199
|
-
src: string
|
|
200
|
-
srcSet: string | undefined
|
|
201
|
-
sizes: string | undefined
|
|
199
|
+
src: string
|
|
200
|
+
srcSet: string | undefined
|
|
201
|
+
sizes: string | undefined
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
function getWidths(
|
|
@@ -206,44 +206,49 @@ function getWidths(
|
|
|
206
206
|
width: number | undefined,
|
|
207
207
|
sizes: string | undefined,
|
|
208
208
|
): { widths: number[]; kind: 'w' | 'x' } {
|
|
209
|
-
const { deviceSizes, allSizes } = config
|
|
209
|
+
const { deviceSizes, allSizes } = config
|
|
210
210
|
if (sizes) {
|
|
211
|
-
const viewportWidthRe = /(^|\s)(1?\d?\d)vw/g
|
|
212
|
-
const percentSizes: number[] = []
|
|
213
|
-
for (let match; (match = viewportWidthRe.exec(sizes));
|
|
214
|
-
percentSizes.push(parseInt(match[2]!, 10))
|
|
211
|
+
const viewportWidthRe = /(^|\s)(1?\d?\d)vw/g
|
|
212
|
+
const percentSizes: number[] = []
|
|
213
|
+
for (let match; (match = viewportWidthRe.exec(sizes));) {
|
|
214
|
+
percentSizes.push(parseInt(match[2]!, 10))
|
|
215
215
|
}
|
|
216
216
|
if (percentSizes.length) {
|
|
217
|
-
const smallestRatio = Math.min(...percentSizes) * 0.01
|
|
217
|
+
const smallestRatio = Math.min(...percentSizes) * 0.01
|
|
218
218
|
return {
|
|
219
219
|
widths: allSizes.filter(s => s >= deviceSizes[0]! * smallestRatio),
|
|
220
220
|
kind: 'w',
|
|
221
|
-
}
|
|
221
|
+
}
|
|
222
222
|
}
|
|
223
|
-
return { widths: allSizes, kind: 'w' }
|
|
223
|
+
return { widths: allSizes, kind: 'w' }
|
|
224
224
|
}
|
|
225
|
-
if (typeof width !== 'number') return { widths: deviceSizes, kind: 'w' }
|
|
225
|
+
if (typeof width !== 'number') return { widths: deviceSizes, kind: 'w' }
|
|
226
226
|
const widths = [
|
|
227
227
|
...new Set(
|
|
228
228
|
[width, width * 2].map(w => allSizes.find(p => p >= w) || allSizes[allSizes.length - 1]!),
|
|
229
229
|
),
|
|
230
|
-
]
|
|
231
|
-
return { widths, kind: 'x' }
|
|
230
|
+
]
|
|
231
|
+
return { widths, kind: 'x' }
|
|
232
232
|
}
|
|
233
233
|
|
|
234
234
|
function generateImgAttrs(params: {
|
|
235
|
-
config: ResolvedImagesConfig
|
|
236
|
-
src: string
|
|
237
|
-
unoptimized: boolean
|
|
238
|
-
width: number | undefined
|
|
239
|
-
quality: number | undefined
|
|
240
|
-
sizes: string | undefined
|
|
241
|
-
loader: (args: {
|
|
235
|
+
config: ResolvedImagesConfig
|
|
236
|
+
src: string
|
|
237
|
+
unoptimized: boolean
|
|
238
|
+
width: number | undefined
|
|
239
|
+
quality: number | undefined
|
|
240
|
+
sizes: string | undefined
|
|
241
|
+
loader: (args: {
|
|
242
|
+
config: ResolvedImagesConfig
|
|
243
|
+
src: string
|
|
244
|
+
width: number
|
|
245
|
+
quality?: number
|
|
246
|
+
}) => string
|
|
242
247
|
}): GenImgAttrsResult {
|
|
243
|
-
const { config, src, unoptimized, width, quality, sizes, loader } = params
|
|
244
|
-
if (unoptimized) return { src, srcSet: undefined, sizes: undefined }
|
|
245
|
-
const { widths, kind } = getWidths(config, width, sizes)
|
|
246
|
-
const last = widths.length - 1
|
|
248
|
+
const { config, src, unoptimized, width, quality, sizes, loader } = params
|
|
249
|
+
if (unoptimized) return { src, srcSet: undefined, sizes: undefined }
|
|
250
|
+
const { widths, kind } = getWidths(config, width, sizes)
|
|
251
|
+
const last = widths.length - 1
|
|
247
252
|
return {
|
|
248
253
|
sizes: !sizes && kind === 'w' ? '100vw' : sizes,
|
|
249
254
|
srcSet: widths
|
|
@@ -253,7 +258,7 @@ function generateImgAttrs(params: {
|
|
|
253
258
|
)
|
|
254
259
|
.join(', '),
|
|
255
260
|
src: loader({ config, src, quality, width: widths[last]! }),
|
|
256
|
-
}
|
|
261
|
+
}
|
|
257
262
|
}
|
|
258
263
|
|
|
259
264
|
/**
|
|
@@ -262,38 +267,38 @@ function generateImgAttrs(params: {
|
|
|
262
267
|
* builder is then dead code. Undefined (no define) keeps it, so the gate can only ever remove bytes an
|
|
263
268
|
* app proved it cannot use.
|
|
264
269
|
*/
|
|
265
|
-
declare const __PNEXT_IMAGE_BLUR__: boolean
|
|
270
|
+
declare const __PNEXT_IMAGE_BLUR__: boolean
|
|
266
271
|
|
|
267
272
|
function getImageBlurSvg(params: {
|
|
268
|
-
widthInt?: number
|
|
269
|
-
heightInt?: number
|
|
270
|
-
blurWidth?: number
|
|
271
|
-
blurHeight?: number
|
|
272
|
-
blurDataURL: string
|
|
273
|
-
objectFit?: string
|
|
273
|
+
widthInt?: number
|
|
274
|
+
heightInt?: number
|
|
275
|
+
blurWidth?: number
|
|
276
|
+
blurHeight?: number
|
|
277
|
+
blurDataURL: string
|
|
278
|
+
objectFit?: string
|
|
274
279
|
}): string {
|
|
275
|
-
const { widthInt, heightInt, blurWidth, blurHeight, blurDataURL, objectFit } = params
|
|
276
|
-
const std = 20
|
|
277
|
-
const svgWidth = blurWidth ? blurWidth * 40 : widthInt
|
|
278
|
-
const svgHeight = blurHeight ? blurHeight * 40 : heightInt
|
|
279
|
-
const viewBox = svgWidth && svgHeight ? `viewBox='0 0 ${svgWidth} ${svgHeight}'` : ''
|
|
280
|
+
const { widthInt, heightInt, blurWidth, blurHeight, blurDataURL, objectFit } = params
|
|
281
|
+
const std = 20
|
|
282
|
+
const svgWidth = blurWidth ? blurWidth * 40 : widthInt
|
|
283
|
+
const svgHeight = blurHeight ? blurHeight * 40 : heightInt
|
|
284
|
+
const viewBox = svgWidth && svgHeight ? `viewBox='0 0 ${svgWidth} ${svgHeight}'` : ''
|
|
280
285
|
const preserveAspectRatio = viewBox
|
|
281
286
|
? 'none'
|
|
282
287
|
: objectFit === 'contain'
|
|
283
288
|
? 'xMidYMid'
|
|
284
289
|
: objectFit === 'cover'
|
|
285
290
|
? 'xMidYMid slice'
|
|
286
|
-
: 'none'
|
|
287
|
-
return `%3Csvg xmlns='http://www.w3.org/2000/svg' ${viewBox}%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='${std}'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='${std}'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='${preserveAspectRatio}' style='filter: url(%23b);' href='${blurDataURL}'/%3E%3C/svg%3E
|
|
291
|
+
: 'none'
|
|
292
|
+
return `%3Csvg xmlns='http://www.w3.org/2000/svg' ${viewBox}%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='${std}'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='${std}'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='${preserveAspectRatio}' style='filter: url(%23b);' href='${blurDataURL}'/%3E%3C/svg%3E`
|
|
288
293
|
}
|
|
289
294
|
|
|
290
295
|
export function getImageProps(imageProps: ImageProps): { props: Record<string, unknown> } {
|
|
291
|
-
const resolved = resolveImageProps(imageProps, getImagesConfig())
|
|
292
|
-
return { props: resolved.props }
|
|
296
|
+
const resolved = resolveImageProps(imageProps, getImagesConfig())
|
|
297
|
+
return { props: resolved.props }
|
|
293
298
|
}
|
|
294
299
|
|
|
295
300
|
export function unstable_getImgProps(imageProps: ImageProps) {
|
|
296
|
-
return getImageProps(imageProps)
|
|
301
|
+
return getImageProps(imageProps)
|
|
297
302
|
}
|
|
298
303
|
|
|
299
304
|
export function resolveImageProps(
|
|
@@ -328,66 +333,66 @@ export function resolveImageProps(
|
|
|
328
333
|
onError: _onError,
|
|
329
334
|
onLoadingComplete: _onLoadingComplete,
|
|
330
335
|
...rest
|
|
331
|
-
} = imageProps
|
|
336
|
+
} = imageProps
|
|
332
337
|
|
|
333
|
-
let fill = fillProp
|
|
334
|
-
let sizes = sizesProp
|
|
335
|
-
let userStyle = normalizeStyle(styleProp)
|
|
338
|
+
let fill = fillProp
|
|
339
|
+
let sizes = sizesProp
|
|
340
|
+
let userStyle = normalizeStyle(styleProp)
|
|
336
341
|
|
|
337
342
|
if (layout) {
|
|
338
|
-
if (layout === 'fill') fill = true
|
|
343
|
+
if (layout === 'fill') fill = true
|
|
339
344
|
const layoutStyle =
|
|
340
345
|
layout === 'intrinsic'
|
|
341
346
|
? { maxWidth: '100%', height: 'auto' }
|
|
342
347
|
: layout === 'responsive'
|
|
343
348
|
? { width: '100%', height: 'auto' }
|
|
344
|
-
: undefined
|
|
345
|
-
if (layoutStyle) userStyle = { ...userStyle, ...layoutStyle }
|
|
346
|
-
if (!sizes && (layout === 'responsive' || layout === 'fill')) sizes = '100vw'
|
|
349
|
+
: undefined
|
|
350
|
+
if (layoutStyle) userStyle = { ...userStyle, ...layoutStyle }
|
|
351
|
+
if (!sizes && (layout === 'responsive' || layout === 'fill')) sizes = '100vw'
|
|
347
352
|
}
|
|
348
353
|
|
|
349
|
-
const staticData = rawSrc && typeof rawSrc !== 'string' ? unwrapStaticImport(rawSrc) : undefined
|
|
350
|
-
const src = typeof rawSrc === 'string' ? rawSrc : (staticData?.src ?? '')
|
|
354
|
+
const staticData = rawSrc && typeof rawSrc !== 'string' ? unwrapStaticImport(rawSrc) : undefined
|
|
355
|
+
const src = typeof rawSrc === 'string' ? rawSrc : (staticData?.src ?? '')
|
|
351
356
|
|
|
352
|
-
let width = toNumber(widthProp)
|
|
353
|
-
let height = toNumber(heightProp)
|
|
357
|
+
let width = toNumber(widthProp)
|
|
358
|
+
let height = toNumber(heightProp)
|
|
354
359
|
if (staticData) {
|
|
355
360
|
if (width === undefined && height === undefined) {
|
|
356
|
-
width = staticData.width
|
|
357
|
-
height = staticData.height
|
|
361
|
+
width = staticData.width
|
|
362
|
+
height = staticData.height
|
|
358
363
|
} else if (width !== undefined && height === undefined) {
|
|
359
|
-
height = Math.round((staticData.height / staticData.width) * width)
|
|
364
|
+
height = Math.round((staticData.height / staticData.width) * width)
|
|
360
365
|
} else if (height !== undefined && width === undefined) {
|
|
361
|
-
width = Math.round((staticData.width / staticData.height) * height)
|
|
366
|
+
width = Math.round((staticData.width / staticData.height) * height)
|
|
362
367
|
}
|
|
363
368
|
}
|
|
364
369
|
|
|
365
|
-
const blurDataURL = blurDataURLProp ?? staticData?.blurDataURL
|
|
366
|
-
const quality = toNumber(qualityProp)
|
|
367
|
-
let unoptimized = Boolean(unoptimizedProp ?? config.unoptimized)
|
|
368
|
-
if (!src || src.startsWith('data:') || src.startsWith('blob:')) unoptimized = true
|
|
370
|
+
const blurDataURL = blurDataURLProp ?? staticData?.blurDataURL
|
|
371
|
+
const quality = toNumber(qualityProp)
|
|
372
|
+
let unoptimized = Boolean(unoptimizedProp ?? config.unoptimized)
|
|
373
|
+
if (!src || src.startsWith('data:') || src.startsWith('blob:')) unoptimized = true
|
|
369
374
|
// Serve `.svg` as-is instead of proxying through the Image Optimization API,
|
|
370
375
|
// which refuses SVG unless `dangerouslyAllowSVG` is set (otherwise the request
|
|
371
376
|
// 400s and the image never loads, so onLoad/onLoadingComplete never fire).
|
|
372
377
|
// Only applies to the default loader — a custom loader/loaderFile owns SVG.
|
|
373
|
-
const isDefaultLoader = !loader && !config.loaderFile
|
|
378
|
+
const isDefaultLoader = !loader && !config.loaderFile
|
|
374
379
|
if (
|
|
375
380
|
isDefaultLoader &&
|
|
376
381
|
!config.dangerouslyAllowSVG &&
|
|
377
382
|
(src.split('?', 1)[0] ?? '').endsWith('.svg')
|
|
378
383
|
) {
|
|
379
|
-
unoptimized = true
|
|
384
|
+
unoptimized = true
|
|
380
385
|
}
|
|
381
|
-
if (!unoptimized) validateLocalSrc(config, src)
|
|
386
|
+
if (!unoptimized) validateLocalSrc(config, src)
|
|
382
387
|
|
|
383
388
|
const activeLoader: (args: {
|
|
384
|
-
config: ResolvedImagesConfig
|
|
385
|
-
src: string
|
|
386
|
-
width: number
|
|
387
|
-
quality?: number
|
|
389
|
+
config: ResolvedImagesConfig
|
|
390
|
+
src: string
|
|
391
|
+
width: number
|
|
392
|
+
quality?: number
|
|
388
393
|
}) => string = loader
|
|
389
394
|
? ({ src: s, width: w, quality: q }) => loader({ src: s, width: w, quality: q })
|
|
390
|
-
: ({ config: c, src: s, width: w, quality: q }) => defaultLoader(c, s, w, q)
|
|
395
|
+
: ({ config: c, src: s, width: w, quality: q }) => defaultLoader(c, s, w, q)
|
|
391
396
|
|
|
392
397
|
const imgAttrs = generateImgAttrs({
|
|
393
398
|
config,
|
|
@@ -397,16 +402,16 @@ export function resolveImageProps(
|
|
|
397
402
|
quality,
|
|
398
403
|
sizes,
|
|
399
404
|
loader: activeLoader,
|
|
400
|
-
})
|
|
405
|
+
})
|
|
401
406
|
|
|
402
|
-
const isBlur = placeholder === 'blur' && Boolean(blurDataURL)
|
|
407
|
+
const isBlur = placeholder === 'blur' && Boolean(blurDataURL)
|
|
403
408
|
const imgStyle: Record<string, string | number | undefined> = {
|
|
404
409
|
...(fill ? { ...fillStyle(), objectFit, objectPosition } : {}),
|
|
405
410
|
...(showAltText ? {} : { color: 'transparent' }),
|
|
406
411
|
...userStyle,
|
|
407
|
-
}
|
|
412
|
+
}
|
|
408
413
|
|
|
409
|
-
const objectFitVal = typeof imgStyle.objectFit === 'string' ? imgStyle.objectFit : undefined
|
|
414
|
+
const objectFitVal = typeof imgStyle.objectFit === 'string' ? imgStyle.objectFit : undefined
|
|
410
415
|
const backgroundImage =
|
|
411
416
|
!blurComplete && placeholder !== 'empty'
|
|
412
417
|
? placeholder === 'blur'
|
|
@@ -425,11 +430,11 @@ export function resolveImageProps(
|
|
|
425
430
|
})}")`
|
|
426
431
|
: undefined
|
|
427
432
|
: `url("${placeholder}")`
|
|
428
|
-
: undefined
|
|
433
|
+
: undefined
|
|
429
434
|
|
|
430
|
-
let backgroundSize = 'cover'
|
|
431
|
-
if (objectFitVal === 'fill') backgroundSize = '100% 100%'
|
|
432
|
-
else if (objectFitVal && !INVALID_BACKGROUND_SIZE.has(objectFitVal)) backgroundSize = objectFitVal
|
|
435
|
+
let backgroundSize = 'cover'
|
|
436
|
+
if (objectFitVal === 'fill') backgroundSize = '100% 100%'
|
|
437
|
+
else if (objectFitVal && !INVALID_BACKGROUND_SIZE.has(objectFitVal)) backgroundSize = objectFitVal
|
|
433
438
|
|
|
434
439
|
const placeholderStyle: Record<string, string | number> = backgroundImage
|
|
435
440
|
? {
|
|
@@ -438,10 +443,10 @@ export function resolveImageProps(
|
|
|
438
443
|
backgroundRepeat: 'no-repeat',
|
|
439
444
|
backgroundImage,
|
|
440
445
|
}
|
|
441
|
-
: {}
|
|
446
|
+
: {}
|
|
442
447
|
|
|
443
|
-
const style = serializeStyle({ ...imgStyle, ...placeholderStyle })
|
|
444
|
-
const resolvedSrc = (overrideSrc ?? imgAttrs.src) || undefined
|
|
448
|
+
const style = serializeStyle({ ...imgStyle, ...placeholderStyle })
|
|
449
|
+
const resolvedSrc = (overrideSrc ?? imgAttrs.src) || undefined
|
|
445
450
|
const props: Record<string, unknown> = {
|
|
446
451
|
...rest,
|
|
447
452
|
alt,
|
|
@@ -450,14 +455,14 @@ export function resolveImageProps(
|
|
|
450
455
|
...(imgAttrs.sizes ? { sizes: imgAttrs.sizes } : {}),
|
|
451
456
|
decoding,
|
|
452
457
|
style,
|
|
453
|
-
}
|
|
458
|
+
}
|
|
454
459
|
if (!fill) {
|
|
455
|
-
if (width !== undefined) props.width = width
|
|
456
|
-
if (height !== undefined) props.height = height
|
|
460
|
+
if (width !== undefined) props.width = width
|
|
461
|
+
if (height !== undefined) props.height = height
|
|
457
462
|
}
|
|
458
|
-
if (loading !== undefined) props.loading = loading
|
|
459
|
-
else if (!priority && !preload) props.loading = 'lazy'
|
|
460
|
-
if (fetchPriority !== undefined) props.fetchpriority = fetchPriority
|
|
463
|
+
if (loading !== undefined) props.loading = loading
|
|
464
|
+
else if (!priority && !preload) props.loading = 'lazy'
|
|
465
|
+
if (fetchPriority !== undefined) props.fetchpriority = fetchPriority
|
|
461
466
|
|
|
462
467
|
return {
|
|
463
468
|
props,
|
|
@@ -473,18 +478,18 @@ export function resolveImageProps(
|
|
|
473
478
|
},
|
|
474
479
|
...(backgroundImage ? { loadedStyle: serializeStyle(imgStyle) } : {}),
|
|
475
480
|
},
|
|
476
|
-
}
|
|
481
|
+
}
|
|
477
482
|
}
|
|
478
483
|
|
|
479
484
|
function normalizeStyle(style: JSX.CSSProperties | string | undefined): Record<string, unknown> {
|
|
480
|
-
if (!style) return {}
|
|
481
|
-
if (typeof style !== 'string') return { ...style }
|
|
482
|
-
const out: Record<string, unknown> = {}
|
|
485
|
+
if (!style) return {}
|
|
486
|
+
if (typeof style !== 'string') return { ...style }
|
|
487
|
+
const out: Record<string, unknown> = {}
|
|
483
488
|
for (const decl of style.split(';')) {
|
|
484
|
-
const [k, v] = decl.split(':')
|
|
485
|
-
if (k && v) out[camel(k.trim())] = v.trim()
|
|
489
|
+
const [k, v] = decl.split(':')
|
|
490
|
+
if (k && v) out[camel(k.trim())] = v.trim()
|
|
486
491
|
}
|
|
487
|
-
return out
|
|
492
|
+
return out
|
|
488
493
|
}
|
|
489
494
|
|
|
490
495
|
function fillStyle(): Record<string, string> {
|
|
@@ -496,20 +501,20 @@ function fillStyle(): Record<string, string> {
|
|
|
496
501
|
top: '0',
|
|
497
502
|
right: '0',
|
|
498
503
|
bottom: '0',
|
|
499
|
-
}
|
|
504
|
+
}
|
|
500
505
|
}
|
|
501
506
|
|
|
502
507
|
function validateLocalSrc(config: ResolvedImagesConfig, src: string): void {
|
|
503
|
-
if (!src.startsWith('/') || src.startsWith('//') || config.localPatterns !== undefined) return
|
|
504
|
-
const search = new URL(src, 'http://n').search
|
|
505
|
-
if (!search) return
|
|
508
|
+
if (!src.startsWith('/') || src.startsWith('//') || config.localPatterns !== undefined) return
|
|
509
|
+
const search = new URL(src, 'http://n').search
|
|
510
|
+
if (!search) return
|
|
506
511
|
throw new Error(
|
|
507
512
|
`Image with src "${src}" is using a query string which is not configured in images.localPatterns.\nRead more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`,
|
|
508
|
-
)
|
|
513
|
+
)
|
|
509
514
|
}
|
|
510
515
|
|
|
511
516
|
function camel(prop: string): string {
|
|
512
|
-
return prop.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())
|
|
517
|
+
return prop.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())
|
|
513
518
|
}
|
|
514
519
|
|
|
515
520
|
const UNITLESS_STYLE_PROPS = new Set([
|
|
@@ -556,20 +561,21 @@ const UNITLESS_STYLE_PROPS = new Set([
|
|
|
556
561
|
'strokeMiterlimit',
|
|
557
562
|
'strokeOpacity',
|
|
558
563
|
'strokeWidth',
|
|
559
|
-
])
|
|
564
|
+
])
|
|
560
565
|
|
|
561
566
|
function serializeStyle(style: Record<string, string | number | undefined>): string {
|
|
562
567
|
return Object.entries(style)
|
|
563
568
|
.filter(([, v]) => v !== undefined && v !== '')
|
|
564
569
|
.map(([k, v]) => `${kebab(k)}:${cssValue(k, v!)}`)
|
|
565
|
-
.join(';')
|
|
570
|
+
.join(';')
|
|
566
571
|
}
|
|
567
572
|
|
|
568
573
|
function cssValue(prop: string, value: string | number): string {
|
|
569
|
-
if (typeof value === 'number' && value !== 0 && !UNITLESS_STYLE_PROPS.has(prop))
|
|
570
|
-
|
|
574
|
+
if (typeof value === 'number' && value !== 0 && !UNITLESS_STYLE_PROPS.has(prop))
|
|
575
|
+
return `${value}px`
|
|
576
|
+
return String(value)
|
|
571
577
|
}
|
|
572
578
|
|
|
573
579
|
function kebab(prop: string): string {
|
|
574
|
-
return prop.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`)
|
|
580
|
+
return prop.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`)
|
|
575
581
|
}
|