@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
|
@@ -10,48 +10,48 @@
|
|
|
10
10
|
* exactly.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
export type FontDisplay = 'auto' | 'block' | 'swap' | 'fallback' | 'optional'
|
|
13
|
+
export type FontDisplay = 'auto' | 'block' | 'swap' | 'fallback' | 'optional'
|
|
14
14
|
|
|
15
15
|
export interface GoogleFontOptions {
|
|
16
|
-
axes?: string[]
|
|
17
|
-
adjustFontFallback?: boolean
|
|
18
|
-
display?: FontDisplay
|
|
19
|
-
fallback?: string[]
|
|
20
|
-
preload?: boolean
|
|
21
|
-
subsets?: string[]
|
|
22
|
-
style?: string | string[]
|
|
23
|
-
variable?: string
|
|
24
|
-
weight?: string | string[]
|
|
16
|
+
axes?: string[]
|
|
17
|
+
adjustFontFallback?: boolean
|
|
18
|
+
display?: FontDisplay
|
|
19
|
+
fallback?: string[]
|
|
20
|
+
preload?: boolean
|
|
21
|
+
subsets?: string[]
|
|
22
|
+
style?: string | string[]
|
|
23
|
+
variable?: string
|
|
24
|
+
weight?: string | string[]
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export interface LocalFontSource {
|
|
28
|
-
path: string
|
|
29
|
-
style?: string
|
|
30
|
-
weight?: string
|
|
28
|
+
path: string
|
|
29
|
+
style?: string
|
|
30
|
+
weight?: string
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export interface LocalFontOptions {
|
|
34
|
-
declarations?: { prop: string; value: string }[]
|
|
35
|
-
display?: FontDisplay
|
|
36
|
-
fallback?: string[]
|
|
37
|
-
preload?: boolean
|
|
38
|
-
src: string | LocalFontSource | LocalFontSource[]
|
|
39
|
-
style?: string
|
|
40
|
-
variable?: string
|
|
41
|
-
weight?: string
|
|
34
|
+
declarations?: { prop: string; value: string }[]
|
|
35
|
+
display?: FontDisplay
|
|
36
|
+
fallback?: string[]
|
|
37
|
+
preload?: boolean
|
|
38
|
+
src: string | LocalFontSource | LocalFontSource[]
|
|
39
|
+
style?: string
|
|
40
|
+
variable?: string
|
|
41
|
+
weight?: string
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
export interface NextFont {
|
|
45
|
-
className: string
|
|
45
|
+
className: string
|
|
46
46
|
style: {
|
|
47
|
-
fontFamily: string
|
|
48
|
-
fontStyle?: string
|
|
49
|
-
fontWeight?: number | string
|
|
50
|
-
}
|
|
47
|
+
fontFamily: string
|
|
48
|
+
fontStyle?: string
|
|
49
|
+
fontWeight?: number | string
|
|
50
|
+
}
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
export interface NextFontWithVariable extends NextFont {
|
|
54
|
-
variable: string
|
|
54
|
+
variable: string
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
/**
|
|
@@ -59,26 +59,26 @@ export interface NextFontWithVariable extends NextFont {
|
|
|
59
59
|
* Both runtimes derive these from the same inputs, so they agree byte-for-byte.
|
|
60
60
|
*/
|
|
61
61
|
export interface FontNaming {
|
|
62
|
-
className: string
|
|
63
|
-
variable: string
|
|
64
|
-
style: NextFont['style']
|
|
62
|
+
className: string
|
|
63
|
+
variable: string
|
|
64
|
+
style: NextFont['style']
|
|
65
65
|
/** Human-readable CSS family label (single, unquoted). */
|
|
66
|
-
fontFamily: string
|
|
66
|
+
fontFamily: string
|
|
67
67
|
/** 12-char hash used for `__className_<hash>` / `__variable_<hash>`. */
|
|
68
|
-
hash: string
|
|
68
|
+
hash: string
|
|
69
69
|
/** Whether the loader call requested a CSS variable. When false the returned
|
|
70
70
|
* font object omits the `variable` key entirely (Next only exposes it when
|
|
71
71
|
* `variable` was passed). */
|
|
72
|
-
hasVariable: boolean
|
|
72
|
+
hasVariable: boolean
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
/** Naming for a `next/font/google` loader call: keyed on `{family, options}`. */
|
|
76
76
|
export function googleFontNaming(family: string, options: GoogleFontOptions): FontNaming {
|
|
77
|
-
const normalizedKey = stableJson({ family, options })
|
|
78
|
-
const hash = hashString(normalizedKey).slice(0, 12)
|
|
77
|
+
const normalizedKey = stableJson({ family, options })
|
|
78
|
+
const hash = hashString(normalizedKey).slice(0, 12)
|
|
79
79
|
// Next scopes the family to the human-readable font name (`'Inter'`), not a
|
|
80
80
|
// hashed token; only the className/variable identifiers are hashed.
|
|
81
|
-
const fontFamily = family
|
|
81
|
+
const fontFamily = family
|
|
82
82
|
return {
|
|
83
83
|
className: `__className_${hash}`,
|
|
84
84
|
variable: `__variable_${hash}`,
|
|
@@ -86,7 +86,7 @@ export function googleFontNaming(family: string, options: GoogleFontOptions): Fo
|
|
|
86
86
|
hash,
|
|
87
87
|
hasVariable: Boolean(options.variable),
|
|
88
88
|
style: fontStyle(fontFamily, options, options.fallback ?? []),
|
|
89
|
-
}
|
|
89
|
+
}
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
/**
|
|
@@ -98,12 +98,12 @@ export function localFontNaming(
|
|
|
98
98
|
callerFile: string | undefined,
|
|
99
99
|
options: LocalFontOptions,
|
|
100
100
|
): FontNaming {
|
|
101
|
-
const normalizedKey = stableJson({ callerFile, options })
|
|
102
|
-
const hash = hashString(normalizedKey).slice(0, 12)
|
|
101
|
+
const normalizedKey = stableJson({ callerFile, options })
|
|
102
|
+
const hash = hashString(normalizedKey).slice(0, 12)
|
|
103
103
|
// Next derives the CSS font-family from the loader call's JS binding
|
|
104
104
|
// (`variableName`). We reproduce the same human-readable label from the
|
|
105
105
|
// (first) source filename stem: `font1_roboto.woff2` -> `font1`.
|
|
106
|
-
const fontFamily = localFontFamilyLabel(options) ?? `local_${hash}
|
|
106
|
+
const fontFamily = localFontFamilyLabel(options) ?? `local_${hash}`
|
|
107
107
|
return {
|
|
108
108
|
className: `__className_${hash}`,
|
|
109
109
|
variable: `__variable_${hash}`,
|
|
@@ -111,17 +111,17 @@ export function localFontNaming(
|
|
|
111
111
|
hash,
|
|
112
112
|
hasVariable: Boolean(options.variable),
|
|
113
113
|
style: fontStyle(fontFamily, options, options.fallback ?? []),
|
|
114
|
-
}
|
|
114
|
+
}
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
/** Human-readable family label from the first local `src` filename stem. */
|
|
118
118
|
export function localFontFamilyLabel(options: LocalFontOptions): string | undefined {
|
|
119
|
-
const first = Array.isArray(options.src) ? options.src[0] : options.src
|
|
120
|
-
const srcPath = typeof first === 'string' ? first : first?.path
|
|
121
|
-
if (!srcPath) return undefined
|
|
122
|
-
const base = srcPath.replace(/^.*[\\/]/, '').replace(/\.[^.]+$/, '')
|
|
123
|
-
const stem = base.split('_', 1)[0] ?? base
|
|
124
|
-
return /^[-_a-zA-Z0-9 ]+$/.test(stem) ? stem : undefined
|
|
119
|
+
const first = Array.isArray(options.src) ? options.src[0] : options.src
|
|
120
|
+
const srcPath = typeof first === 'string' ? first : first?.path
|
|
121
|
+
if (!srcPath) return undefined
|
|
122
|
+
const base = srcPath.replace(/^.*[\\/]/, '').replace(/\.[^.]+$/, '')
|
|
123
|
+
const stem = base.split('_', 1)[0] ?? base
|
|
124
|
+
return /^[-_a-zA-Z0-9 ]+$/.test(stem) ? stem : undefined
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
export function fontStyle(
|
|
@@ -132,18 +132,20 @@ export function fontStyle(
|
|
|
132
132
|
// Next exports numeric font-weight and the raw font-style, but only when a
|
|
133
133
|
// single (non-range) value is set on the loader call.
|
|
134
134
|
const weight =
|
|
135
|
-
typeof options.weight === 'string' &&
|
|
135
|
+
typeof options.weight === 'string' &&
|
|
136
|
+
!isRangeValue(options.weight) &&
|
|
137
|
+
!Number.isNaN(Number(options.weight))
|
|
136
138
|
? { fontWeight: Number(cssIdentifier(options.weight)) }
|
|
137
|
-
: {}
|
|
139
|
+
: {}
|
|
138
140
|
const style =
|
|
139
141
|
typeof options.style === 'string' && !isRangeValue(options.style)
|
|
140
142
|
? { fontStyle: cssIdentifier(options.style) }
|
|
141
|
-
: {}
|
|
143
|
+
: {}
|
|
142
144
|
return {
|
|
143
145
|
fontFamily: familyStack(family, fallbackFonts),
|
|
144
146
|
...weight,
|
|
145
147
|
...style,
|
|
146
|
-
}
|
|
148
|
+
}
|
|
147
149
|
}
|
|
148
150
|
|
|
149
151
|
/**
|
|
@@ -151,41 +153,45 @@ export function fontStyle(
|
|
|
151
153
|
* `<family> Fallback` metrics-adjusted fallback (adjustFontFallback defaults
|
|
152
154
|
* on), then any user fallbacks. Single-quoted to match Next's postcss output.
|
|
153
155
|
*/
|
|
154
|
-
export function familyStack(
|
|
156
|
+
export function familyStack(
|
|
157
|
+
family: string,
|
|
158
|
+
fallbackFonts: string[] = [],
|
|
159
|
+
adjustFontFallback = true,
|
|
160
|
+
) {
|
|
155
161
|
return [
|
|
156
162
|
singleQuoteFamily(family),
|
|
157
163
|
...(adjustFontFallback ? [singleQuoteFamily(`${family} Fallback`)] : []),
|
|
158
164
|
...fallbackFonts.map(singleQuoteFamily),
|
|
159
|
-
].join(', ')
|
|
165
|
+
].join(', ')
|
|
160
166
|
}
|
|
161
167
|
|
|
162
168
|
export function singleQuoteFamily(value: string) {
|
|
163
|
-
if (!/^[-_a-zA-Z0-9 ]+$/.test(value)) throw new Error(`Invalid font family: ${value}`)
|
|
164
|
-
return `'${value}'
|
|
169
|
+
if (!/^[-_a-zA-Z0-9 ]+$/.test(value)) throw new Error(`Invalid font family: ${value}`)
|
|
170
|
+
return `'${value}'`
|
|
165
171
|
}
|
|
166
172
|
|
|
167
173
|
function cssIdentifier(value: string) {
|
|
168
|
-
if (!/^[-_a-zA-Z0-9. ]+$/.test(value)) throw new Error(`Invalid font option value: ${value}`)
|
|
169
|
-
return value
|
|
174
|
+
if (!/^[-_a-zA-Z0-9. ]+$/.test(value)) throw new Error(`Invalid font option value: ${value}`)
|
|
175
|
+
return value
|
|
170
176
|
}
|
|
171
177
|
|
|
172
178
|
function isRangeValue(value: string) {
|
|
173
|
-
return value.trim().includes(' ')
|
|
179
|
+
return value.trim().includes(' ')
|
|
174
180
|
}
|
|
175
181
|
|
|
176
182
|
export function stableJson(value: unknown): string {
|
|
177
|
-
return JSON.stringify(sortObject(value))
|
|
183
|
+
return JSON.stringify(sortObject(value))
|
|
178
184
|
}
|
|
179
185
|
|
|
180
186
|
function sortObject(value: unknown): unknown {
|
|
181
|
-
if (Array.isArray(value)) return value.map(sortObject)
|
|
182
|
-
if (!value || typeof value !== 'object') return value
|
|
187
|
+
if (Array.isArray(value)) return value.map(sortObject)
|
|
188
|
+
if (!value || typeof value !== 'object') return value
|
|
183
189
|
return Object.fromEntries(
|
|
184
190
|
Object.entries(value as Record<string, unknown>)
|
|
185
191
|
.filter(([, item]) => item !== undefined)
|
|
186
192
|
.sort(([a], [b]) => a.localeCompare(b))
|
|
187
193
|
.map(([key, item]) => [key, sortObject(item)]),
|
|
188
|
-
)
|
|
194
|
+
)
|
|
189
195
|
}
|
|
190
196
|
|
|
191
197
|
/**
|
|
@@ -195,12 +201,12 @@ function sortObject(value: unknown): unknown {
|
|
|
195
201
|
* font hashes in lock-step.
|
|
196
202
|
*/
|
|
197
203
|
export function hashString(value: string): string {
|
|
198
|
-
return sha256Hex(utf8Bytes(value))
|
|
204
|
+
return sha256Hex(utf8Bytes(value))
|
|
199
205
|
}
|
|
200
206
|
|
|
201
207
|
function utf8Bytes(value: string): Uint8Array {
|
|
202
208
|
// TextEncoder is available in browsers and in Node/Bun.
|
|
203
|
-
return new TextEncoder().encode(value)
|
|
209
|
+
return new TextEncoder().encode(value)
|
|
204
210
|
}
|
|
205
211
|
|
|
206
212
|
const K = new Uint32Array([
|
|
@@ -212,70 +218,76 @@ const K = new Uint32Array([
|
|
|
212
218
|
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
213
219
|
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
214
220
|
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
|
|
215
|
-
])
|
|
221
|
+
])
|
|
216
222
|
|
|
217
223
|
function sha256Hex(message: Uint8Array): string {
|
|
218
224
|
const h = new Uint32Array([
|
|
219
225
|
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
|
|
220
|
-
])
|
|
226
|
+
])
|
|
221
227
|
|
|
222
|
-
const bitLen = message.length * 8
|
|
228
|
+
const bitLen = message.length * 8
|
|
223
229
|
// Padded length: message + 0x80 + zeros + 8-byte length, up to a 64-byte block.
|
|
224
|
-
const padded = new Uint8Array((((message.length + 8) >> 6) + 1) << 6)
|
|
225
|
-
padded.set(message)
|
|
226
|
-
padded[message.length] = 0x80
|
|
230
|
+
const padded = new Uint8Array((((message.length + 8) >> 6) + 1) << 6)
|
|
231
|
+
padded.set(message)
|
|
232
|
+
padded[message.length] = 0x80
|
|
227
233
|
// 64-bit big-endian bit length in the final 8 bytes (high 32 bits ~always 0
|
|
228
234
|
// for our short inputs, but write both halves for correctness).
|
|
229
|
-
const dv = new DataView(padded.buffer)
|
|
230
|
-
dv.setUint32(padded.length - 8, Math.floor(bitLen / 0x100000000))
|
|
231
|
-
dv.setUint32(padded.length - 4, bitLen >>> 0)
|
|
235
|
+
const dv = new DataView(padded.buffer)
|
|
236
|
+
dv.setUint32(padded.length - 8, Math.floor(bitLen / 0x100000000))
|
|
237
|
+
dv.setUint32(padded.length - 4, bitLen >>> 0)
|
|
232
238
|
|
|
233
|
-
const w = new Uint32Array(64)
|
|
239
|
+
const w = new Uint32Array(64)
|
|
234
240
|
for (let offset = 0; offset < padded.length; offset += 64) {
|
|
235
|
-
for (let i = 0; i < 16; i++) w[i] = dv.getUint32(offset + i * 4)
|
|
241
|
+
for (let i = 0; i < 16; i++) w[i] = dv.getUint32(offset + i * 4)
|
|
236
242
|
for (let i = 16; i < 64; i++) {
|
|
237
|
-
const w15 = w[i - 15]
|
|
238
|
-
const w2 = w[i - 2]
|
|
239
|
-
const s0 = rotr(w15, 7) ^ rotr(w15, 18) ^ (w15 >>> 3)
|
|
240
|
-
const s1 = rotr(w2, 17) ^ rotr(w2, 19) ^ (w2 >>> 10)
|
|
241
|
-
w[i] = (w[i - 16]! + s0 + w[i - 7]! + s1) >>> 0
|
|
243
|
+
const w15 = w[i - 15]!
|
|
244
|
+
const w2 = w[i - 2]!
|
|
245
|
+
const s0 = rotr(w15, 7) ^ rotr(w15, 18) ^ (w15 >>> 3)
|
|
246
|
+
const s1 = rotr(w2, 17) ^ rotr(w2, 19) ^ (w2 >>> 10)
|
|
247
|
+
w[i] = (w[i - 16]! + s0 + w[i - 7]! + s1) >>> 0
|
|
242
248
|
}
|
|
243
249
|
|
|
244
|
-
let a = h[0]!,
|
|
245
|
-
|
|
250
|
+
let a = h[0]!,
|
|
251
|
+
b = h[1]!,
|
|
252
|
+
c = h[2]!,
|
|
253
|
+
d = h[3]!
|
|
254
|
+
let e = h[4]!,
|
|
255
|
+
f = h[5]!,
|
|
256
|
+
g = h[6]!,
|
|
257
|
+
hh = h[7]!
|
|
246
258
|
|
|
247
259
|
for (let i = 0; i < 64; i++) {
|
|
248
|
-
const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)
|
|
249
|
-
const ch = (e & f) ^ (~e & g)
|
|
250
|
-
const t1 = (hh + S1 + ch + K[i]! + w[i]!) >>> 0
|
|
251
|
-
const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)
|
|
252
|
-
const maj = (a & b) ^ (a & c) ^ (b & c)
|
|
253
|
-
const t2 = (S0 + maj) >>> 0
|
|
254
|
-
hh = g
|
|
255
|
-
g = f
|
|
256
|
-
f = e
|
|
257
|
-
e = (d + t1) >>> 0
|
|
258
|
-
d = c
|
|
259
|
-
c = b
|
|
260
|
-
b = a
|
|
261
|
-
a = (t1 + t2) >>> 0
|
|
260
|
+
const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)
|
|
261
|
+
const ch = (e & f) ^ (~e & g)
|
|
262
|
+
const t1 = (hh + S1 + ch + K[i]! + w[i]!) >>> 0
|
|
263
|
+
const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)
|
|
264
|
+
const maj = (a & b) ^ (a & c) ^ (b & c)
|
|
265
|
+
const t2 = (S0 + maj) >>> 0
|
|
266
|
+
hh = g
|
|
267
|
+
g = f
|
|
268
|
+
f = e
|
|
269
|
+
e = (d + t1) >>> 0
|
|
270
|
+
d = c
|
|
271
|
+
c = b
|
|
272
|
+
b = a
|
|
273
|
+
a = (t1 + t2) >>> 0
|
|
262
274
|
}
|
|
263
275
|
|
|
264
|
-
h[0] = (h[0]! + a) >>> 0
|
|
265
|
-
h[1] = (h[1]! + b) >>> 0
|
|
266
|
-
h[2] = (h[2]! + c) >>> 0
|
|
267
|
-
h[3] = (h[3]! + d) >>> 0
|
|
268
|
-
h[4] = (h[4]! + e) >>> 0
|
|
269
|
-
h[5] = (h[5]! + f) >>> 0
|
|
270
|
-
h[6] = (h[6]! + g) >>> 0
|
|
271
|
-
h[7] = (h[7]! + hh) >>> 0
|
|
276
|
+
h[0] = (h[0]! + a) >>> 0
|
|
277
|
+
h[1] = (h[1]! + b) >>> 0
|
|
278
|
+
h[2] = (h[2]! + c) >>> 0
|
|
279
|
+
h[3] = (h[3]! + d) >>> 0
|
|
280
|
+
h[4] = (h[4]! + e) >>> 0
|
|
281
|
+
h[5] = (h[5]! + f) >>> 0
|
|
282
|
+
h[6] = (h[6]! + g) >>> 0
|
|
283
|
+
h[7] = (h[7]! + hh) >>> 0
|
|
272
284
|
}
|
|
273
285
|
|
|
274
|
-
let hex = ''
|
|
275
|
-
for (let i = 0; i < 8; i++) hex += h[i]!.toString(16).padStart(8, '0')
|
|
276
|
-
return hex
|
|
286
|
+
let hex = ''
|
|
287
|
+
for (let i = 0; i < 8; i++) hex += h[i]!.toString(16).padStart(8, '0')
|
|
288
|
+
return hex
|
|
277
289
|
}
|
|
278
290
|
|
|
279
291
|
function rotr(value: number, bits: number): number {
|
|
280
|
-
return ((value >>> bits) | (value << (32 - bits))) >>> 0
|
|
292
|
+
return ((value >>> bits) | (value << (32 - bits))) >>> 0
|
|
281
293
|
}
|
package/src/compat/next/form.tsx
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
'use client'
|
|
1
|
+
'use client'
|
|
2
2
|
|
|
3
|
-
import { useEffect, useRef, type JSX, type ReactNode } from 'preact/compat'
|
|
4
|
-
import { prefetchRoute, softNavigate } from '../../
|
|
5
|
-
import { addBasePath } from '../client/base-path'
|
|
3
|
+
import { useEffect, useRef, type JSX, type ReactNode } from 'preact/compat'
|
|
4
|
+
import { prefetchRoute, softNavigate } from '../../client/router'
|
|
5
|
+
import { addBasePath } from '../client/base-path'
|
|
6
6
|
|
|
7
|
-
type FormAction = string | ((formData: FormData) => void | Promise<void>)
|
|
7
|
+
type FormAction = string | ((formData: FormData) => void | Promise<void>)
|
|
8
8
|
export type FormProps = Omit<JSX.HTMLAttributes<HTMLFormElement>, 'action' | 'method'> & {
|
|
9
|
-
action: FormAction
|
|
10
|
-
replace?: boolean
|
|
11
|
-
scroll?: boolean
|
|
12
|
-
prefetch?: boolean
|
|
13
|
-
children?: ReactNode
|
|
14
|
-
}
|
|
9
|
+
action: FormAction
|
|
10
|
+
replace?: boolean
|
|
11
|
+
scroll?: boolean
|
|
12
|
+
prefetch?: boolean
|
|
13
|
+
children?: ReactNode
|
|
14
|
+
}
|
|
15
15
|
|
|
16
16
|
export default function Form({
|
|
17
17
|
action,
|
|
@@ -22,52 +22,50 @@ export default function Form({
|
|
|
22
22
|
children,
|
|
23
23
|
...formProps
|
|
24
24
|
}: FormProps) {
|
|
25
|
-
const formRef = useRef<HTMLFormElement | null>(null)
|
|
26
|
-
const stringAction = typeof action === 'string' ? action : undefined
|
|
27
|
-
const basePathAction = stringAction == null ? undefined : addBasePath(stringAction)
|
|
25
|
+
const formRef = useRef<HTMLFormElement | null>(null)
|
|
26
|
+
const stringAction = typeof action === 'string' ? action : undefined
|
|
27
|
+
const basePathAction = stringAction == null ? undefined : addBasePath(stringAction)
|
|
28
28
|
|
|
29
29
|
// Function actions are React form actions; pass through untouched so the
|
|
30
30
|
// renderer wires them (no soft-nav interception, no GET semantics).
|
|
31
31
|
|
|
32
32
|
useEffect(() => {
|
|
33
|
-
if (basePathAction == null || prefetch === false) return
|
|
33
|
+
if (basePathAction == null || prefetch === false) return
|
|
34
34
|
// No prefetch in dev (per-request rendering); prefetchRoute already no-ops.
|
|
35
35
|
// Register the form element so a revalidation-triggered retry re-prefetches
|
|
36
36
|
// visible forms exactly like visible links (the router reads its `action`).
|
|
37
|
-
void prefetchRoute(basePathAction, { element: formRef.current ?? undefined })
|
|
38
|
-
}, [basePathAction, prefetch])
|
|
37
|
+
void prefetchRoute(basePathAction, { element: formRef.current ?? undefined })
|
|
38
|
+
}, [basePathAction, prefetch])
|
|
39
39
|
|
|
40
40
|
if (typeof action !== 'string') {
|
|
41
41
|
return (
|
|
42
42
|
<form ref={formRef} action={action as never} onSubmit={onSubmit} {...formProps}>
|
|
43
43
|
{children}
|
|
44
44
|
</form>
|
|
45
|
-
)
|
|
45
|
+
)
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
const handleSubmit = (event: JSX.TargetedSubmitEvent<HTMLFormElement>) => {
|
|
49
|
-
onSubmit?.(event)
|
|
50
|
-
if (event.defaultPrevented) return
|
|
49
|
+
onSubmit?.(event)
|
|
50
|
+
if (event.defaultPrevented) return
|
|
51
51
|
|
|
52
|
-
const form = event.currentTarget
|
|
52
|
+
const form = event.currentTarget
|
|
53
53
|
const submitter = (event as unknown as { submitter?: HTMLElement }).submitter as
|
|
54
|
-
|
|
|
55
|
-
| HTMLInputElement
|
|
56
|
-
| undefined;
|
|
54
|
+
HTMLButtonElement | HTMLInputElement | undefined
|
|
57
55
|
|
|
58
56
|
// A submitter that sets encType/method/target to a non-default value isn't
|
|
59
57
|
// supported for soft-nav; fall back to the browser's native submit.
|
|
60
|
-
if (submitter && hasUnsupportedSubmitterAttr(submitter)) return
|
|
61
|
-
if (submitter && hasReactClientActionAttributes(submitter)) return
|
|
58
|
+
if (submitter && hasUnsupportedSubmitterAttr(submitter)) return
|
|
59
|
+
if (submitter && hasReactClientActionAttributes(submitter)) return
|
|
62
60
|
|
|
63
|
-
event.preventDefault()
|
|
61
|
+
event.preventDefault()
|
|
64
62
|
|
|
65
|
-
const submitterAction = submitter?.getAttribute('formaction')
|
|
66
|
-
const target = submitterAction != null ? submitterAction : addBasePath(action)
|
|
67
|
-
const destination = createFormSubmitDestinationUrl(target, form)
|
|
63
|
+
const submitterAction = submitter?.getAttribute('formaction')
|
|
64
|
+
const target = submitterAction != null ? submitterAction : addBasePath(action)
|
|
65
|
+
const destination = createFormSubmitDestinationUrl(target, form)
|
|
68
66
|
|
|
69
|
-
void softNavigate(destination.href, { replace, scroll })
|
|
70
|
-
}
|
|
67
|
+
void softNavigate(destination.href, { replace, scroll })
|
|
68
|
+
}
|
|
71
69
|
|
|
72
70
|
return (
|
|
73
71
|
<form
|
|
@@ -79,10 +77,10 @@ export default function Form({
|
|
|
79
77
|
>
|
|
80
78
|
{children}
|
|
81
79
|
</form>
|
|
82
|
-
)
|
|
80
|
+
)
|
|
83
81
|
}
|
|
84
82
|
|
|
85
|
-
export { Form }
|
|
83
|
+
export { Form }
|
|
86
84
|
|
|
87
85
|
// encType/method/target set to a non-default value can't be honored by a
|
|
88
86
|
// soft-nav GET; detect and warn so the caller falls back to native submit.
|
|
@@ -90,67 +88,69 @@ const SUBMITTER_ATTRS: { attr: string; name: string; defaults: string[] }[] = [
|
|
|
90
88
|
{ attr: 'formEncType', name: 'encType', defaults: ['application/x-www-form-urlencoded'] },
|
|
91
89
|
{ attr: 'formMethod', name: 'method', defaults: ['get'] },
|
|
92
90
|
{ attr: 'formTarget', name: 'target', defaults: ['', '_self'] },
|
|
93
|
-
]
|
|
91
|
+
]
|
|
94
92
|
|
|
95
93
|
function hasUnsupportedSubmitterAttr(submitter: HTMLButtonElement | HTMLInputElement) {
|
|
96
94
|
for (const { attr, name, defaults } of SUBMITTER_ATTRS) {
|
|
97
|
-
const raw = submitter.getAttribute(attr) ?? submitter.getAttribute(attr.toLowerCase())
|
|
98
|
-
if (raw == null || raw === '') continue
|
|
99
|
-
if (defaults.includes(raw.toLowerCase())) continue
|
|
100
|
-
reportUnsupportedAttr(name)
|
|
101
|
-
return true
|
|
95
|
+
const raw = submitter.getAttribute(attr) ?? submitter.getAttribute(attr.toLowerCase())
|
|
96
|
+
if (raw == null || raw === '') continue
|
|
97
|
+
if (defaults.includes(raw.toLowerCase())) continue
|
|
98
|
+
reportUnsupportedAttr(name)
|
|
99
|
+
return true
|
|
102
100
|
}
|
|
103
|
-
return false
|
|
101
|
+
return false
|
|
104
102
|
}
|
|
105
103
|
|
|
106
104
|
function hasReactClientActionAttributes(submitter: HTMLElement) {
|
|
107
|
-
const name = submitter.getAttribute('name')
|
|
108
|
-
return Boolean(name && (name.startsWith('$ACTION_ID_') || name.startsWith('$ACTION_REF_')))
|
|
105
|
+
const name = submitter.getAttribute('name')
|
|
106
|
+
return Boolean(name && (name.startsWith('$ACTION_ID_') || name.startsWith('$ACTION_REF_')))
|
|
109
107
|
}
|
|
110
108
|
|
|
111
109
|
function createFormSubmitDestinationUrl(action: string, form: HTMLFormElement) {
|
|
112
|
-
let targetUrl: URL
|
|
110
|
+
let targetUrl: URL
|
|
113
111
|
try {
|
|
114
|
-
targetUrl = new URL(action, location.href)
|
|
112
|
+
targetUrl = new URL(action, location.href)
|
|
115
113
|
} catch (error) {
|
|
116
114
|
throw new Error(`Cannot parse form action "${action}" as a URL`, {
|
|
117
115
|
cause: error as Error,
|
|
118
|
-
})
|
|
116
|
+
})
|
|
119
117
|
}
|
|
120
|
-
if (targetUrl.searchParams.size > 0) targetUrl.search = ''
|
|
118
|
+
if (targetUrl.searchParams.size > 0) targetUrl.search = ''
|
|
121
119
|
|
|
122
|
-
const data = new FormData(form)
|
|
120
|
+
const data = new FormData(form)
|
|
123
121
|
for (const [key, value] of data.entries()) {
|
|
124
122
|
if (typeof value === 'string') {
|
|
125
|
-
targetUrl.searchParams.append(key, value)
|
|
123
|
+
targetUrl.searchParams.append(key, value)
|
|
126
124
|
} else {
|
|
127
|
-
warnFileInput()
|
|
128
|
-
targetUrl.searchParams.append(key, (value as File).name)
|
|
125
|
+
warnFileInput()
|
|
126
|
+
targetUrl.searchParams.append(key, (value as File).name)
|
|
129
127
|
}
|
|
130
128
|
}
|
|
131
|
-
return targetUrl
|
|
129
|
+
return targetUrl
|
|
132
130
|
}
|
|
133
131
|
|
|
134
|
-
let reportedAttrs: Set<string> | undefined
|
|
132
|
+
let reportedAttrs: Set<string> | undefined
|
|
135
133
|
function reportUnsupportedAttr(name: string) {
|
|
136
|
-
if (typeof document === 'undefined' || !isDevDocument()) return
|
|
137
|
-
reportedAttrs ??= new Set()
|
|
138
|
-
if (reportedAttrs.has(name)) return
|
|
139
|
-
reportedAttrs.add(name)
|
|
134
|
+
if (typeof document === 'undefined' || !isDevDocument()) return
|
|
135
|
+
reportedAttrs ??= new Set()
|
|
136
|
+
if (reportedAttrs.has(name)) return
|
|
137
|
+
reportedAttrs.add(name)
|
|
140
138
|
console.error(
|
|
141
139
|
`<Form>'s \`${name}\` was set to an unsupported value. Only the default value is supported. See https://nextjs.org/docs/app/api-reference/components/form`,
|
|
142
|
-
)
|
|
140
|
+
)
|
|
143
141
|
}
|
|
144
142
|
|
|
145
|
-
let fileInputWarned = false
|
|
143
|
+
let fileInputWarned = false
|
|
146
144
|
function warnFileInput() {
|
|
147
|
-
if (fileInputWarned || typeof document === 'undefined' || !isDevDocument()) return
|
|
148
|
-
fileInputWarned = true
|
|
145
|
+
if (fileInputWarned || typeof document === 'undefined' || !isDevDocument()) return
|
|
146
|
+
fileInputWarned = true
|
|
149
147
|
console.warn(
|
|
150
148
|
'<Form> only supports file inputs if `action` is a function. Files will not be submitted with a string action.',
|
|
151
|
-
)
|
|
149
|
+
)
|
|
152
150
|
}
|
|
153
151
|
|
|
154
152
|
function isDevDocument() {
|
|
155
|
-
return
|
|
153
|
+
return (
|
|
154
|
+
typeof document !== 'undefined' && Boolean(document.querySelector('script[data-pnext-dev]'))
|
|
155
|
+
)
|
|
156
156
|
}
|
package/src/compat/next/head.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ComponentChildren } from 'preact'
|
|
1
|
+
import type { ComponentChildren } from 'preact'
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Pages-router head hoisting is not supported (Next's own app router rejects
|
|
@@ -6,5 +6,5 @@ import type { ComponentChildren } from 'preact';
|
|
|
6
6
|
* components that still carry a <Head> don't break.
|
|
7
7
|
*/
|
|
8
8
|
export default function Head(_props: { children?: ComponentChildren }) {
|
|
9
|
-
return null
|
|
9
|
+
return null
|
|
10
10
|
}
|