@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
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { dynamicCallFacts, rewriteFacts, type DynamicCallFact } 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,36 +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
|
|
89
|
-
const facts = dynamicCallFacts(source, file)
|
|
87
|
+
const dynamicNames = pnextDynamicImportNames(source, file)
|
|
88
|
+
if (dynamicNames.size === 0) return source
|
|
89
|
+
const facts = dynamicCallFacts(source, file)
|
|
90
90
|
|
|
91
|
-
const edits: { start: number; end: number; value: string }[] = []
|
|
91
|
+
const edits: { start: number; end: number; value: string }[] = []
|
|
92
92
|
for (const call of dynamicCallsFromSource(source, dynamicNames)) {
|
|
93
|
-
const fact = factForCall(facts, call)
|
|
94
|
-
if (!fact?.literal) continue
|
|
93
|
+
const fact = factForCall(facts, call)
|
|
94
|
+
if (!fact?.literal) continue
|
|
95
95
|
edits.push({
|
|
96
96
|
start: fact.specifierStart,
|
|
97
97
|
end: fact.specifierEnd,
|
|
98
98
|
value: `() => import(${source.slice(fact.specifierStart, fact.specifierEnd)})`,
|
|
99
|
-
})
|
|
99
|
+
})
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
if (edits.length === 0) return source
|
|
102
|
+
if (edits.length === 0) return source
|
|
103
103
|
|
|
104
|
-
let next = source
|
|
104
|
+
let next = source
|
|
105
105
|
for (const edit of edits.reverse()) {
|
|
106
|
-
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)}`
|
|
107
107
|
}
|
|
108
|
-
return next
|
|
108
|
+
return next
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
// Server compiles append the statically-resolved import target as a third
|
|
@@ -118,39 +118,39 @@ export function rewriteDynamicCallTargets(
|
|
|
118
118
|
resolve: (specifier: string) => string | undefined,
|
|
119
119
|
file?: string,
|
|
120
120
|
) {
|
|
121
|
-
const dynamicNames = pnextDynamicImportNames(source, file)
|
|
122
|
-
if (dynamicNames.size === 0) return source
|
|
123
|
-
const facts = dynamicCallFacts(source, file)
|
|
121
|
+
const dynamicNames = pnextDynamicImportNames(source, file)
|
|
122
|
+
if (dynamicNames.size === 0) return source
|
|
123
|
+
const facts = dynamicCallFacts(source, file)
|
|
124
124
|
|
|
125
|
-
const edits: { at: number; value: string }[] = []
|
|
125
|
+
const edits: { at: number; value: string }[] = []
|
|
126
126
|
for (const call of dynamicCallsFromSource(source, dynamicNames)) {
|
|
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) ? '' : ', '
|
|
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) ? '' : ', '
|
|
137
137
|
edits.push({
|
|
138
138
|
at: call.close,
|
|
139
139
|
value: `${separator}${argCount === 1 ? 'undefined, ' : ''}${literal}`,
|
|
140
|
-
})
|
|
140
|
+
})
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
-
if (edits.length === 0) return source
|
|
143
|
+
if (edits.length === 0) return source
|
|
144
144
|
|
|
145
|
-
let next = source
|
|
145
|
+
let next = source
|
|
146
146
|
for (const edit of edits.reverse()) {
|
|
147
|
-
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)}`
|
|
148
148
|
}
|
|
149
|
-
return next
|
|
149
|
+
return next
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
function factForCall(facts: DynamicCallFact[], call: DynamicCall) {
|
|
153
|
-
return facts.find(fact => fact.start === call.index)
|
|
153
|
+
return facts.find(fact => fact.start === call.index)
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
/**
|
|
@@ -159,14 +159,14 @@ function factForCall(facts: DynamicCallFact[], call: DynamicCall) {
|
|
|
159
159
|
* calls (`dynamic('./x')`) answer undefined — they carry no `import()` yet.
|
|
160
160
|
*/
|
|
161
161
|
function loaderImportTargetForCall(call: DynamicCall, facts: DynamicCallFact[]) {
|
|
162
|
-
const fact = factForCall(facts, call)
|
|
163
|
-
return fact && !fact.literal ? fact : undefined
|
|
162
|
+
const fact = factForCall(facts, call)
|
|
163
|
+
return fact && !fact.literal ? fact : undefined
|
|
164
164
|
}
|
|
165
165
|
|
|
166
166
|
/** Dev split of `dynamic(ssr:false)` targets; `PNEXT_DYNAMIC_SPLIT=0` restores eager builds. */
|
|
167
167
|
export function devDynamicSplitEnabled() {
|
|
168
168
|
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
169
|
-
return process.env.PNEXT_DYNAMIC_SPLIT !== '0'
|
|
169
|
+
return process.env.PNEXT_DYNAMIC_SPLIT !== '0'
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
/**
|
|
@@ -180,28 +180,28 @@ export function rewriteDeferredDynamicImports(
|
|
|
180
180
|
resolve: (specifier: string) => string | undefined,
|
|
181
181
|
href: (target: { file: string; exportName: string }) => string | undefined,
|
|
182
182
|
) {
|
|
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)
|
|
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)
|
|
188
188
|
|
|
189
|
-
const edits: { start: number; end: number; value: string }[] = []
|
|
189
|
+
const edits: { start: number; end: number; value: string }[] = []
|
|
190
190
|
for (const call of dynamicCallsFromSource(source, dynamicNames)) {
|
|
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 })
|
|
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 })
|
|
198
198
|
}
|
|
199
|
-
if (edits.length === 0) return source
|
|
200
|
-
let next = source
|
|
199
|
+
if (edits.length === 0) return source
|
|
200
|
+
let next = source
|
|
201
201
|
for (const edit of edits.sort((a, b) => b.start - a.start)) {
|
|
202
|
-
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)}`
|
|
203
203
|
}
|
|
204
|
-
return next
|
|
204
|
+
return next
|
|
205
205
|
}
|
|
206
206
|
|
|
207
207
|
/**
|
|
@@ -209,108 +209,108 @@ export function rewriteDeferredDynamicImports(
|
|
|
209
209
|
* without `ssr: true`) - the dev split points: their target modules compile on browser demand, not eagerly.
|
|
210
210
|
*/
|
|
211
211
|
export function deferredDynamicImportSpecifiers(source: string, file?: string) {
|
|
212
|
-
const deferred = new Set<string>()
|
|
213
|
-
const dynamicNames = pnextDynamicImportNames(source, file)
|
|
214
|
-
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
|
|
215
215
|
|
|
216
216
|
// `const opts = { ssr: false }` option objects referenced by name.
|
|
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
|
|
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
|
|
220
220
|
while ((constMatch = constPattern.exec(source))) {
|
|
221
|
-
if (constMatch[1] && constMatch[2]) optionConsts.set(constMatch[1], constMatch[2])
|
|
221
|
+
if (constMatch[1] && constMatch[2]) optionConsts.set(constMatch[1], constMatch[2])
|
|
222
222
|
}
|
|
223
223
|
|
|
224
|
-
const facts = dynamicCallFacts(source, file)
|
|
224
|
+
const facts = dynamicCallFacts(source, file)
|
|
225
225
|
for (const call of dynamicCallsFromSource(source, dynamicNames)) {
|
|
226
|
-
const target = loaderImportTargetForCall(call, facts)
|
|
227
|
-
if (!target) continue
|
|
226
|
+
const target = loaderImportTargetForCall(call, facts)
|
|
227
|
+
if (!target) continue
|
|
228
228
|
// Token scan over the call plus any named option consts it references —
|
|
229
229
|
// tolerant of the compile-appended target argument (rewriteDynamicCallTargets).
|
|
230
|
-
const tail = source.slice(target.loaderEnd, call.close)
|
|
231
|
-
let options = tail
|
|
230
|
+
const tail = source.slice(target.loaderEnd, call.close)
|
|
231
|
+
let options = tail
|
|
232
232
|
for (const identifier of tail.match(/[A-Za-z_$][\w$]*/g) ?? []) {
|
|
233
|
-
const named = optionConsts.get(identifier)
|
|
234
|
-
if (named) options += `\n${named}
|
|
233
|
+
const named = optionConsts.get(identifier)
|
|
234
|
+
if (named) options += `\n${named}`
|
|
235
235
|
}
|
|
236
|
-
const ssrFalse = /\bssr\s*:\s*false\b/.test(options)
|
|
236
|
+
const ssrFalse = /\bssr\s*:\s*false\b/.test(options)
|
|
237
237
|
const visible =
|
|
238
|
-
/\bload\s*:\s*['"]visible['"]/.test(options) && !/\bssr\s*:\s*true\b/.test(options)
|
|
239
|
-
if (ssrFalse || visible) deferred.add(target.specifier)
|
|
238
|
+
/\bload\s*:\s*['"]visible['"]/.test(options) && !/\bssr\s*:\s*true\b/.test(options)
|
|
239
|
+
if (ssrFalse || visible) deferred.add(target.specifier)
|
|
240
240
|
}
|
|
241
|
-
return deferred
|
|
241
|
+
return deferred
|
|
242
242
|
}
|
|
243
243
|
|
|
244
244
|
function topLevelArgCount(args: string) {
|
|
245
|
-
let count = 0
|
|
246
|
-
let depth = 0
|
|
247
|
-
let quote: string | null = null
|
|
248
|
-
let sawArg = false
|
|
245
|
+
let count = 0
|
|
246
|
+
let depth = 0
|
|
247
|
+
let quote: string | null = null
|
|
248
|
+
let sawArg = false
|
|
249
249
|
|
|
250
250
|
for (let index = 0; index < args.length; index += 1) {
|
|
251
|
-
const char = args[index]
|
|
251
|
+
const char = args[index]
|
|
252
252
|
if (quote) {
|
|
253
|
-
if (char === quote && args[index - 1] !== '\\') quote = null
|
|
254
|
-
continue
|
|
253
|
+
if (char === quote && args[index - 1] !== '\\') quote = null
|
|
254
|
+
continue
|
|
255
255
|
}
|
|
256
256
|
if (char === '"' || char === "'" || char === '`') {
|
|
257
|
-
quote = char
|
|
258
|
-
sawArg = true
|
|
259
|
-
continue
|
|
257
|
+
quote = char
|
|
258
|
+
sawArg = true
|
|
259
|
+
continue
|
|
260
260
|
}
|
|
261
|
-
if (char === '(' || char === '[' || char === '{') depth += 1
|
|
262
|
-
if (char === ')' || char === ']' || char === '}') depth -= 1
|
|
261
|
+
if (char === '(' || char === '[' || char === '{') depth += 1
|
|
262
|
+
if (char === ')' || char === ']' || char === '}') depth -= 1
|
|
263
263
|
if (char === ',' && depth === 0) {
|
|
264
|
-
if (sawArg) count += 1
|
|
265
|
-
sawArg = false
|
|
266
|
-
continue
|
|
264
|
+
if (sawArg) count += 1
|
|
265
|
+
sawArg = false
|
|
266
|
+
continue
|
|
267
267
|
}
|
|
268
|
-
if (!/\s/.test(char ?? '')) sawArg = true
|
|
268
|
+
if (!/\s/.test(char ?? '')) sawArg = true
|
|
269
269
|
}
|
|
270
270
|
|
|
271
|
-
return sawArg ? count + 1 : count
|
|
271
|
+
return sawArg ? count + 1 : count
|
|
272
272
|
}
|
|
273
273
|
|
|
274
274
|
function matchingParen(source: string, open: number) {
|
|
275
|
-
let depth = 0
|
|
276
|
-
let quote: string | null = null
|
|
275
|
+
let depth = 0
|
|
276
|
+
let quote: string | null = null
|
|
277
277
|
|
|
278
278
|
for (let index = open; index < source.length; index += 1) {
|
|
279
|
-
const char = source[index]
|
|
280
|
-
const previous = source[index - 1]
|
|
279
|
+
const char = source[index]
|
|
280
|
+
const previous = source[index - 1]
|
|
281
281
|
|
|
282
282
|
if (quote) {
|
|
283
|
-
if (char === quote && previous !== '\\') quote = null
|
|
284
|
-
continue
|
|
283
|
+
if (char === quote && previous !== '\\') quote = null
|
|
284
|
+
continue
|
|
285
285
|
}
|
|
286
286
|
|
|
287
287
|
if (char === '"' || char === "'" || char === '`') {
|
|
288
|
-
quote = char
|
|
289
|
-
continue
|
|
288
|
+
quote = char
|
|
289
|
+
continue
|
|
290
290
|
}
|
|
291
291
|
|
|
292
|
-
if (char === '(') depth += 1
|
|
292
|
+
if (char === '(') depth += 1
|
|
293
293
|
if (char === ')') {
|
|
294
|
-
depth -= 1
|
|
295
|
-
if (depth === 0) return index
|
|
294
|
+
depth -= 1
|
|
295
|
+
if (depth === 0) return index
|
|
296
296
|
}
|
|
297
297
|
}
|
|
298
298
|
|
|
299
|
-
return -1
|
|
299
|
+
return -1
|
|
300
300
|
}
|
|
301
301
|
|
|
302
302
|
function nextDynamicCallIndex(source: string, dynamicNames: Set<string>, fromIndex: number) {
|
|
303
|
-
let next = -1
|
|
303
|
+
let next = -1
|
|
304
304
|
for (const name of dynamicNames) {
|
|
305
|
-
const index = source.indexOf(name, fromIndex)
|
|
306
|
-
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
|
|
307
307
|
}
|
|
308
|
-
return next
|
|
308
|
+
return next
|
|
309
309
|
}
|
|
310
310
|
|
|
311
311
|
function dynamicNameAt(source: string, dynamicNames: Set<string>, index: number) {
|
|
312
312
|
for (const name of dynamicNames) {
|
|
313
|
-
if (source.startsWith(name, index)) return name
|
|
313
|
+
if (source.startsWith(name, index)) return name
|
|
314
314
|
}
|
|
315
|
-
return undefined
|
|
315
|
+
return undefined
|
|
316
316
|
}
|