@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,17 +1,17 @@
|
|
|
1
|
-
import type { JSX } from 'preact'
|
|
2
|
-
import { useEffect } from 'preact/compat'
|
|
3
|
-
import { registerResourceHint } from '../../render/resource-hints'
|
|
1
|
+
import type { JSX } from 'preact'
|
|
2
|
+
import { useEffect } from 'preact/compat'
|
|
3
|
+
import { registerResourceHint } from '../../render/resource-hints'
|
|
4
4
|
|
|
5
|
-
export type ScriptStrategy = 'beforeInteractive' | 'afterInteractive' | 'lazyOnload' | 'worker'
|
|
5
|
+
export type ScriptStrategy = 'beforeInteractive' | 'afterInteractive' | 'lazyOnload' | 'worker'
|
|
6
6
|
|
|
7
7
|
export type ScriptProps = Omit<JSX.ScriptHTMLAttributes<HTMLScriptElement>, 'src'> & {
|
|
8
|
-
src?: string
|
|
9
|
-
strategy?: ScriptStrategy
|
|
10
|
-
onLoad?: (event: Event) => void
|
|
11
|
-
onReady?: () => void
|
|
12
|
-
onError?: (event: Event) => void
|
|
13
|
-
children?: string
|
|
14
|
-
}
|
|
8
|
+
src?: string
|
|
9
|
+
strategy?: ScriptStrategy
|
|
10
|
+
onLoad?: (event: Event) => void
|
|
11
|
+
onReady?: () => void
|
|
12
|
+
onError?: (event: Event) => void
|
|
13
|
+
children?: string
|
|
14
|
+
}
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* Client runtime for next/script. Mirrors Next's imperative loader: scripts are created and appended to
|
|
@@ -22,8 +22,8 @@ export type ScriptProps = Omit<JSX.ScriptHTMLAttributes<HTMLScriptElement>, 'src
|
|
|
22
22
|
* underlying script exactly once, and the cache survives soft navigations so the same src/id is never
|
|
23
23
|
* re-run.
|
|
24
24
|
*/
|
|
25
|
-
const LoadCache = new Set<string>()
|
|
26
|
-
const ScriptCache = new Map<string, Promise<void>>()
|
|
25
|
+
const LoadCache = new Set<string>()
|
|
26
|
+
const ScriptCache = new Map<string, Promise<void>>()
|
|
27
27
|
|
|
28
28
|
const SKIP_PROPS = new Set([
|
|
29
29
|
'src',
|
|
@@ -33,22 +33,22 @@ const SKIP_PROPS = new Set([
|
|
|
33
33
|
'onError',
|
|
34
34
|
'children',
|
|
35
35
|
'dangerouslySetInnerHTML',
|
|
36
|
-
])
|
|
36
|
+
])
|
|
37
37
|
|
|
38
38
|
function applyAttrs(el: HTMLScriptElement, props: ScriptProps) {
|
|
39
39
|
for (const [key, value] of Object.entries(props)) {
|
|
40
|
-
if (SKIP_PROPS.has(key) || key.startsWith('on')) continue
|
|
41
|
-
if (value == null || value === false || typeof value === 'function') continue
|
|
42
|
-
const name = key === 'className' ? 'class' : key === 'htmlFor' ? 'for' : key.toLowerCase()
|
|
43
|
-
el.setAttribute(name, value === true ? '' : String(value))
|
|
40
|
+
if (SKIP_PROPS.has(key) || key.startsWith('on')) continue
|
|
41
|
+
if (value == null || value === false || typeof value === 'function') continue
|
|
42
|
+
const name = key === 'className' ? 'class' : key === 'htmlFor' ? 'for' : key.toLowerCase()
|
|
43
|
+
el.setAttribute(name, value === true ? '' : String(value))
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
function inlineHtml(props: ScriptProps): string | undefined {
|
|
48
|
-
if (typeof props.children === 'string') return props.children
|
|
49
|
-
const dangerous = props.dangerouslySetInnerHTML as { __html?: unknown } | undefined
|
|
50
|
-
if (dangerous && typeof dangerous.__html === 'string') return dangerous.__html
|
|
51
|
-
return undefined
|
|
48
|
+
if (typeof props.children === 'string') return props.children
|
|
49
|
+
const dangerous = props.dangerouslySetInnerHTML as { __html?: unknown } | undefined
|
|
50
|
+
if (dangerous && typeof dangerous.__html === 'string') return dangerous.__html
|
|
51
|
+
return undefined
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
/**
|
|
@@ -57,35 +57,35 @@ function inlineHtml(props: ScriptProps): string | undefined {
|
|
|
57
57
|
* script without re-running it, matching Next.
|
|
58
58
|
*/
|
|
59
59
|
function loadScript(props: ScriptProps): void {
|
|
60
|
-
const { src, id, onLoad, onReady, onError } = props
|
|
61
|
-
const cacheKey = (typeof id === 'string' && id) || src
|
|
60
|
+
const { src, id, onLoad, onReady, onError } = props
|
|
61
|
+
const cacheKey = (typeof id === 'string' && id) || src
|
|
62
62
|
|
|
63
63
|
if (cacheKey && LoadCache.has(cacheKey)) {
|
|
64
|
-
const pending = ScriptCache.get(cacheKey)
|
|
65
|
-
if (pending) pending.then(() => onReady?.()).catch(() => undefined)
|
|
66
|
-
else onReady?.()
|
|
67
|
-
return
|
|
64
|
+
const pending = ScriptCache.get(cacheKey)
|
|
65
|
+
if (pending) pending.then(() => onReady?.()).catch(() => undefined)
|
|
66
|
+
else onReady?.()
|
|
67
|
+
return
|
|
68
68
|
}
|
|
69
|
-
if (cacheKey) LoadCache.add(cacheKey)
|
|
69
|
+
if (cacheKey) LoadCache.add(cacheKey)
|
|
70
70
|
|
|
71
|
-
const el = document.createElement('script')
|
|
72
|
-
applyAttrs(el, props)
|
|
73
|
-
if (typeof id === 'string') el.id = id
|
|
71
|
+
const el = document.createElement('script')
|
|
72
|
+
applyAttrs(el, props)
|
|
73
|
+
if (typeof id === 'string') el.id = id
|
|
74
74
|
|
|
75
75
|
if (src) {
|
|
76
76
|
const promise = new Promise<void>((resolve, reject) => {
|
|
77
77
|
el.addEventListener('load', event => {
|
|
78
|
-
onLoad?.(event)
|
|
79
|
-
resolve()
|
|
80
|
-
})
|
|
78
|
+
onLoad?.(event)
|
|
79
|
+
resolve()
|
|
80
|
+
})
|
|
81
81
|
el.addEventListener('error', event => {
|
|
82
|
-
onError?.(event)
|
|
83
|
-
reject(event instanceof Error ? event : new Error('next/script failed to load'))
|
|
84
|
-
})
|
|
85
|
-
})
|
|
86
|
-
if (cacheKey) ScriptCache.set(cacheKey, promise)
|
|
87
|
-
promise.then(() => onReady?.()).catch(() => undefined)
|
|
88
|
-
el.src = src
|
|
82
|
+
onError?.(event)
|
|
83
|
+
reject(event instanceof Error ? event : new Error('next/script failed to load'))
|
|
84
|
+
})
|
|
85
|
+
})
|
|
86
|
+
if (cacheKey) ScriptCache.set(cacheKey, promise)
|
|
87
|
+
promise.then(() => onReady?.()).catch(() => undefined)
|
|
88
|
+
el.src = src
|
|
89
89
|
// Append the executing tag only once the resource is warm (Next appends from its mount effect AFTER
|
|
90
90
|
// ReactDOM.preload has resolved the src). Then the tag's own fetch is a cache hit and it executes
|
|
91
91
|
// within a tick of entering the DOM, so a consumer that reads the script's side effects right after
|
|
@@ -93,17 +93,17 @@ function loadScript(props: ScriptProps): void {
|
|
|
93
93
|
// script is still downloading, so that read races ahead of execution. The document already carries an
|
|
94
94
|
// SSR preload link for this src, so the download is already in flight regardless of when hydration
|
|
95
95
|
// runs - this warm-up link just yields a load event to gate on and dedupes onto that same fetch.
|
|
96
|
-
warmThenAppend(el, src, props)
|
|
97
|
-
return
|
|
96
|
+
warmThenAppend(el, src, props)
|
|
97
|
+
return
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
const html = inlineHtml(props)
|
|
100
|
+
const html = inlineHtml(props)
|
|
101
101
|
if (html !== undefined) {
|
|
102
|
-
el.innerHTML = html
|
|
102
|
+
el.innerHTML = html
|
|
103
103
|
// A script element created via createElement + appended to the document
|
|
104
104
|
// executes synchronously here, so onReady is safe to fire immediately after.
|
|
105
|
-
document.body.appendChild(el)
|
|
106
|
-
onReady?.()
|
|
105
|
+
document.body.appendChild(el)
|
|
106
|
+
onReady?.()
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
|
|
@@ -117,35 +117,35 @@ function loadScript(props: ScriptProps): void {
|
|
|
117
117
|
*/
|
|
118
118
|
function warmThenAppend(el: HTMLScriptElement, src: string, props: ScriptProps): void {
|
|
119
119
|
const append = () => {
|
|
120
|
-
if (el.isConnected) return
|
|
121
|
-
document.body.appendChild(el)
|
|
122
|
-
}
|
|
123
|
-
let warm: HTMLLinkElement
|
|
120
|
+
if (el.isConnected) return
|
|
121
|
+
document.body.appendChild(el)
|
|
122
|
+
}
|
|
123
|
+
let warm: HTMLLinkElement
|
|
124
124
|
try {
|
|
125
|
-
warm = document.createElement('link')
|
|
126
|
-
warm.rel = 'preload'
|
|
127
|
-
warm.as = 'script'
|
|
128
|
-
warm.href = src
|
|
129
|
-
if (typeof props.crossOrigin === 'string') warm.crossOrigin = props.crossOrigin
|
|
130
|
-
if (typeof props.nonce === 'string') warm.nonce = props.nonce
|
|
125
|
+
warm = document.createElement('link')
|
|
126
|
+
warm.rel = 'preload'
|
|
127
|
+
warm.as = 'script'
|
|
128
|
+
warm.href = src
|
|
129
|
+
if (typeof props.crossOrigin === 'string') warm.crossOrigin = props.crossOrigin
|
|
130
|
+
if (typeof props.nonce === 'string') warm.nonce = props.nonce
|
|
131
131
|
} catch {
|
|
132
|
-
append()
|
|
133
|
-
return
|
|
132
|
+
append()
|
|
133
|
+
return
|
|
134
134
|
}
|
|
135
135
|
const done = () => {
|
|
136
|
-
warm.remove()
|
|
137
|
-
append()
|
|
138
|
-
}
|
|
139
|
-
warm.addEventListener('load', done, { once: true })
|
|
140
|
-
warm.addEventListener('error', done, { once: true })
|
|
141
|
-
document.head.appendChild(warm)
|
|
136
|
+
warm.remove()
|
|
137
|
+
append()
|
|
138
|
+
}
|
|
139
|
+
warm.addEventListener('load', done, { once: true })
|
|
140
|
+
warm.addEventListener('error', done, { once: true })
|
|
141
|
+
document.head.appendChild(warm)
|
|
142
142
|
// Safety net: never leave the script unappended if the link never settles
|
|
143
143
|
// (some browsers do not fire load for an already-cached preload).
|
|
144
|
-
setTimeout(append, 1500)
|
|
144
|
+
setTimeout(append, 1500)
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
export default function Script(props: ScriptProps) {
|
|
148
|
-
const strategy = props.strategy ?? 'afterInteractive'
|
|
148
|
+
const strategy = props.strategy ?? 'afterInteractive'
|
|
149
149
|
|
|
150
150
|
// Next's app-router Script preloads an EXTERNAL before/afterInteractive script while the document
|
|
151
151
|
// renders (ReactDOM.preload) and only appends the executing tag from its mount effect. Without the
|
|
@@ -154,7 +154,8 @@ export default function Script(props: ScriptProps) {
|
|
|
154
154
|
// the SSR-side half of Next's behavior; the mount effect below still owns execution and dedup.
|
|
155
155
|
// lazyOnload is deliberately excluded - Next does not preload something fetched minutes later either.
|
|
156
156
|
if (
|
|
157
|
-
|
|
157
|
+
!process.browser &&
|
|
158
|
+
typeof window === 'undefined' &&
|
|
158
159
|
props.src &&
|
|
159
160
|
(strategy === 'afterInteractive' || strategy === 'beforeInteractive')
|
|
160
161
|
) {
|
|
@@ -170,46 +171,51 @@ export default function Script(props: ScriptProps) {
|
|
|
170
171
|
},
|
|
171
172
|
}
|
|
172
173
|
: {}),
|
|
173
|
-
})
|
|
174
|
+
})
|
|
174
175
|
}
|
|
175
176
|
|
|
176
177
|
useEffect(() => {
|
|
177
|
-
if (strategy === 'worker') return
|
|
178
|
+
if (strategy === 'worker') return
|
|
178
179
|
|
|
179
180
|
if (strategy === 'lazyOnload') {
|
|
180
|
-
let cancelled = false
|
|
181
|
+
let cancelled = false
|
|
181
182
|
const run = () => {
|
|
182
|
-
if (!cancelled) loadScript(props)
|
|
183
|
-
}
|
|
183
|
+
if (!cancelled) loadScript(props)
|
|
184
|
+
}
|
|
184
185
|
if (typeof requestIdleCallback === 'function') {
|
|
185
|
-
const handle = requestIdleCallback(run)
|
|
186
|
+
const handle = requestIdleCallback(run)
|
|
186
187
|
return () => {
|
|
187
|
-
cancelled = true
|
|
188
|
-
if (typeof cancelIdleCallback === 'function') cancelIdleCallback(handle)
|
|
189
|
-
}
|
|
188
|
+
cancelled = true
|
|
189
|
+
if (typeof cancelIdleCallback === 'function') cancelIdleCallback(handle)
|
|
190
|
+
}
|
|
190
191
|
}
|
|
191
|
-
const timer = setTimeout(run, 1)
|
|
192
|
+
const timer = setTimeout(run, 1)
|
|
192
193
|
return () => {
|
|
193
|
-
cancelled = true
|
|
194
|
-
clearTimeout(timer)
|
|
195
|
-
}
|
|
194
|
+
cancelled = true
|
|
195
|
+
clearTimeout(timer)
|
|
196
|
+
}
|
|
196
197
|
}
|
|
197
198
|
|
|
198
199
|
// afterInteractive + beforeInteractive: load as soon as the island mounts.
|
|
199
|
-
loadScript(props)
|
|
200
|
-
return undefined
|
|
201
|
-
}, [strategy, props.src, props.id])
|
|
200
|
+
loadScript(props)
|
|
201
|
+
return undefined
|
|
202
|
+
}, [strategy, props.src, props.id])
|
|
202
203
|
|
|
203
204
|
if (strategy === 'worker') {
|
|
204
|
-
const {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
205
|
+
const {
|
|
206
|
+
onLoad: _onLoad,
|
|
207
|
+
onReady: _onReady,
|
|
208
|
+
onError: _onError,
|
|
209
|
+
children,
|
|
210
|
+
strategy: _s,
|
|
211
|
+
...rest
|
|
212
|
+
} = props
|
|
213
|
+
const html = typeof children === 'string' ? children : inlineHtml(props)
|
|
214
|
+
const inline = html !== undefined ? { dangerouslySetInnerHTML: { __html: html } } : {}
|
|
215
|
+
return <script {...rest} type="text/partytown" data-nscript="worker" {...inline} />
|
|
210
216
|
}
|
|
211
217
|
|
|
212
|
-
return null
|
|
218
|
+
return null
|
|
213
219
|
}
|
|
214
220
|
|
|
215
|
-
export { Script }
|
|
221
|
+
export { Script }
|
|
@@ -7,25 +7,25 @@
|
|
|
7
7
|
// client-side they degrade to inert stubs, since the real dynamic-marking happens during SSR and
|
|
8
8
|
// control-flow like redirect/notFound is driven by the client error runtime after hydration.
|
|
9
9
|
|
|
10
|
-
export { NextRequest, NextResponse } from '../../api/server'
|
|
11
|
-
export type { NextRequestGeo } from '../../api/server'
|
|
12
|
-
export type { NextFetchEvent } from '../../types'
|
|
13
|
-
export type { ProxyConfig } from '../../proxy'
|
|
14
|
-
export { URLPattern, userAgent, userAgentFromString } from './user-agent'
|
|
15
|
-
export type { UserAgent } from './user-agent'
|
|
10
|
+
export { NextRequest, NextResponse } from '../../api/server'
|
|
11
|
+
export type { NextRequestGeo } from '../../api/server'
|
|
12
|
+
export type { NextFetchEvent } from '../../types'
|
|
13
|
+
export type { ProxyConfig } from '../../routing/proxy'
|
|
14
|
+
export { URLPattern, userAgent, userAgentFromString } from './user-agent'
|
|
15
|
+
export type { UserAgent } from './user-agent'
|
|
16
16
|
|
|
17
17
|
/** Browser-safe placeholder; OG rendering only runs on the server. */
|
|
18
18
|
export class ImageResponse extends Response {
|
|
19
19
|
constructor(_element: unknown, options: ResponseInit = {}) {
|
|
20
|
-
super(null, options)
|
|
20
|
+
super(null, options)
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
type AfterTask<T> = Promise<T> | (() => T | Promise<T>)
|
|
24
|
+
type AfterTask<T> = Promise<T> | (() => T | Promise<T>)
|
|
25
25
|
|
|
26
26
|
/** Client stub: dynamic marking is a server concern; resolve immediately. */
|
|
27
27
|
export function connection(): Promise<Record<never, never>> {
|
|
28
|
-
return Promise.resolve({})
|
|
28
|
+
return Promise.resolve({})
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
/** Client stub: `after()` callbacks only run server-side; no-op in the browser. */
|
|
@@ -35,5 +35,5 @@ export function after<T>(_task: AfterTask<T>): void {
|
|
|
35
35
|
|
|
36
36
|
/** Client stub: IO postpone only fires during a server prerender. */
|
|
37
37
|
export function io(): Promise<void> {
|
|
38
|
-
return Promise.resolve()
|
|
38
|
+
return Promise.resolve()
|
|
39
39
|
}
|