@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,16 +1,16 @@
|
|
|
1
|
-
import { rewriteFacts } from '
|
|
1
|
+
import { dynamicCallFacts, rewriteFacts, type DynamicCallFact } from './scan-facts'
|
|
2
2
|
|
|
3
3
|
export interface DynamicCall {
|
|
4
|
-
index: number
|
|
5
|
-
name: string
|
|
6
|
-
open: number
|
|
7
|
-
close: number
|
|
8
|
-
source: string
|
|
4
|
+
index: number
|
|
5
|
+
name: string
|
|
6
|
+
open: number
|
|
7
|
+
close: number
|
|
8
|
+
source: string
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
/** Cheap gate: a `dynamic` binding can only come from one of these specifiers. */
|
|
12
12
|
export function sourceHasDynamicImport(source: string) {
|
|
13
|
-
return source.includes('@wular/pnext') || source.includes('next/dynamic')
|
|
13
|
+
return source.includes('@wular/pnext') || source.includes('next/dynamic')
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
/**
|
|
@@ -19,55 +19,55 @@ export function sourceHasDynamicImport(source: string) {
|
|
|
19
19
|
* scanning below stays textual.
|
|
20
20
|
*/
|
|
21
21
|
export function pnextDynamicImportNames(source: string, file = 'module.tsx') {
|
|
22
|
-
const names = new Set<string>()
|
|
23
|
-
if (!sourceHasDynamicImport(source)) return names
|
|
22
|
+
const names = new Set<string>()
|
|
23
|
+
if (!sourceHasDynamicImport(source)) return names
|
|
24
24
|
for (const statement of rewriteFacts(file, source).imports) {
|
|
25
|
-
const { specifier } = statement
|
|
26
|
-
const pnext = specifier === '@wular/pnext' || specifier === '@wular/pnext/dynamic'
|
|
25
|
+
const { specifier } = statement
|
|
26
|
+
const pnext = specifier === '@wular/pnext' || specifier === '@wular/pnext/dynamic'
|
|
27
27
|
// The compat alias rewrite may already have turned `next/dynamic` into the
|
|
28
28
|
// shim's own file path/href before this scan runs.
|
|
29
29
|
const nextDynamic =
|
|
30
|
-
specifier === 'next/dynamic' || /compat\/next\/dynamic(?:\.tsx)?$/.test(specifier)
|
|
31
|
-
if (!pnext && !nextDynamic) continue
|
|
30
|
+
specifier === 'next/dynamic' || /compat\/next\/dynamic(?:\.tsx)?$/.test(specifier)
|
|
31
|
+
if (!pnext && !nextDynamic) continue
|
|
32
32
|
for (const binding of statement.bindings) {
|
|
33
|
-
if (binding.type) continue
|
|
33
|
+
if (binding.type) continue
|
|
34
34
|
if (pnext ? binding.imported === 'dynamic' : binding.imported === 'default') {
|
|
35
|
-
names.add(binding.local)
|
|
35
|
+
names.add(binding.local)
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
return names
|
|
39
|
+
return names
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
export function dynamicCallsFromSource(source: string, dynamicNames: Set<string>) {
|
|
43
|
-
const calls: DynamicCall[] = []
|
|
44
|
-
if (dynamicNames.size === 0) return calls
|
|
43
|
+
const calls: DynamicCall[] = []
|
|
44
|
+
if (dynamicNames.size === 0) return calls
|
|
45
45
|
|
|
46
|
-
let index = 0
|
|
46
|
+
let index = 0
|
|
47
47
|
|
|
48
48
|
while ((index = nextDynamicCallIndex(source, dynamicNames, index)) !== -1) {
|
|
49
|
-
const name = dynamicNameAt(source, dynamicNames, index)
|
|
49
|
+
const name = dynamicNameAt(source, dynamicNames, index)
|
|
50
50
|
if (!name) {
|
|
51
|
-
index += 1
|
|
52
|
-
continue
|
|
51
|
+
index += 1
|
|
52
|
+
continue
|
|
53
53
|
}
|
|
54
|
-
const before = source[index - 1]
|
|
55
|
-
const after = source[index + name.length]
|
|
54
|
+
const before = source[index - 1]
|
|
55
|
+
const after = source[index + name.length]
|
|
56
56
|
if ((before && /[\w$]/.test(before)) || (after && /[\w$]/.test(after))) {
|
|
57
|
-
index += name.length
|
|
58
|
-
continue
|
|
57
|
+
index += name.length
|
|
58
|
+
continue
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
const open = source.indexOf('(', index + name.length)
|
|
61
|
+
const open = source.indexOf('(', index + name.length)
|
|
62
62
|
if (open === -1 || source.slice(index + name.length, open).trim()) {
|
|
63
|
-
index += name.length
|
|
64
|
-
continue
|
|
63
|
+
index += name.length
|
|
64
|
+
continue
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
const close = matchingParen(source, open)
|
|
67
|
+
const close = matchingParen(source, open)
|
|
68
68
|
if (close === -1) {
|
|
69
|
-
index = open + 1
|
|
70
|
-
continue
|
|
69
|
+
index = open + 1
|
|
70
|
+
continue
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
calls.push({
|
|
@@ -76,39 +76,36 @@ export function dynamicCallsFromSource(source: string, dynamicNames: Set<string>
|
|
|
76
76
|
open,
|
|
77
77
|
close,
|
|
78
78
|
source: source.slice(index, close + 1),
|
|
79
|
-
})
|
|
80
|
-
index = close + 1
|
|
79
|
+
})
|
|
80
|
+
index = close + 1
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
return calls
|
|
83
|
+
return calls
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
export function rewriteLiteralDynamicCalls(source: string, file?: string) {
|
|
87
|
-
const dynamicNames = pnextDynamicImportNames(source, file)
|
|
88
|
-
if (dynamicNames.size === 0) return source
|
|
87
|
+
const dynamicNames = pnextDynamicImportNames(source, file)
|
|
88
|
+
if (dynamicNames.size === 0) return source
|
|
89
|
+
const facts = dynamicCallFacts(source, file)
|
|
89
90
|
|
|
90
|
-
const edits: { start: number; end: number; value: string }[] = []
|
|
91
|
+
const edits: { start: number; end: number; value: string }[] = []
|
|
91
92
|
for (const call of dynamicCallsFromSource(source, dynamicNames)) {
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
if (!literal) continue;
|
|
95
|
-
const [match, leading = '', quote = "'", specifier] = literal;
|
|
96
|
-
if (!specifier) continue;
|
|
97
|
-
const start = call.open + 1 + leading.length;
|
|
93
|
+
const fact = factForCall(facts, call)
|
|
94
|
+
if (!fact?.literal) continue
|
|
98
95
|
edits.push({
|
|
99
|
-
start,
|
|
100
|
-
end:
|
|
101
|
-
value: `() => import(${
|
|
102
|
-
})
|
|
96
|
+
start: fact.specifierStart,
|
|
97
|
+
end: fact.specifierEnd,
|
|
98
|
+
value: `() => import(${source.slice(fact.specifierStart, fact.specifierEnd)})`,
|
|
99
|
+
})
|
|
103
100
|
}
|
|
104
101
|
|
|
105
|
-
if (edits.length === 0) return source
|
|
102
|
+
if (edits.length === 0) return source
|
|
106
103
|
|
|
107
|
-
let next = source
|
|
104
|
+
let next = source
|
|
108
105
|
for (const edit of edits.reverse()) {
|
|
109
|
-
next = `${next.slice(0, edit.start)}${edit.value}${next.slice(edit.end)}
|
|
106
|
+
next = `${next.slice(0, edit.start)}${edit.value}${next.slice(edit.end)}`
|
|
110
107
|
}
|
|
111
|
-
return next
|
|
108
|
+
return next
|
|
112
109
|
}
|
|
113
110
|
|
|
114
111
|
// Server compiles append the statically-resolved import target as a third
|
|
@@ -121,43 +118,55 @@ export function rewriteDynamicCallTargets(
|
|
|
121
118
|
resolve: (specifier: string) => string | undefined,
|
|
122
119
|
file?: string,
|
|
123
120
|
) {
|
|
124
|
-
const dynamicNames = pnextDynamicImportNames(source, file)
|
|
125
|
-
if (dynamicNames.size === 0) return source
|
|
121
|
+
const dynamicNames = pnextDynamicImportNames(source, file)
|
|
122
|
+
if (dynamicNames.size === 0) return source
|
|
123
|
+
const facts = dynamicCallFacts(source, file)
|
|
126
124
|
|
|
127
|
-
const edits: { at: number; value: string }[] = []
|
|
125
|
+
const edits: { at: number; value: string }[] = []
|
|
128
126
|
for (const call of dynamicCallsFromSource(source, dynamicNames)) {
|
|
129
|
-
const target =
|
|
130
|
-
if (!target
|
|
131
|
-
const file = resolve(target
|
|
132
|
-
if (!file) continue
|
|
133
|
-
|
|
134
|
-
const args = source.slice(call.open + 1, call.close)
|
|
135
|
-
const argCount = topLevelArgCount(args)
|
|
136
|
-
if (argCount < 1 || argCount > 2) continue
|
|
137
|
-
const literal = JSON.stringify({ file, exportName: target
|
|
138
|
-
const separator = /,\s*$/.test(args) ? '' : ', '
|
|
127
|
+
const target = loaderImportTargetForCall(call, facts)
|
|
128
|
+
if (!target) continue
|
|
129
|
+
const file = resolve(target.specifier)
|
|
130
|
+
if (!file) continue
|
|
131
|
+
|
|
132
|
+
const args = source.slice(call.open + 1, call.close)
|
|
133
|
+
const argCount = topLevelArgCount(args)
|
|
134
|
+
if (argCount < 1 || argCount > 2) continue
|
|
135
|
+
const literal = JSON.stringify({ file, exportName: target.exportName })
|
|
136
|
+
const separator = /,\s*$/.test(args) ? '' : ', '
|
|
139
137
|
edits.push({
|
|
140
138
|
at: call.close,
|
|
141
139
|
value: `${separator}${argCount === 1 ? 'undefined, ' : ''}${literal}`,
|
|
142
|
-
})
|
|
140
|
+
})
|
|
143
141
|
}
|
|
144
142
|
|
|
145
|
-
if (edits.length === 0) return source
|
|
143
|
+
if (edits.length === 0) return source
|
|
146
144
|
|
|
147
|
-
let next = source
|
|
145
|
+
let next = source
|
|
148
146
|
for (const edit of edits.reverse()) {
|
|
149
|
-
next = `${next.slice(0, edit.at)}${edit.value}${next.slice(edit.at)}
|
|
147
|
+
next = `${next.slice(0, edit.at)}${edit.value}${next.slice(edit.at)}`
|
|
150
148
|
}
|
|
151
|
-
return next
|
|
149
|
+
return next
|
|
152
150
|
}
|
|
153
151
|
|
|
154
|
-
|
|
155
|
-
|
|
152
|
+
function factForCall(facts: DynamicCallFact[], call: DynamicCall) {
|
|
153
|
+
return facts.find(fact => fact.start === call.index)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* The statically-extractable import behind one dynamic() call — the AST fact
|
|
158
|
+
* alone; a call the scan could not analyze yields no detection. Literal-loader
|
|
159
|
+
* calls (`dynamic('./x')`) answer undefined — they carry no `import()` yet.
|
|
160
|
+
*/
|
|
161
|
+
function loaderImportTargetForCall(call: DynamicCall, facts: DynamicCallFact[]) {
|
|
162
|
+
const fact = factForCall(facts, call)
|
|
163
|
+
return fact && !fact.literal ? fact : undefined
|
|
164
|
+
}
|
|
156
165
|
|
|
157
166
|
/** Dev split of `dynamic(ssr:false)` targets; `PNEXT_DYNAMIC_SPLIT=0` restores eager builds. */
|
|
158
167
|
export function devDynamicSplitEnabled() {
|
|
159
168
|
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
160
|
-
return process.env.PNEXT_DYNAMIC_SPLIT !== '0'
|
|
169
|
+
return process.env.PNEXT_DYNAMIC_SPLIT !== '0'
|
|
161
170
|
}
|
|
162
171
|
|
|
163
172
|
/**
|
|
@@ -171,28 +180,28 @@ export function rewriteDeferredDynamicImports(
|
|
|
171
180
|
resolve: (specifier: string) => string | undefined,
|
|
172
181
|
href: (target: { file: string; exportName: string }) => string | undefined,
|
|
173
182
|
) {
|
|
174
|
-
const dynamicNames = pnextDynamicImportNames(source, file)
|
|
175
|
-
if (dynamicNames.size === 0) return source
|
|
176
|
-
const deferred = deferredDynamicImportSpecifiers(source, file)
|
|
177
|
-
if (deferred.size === 0) return source
|
|
183
|
+
const dynamicNames = pnextDynamicImportNames(source, file)
|
|
184
|
+
if (dynamicNames.size === 0) return source
|
|
185
|
+
const deferred = deferredDynamicImportSpecifiers(source, file)
|
|
186
|
+
if (deferred.size === 0) return source
|
|
187
|
+
const facts = dynamicCallFacts(source, file)
|
|
178
188
|
|
|
179
|
-
const edits: { start: number; end: number; value: string }[] = []
|
|
189
|
+
const edits: { start: number; end: number; value: string }[] = []
|
|
180
190
|
for (const call of dynamicCallsFromSource(source, dynamicNames)) {
|
|
181
|
-
const target =
|
|
182
|
-
if (!target
|
|
183
|
-
const resolved = resolve(target
|
|
184
|
-
if (!resolved) continue
|
|
185
|
-
const url = href({ file: resolved, exportName: target
|
|
186
|
-
if (!url) continue
|
|
187
|
-
|
|
188
|
-
edits.push({ start: specifierAt, end: specifierAt + target[2].length, value: url });
|
|
191
|
+
const target = loaderImportTargetForCall(call, facts)
|
|
192
|
+
if (!target || !deferred.has(target.specifier)) continue
|
|
193
|
+
const resolved = resolve(target.specifier)
|
|
194
|
+
if (!resolved) continue
|
|
195
|
+
const url = href({ file: resolved, exportName: target.exportName })
|
|
196
|
+
if (!url) continue
|
|
197
|
+
edits.push({ start: target.specifierStart + 1, end: target.specifierEnd - 1, value: url })
|
|
189
198
|
}
|
|
190
|
-
if (edits.length === 0) return source
|
|
191
|
-
let next = source
|
|
199
|
+
if (edits.length === 0) return source
|
|
200
|
+
let next = source
|
|
192
201
|
for (const edit of edits.sort((a, b) => b.start - a.start)) {
|
|
193
|
-
next = `${next.slice(0, edit.start)}${edit.value}${next.slice(edit.end)}
|
|
202
|
+
next = `${next.slice(0, edit.start)}${edit.value}${next.slice(edit.end)}`
|
|
194
203
|
}
|
|
195
|
-
return next
|
|
204
|
+
return next
|
|
196
205
|
}
|
|
197
206
|
|
|
198
207
|
/**
|
|
@@ -200,108 +209,108 @@ export function rewriteDeferredDynamicImports(
|
|
|
200
209
|
* without `ssr: true`) - the dev split points: their target modules compile on browser demand, not eagerly.
|
|
201
210
|
*/
|
|
202
211
|
export function deferredDynamicImportSpecifiers(source: string, file?: string) {
|
|
203
|
-
const deferred = new Set<string>()
|
|
204
|
-
const dynamicNames = pnextDynamicImportNames(source, file)
|
|
205
|
-
if (dynamicNames.size === 0) return deferred
|
|
212
|
+
const deferred = new Set<string>()
|
|
213
|
+
const dynamicNames = pnextDynamicImportNames(source, file)
|
|
214
|
+
if (dynamicNames.size === 0) return deferred
|
|
206
215
|
|
|
207
216
|
// `const opts = { ssr: false }` option objects referenced by name.
|
|
208
|
-
const optionConsts = new Map<string, string>()
|
|
209
|
-
const constPattern = /const\s+([A-Za-z_$][\w$]*)\s*=\s*({[\s\S]*?})\s*(?:as\s+const\s*)?;/g
|
|
210
|
-
let constMatch: RegExpExecArray | null
|
|
217
|
+
const optionConsts = new Map<string, string>()
|
|
218
|
+
const constPattern = /const\s+([A-Za-z_$][\w$]*)\s*=\s*({[\s\S]*?})\s*(?:as\s+const\s*)?;/g
|
|
219
|
+
let constMatch: RegExpExecArray | null
|
|
211
220
|
while ((constMatch = constPattern.exec(source))) {
|
|
212
|
-
if (constMatch[1] && constMatch[2]) optionConsts.set(constMatch[1], constMatch[2])
|
|
221
|
+
if (constMatch[1] && constMatch[2]) optionConsts.set(constMatch[1], constMatch[2])
|
|
213
222
|
}
|
|
214
223
|
|
|
224
|
+
const facts = dynamicCallFacts(source, file)
|
|
215
225
|
for (const call of dynamicCallsFromSource(source, dynamicNames)) {
|
|
216
|
-
const target =
|
|
217
|
-
if (!target
|
|
226
|
+
const target = loaderImportTargetForCall(call, facts)
|
|
227
|
+
if (!target) continue
|
|
218
228
|
// Token scan over the call plus any named option consts it references —
|
|
219
229
|
// tolerant of the compile-appended target argument (rewriteDynamicCallTargets).
|
|
220
|
-
const
|
|
221
|
-
|
|
222
|
-
let options = tail;
|
|
230
|
+
const tail = source.slice(target.loaderEnd, call.close)
|
|
231
|
+
let options = tail
|
|
223
232
|
for (const identifier of tail.match(/[A-Za-z_$][\w$]*/g) ?? []) {
|
|
224
|
-
const named = optionConsts.get(identifier)
|
|
225
|
-
if (named) options += `\n${named}
|
|
233
|
+
const named = optionConsts.get(identifier)
|
|
234
|
+
if (named) options += `\n${named}`
|
|
226
235
|
}
|
|
227
|
-
const ssrFalse = /\bssr\s*:\s*false\b/.test(options)
|
|
236
|
+
const ssrFalse = /\bssr\s*:\s*false\b/.test(options)
|
|
228
237
|
const visible =
|
|
229
|
-
/\bload\s*:\s*['"]visible['"]/.test(options) && !/\bssr\s*:\s*true\b/.test(options)
|
|
230
|
-
if (ssrFalse || visible) deferred.add(target
|
|
238
|
+
/\bload\s*:\s*['"]visible['"]/.test(options) && !/\bssr\s*:\s*true\b/.test(options)
|
|
239
|
+
if (ssrFalse || visible) deferred.add(target.specifier)
|
|
231
240
|
}
|
|
232
|
-
return deferred
|
|
241
|
+
return deferred
|
|
233
242
|
}
|
|
234
243
|
|
|
235
244
|
function topLevelArgCount(args: string) {
|
|
236
|
-
let count = 0
|
|
237
|
-
let depth = 0
|
|
238
|
-
let quote: string | null = null
|
|
239
|
-
let sawArg = false
|
|
245
|
+
let count = 0
|
|
246
|
+
let depth = 0
|
|
247
|
+
let quote: string | null = null
|
|
248
|
+
let sawArg = false
|
|
240
249
|
|
|
241
250
|
for (let index = 0; index < args.length; index += 1) {
|
|
242
|
-
const char = args[index]
|
|
251
|
+
const char = args[index]
|
|
243
252
|
if (quote) {
|
|
244
|
-
if (char === quote && args[index - 1] !== '\\') quote = null
|
|
245
|
-
continue
|
|
253
|
+
if (char === quote && args[index - 1] !== '\\') quote = null
|
|
254
|
+
continue
|
|
246
255
|
}
|
|
247
256
|
if (char === '"' || char === "'" || char === '`') {
|
|
248
|
-
quote = char
|
|
249
|
-
sawArg = true
|
|
250
|
-
continue
|
|
257
|
+
quote = char
|
|
258
|
+
sawArg = true
|
|
259
|
+
continue
|
|
251
260
|
}
|
|
252
|
-
if (char === '(' || char === '[' || char === '{') depth += 1
|
|
253
|
-
if (char === ')' || char === ']' || char === '}') depth -= 1
|
|
261
|
+
if (char === '(' || char === '[' || char === '{') depth += 1
|
|
262
|
+
if (char === ')' || char === ']' || char === '}') depth -= 1
|
|
254
263
|
if (char === ',' && depth === 0) {
|
|
255
|
-
if (sawArg) count += 1
|
|
256
|
-
sawArg = false
|
|
257
|
-
continue
|
|
264
|
+
if (sawArg) count += 1
|
|
265
|
+
sawArg = false
|
|
266
|
+
continue
|
|
258
267
|
}
|
|
259
|
-
if (!/\s/.test(char ?? '')) sawArg = true
|
|
268
|
+
if (!/\s/.test(char ?? '')) sawArg = true
|
|
260
269
|
}
|
|
261
270
|
|
|
262
|
-
return sawArg ? count + 1 : count
|
|
271
|
+
return sawArg ? count + 1 : count
|
|
263
272
|
}
|
|
264
273
|
|
|
265
274
|
function matchingParen(source: string, open: number) {
|
|
266
|
-
let depth = 0
|
|
267
|
-
let quote: string | null = null
|
|
275
|
+
let depth = 0
|
|
276
|
+
let quote: string | null = null
|
|
268
277
|
|
|
269
278
|
for (let index = open; index < source.length; index += 1) {
|
|
270
|
-
const char = source[index]
|
|
271
|
-
const previous = source[index - 1]
|
|
279
|
+
const char = source[index]
|
|
280
|
+
const previous = source[index - 1]
|
|
272
281
|
|
|
273
282
|
if (quote) {
|
|
274
|
-
if (char === quote && previous !== '\\') quote = null
|
|
275
|
-
continue
|
|
283
|
+
if (char === quote && previous !== '\\') quote = null
|
|
284
|
+
continue
|
|
276
285
|
}
|
|
277
286
|
|
|
278
287
|
if (char === '"' || char === "'" || char === '`') {
|
|
279
|
-
quote = char
|
|
280
|
-
continue
|
|
288
|
+
quote = char
|
|
289
|
+
continue
|
|
281
290
|
}
|
|
282
291
|
|
|
283
|
-
if (char === '(') depth += 1
|
|
292
|
+
if (char === '(') depth += 1
|
|
284
293
|
if (char === ')') {
|
|
285
|
-
depth -= 1
|
|
286
|
-
if (depth === 0) return index
|
|
294
|
+
depth -= 1
|
|
295
|
+
if (depth === 0) return index
|
|
287
296
|
}
|
|
288
297
|
}
|
|
289
298
|
|
|
290
|
-
return -1
|
|
299
|
+
return -1
|
|
291
300
|
}
|
|
292
301
|
|
|
293
302
|
function nextDynamicCallIndex(source: string, dynamicNames: Set<string>, fromIndex: number) {
|
|
294
|
-
let next = -1
|
|
303
|
+
let next = -1
|
|
295
304
|
for (const name of dynamicNames) {
|
|
296
|
-
const index = source.indexOf(name, fromIndex)
|
|
297
|
-
if (index !== -1 && (next === -1 || index < next)) next = index
|
|
305
|
+
const index = source.indexOf(name, fromIndex)
|
|
306
|
+
if (index !== -1 && (next === -1 || index < next)) next = index
|
|
298
307
|
}
|
|
299
|
-
return next
|
|
308
|
+
return next
|
|
300
309
|
}
|
|
301
310
|
|
|
302
311
|
function dynamicNameAt(source: string, dynamicNames: Set<string>, index: number) {
|
|
303
312
|
for (const name of dynamicNames) {
|
|
304
|
-
if (source.startsWith(name, index)) return name
|
|
313
|
+
if (source.startsWith(name, index)) return name
|
|
305
314
|
}
|
|
306
|
-
return undefined
|
|
315
|
+
return undefined
|
|
307
316
|
}
|