@wular/pnext 0.0.3 → 0.0.6
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 +11 -11
- package/bin/pnext +1 -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 +1 -1
- package/reference/config.md +2 -2
- package/reference/css.md +13 -9
- package/reference/dev.md +1 -1
- package/reference/metadata.md +7 -7
- package/reference/navigation.md +35 -28
- package/reference/performance.md +70 -70
- package/reference/rendering.md +17 -17
- package/reference/routing.md +17 -17
- package/reference/typegen.md +12 -8
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +113 -109
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +49 -52
- 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 +71 -63
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +88 -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 +794 -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 +17 -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 +1988 -1961
- package/src/{api → client}/router/types.ts +93 -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 -1887
- 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 +69 -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 +2076 -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} +152 -143
- package/src/resolve/engine.ts +90 -77
- package/src/resolve/imports.ts +475 -463
- package/src/resolve/scan-facts.ts +442 -186
- 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 +69 -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 +833 -848
- package/src/routing/slots.ts +164 -160
- package/src/runtime/loader.ts +952 -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 +425 -404
- package/src/styles.d.ts +9 -0
- package/src/types.ts +320 -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/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,20 +1,20 @@
|
|
|
1
|
-
import type { JSX } from 'preact'
|
|
2
|
-
import { escapeHtml } from '../../utils/html'
|
|
3
|
-
import { getNextConfig } from './config-loader'
|
|
4
|
-
import { registerResourceHint } from '../../render/resource-hints'
|
|
1
|
+
import type { JSX } from 'preact'
|
|
2
|
+
import { escapeHtml } from '../../utils/html'
|
|
3
|
+
import { getNextConfig } from './config-loader'
|
|
4
|
+
import { registerResourceHint } from '../../render/resource-hints'
|
|
5
5
|
|
|
6
|
-
export type ScriptStrategy = 'beforeInteractive' | 'afterInteractive' | 'lazyOnload' | 'worker'
|
|
6
|
+
export type ScriptStrategy = 'beforeInteractive' | 'afterInteractive' | 'lazyOnload' | 'worker'
|
|
7
7
|
|
|
8
8
|
export type ScriptProps = Omit<JSX.ScriptHTMLAttributes<HTMLScriptElement>, 'src'> & {
|
|
9
|
-
src?: string
|
|
10
|
-
strategy?: ScriptStrategy
|
|
11
|
-
onLoad?: (event: Event) => void
|
|
12
|
-
onReady?: () => void
|
|
13
|
-
onError?: (event: Event) => void
|
|
14
|
-
children?: string
|
|
9
|
+
src?: string
|
|
10
|
+
strategy?: ScriptStrategy
|
|
11
|
+
onLoad?: (event: Event) => void
|
|
12
|
+
onReady?: () => void
|
|
13
|
+
onError?: (event: Event) => void
|
|
14
|
+
children?: string
|
|
15
15
|
/** Stylesheets the script depends on; Next preloads these alongside the script itself. */
|
|
16
|
-
stylesheets?: string[]
|
|
17
|
-
}
|
|
16
|
+
stylesheets?: string[]
|
|
17
|
+
}
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* Server-renderable approximation of next/script. onLoad/onReady/onError are unserializable across a
|
|
@@ -29,22 +29,22 @@ export default function Script({
|
|
|
29
29
|
stylesheets,
|
|
30
30
|
...scriptProps
|
|
31
31
|
}: ScriptProps) {
|
|
32
|
-
const src = typeof scriptProps.src === 'string' ? scriptProps.src : undefined
|
|
32
|
+
const src = typeof scriptProps.src === 'string' ? scriptProps.src : undefined
|
|
33
33
|
|
|
34
34
|
// Dedup on Next's cache key (`id ?? src`): two `<Script id="x">` must be serialized to the document
|
|
35
35
|
// exactly once. The executed-set is scoped to the current render (tied to the per-request
|
|
36
36
|
// resource-hints buffer) so it never leaks across requests.
|
|
37
|
-
const dedupKey = (typeof scriptProps.id === 'string' && scriptProps.id) || src
|
|
37
|
+
const dedupKey = (typeof scriptProps.id === 'string' && scriptProps.id) || src
|
|
38
38
|
if (dedupKey) {
|
|
39
|
-
const keys = executedScriptKeys()
|
|
40
|
-
if (keys.has(dedupKey)) return null
|
|
41
|
-
keys.add(dedupKey)
|
|
39
|
+
const keys = executedScriptKeys()
|
|
40
|
+
if (keys.has(dedupKey)) return null
|
|
41
|
+
keys.add(dedupKey)
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
// A manually-passed `nonce` prop always wins, matching Next. The CSP-detected case has no per-Script
|
|
45
45
|
// signal to read here - it is stamped uniformly, after the whole document is assembled, by the
|
|
46
46
|
// renderer's stampDocumentNonce - so only the explicit override needs threading through this module.
|
|
47
|
-
const manualNonce = typeof scriptProps.nonce === 'string' ? scriptProps.nonce : undefined
|
|
47
|
+
const manualNonce = typeof scriptProps.nonce === 'string' ? scriptProps.nonce : undefined
|
|
48
48
|
|
|
49
49
|
// lazyOnload scripts load well after hydration on a browser idle callback;
|
|
50
50
|
// Next doesn't preload them (a preload hint for something fetched minutes
|
|
@@ -58,12 +58,12 @@ export default function Script({
|
|
|
58
58
|
...(typeof scriptProps.crossOrigin === 'string'
|
|
59
59
|
? { crossOrigin: scriptProps.crossOrigin }
|
|
60
60
|
: {}),
|
|
61
|
-
})
|
|
61
|
+
})
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
if (stylesheets) {
|
|
65
65
|
for (const url of stylesheets) {
|
|
66
|
-
registerResourceHint({ rel: 'stylesheet', url })
|
|
66
|
+
registerResourceHint({ rel: 'stylesheet', url })
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -76,8 +76,8 @@ export default function Script({
|
|
|
76
76
|
headScripts().push({
|
|
77
77
|
props: { 'data-nscript': 'beforeInteractive', ...scriptProps },
|
|
78
78
|
content: inlineScriptContent(scriptProps, children),
|
|
79
|
-
})
|
|
80
|
-
return null
|
|
79
|
+
})
|
|
80
|
+
return null
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
if (strategy === 'worker' && nextScriptWorkersEnabled()) {
|
|
@@ -88,10 +88,10 @@ export default function Script({
|
|
|
88
88
|
...scriptProps,
|
|
89
89
|
type: 'text/partytown',
|
|
90
90
|
'data-nscript': 'worker',
|
|
91
|
-
}
|
|
91
|
+
}
|
|
92
92
|
const workerInline =
|
|
93
|
-
typeof children === 'string' ? { dangerouslySetInnerHTML: { __html: children } } : {}
|
|
94
|
-
return <script {...partytownProps} {...workerInline}
|
|
93
|
+
typeof children === 'string' ? { dangerouslySetInnerHTML: { __html: children } } : {}
|
|
94
|
+
return <script {...partytownProps} {...workerInline} />
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
// afterInteractive / lazyOnload: Next never SSRs the actual tag for these - only the preload hint
|
|
@@ -100,33 +100,33 @@ export default function Script({
|
|
|
100
100
|
// racing them. A bare `<Script>` usage inside a Server Component tree hydrates nothing here, so SSRing
|
|
101
101
|
// the tag inline would execute it immediately during HTML parse. Queue a descriptor instead; the
|
|
102
102
|
// renderer flushes one shared bootstrap that creates and appends the real elements at the right time.
|
|
103
|
-
const deferredContent = inlineScriptContent(scriptProps, children)
|
|
103
|
+
const deferredContent = inlineScriptContent(scriptProps, children)
|
|
104
104
|
deferredScripts().push({
|
|
105
105
|
strategy: strategy === 'lazyOnload' ? 'lazyOnload' : 'afterInteractive',
|
|
106
106
|
attrs: deferredAttrs({ ...scriptProps, ...(manualNonce ? { nonce: manualNonce } : {}) }),
|
|
107
107
|
...(typeof scriptProps.id === 'string' ? { id: scriptProps.id } : {}),
|
|
108
108
|
...(src ? { src } : {}),
|
|
109
109
|
...(deferredContent !== undefined ? { content: deferredContent } : {}),
|
|
110
|
-
})
|
|
111
|
-
return null
|
|
110
|
+
})
|
|
111
|
+
return null
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
-
export { Script }
|
|
114
|
+
export { Script }
|
|
115
115
|
|
|
116
116
|
/**
|
|
117
117
|
* `experimental.nextScriptWorkers` gate. When on, `strategy="worker"` scripts
|
|
118
118
|
* are rewritten to Partytown (`type="text/partytown"`).
|
|
119
119
|
*/
|
|
120
120
|
function nextScriptWorkersEnabled(): boolean {
|
|
121
|
-
const experimental = getNextConfig().experimental as { nextScriptWorkers?: boolean } | undefined
|
|
122
|
-
return experimental?.nextScriptWorkers === true
|
|
121
|
+
const experimental = getNextConfig().experimental as { nextScriptWorkers?: boolean } | undefined
|
|
122
|
+
return experimental?.nextScriptWorkers === true
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
/**
|
|
126
126
|
* The Partytown loader path Next serves the library from. Copied verbatim by the
|
|
127
127
|
* asset pipeline; the injected snippet points the worker sandbox here.
|
|
128
128
|
*/
|
|
129
|
-
export const PARTYTOWN_LIB_PATH = '/_next/static/~partytown/'
|
|
129
|
+
export const PARTYTOWN_LIB_PATH = '/_next/static/~partytown/'
|
|
130
130
|
|
|
131
131
|
/**
|
|
132
132
|
* Partytown config plus the inline snippet Next injects into <head> once when any `worker` script is
|
|
@@ -135,14 +135,14 @@ export const PARTYTOWN_LIB_PATH = '/_next/static/~partytown/';
|
|
|
135
135
|
*/
|
|
136
136
|
export function partytownHeadScripts(): HeadScript[] {
|
|
137
137
|
const config = getNextConfig() as {
|
|
138
|
-
experimental?: { nextScriptWorkers?: boolean }
|
|
139
|
-
partytown?: Record<string, unknown
|
|
140
|
-
}
|
|
141
|
-
if (config.experimental?.nextScriptWorkers !== true) return []
|
|
138
|
+
experimental?: { nextScriptWorkers?: boolean }
|
|
139
|
+
partytown?: Record<string, unknown>
|
|
140
|
+
}
|
|
141
|
+
if (config.experimental?.nextScriptWorkers !== true) return []
|
|
142
142
|
const partytownConfig = {
|
|
143
143
|
lib: PARTYTOWN_LIB_PATH,
|
|
144
144
|
...(config.partytown ?? {}),
|
|
145
|
-
}
|
|
145
|
+
}
|
|
146
146
|
return [
|
|
147
147
|
{
|
|
148
148
|
props: { 'data-partytown-config': '' },
|
|
@@ -152,7 +152,7 @@ export function partytownHeadScripts(): HeadScript[] {
|
|
|
152
152
|
props: { 'data-partytown': '' },
|
|
153
153
|
content: partytownSnippet(partytownConfig.lib),
|
|
154
154
|
},
|
|
155
|
-
]
|
|
155
|
+
]
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
/**
|
|
@@ -160,7 +160,7 @@ export function partytownHeadScripts(): HeadScript[] {
|
|
|
160
160
|
* the render seam. Returns '' when nextScriptWorkers is disabled - a no-op for every other app.
|
|
161
161
|
*/
|
|
162
162
|
export function renderPartytownHeadScripts(): string {
|
|
163
|
-
return partytownHeadScripts().map(renderHeadScript).join('')
|
|
163
|
+
return partytownHeadScripts().map(renderHeadScript).join('')
|
|
164
164
|
}
|
|
165
165
|
|
|
166
166
|
/**
|
|
@@ -178,7 +178,7 @@ function partytownSnippet(lib: string): string {
|
|
|
178
178
|
`f.async=!0;f.src=c.lib+'partytown.js';` +
|
|
179
179
|
`document.head.appendChild(f);` +
|
|
180
180
|
`})(window,'partytown');`
|
|
181
|
-
)
|
|
181
|
+
)
|
|
182
182
|
}
|
|
183
183
|
|
|
184
184
|
// afterInteractive/lazyOnload descriptors (§ deferred bootstrap). Consumed by
|
|
@@ -186,170 +186,170 @@ function partytownSnippet(lib: string): string {
|
|
|
186
186
|
// copy of this shape (core may not import compat) keyed off the same global —
|
|
187
187
|
// mirrors the ResourceHint/HeadScript protocol above.
|
|
188
188
|
export interface DeferredScript {
|
|
189
|
-
strategy: 'afterInteractive' | 'lazyOnload'
|
|
190
|
-
attrs: Record<string, string
|
|
191
|
-
id?: string
|
|
192
|
-
src?: string
|
|
193
|
-
content?: string
|
|
189
|
+
strategy: 'afterInteractive' | 'lazyOnload'
|
|
190
|
+
attrs: Record<string, string>
|
|
191
|
+
id?: string
|
|
192
|
+
src?: string
|
|
193
|
+
content?: string
|
|
194
194
|
}
|
|
195
195
|
|
|
196
196
|
function deferredScripts() {
|
|
197
|
-
const holder = globalThis as { __PNEXT_DEFERRED_SCRIPTS__?: DeferredScript[] }
|
|
198
|
-
holder.__PNEXT_DEFERRED_SCRIPTS__ ??= []
|
|
199
|
-
return holder.__PNEXT_DEFERRED_SCRIPTS__
|
|
197
|
+
const holder = globalThis as { __PNEXT_DEFERRED_SCRIPTS__?: DeferredScript[] }
|
|
198
|
+
holder.__PNEXT_DEFERRED_SCRIPTS__ ??= []
|
|
199
|
+
return holder.__PNEXT_DEFERRED_SCRIPTS__
|
|
200
200
|
}
|
|
201
201
|
|
|
202
202
|
export function clearDeferredScripts() {
|
|
203
|
-
(globalThis as { __PNEXT_DEFERRED_SCRIPTS__?: DeferredScript[] }).__PNEXT_DEFERRED_SCRIPTS__ = []
|
|
203
|
+
;(globalThis as { __PNEXT_DEFERRED_SCRIPTS__?: DeferredScript[] }).__PNEXT_DEFERRED_SCRIPTS__ = []
|
|
204
204
|
}
|
|
205
205
|
|
|
206
206
|
export function takeDeferredScripts() {
|
|
207
|
-
const holder = globalThis as { __PNEXT_DEFERRED_SCRIPTS__?: DeferredScript[] }
|
|
208
|
-
const scripts = holder.__PNEXT_DEFERRED_SCRIPTS__ ?? []
|
|
209
|
-
holder.__PNEXT_DEFERRED_SCRIPTS__ = []
|
|
210
|
-
return scripts
|
|
207
|
+
const holder = globalThis as { __PNEXT_DEFERRED_SCRIPTS__?: DeferredScript[] }
|
|
208
|
+
const scripts = holder.__PNEXT_DEFERRED_SCRIPTS__ ?? []
|
|
209
|
+
holder.__PNEXT_DEFERRED_SCRIPTS__ = []
|
|
210
|
+
return scripts
|
|
211
211
|
}
|
|
212
212
|
|
|
213
213
|
// Like scriptAttrs, but building a raw name -> value map (for
|
|
214
214
|
// `element.setAttribute(name, value)` client-side) instead of an
|
|
215
215
|
// HTML-escaped string — the deferred bootstrap reconstructs real elements via
|
|
216
216
|
// the DOM, never via innerHTML.
|
|
217
|
-
const DEFERRED_SKIP_PROPS = new Set(['src', 'strategy', 'dangerouslysetinnerhtml', 'id'])
|
|
217
|
+
const DEFERRED_SKIP_PROPS = new Set(['src', 'strategy', 'dangerouslysetinnerhtml', 'id'])
|
|
218
218
|
|
|
219
219
|
function deferredAttrs(props: Record<string, unknown>): Record<string, string> {
|
|
220
|
-
const attrs: Record<string, string> = {}
|
|
220
|
+
const attrs: Record<string, string> = {}
|
|
221
221
|
for (const [key, value] of Object.entries(props)) {
|
|
222
|
-
const name = attrName(key)
|
|
223
|
-
if (!isAttrName(name) || DEFERRED_SKIP_PROPS.has(name) || name.startsWith('on')) continue
|
|
224
|
-
if (value == null || value === false || typeof value === 'function') continue
|
|
222
|
+
const name = attrName(key)
|
|
223
|
+
if (!isAttrName(name) || DEFERRED_SKIP_PROPS.has(name) || name.startsWith('on')) continue
|
|
224
|
+
if (value == null || value === false || typeof value === 'function') continue
|
|
225
225
|
if (value === true) {
|
|
226
|
-
attrs[name] = ''
|
|
227
|
-
continue
|
|
226
|
+
attrs[name] = ''
|
|
227
|
+
continue
|
|
228
228
|
}
|
|
229
229
|
if (name === 'class' && Array.isArray(value)) {
|
|
230
230
|
const className = value
|
|
231
231
|
.filter(
|
|
232
232
|
(item): item is string | number => typeof item === 'string' || typeof item === 'number',
|
|
233
233
|
)
|
|
234
|
-
.join(' ')
|
|
235
|
-
if (className) attrs[name] = className
|
|
236
|
-
continue
|
|
234
|
+
.join(' ')
|
|
235
|
+
if (className) attrs[name] = className
|
|
236
|
+
continue
|
|
237
237
|
}
|
|
238
238
|
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint') {
|
|
239
|
-
attrs[name] = String(value)
|
|
239
|
+
attrs[name] = String(value)
|
|
240
240
|
}
|
|
241
241
|
}
|
|
242
|
-
return attrs
|
|
242
|
+
return attrs
|
|
243
243
|
}
|
|
244
244
|
|
|
245
245
|
export interface HeadScript {
|
|
246
|
-
props: Record<string, unknown
|
|
247
|
-
content?: string
|
|
246
|
+
props: Record<string, unknown>
|
|
247
|
+
content?: string
|
|
248
248
|
}
|
|
249
249
|
|
|
250
250
|
// The renderer replaces the resource-hints array with a fresh `[]` at the start
|
|
251
251
|
// of every render (clearResourceHints). Keying the executed-set off that array
|
|
252
252
|
// via a WeakMap gives us a dedup scope that lives exactly one render and is
|
|
253
253
|
// garbage-collected with it — no cross-request leakage.
|
|
254
|
-
const scriptDedupRegistry = new WeakMap<object, Set<string>>()
|
|
254
|
+
const scriptDedupRegistry = new WeakMap<object, Set<string>>()
|
|
255
255
|
|
|
256
256
|
function executedScriptKeys(): Set<string> {
|
|
257
|
-
const holder = globalThis as { __PNEXT_RESOURCE_HINTS__?: object }
|
|
258
|
-
holder.__PNEXT_RESOURCE_HINTS__ ??= []
|
|
259
|
-
const arr = holder.__PNEXT_RESOURCE_HINTS__
|
|
260
|
-
let keys = scriptDedupRegistry.get(arr)
|
|
257
|
+
const holder = globalThis as { __PNEXT_RESOURCE_HINTS__?: object }
|
|
258
|
+
holder.__PNEXT_RESOURCE_HINTS__ ??= []
|
|
259
|
+
const arr = holder.__PNEXT_RESOURCE_HINTS__
|
|
260
|
+
let keys = scriptDedupRegistry.get(arr)
|
|
261
261
|
if (!keys) {
|
|
262
|
-
keys = new Set<string>()
|
|
263
|
-
scriptDedupRegistry.set(arr, keys)
|
|
262
|
+
keys = new Set<string>()
|
|
263
|
+
scriptDedupRegistry.set(arr, keys)
|
|
264
264
|
}
|
|
265
|
-
return keys
|
|
265
|
+
return keys
|
|
266
266
|
}
|
|
267
267
|
|
|
268
268
|
function headScripts() {
|
|
269
|
-
const holder = globalThis as { __PNEXT_HEAD_SCRIPTS__?: HeadScript[] }
|
|
270
|
-
holder.__PNEXT_HEAD_SCRIPTS__ ??= []
|
|
271
|
-
return holder.__PNEXT_HEAD_SCRIPTS__
|
|
269
|
+
const holder = globalThis as { __PNEXT_HEAD_SCRIPTS__?: HeadScript[] }
|
|
270
|
+
holder.__PNEXT_HEAD_SCRIPTS__ ??= []
|
|
271
|
+
return holder.__PNEXT_HEAD_SCRIPTS__
|
|
272
272
|
}
|
|
273
273
|
|
|
274
274
|
export function clearHeadScripts() {
|
|
275
|
-
(globalThis as { __PNEXT_HEAD_SCRIPTS__?: HeadScript[] }).__PNEXT_HEAD_SCRIPTS__ = []
|
|
275
|
+
;(globalThis as { __PNEXT_HEAD_SCRIPTS__?: HeadScript[] }).__PNEXT_HEAD_SCRIPTS__ = []
|
|
276
276
|
}
|
|
277
277
|
|
|
278
278
|
export function takeHeadScripts() {
|
|
279
|
-
const holder = globalThis as { __PNEXT_HEAD_SCRIPTS__?: HeadScript[] }
|
|
280
|
-
const scripts = holder.__PNEXT_HEAD_SCRIPTS__ ?? []
|
|
281
|
-
holder.__PNEXT_HEAD_SCRIPTS__ = []
|
|
282
|
-
return scripts
|
|
279
|
+
const holder = globalThis as { __PNEXT_HEAD_SCRIPTS__?: HeadScript[] }
|
|
280
|
+
const scripts = holder.__PNEXT_HEAD_SCRIPTS__ ?? []
|
|
281
|
+
holder.__PNEXT_HEAD_SCRIPTS__ = []
|
|
282
|
+
return scripts
|
|
283
283
|
}
|
|
284
284
|
|
|
285
285
|
export function renderHeadScripts() {
|
|
286
|
-
return takeHeadScripts().map(renderHeadScript).join('\n ')
|
|
286
|
+
return takeHeadScripts().map(renderHeadScript).join('\n ')
|
|
287
287
|
}
|
|
288
288
|
|
|
289
289
|
function renderHeadScript(script: HeadScript) {
|
|
290
|
-
const attrs = scriptAttrs(script.props)
|
|
291
|
-
const open = attrs ? `<script ${attrs}>` : '<script>'
|
|
290
|
+
const attrs = scriptAttrs(script.props)
|
|
291
|
+
const open = attrs ? `<script ${attrs}>` : '<script>'
|
|
292
292
|
return script.content === undefined
|
|
293
293
|
? `${open}</script>`
|
|
294
|
-
: `${open}${escapeScriptText(script.content)}</script
|
|
294
|
+
: `${open}${escapeScriptText(script.content)}</script>`
|
|
295
295
|
}
|
|
296
296
|
|
|
297
297
|
function inlineScriptContent(
|
|
298
298
|
props: Record<string, unknown>,
|
|
299
299
|
children: string | undefined,
|
|
300
300
|
): string | undefined {
|
|
301
|
-
if (typeof children === 'string') return children
|
|
302
|
-
const dangerous = props.dangerouslySetInnerHTML
|
|
301
|
+
if (typeof children === 'string') return children
|
|
302
|
+
const dangerous = props.dangerouslySetInnerHTML
|
|
303
303
|
if (
|
|
304
304
|
dangerous &&
|
|
305
305
|
typeof dangerous === 'object' &&
|
|
306
306
|
typeof (dangerous as { __html?: unknown }).__html === 'string'
|
|
307
307
|
) {
|
|
308
|
-
return (dangerous as { __html: string }).__html
|
|
308
|
+
return (dangerous as { __html: string }).__html
|
|
309
309
|
}
|
|
310
|
-
return undefined
|
|
310
|
+
return undefined
|
|
311
311
|
}
|
|
312
312
|
|
|
313
313
|
function scriptAttrs(props: Record<string, unknown>) {
|
|
314
|
-
const attrs = Object.entries(props).flatMap(([key, value]) => scriptAttr(attrName(key), value))
|
|
315
|
-
return attrs.join(' ')
|
|
314
|
+
const attrs = Object.entries(props).flatMap(([key, value]) => scriptAttr(attrName(key), value))
|
|
315
|
+
return attrs.join(' ')
|
|
316
316
|
}
|
|
317
317
|
|
|
318
318
|
function scriptAttr(name: string, value: unknown): string[] {
|
|
319
|
-
if (!isAttrName(name)) return []
|
|
320
|
-
if (value == null || value === false || typeof value === 'function') return []
|
|
321
|
-
if (name === 'strategy' || name === 'dangerouslysetinnerhtml' || name.startsWith('on')) return []
|
|
322
|
-
if (value === true) return [name]
|
|
319
|
+
if (!isAttrName(name)) return []
|
|
320
|
+
if (value == null || value === false || typeof value === 'function') return []
|
|
321
|
+
if (name === 'strategy' || name === 'dangerouslysetinnerhtml' || name.startsWith('on')) return []
|
|
322
|
+
if (value === true) return [name]
|
|
323
323
|
if (name === 'class' && Array.isArray(value)) {
|
|
324
324
|
const className = value
|
|
325
325
|
.filter(
|
|
326
326
|
(item): item is string | number => typeof item === 'string' || typeof item === 'number',
|
|
327
327
|
)
|
|
328
|
-
.join(' ')
|
|
329
|
-
return className ? [`class="${escapeHtml(className)}"`] : []
|
|
328
|
+
.join(' ')
|
|
329
|
+
return className ? [`class="${escapeHtml(className)}"`] : []
|
|
330
330
|
}
|
|
331
331
|
if (typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'bigint') {
|
|
332
|
-
return []
|
|
332
|
+
return []
|
|
333
333
|
}
|
|
334
|
-
return [`${name}="${escapeHtml(value)}"`]
|
|
334
|
+
return [`${name}="${escapeHtml(value)}"`]
|
|
335
335
|
}
|
|
336
336
|
|
|
337
337
|
function attrName(key: string) {
|
|
338
|
-
if (key === 'className') return 'class'
|
|
339
|
-
if (key === 'htmlFor') return 'for'
|
|
340
|
-
return key.toLowerCase()
|
|
338
|
+
if (key === 'className') return 'class'
|
|
339
|
+
if (key === 'htmlFor') return 'for'
|
|
340
|
+
return key.toLowerCase()
|
|
341
341
|
}
|
|
342
342
|
|
|
343
343
|
function isAttrName(name: string) {
|
|
344
|
-
return /^[a-zA-Z_:][a-zA-Z0-9:._-]*$/.test(name)
|
|
344
|
+
return /^[a-zA-Z_:][a-zA-Z0-9:._-]*$/.test(name)
|
|
345
345
|
}
|
|
346
346
|
|
|
347
|
-
const scriptTerminator = /(<\/|<)(s)(cript)/gi
|
|
347
|
+
const scriptTerminator = /(<\/|<)(s)(cript)/gi
|
|
348
348
|
|
|
349
349
|
function escapeScriptText(text: string) {
|
|
350
350
|
return text.replace(
|
|
351
351
|
scriptTerminator,
|
|
352
352
|
(_, prefix: string, s: string, suffix: string) =>
|
|
353
353
|
`${prefix}${s === 's' ? '\\u0073' : '\\u0053'}${suffix}`,
|
|
354
|
-
)
|
|
354
|
+
)
|
|
355
355
|
}
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import { requireRequest, requestApiPromise } from '../../request/context'
|
|
2
|
-
import { assertRequestApiAllowedInAfter } from '../lifecycle/after-scope'
|
|
3
|
-
import { assertNoDynamicApiInsideCache } from '../cache/revalidate'
|
|
4
|
-
import { assertDynamicErrorRequestApi } from './headers'
|
|
1
|
+
import { requireRequest, requestApiPromise } from '../../request/context'
|
|
2
|
+
import { assertRequestApiAllowedInAfter } from '../lifecycle/after-scope'
|
|
3
|
+
import { assertNoDynamicApiInsideCache } from '../cache/revalidate'
|
|
4
|
+
import { assertDynamicErrorRequestApi } from './headers'
|
|
5
5
|
|
|
6
|
-
export { after } from '../lifecycle/after'
|
|
7
|
-
export { io } from '../ppr/io'
|
|
8
|
-
export { NextRequest, NextResponse } from '../../api/server'
|
|
9
|
-
export type { NextRequestGeo } from '../../api/server'
|
|
10
|
-
export type { NextFetchEvent } from '../../types'
|
|
11
|
-
export type { ProxyConfig } from '../../proxy'
|
|
12
|
-
export { ImageResponse } from './og'
|
|
6
|
+
export { after } from '../lifecycle/after'
|
|
7
|
+
export { io } from '../ppr/io'
|
|
8
|
+
export { NextRequest, NextResponse } from '../../api/server'
|
|
9
|
+
export type { NextRequestGeo } from '../../api/server'
|
|
10
|
+
export type { NextFetchEvent } from '../../types'
|
|
11
|
+
export type { ProxyConfig } from '../../routing/proxy'
|
|
12
|
+
export { ImageResponse } from './og'
|
|
13
13
|
// Pure UA/URLPattern helpers live in a client-safe module so the client
|
|
14
14
|
// `next/server` variant (client-server.ts) can share them without pulling this
|
|
15
15
|
// file's node:async_hooks imports into the browser bundle.
|
|
16
|
-
export { URLPattern, userAgent, userAgentFromString } from './user-agent'
|
|
17
|
-
export type { UserAgent } from './user-agent'
|
|
16
|
+
export { URLPattern, userAgent, userAgentFromString } from './user-agent'
|
|
17
|
+
export type { UserAgent } from './user-agent'
|
|
18
18
|
|
|
19
19
|
/** Marks the surrounding scope as dynamic, like headers()/cookies(). */
|
|
20
20
|
export function connection(): Promise<Record<never, never>> {
|
|
21
|
-
assertRequestApiAllowedInAfter('connection()')
|
|
22
|
-
assertDynamicErrorRequestApi('connection()')
|
|
23
|
-
assertNoDynamicApiInsideCache('connection()')
|
|
21
|
+
assertRequestApiAllowedInAfter('connection()')
|
|
22
|
+
assertDynamicErrorRequestApi('connection()')
|
|
23
|
+
assertNoDynamicApiInsideCache('connection()')
|
|
24
24
|
return requestApiPromise('connection()', () => {
|
|
25
|
-
requireRequest('connection()')
|
|
26
|
-
return {}
|
|
27
|
-
})
|
|
25
|
+
requireRequest('connection()')
|
|
26
|
+
return {}
|
|
27
|
+
})
|
|
28
28
|
}
|
package/src/compat/next/svgr.ts
CHANGED
|
@@ -6,34 +6,35 @@
|
|
|
6
6
|
// reference and reproduce the import-as-component semantics directly against core's `staticAssetModule`
|
|
7
7
|
// seam (see image/static-metadata.ts) instead of executing the loader.
|
|
8
8
|
|
|
9
|
-
let svgAsComponent = false
|
|
9
|
+
let svgAsComponent = false
|
|
10
10
|
|
|
11
11
|
/** Derived per config load (see config-loader's setNextConfig) — never a process one-shot. */
|
|
12
12
|
export function setSvgAsComponentEnabled(enabled: boolean): void {
|
|
13
|
-
svgAsComponent = enabled
|
|
13
|
+
svgAsComponent = enabled
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export function isSvgAsComponentEnabled(): boolean {
|
|
17
|
-
return svgAsComponent
|
|
17
|
+
return svgAsComponent
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
/** True when next.config's `webpack()` references `@svgr/webpack` (the common custom-loader use). */
|
|
21
21
|
export function webpackReferencesSvgr(config: { webpack?: unknown }): boolean {
|
|
22
|
-
return typeof config.webpack === 'function' && String(config.webpack).includes('@svgr/webpack')
|
|
22
|
+
return typeof config.webpack === 'function' && String(config.webpack).includes('@svgr/webpack')
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
const XML_PROLOGUE = /^\uFEFF?\s*(?:<\?xml[^>]*\?>\s*)?(?:<!DOCTYPE[^>]*>\s*)?/i
|
|
26
|
-
const SVG_TAG = /^<svg([^>]*)>([\s\S]*)<\/svg>\s*$/i
|
|
27
|
-
const ATTR =
|
|
25
|
+
const XML_PROLOGUE = /^\uFEFF?\s*(?:<\?xml[^>]*\?>\s*)?(?:<!DOCTYPE[^>]*>\s*)?/i
|
|
26
|
+
const SVG_TAG = /^<svg([^>]*)>([\s\S]*)<\/svg>\s*$/i
|
|
27
|
+
const ATTR =
|
|
28
|
+
/([a-zA-Z_:][-a-zA-Z0-9_:.]*)\s*=\s*"([^"]*)"|([a-zA-Z_:][-a-zA-Z0-9_:.]*)\s*=\s*'([^']*)'/g
|
|
28
29
|
|
|
29
30
|
function parseRootAttrs(raw: string): Record<string, string> {
|
|
30
|
-
const attrs: Record<string, string> = {}
|
|
31
|
+
const attrs: Record<string, string> = {}
|
|
31
32
|
for (const match of raw.matchAll(ATTR)) {
|
|
32
|
-
const name = match[1] ?? match[3]
|
|
33
|
-
const value = match[2] ?? match[4] ?? ''
|
|
34
|
-
if (name) attrs[name] = value
|
|
33
|
+
const name = match[1] ?? match[3]
|
|
34
|
+
const value = match[2] ?? match[4] ?? ''
|
|
35
|
+
if (name) attrs[name] = value
|
|
35
36
|
}
|
|
36
|
-
return attrs
|
|
37
|
+
return attrs
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
/**
|
|
@@ -43,10 +44,10 @@ function parseRootAttrs(raw: string): Record<string, string> {
|
|
|
43
44
|
* hydration sees the same markup the server rendered.
|
|
44
45
|
*/
|
|
45
46
|
export function svgComponentModule(bytes: Uint8Array): string {
|
|
46
|
-
const text = new TextDecoder().decode(bytes).replace(XML_PROLOGUE, '').trim()
|
|
47
|
-
const match = SVG_TAG.exec(text)
|
|
48
|
-
const rootAttrs = match ? parseRootAttrs(match[1] ?? '') : {}
|
|
49
|
-
const inner = match ? match[2] : text
|
|
47
|
+
const text = new TextDecoder().decode(bytes).replace(XML_PROLOGUE, '').trim()
|
|
48
|
+
const match = SVG_TAG.exec(text)
|
|
49
|
+
const rootAttrs = match ? parseRootAttrs(match[1] ?? '') : {}
|
|
50
|
+
const inner = match ? match[2] : text
|
|
50
51
|
return `import { h } from 'preact';
|
|
51
52
|
const __pnextSvgAttrs = ${JSON.stringify(rootAttrs)};
|
|
52
53
|
const __pnextSvgInner = ${JSON.stringify(inner)};
|
|
@@ -54,5 +55,5 @@ function SvgComponent(props) {
|
|
|
54
55
|
return h('svg', { ...__pnextSvgAttrs, ...props, dangerouslySetInnerHTML: { __html: __pnextSvgInner } });
|
|
55
56
|
}
|
|
56
57
|
export default SvgComponent;
|
|
57
|
-
|
|
58
|
+
`
|
|
58
59
|
}
|
|
@@ -5,33 +5,33 @@
|
|
|
5
5
|
// indentation (closing brace at column 0) is part of the contract. pnext sends nothing anywhere - this
|
|
6
6
|
// is wire-format parity only, emitted once per CLI session after next.config loads.
|
|
7
7
|
|
|
8
|
-
import type { NextConfigObject } from './config-loader'
|
|
8
|
+
import type { NextConfigObject } from './config-loader'
|
|
9
9
|
|
|
10
|
-
const EVENT_CLI_SESSION_STARTED = 'NEXT_CLI_SESSION_STARTED'
|
|
11
|
-
const EVENT_BUILD_FEATURE_USAGE = 'NEXT_BUILD_FEATURE_USAGE'
|
|
10
|
+
const EVENT_CLI_SESSION_STARTED = 'NEXT_CLI_SESSION_STARTED'
|
|
11
|
+
const EVENT_BUILD_FEATURE_USAGE = 'NEXT_BUILD_FEATURE_USAGE'
|
|
12
12
|
|
|
13
|
-
let emitted = false
|
|
14
|
-
let featureUsageEmitted = false
|
|
13
|
+
let emitted = false
|
|
14
|
+
let featureUsageEmitted = false
|
|
15
15
|
|
|
16
16
|
function configuredStaleTimes(config: NextConfigObject): { static?: number; dynamic?: number } {
|
|
17
|
-
const experimental = config.experimental
|
|
18
|
-
if (!experimental || typeof experimental !== 'object') return {}
|
|
19
|
-
const staleTimes = (experimental as { staleTimes?: unknown }).staleTimes
|
|
20
|
-
if (!staleTimes || typeof staleTimes !== 'object') return {}
|
|
21
|
-
const value = staleTimes as { static?: unknown; dynamic?: unknown }
|
|
17
|
+
const experimental = config.experimental
|
|
18
|
+
if (!experimental || typeof experimental !== 'object') return {}
|
|
19
|
+
const staleTimes = (experimental as { staleTimes?: unknown }).staleTimes
|
|
20
|
+
if (!staleTimes || typeof staleTimes !== 'object') return {}
|
|
21
|
+
const value = staleTimes as { static?: unknown; dynamic?: unknown }
|
|
22
22
|
return {
|
|
23
23
|
...(typeof value.static === 'number' ? { static: value.static } : {}),
|
|
24
24
|
...(typeof value.dynamic === 'number' ? { dynamic: value.dynamic } : {}),
|
|
25
|
-
}
|
|
25
|
+
}
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
/** Print the session-started telemetry event when NEXT_TELEMETRY_DEBUG is on. */
|
|
29
29
|
export function emitSessionStartedTelemetry(config: NextConfigObject): void {
|
|
30
|
-
if (emitted) return
|
|
30
|
+
if (emitted) return
|
|
31
31
|
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
32
|
-
if (!process.env.NEXT_TELEMETRY_DEBUG) return
|
|
33
|
-
emitted = true
|
|
34
|
-
const staleTimes = configuredStaleTimes(config)
|
|
32
|
+
if (!process.env.NEXT_TELEMETRY_DEBUG) return
|
|
33
|
+
emitted = true
|
|
34
|
+
const staleTimes = configuredStaleTimes(config)
|
|
35
35
|
const event = {
|
|
36
36
|
eventName: EVENT_CLI_SESSION_STARTED,
|
|
37
37
|
payload: {
|
|
@@ -40,8 +40,8 @@ export function emitSessionStartedTelemetry(config: NextConfigObject): void {
|
|
|
40
40
|
staticStaleTime: staleTimes.static ?? null,
|
|
41
41
|
dynamicStaleTime: staleTimes.dynamic ?? null,
|
|
42
42
|
},
|
|
43
|
-
}
|
|
44
|
-
console.log(`[telemetry] ${JSON.stringify(event, null, 2)}`)
|
|
43
|
+
}
|
|
44
|
+
console.log(`[telemetry] ${JSON.stringify(event, null, 2)}`)
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
/**
|
|
@@ -51,16 +51,16 @@ export function emitSessionStartedTelemetry(config: NextConfigObject): void {
|
|
|
51
51
|
* any extra key fails the deep match.
|
|
52
52
|
*/
|
|
53
53
|
export function emitBuildFeatureUsageTelemetry(config: NextConfigObject): void {
|
|
54
|
-
if (featureUsageEmitted) return
|
|
54
|
+
if (featureUsageEmitted) return
|
|
55
55
|
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
56
|
-
if (!process.env.NEXT_TELEMETRY_DEBUG) return
|
|
57
|
-
if ((process.argv[2] ?? '') !== 'build') return
|
|
58
|
-
featureUsageEmitted = true
|
|
59
|
-
const experimental = config.experimental
|
|
56
|
+
if (!process.env.NEXT_TELEMETRY_DEBUG) return
|
|
57
|
+
if ((process.argv[2] ?? '') !== 'build') return
|
|
58
|
+
featureUsageEmitted = true
|
|
59
|
+
const experimental = config.experimental
|
|
60
60
|
const esmExternals =
|
|
61
61
|
experimental && typeof experimental === 'object'
|
|
62
62
|
? (experimental as { esmExternals?: unknown }).esmExternals
|
|
63
|
-
: undefined
|
|
63
|
+
: undefined
|
|
64
64
|
// Next counts a feature as "used" only when it is set away from its default.
|
|
65
65
|
if (esmExternals !== undefined && esmExternals !== true) {
|
|
66
66
|
console.log(
|
|
@@ -72,6 +72,6 @@ export function emitBuildFeatureUsageTelemetry(config: NextConfigObject): void {
|
|
|
72
72
|
null,
|
|
73
73
|
2,
|
|
74
74
|
)}`,
|
|
75
|
-
)
|
|
75
|
+
)
|
|
76
76
|
}
|
|
77
77
|
}
|