@wular/pnext 0.0.4 → 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 -1992
- 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 -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 +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} +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 +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 +827 -815
- 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
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
// same placement SWC's usage mode picks, so the polyfill runs ahead of that module and ships in its
|
|
7
7
|
// chunk. Gated on swcEnvOptions being configured, so a pure app pays nothing.
|
|
8
8
|
|
|
9
|
-
import { createHash } from 'node:crypto'
|
|
10
|
-
import { createRequire } from 'node:module'
|
|
11
|
-
import path from 'node:path'
|
|
12
|
-
import type { ResolvedConfig } from '../../config'
|
|
9
|
+
import { createHash } from 'node:crypto'
|
|
10
|
+
import { createRequire } from 'node:module'
|
|
11
|
+
import path from 'node:path'
|
|
12
|
+
import type { ResolvedConfig } from '../../config'
|
|
13
13
|
|
|
14
14
|
// No-module polyfills chunk (COMPAT - Next parity).
|
|
15
15
|
//
|
|
@@ -19,41 +19,41 @@ import type { ResolvedConfig } from '../../config';
|
|
|
19
19
|
// carries the same `noModule` script tag Next emits, which some suites assert on.
|
|
20
20
|
|
|
21
21
|
/** Inert body for the no-module polyfills chunk (never runs in module browsers). */
|
|
22
|
-
export const POLYFILLS_NOMODULE_SOURCE = '!function(){"use strict"}();\n'
|
|
22
|
+
export const POLYFILLS_NOMODULE_SOURCE = '!function(){"use strict"}();\n'
|
|
23
23
|
|
|
24
|
-
let cachedPolyfillsFileName: string | undefined
|
|
24
|
+
let cachedPolyfillsFileName: string | undefined
|
|
25
25
|
|
|
26
26
|
/** Content-hashed filename for the emitted no-module polyfills chunk. */
|
|
27
27
|
export function polyfillsChunkFileName(): string {
|
|
28
|
-
if (cachedPolyfillsFileName) return cachedPolyfillsFileName
|
|
29
|
-
const hash = createHash('sha256').update(POLYFILLS_NOMODULE_SOURCE).digest('hex').slice(0, 16)
|
|
30
|
-
return (cachedPolyfillsFileName = `polyfills-${hash}.js`)
|
|
28
|
+
if (cachedPolyfillsFileName) return cachedPolyfillsFileName
|
|
29
|
+
const hash = createHash('sha256').update(POLYFILLS_NOMODULE_SOURCE).digest('hex').slice(0, 16)
|
|
30
|
+
return (cachedPolyfillsFileName = `polyfills-${hash}.js`)
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/** App-absolute served path of the polyfills chunk (before assetPrefix). */
|
|
34
34
|
export function polyfillsChunkPath(): string {
|
|
35
|
-
return `/_next/static/chunks/${polyfillsChunkFileName()}
|
|
35
|
+
return `/_next/static/chunks/${polyfillsChunkFileName()}`
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
// The core-js module SWC's usage mode emits per feature, keyed by the syntax
|
|
39
39
|
// that pulls it in. Extend as more features are needed.
|
|
40
40
|
const POLYFILL_FEATURES: { usage: RegExp; module: string }[] = [
|
|
41
41
|
{ usage: /\.replaceAll\s*\(/, module: 'core-js/modules/es.string.replace-all.js' },
|
|
42
|
-
]
|
|
42
|
+
]
|
|
43
43
|
|
|
44
44
|
/** Sniff tokens for the client transform below (one per feature usage). */
|
|
45
|
-
export const POLYFILL_USAGE_TOKENS = POLYFILL_FEATURES.map(feature => feature.usage)
|
|
45
|
+
export const POLYFILL_USAGE_TOKENS = POLYFILL_FEATURES.map(feature => feature.usage)
|
|
46
46
|
|
|
47
47
|
// core-js resolves from the app, not from pnext. One require per root, reused
|
|
48
48
|
// across the transform's per-module calls.
|
|
49
|
-
const polyfillRequires = new Map<string, NodeJS.Require>()
|
|
49
|
+
const polyfillRequires = new Map<string, NodeJS.Require>()
|
|
50
50
|
|
|
51
51
|
function polyfillRequire(config: ResolvedConfig) {
|
|
52
|
-
const existing = polyfillRequires.get(config.root)
|
|
53
|
-
if (existing) return existing
|
|
54
|
-
const created = createRequire(path.join(config.root, 'pnext-polyfill-resolve.cjs'))
|
|
55
|
-
polyfillRequires.set(config.root, created)
|
|
56
|
-
return created
|
|
52
|
+
const existing = polyfillRequires.get(config.root)
|
|
53
|
+
if (existing) return existing
|
|
54
|
+
const created = createRequire(path.join(config.root, 'pnext-polyfill-resolve.cjs'))
|
|
55
|
+
polyfillRequires.set(config.root, created)
|
|
56
|
+
return created
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
/**
|
|
@@ -70,19 +70,19 @@ export function rewriteUsagePolyfillImports(
|
|
|
70
70
|
file: string,
|
|
71
71
|
config: ResolvedConfig,
|
|
72
72
|
): string {
|
|
73
|
-
const inApp = file.startsWith(`${config.root}${path.sep}`)
|
|
74
|
-
if (!inApp || file.includes(`${path.sep}node_modules${path.sep}`)) return source
|
|
75
|
-
const require = polyfillRequire(config)
|
|
73
|
+
const inApp = file.startsWith(`${config.root}${path.sep}`)
|
|
74
|
+
if (!inApp || file.includes(`${path.sep}node_modules${path.sep}`)) return source
|
|
75
|
+
const require = polyfillRequire(config)
|
|
76
76
|
const imports = POLYFILL_FEATURES.flatMap(feature => {
|
|
77
|
-
if (!feature.usage.test(source)) return []
|
|
77
|
+
if (!feature.usage.test(source)) return []
|
|
78
78
|
try {
|
|
79
|
-
return [`import ${JSON.stringify(require.resolve(feature.module))};`]
|
|
79
|
+
return [`import ${JSON.stringify(require.resolve(feature.module))};`]
|
|
80
80
|
} catch {
|
|
81
|
-
return []
|
|
81
|
+
return []
|
|
82
82
|
}
|
|
83
|
-
})
|
|
84
|
-
if (imports.length === 0) return source
|
|
83
|
+
})
|
|
84
|
+
if (imports.length === 0) return source
|
|
85
85
|
// After the directive prologue: a `'use client'` module must keep it first.
|
|
86
|
-
const directive = /^(?:\s*['"][^'"]+['"];?\s*)*/.exec(source)?.[0] ?? ''
|
|
87
|
-
return `${directive}${imports.join('\n')}\n${source.slice(directive.length)}
|
|
86
|
+
const directive = /^(?:\s*['"][^'"]+['"];?\s*)*/.exec(source)?.[0] ?? ''
|
|
87
|
+
return `${directive}${imports.join('\n')}\n${source.slice(directive.length)}`
|
|
88
88
|
}
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
// `reactCompiler` flag reaches it through the compat-mode options seam.
|
|
5
5
|
// ---------------------------------------------------------------------------
|
|
6
6
|
|
|
7
|
-
import path from 'node:path'
|
|
8
|
-
import { rewriteFacts } from '../../resolve/scan-facts'
|
|
9
|
-
import { spliceSource } from '../../
|
|
7
|
+
import path from 'node:path'
|
|
8
|
+
import { rewriteFacts } from '../../resolve/scan-facts'
|
|
9
|
+
import { spliceSource } from '../../runtime/module-transform'
|
|
10
10
|
|
|
11
|
-
const profilerRuntimePath = path.join(import.meta.dirname, 'react-profiler.tsx')
|
|
11
|
+
const profilerRuntimePath = path.join(import.meta.dirname, 'react-profiler.tsx')
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Split `Profiler` out of a `react` named import onto pnext's own Profiler
|
|
@@ -16,46 +16,52 @@ const profilerRuntimePath = path.join(import.meta.dirname, 'react-profiler.tsx')
|
|
|
16
16
|
* matched by shape rather than by a line-anchored regex.
|
|
17
17
|
*/
|
|
18
18
|
export function rewriteReactProfilerImport(source: string, file = 'module.tsx'): string {
|
|
19
|
-
if (!source.includes('Profiler')) return source
|
|
20
|
-
const edits: { start: number; end: number; value: string }[] = []
|
|
19
|
+
if (!source.includes('Profiler')) return source
|
|
20
|
+
const edits: { start: number; end: number; value: string }[] = []
|
|
21
21
|
for (const statement of rewriteFacts(file, source).imports) {
|
|
22
|
-
if (statement.specifier !== 'react') continue
|
|
23
|
-
const profilers = statement.bindings.filter(binding => binding.imported === 'Profiler')
|
|
24
|
-
if (profilers.length === 0) continue
|
|
22
|
+
if (statement.specifier !== 'react') continue
|
|
23
|
+
const profilers = statement.bindings.filter(binding => binding.imported === 'Profiler')
|
|
24
|
+
if (profilers.length === 0) continue
|
|
25
25
|
|
|
26
|
-
const rest = statement.bindings.filter(binding => binding.imported !== 'Profiler')
|
|
27
|
-
const named = rest.filter(binding => binding.imported !== 'default' && binding.imported !== '*')
|
|
28
|
-
const other = rest.filter(binding => binding.imported === 'default' || binding.imported === '*')
|
|
29
|
-
const indent = importIndent(source, statement.start)
|
|
30
|
-
const clause = named.map(printBinding).join(', ')
|
|
31
|
-
const prefix = other
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
const rest = statement.bindings.filter(binding => binding.imported !== 'Profiler')
|
|
27
|
+
const named = rest.filter(binding => binding.imported !== 'default' && binding.imported !== '*')
|
|
28
|
+
const other = rest.filter(binding => binding.imported === 'default' || binding.imported === '*')
|
|
29
|
+
const indent = importIndent(source, statement.start)
|
|
30
|
+
const clause = named.map(printBinding).join(', ')
|
|
31
|
+
const prefix = other
|
|
32
|
+
.map(binding => (binding.imported === '*' ? `* as ${binding.local}` : binding.local))
|
|
33
|
+
.join(', ')
|
|
34
|
+
const lines: string[] = []
|
|
35
|
+
if (prefix && clause) lines.push(`${indent}import ${prefix}, { ${clause} } from 'react';`)
|
|
36
|
+
else if (prefix) lines.push(`${indent}import ${prefix} from 'react';`)
|
|
37
|
+
else if (clause) lines.push(`${indent}import { ${clause} } from 'react';`)
|
|
36
38
|
for (const profiler of profilers) {
|
|
37
39
|
lines.push(
|
|
38
40
|
`${indent}import { Profiler as ${profiler.local} } from ${JSON.stringify(profilerRuntimePath)};`,
|
|
39
|
-
)
|
|
41
|
+
)
|
|
40
42
|
}
|
|
41
|
-
edits.push({
|
|
43
|
+
edits.push({
|
|
44
|
+
start: statement.start,
|
|
45
|
+
end: statement.end,
|
|
46
|
+
value: lines.join('\n').slice(indent.length),
|
|
47
|
+
})
|
|
42
48
|
}
|
|
43
|
-
return edits.length > 0 ? spliceSource(source, edits) : source
|
|
49
|
+
return edits.length > 0 ? spliceSource(source, edits) : source
|
|
44
50
|
}
|
|
45
51
|
|
|
46
52
|
function printBinding(binding: { imported: string; local: string; type: boolean }) {
|
|
47
|
-
const name =
|
|
48
|
-
|
|
53
|
+
const name =
|
|
54
|
+
binding.imported === binding.local ? binding.local : `${binding.imported} as ${binding.local}`
|
|
55
|
+
return binding.type ? `type ${name}` : name
|
|
49
56
|
}
|
|
50
57
|
|
|
51
58
|
/** Leading whitespace of the statement's own line (the splice keeps the first one). */
|
|
52
59
|
function importIndent(source: string, start: number) {
|
|
53
|
-
const lineStart = source.lastIndexOf('\n', start - 1) + 1
|
|
54
|
-
const indent = source.slice(lineStart, start)
|
|
55
|
-
return /^[ \t]*$/.test(indent) ? indent : ''
|
|
60
|
+
const lineStart = source.lastIndexOf('\n', start - 1) + 1
|
|
61
|
+
const indent = source.slice(lineStart, start)
|
|
62
|
+
return /^[ \t]*$/.test(indent) ? indent : ''
|
|
56
63
|
}
|
|
57
64
|
|
|
58
65
|
export function rewriteReactProfilerServerSource(source: string, file?: string): string {
|
|
59
|
-
return rewriteReactProfilerImport(source, file)
|
|
66
|
+
return rewriteReactProfilerImport(source, file)
|
|
60
67
|
}
|
|
61
|
-
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Fragment, type ComponentChildren } from 'preact'
|
|
2
|
-
import { useLayoutEffect, useRef } from 'preact/hooks'
|
|
1
|
+
import { Fragment, type ComponentChildren } from 'preact'
|
|
2
|
+
import { useLayoutEffect, useRef } from 'preact/hooks'
|
|
3
3
|
|
|
4
4
|
export interface ProfilerProps {
|
|
5
|
-
id: string
|
|
6
|
-
children?: ComponentChildren
|
|
5
|
+
id: string
|
|
6
|
+
children?: ComponentChildren
|
|
7
7
|
onRender?: (
|
|
8
8
|
id: string,
|
|
9
9
|
phase: 'mount' | 'update',
|
|
@@ -11,15 +11,15 @@ export interface ProfilerProps {
|
|
|
11
11
|
baseDuration: number,
|
|
12
12
|
startTime: number,
|
|
13
13
|
commitTime: number,
|
|
14
|
-
) => void
|
|
14
|
+
) => void
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export function Profiler({ id, children, onRender }: ProfilerProps) {
|
|
18
|
-
const phase = useRef<'mount' | 'update'>('mount')
|
|
18
|
+
const phase = useRef<'mount' | 'update'>('mount')
|
|
19
19
|
useLayoutEffect(() => {
|
|
20
|
-
const now = typeof performance === 'undefined' ? 0 : performance.now()
|
|
21
|
-
onRender?.(id, phase.current, 0, 0, now, now)
|
|
22
|
-
phase.current = 'update'
|
|
23
|
-
})
|
|
24
|
-
return <Fragment>{children}</Fragment
|
|
20
|
+
const now = typeof performance === 'undefined' ? 0 : performance.now()
|
|
21
|
+
onRender?.(id, phase.current, 0, 0, now, now)
|
|
22
|
+
phase.current = 'update'
|
|
23
|
+
})
|
|
24
|
+
return <Fragment>{children}</Fragment>
|
|
25
25
|
}
|
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
// Everything is resolved relative to `process.cwd()`, matching the SWC transform's root. That is what
|
|
15
15
|
// makes the multi-project fixture work: each sub-project is built with its own cwd.
|
|
16
16
|
|
|
17
|
-
import { existsSync } from 'node:fs'
|
|
18
|
-
import path from 'node:path'
|
|
19
|
-
import { withSniff, type ServerSourceTransform } from '../../extensions'
|
|
20
|
-
import type { RelayCompilerConfig } from './config'
|
|
17
|
+
import { existsSync } from 'node:fs'
|
|
18
|
+
import path from 'node:path'
|
|
19
|
+
import { withSniff, type ServerSourceTransform } from '../../extensions'
|
|
20
|
+
import type { RelayCompilerConfig } from './config'
|
|
21
21
|
|
|
22
22
|
/** The artifact extension relay-compiler emits for each `language` setting. */
|
|
23
23
|
function artifactExtensions(language: RelayCompilerConfig['language']): string[] {
|
|
@@ -25,92 +25,93 @@ function artifactExtensions(language: RelayCompilerConfig['language']): string[]
|
|
|
25
25
|
// project can point `artifactDirectory` at output generated with a different
|
|
26
26
|
// `language` than next.config declares (the multi-project fixture reads its
|
|
27
27
|
// `language` from a sibling project's relay config).
|
|
28
|
-
return language === 'typescript' ? ['.ts', '.js'] : ['.js', '.ts']
|
|
28
|
+
return language === 'typescript' ? ['.ts', '.js'] : ['.js', '.ts']
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
/** `graphql`-tagged templates. GraphQL has no backticks, so a lazy scan is exact. */
|
|
32
32
|
function relayTagPattern(): RegExp {
|
|
33
|
-
return /(?<![\w$.])graphql\s*`([\s\S]*?)`/g
|
|
33
|
+
return /(?<![\w$.])graphql\s*`([\s\S]*?)`/g
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
const OPERATION_NAME = /\b(?:query|mutation|subscription|fragment)\s+([A-Za-z_][\w]*)
|
|
36
|
+
const OPERATION_NAME = /\b(?:query|mutation|subscription|fragment)\s+([A-Za-z_][\w]*)/
|
|
37
37
|
|
|
38
38
|
function isUnder(dir: string, file: string): boolean {
|
|
39
|
-
const relative = path.relative(dir, file)
|
|
40
|
-
return relative !== '' && !relative.startsWith('..') && !path.isAbsolute(relative)
|
|
39
|
+
const relative = path.relative(dir, file)
|
|
40
|
+
return relative !== '' && !relative.startsWith('..') && !path.isAbsolute(relative)
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
// Insert hoisted imports after any leading directive prologue ('use client' /
|
|
44
44
|
// 'use server' / 'use strict') and optional shebang, so a client module's
|
|
45
45
|
// `'use client'` stays the first statement.
|
|
46
46
|
function injectAfterDirectives(source: string, injection: string): string {
|
|
47
|
-
const prologue =
|
|
48
|
-
source
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return `${source.slice(0, index)}${injection}\n${source.slice(index)}`;
|
|
47
|
+
const prologue =
|
|
48
|
+
/^(\uFEFF?(?:#![^\n]*\n)?(?:[ \t]*(['"])use [\w-]+\2[ \t]*;?[ \t]*(?:\r?\n|$))*)/.exec(source)
|
|
49
|
+
const index = prologue ? prologue[0].length : 0
|
|
50
|
+
return `${source.slice(0, index)}${injection}\n${source.slice(index)}`
|
|
52
51
|
}
|
|
53
52
|
|
|
54
53
|
/**
|
|
55
54
|
* Build a source transform applying `compiler.relay`. Returns a no-op transform
|
|
56
55
|
* when nothing is configured so pure-core apps pay nothing.
|
|
57
56
|
*/
|
|
58
|
-
export function createRelayTransform(
|
|
59
|
-
|
|
57
|
+
export function createRelayTransform(
|
|
58
|
+
relay: RelayCompilerConfig | undefined,
|
|
59
|
+
): ServerSourceTransform {
|
|
60
|
+
if (!relay) return withSniff([], source => source)
|
|
60
61
|
|
|
61
|
-
const cwd = path.resolve(process.cwd())
|
|
62
|
-
const srcDir = path.resolve(cwd, relay.src)
|
|
62
|
+
const cwd = path.resolve(process.cwd())
|
|
63
|
+
const srcDir = path.resolve(cwd, relay.src)
|
|
63
64
|
const artifactDir = relay.artifactDirectory
|
|
64
65
|
? path.resolve(cwd, relay.artifactDirectory)
|
|
65
|
-
: undefined
|
|
66
|
-
const extensions = artifactExtensions(relay.language)
|
|
67
|
-
const resolved = new Map<string, string | undefined>()
|
|
66
|
+
: undefined
|
|
67
|
+
const extensions = artifactExtensions(relay.language)
|
|
68
|
+
const resolved = new Map<string, string | undefined>()
|
|
68
69
|
|
|
69
70
|
/** The on-disk artifact for one operation name, or undefined when absent. */
|
|
70
71
|
function artifactFor(fileDir: string, name: string): string | undefined {
|
|
71
72
|
// Without `artifactDirectory`, relay-compiler writes `__generated__` next
|
|
72
73
|
// to the source file.
|
|
73
|
-
const directory = artifactDir ?? path.join(fileDir, '__generated__')
|
|
74
|
-
const key = `${directory}\0${name}
|
|
75
|
-
if (resolved.has(key)) return resolved.get(key)
|
|
76
|
-
let found: string | undefined
|
|
74
|
+
const directory = artifactDir ?? path.join(fileDir, '__generated__')
|
|
75
|
+
const key = `${directory}\0${name}`
|
|
76
|
+
if (resolved.has(key)) return resolved.get(key)
|
|
77
|
+
let found: string | undefined
|
|
77
78
|
for (const extension of extensions) {
|
|
78
|
-
const candidate = path.join(directory, `${name}.graphql${extension}`)
|
|
79
|
+
const candidate = path.join(directory, `${name}.graphql${extension}`)
|
|
79
80
|
if (existsSync(candidate)) {
|
|
80
|
-
found = candidate
|
|
81
|
-
break
|
|
81
|
+
found = candidate
|
|
82
|
+
break
|
|
82
83
|
}
|
|
83
84
|
}
|
|
84
|
-
resolved.set(key, found)
|
|
85
|
-
return found
|
|
85
|
+
resolved.set(key, found)
|
|
86
|
+
return found
|
|
86
87
|
}
|
|
87
88
|
|
|
88
89
|
return withSniff(['graphql'], (source, file) => {
|
|
89
|
-
if (!source.includes('graphql`') && !/graphql\s*`/.test(source)) return source
|
|
90
|
-
const absolute = path.resolve(file)
|
|
90
|
+
if (!source.includes('graphql`') && !/graphql\s*`/.test(source)) return source
|
|
91
|
+
const absolute = path.resolve(file)
|
|
91
92
|
// Next scopes the transform to `src`. Files outside the build cwd entirely
|
|
92
93
|
// (materialized copies) are not covered by that check, so only skip a file
|
|
93
94
|
// that lives under the cwd but outside the configured source root.
|
|
94
|
-
if (isUnder(cwd, absolute) && !isUnder(srcDir, absolute)) return source
|
|
95
|
+
if (isUnder(cwd, absolute) && !isUnder(srcDir, absolute)) return source
|
|
95
96
|
|
|
96
|
-
const bindings = new Map<string, string>()
|
|
97
|
+
const bindings = new Map<string, string>()
|
|
97
98
|
const replaced = source.replace(relayTagPattern(), (match, body: string) => {
|
|
98
|
-
const name = OPERATION_NAME.exec(body)?.[1]
|
|
99
|
-
if (!name) return match
|
|
100
|
-
const artifact = artifactFor(path.dirname(absolute), name)
|
|
101
|
-
if (!artifact) return match
|
|
102
|
-
let binding = bindings.get(artifact)
|
|
99
|
+
const name = OPERATION_NAME.exec(body)?.[1]
|
|
100
|
+
if (!name) return match
|
|
101
|
+
const artifact = artifactFor(path.dirname(absolute), name)
|
|
102
|
+
if (!artifact) return match
|
|
103
|
+
let binding = bindings.get(artifact)
|
|
103
104
|
if (!binding) {
|
|
104
|
-
binding = `__pnext_relay_${bindings.size}
|
|
105
|
-
bindings.set(artifact, binding)
|
|
105
|
+
binding = `__pnext_relay_${bindings.size}`
|
|
106
|
+
bindings.set(artifact, binding)
|
|
106
107
|
}
|
|
107
|
-
return binding
|
|
108
|
-
})
|
|
109
|
-
if (bindings.size === 0) return source
|
|
108
|
+
return binding
|
|
109
|
+
})
|
|
110
|
+
if (bindings.size === 0) return source
|
|
110
111
|
|
|
111
112
|
const imports = [...bindings]
|
|
112
113
|
.map(([artifact, binding]) => `import * as ${binding} from ${JSON.stringify(artifact)};`)
|
|
113
|
-
.join('\n')
|
|
114
|
-
return injectAfterDirectives(replaced, imports)
|
|
115
|
-
})
|
|
114
|
+
.join('\n')
|
|
115
|
+
return injectAfterDirectives(replaced, imports)
|
|
116
|
+
})
|
|
116
117
|
}
|