@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
|
@@ -6,25 +6,25 @@
|
|
|
6
6
|
// exactly once at init and consults it - a no-op when no proxy info is active. Gated on
|
|
7
7
|
// experimental.testProxy in next.config.
|
|
8
8
|
|
|
9
|
-
import { PassThrough } from 'node:stream'
|
|
10
|
-
import type * as http from 'node:http'
|
|
11
|
-
import type * as https from 'node:https'
|
|
12
|
-
import type { IncomingMessage } from 'node:http'
|
|
13
|
-
import { createRequire } from 'node:module'
|
|
14
|
-
import { currentRequest, getWorkUnit } from '../../request/context'
|
|
9
|
+
import { PassThrough } from 'node:stream'
|
|
10
|
+
import type * as http from 'node:http'
|
|
11
|
+
import type * as https from 'node:https'
|
|
12
|
+
import type { IncomingMessage } from 'node:http'
|
|
13
|
+
import { createRequire } from 'node:module'
|
|
14
|
+
import { currentRequest, getWorkUnit } from '../../request/context'
|
|
15
15
|
|
|
16
16
|
// `import * as http` yields a frozen ES module namespace object under strict
|
|
17
17
|
// runtimes (Bun); assigning to `.get` on it throws "Attempted to assign to
|
|
18
18
|
// readonly property." `require()` returns the real, mutable CJS exports
|
|
19
19
|
// object that node/http/https resolve `.get` calls through at runtime, so
|
|
20
20
|
// patch that instead of the namespace binding.
|
|
21
|
-
const requireNode = createRequire(import.meta.url)
|
|
22
|
-
const httpModule = requireNode('node:http') as typeof http
|
|
23
|
-
const httpsModule = requireNode('node:https') as typeof https
|
|
21
|
+
const requireNode = createRequire(import.meta.url)
|
|
22
|
+
const httpModule = requireNode('node:http') as typeof http
|
|
23
|
+
const httpsModule = requireNode('node:https') as typeof https
|
|
24
24
|
|
|
25
25
|
interface TestProxyInfo {
|
|
26
|
-
proxyPort: number
|
|
27
|
-
testData: string
|
|
26
|
+
proxyPort: number
|
|
27
|
+
testData: string
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
/**
|
|
@@ -32,54 +32,54 @@ interface TestProxyInfo {
|
|
|
32
32
|
* private ALS, so the patched global.fetch - invoked deep inside a render or handler - can recover it
|
|
33
33
|
* via getWorkUnit(). The interceptor sets it before matching; the fetch patch reads it.
|
|
34
34
|
*/
|
|
35
|
-
const TEST_PROXY_KEY = Symbol.for('pnext.testProxy')
|
|
35
|
+
const TEST_PROXY_KEY = Symbol.for('pnext.testProxy')
|
|
36
36
|
|
|
37
37
|
/** Extract proxy info from a request's Next-Test-* headers, if present. */
|
|
38
38
|
export function readTestProxyInfo(headers: Headers): TestProxyInfo | undefined {
|
|
39
|
-
const portHeader = headers.get('next-test-proxy-port')
|
|
40
|
-
if (!portHeader) return undefined
|
|
41
|
-
return { proxyPort: Number(portHeader), testData: headers.get('next-test-data') ?? '' }
|
|
39
|
+
const portHeader = headers.get('next-test-proxy-port')
|
|
40
|
+
if (!portHeader) return undefined
|
|
41
|
+
return { proxyPort: Number(portHeader), testData: headers.get('next-test-data') ?? '' }
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
/** Record the request's test-proxy info onto the active work unit (if any). */
|
|
45
45
|
export function activateTestProxy(headers: Headers): void {
|
|
46
|
-
const info = readTestProxyInfo(headers)
|
|
47
|
-
if (!info) return
|
|
48
|
-
const unit = getWorkUnit()
|
|
49
|
-
if (!unit) return
|
|
50
|
-
(unit.compat ??= {})[TEST_PROXY_KEY] = info
|
|
46
|
+
const info = readTestProxyInfo(headers)
|
|
47
|
+
if (!info) return
|
|
48
|
+
const unit = getWorkUnit()
|
|
49
|
+
if (!unit) return
|
|
50
|
+
;(unit.compat ??= {})[TEST_PROXY_KEY] = info
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
function currentTestProxyInfo(): TestProxyInfo | undefined {
|
|
54
|
-
const workUnitInfo = getWorkUnit()?.compat?.[TEST_PROXY_KEY] as TestProxyInfo | undefined
|
|
55
|
-
if (workUnitInfo) return workUnitInfo
|
|
56
|
-
const request = currentRequest()
|
|
57
|
-
if (!request) return undefined
|
|
58
|
-
return readTestProxyInfo(request.headers)
|
|
54
|
+
const workUnitInfo = getWorkUnit()?.compat?.[TEST_PROXY_KEY] as TestProxyInfo | undefined
|
|
55
|
+
if (workUnitInfo) return workUnitInfo
|
|
56
|
+
const request = currentRequest()
|
|
57
|
+
if (!request) return undefined
|
|
58
|
+
return readTestProxyInfo(request.headers)
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
// pnext marks its own proxy round-trips via `next.internal` so the patched
|
|
62
62
|
// fetch (below) doesn't re-intercept them. The `next` field is typed as
|
|
63
63
|
// NextFetchRequestConfig globally, so extend it via intersection rather than
|
|
64
64
|
// interface-extends (which errors on the conflicting `next` property).
|
|
65
|
-
type InternalInit = RequestInit & { next?: { internal?: boolean } }
|
|
65
|
+
type InternalInit = RequestInit & { next?: { internal?: boolean } }
|
|
66
66
|
|
|
67
67
|
interface ProxyFetchRequest {
|
|
68
|
-
testData: string
|
|
69
|
-
api: 'fetch'
|
|
68
|
+
testData: string
|
|
69
|
+
api: 'fetch'
|
|
70
70
|
request: {
|
|
71
|
-
url: string
|
|
72
|
-
method: string
|
|
73
|
-
headers: [string, string][]
|
|
74
|
-
body: string | null
|
|
75
|
-
cache: RequestCache
|
|
76
|
-
credentials: RequestCredentials
|
|
77
|
-
integrity: string
|
|
78
|
-
mode: RequestMode
|
|
79
|
-
redirect: RequestRedirect
|
|
80
|
-
referrer: string
|
|
81
|
-
referrerPolicy: ReferrerPolicy
|
|
82
|
-
}
|
|
71
|
+
url: string
|
|
72
|
+
method: string
|
|
73
|
+
headers: [string, string][]
|
|
74
|
+
body: string | null
|
|
75
|
+
cache: RequestCache
|
|
76
|
+
credentials: RequestCredentials
|
|
77
|
+
integrity: string
|
|
78
|
+
mode: RequestMode
|
|
79
|
+
redirect: RequestRedirect
|
|
80
|
+
referrer: string
|
|
81
|
+
referrerPolicy: ReferrerPolicy
|
|
82
|
+
}
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
async function buildProxyRequest(testData: string, request: Request): Promise<ProxyFetchRequest> {
|
|
@@ -89,10 +89,7 @@ async function buildProxyRequest(testData: string, request: Request): Promise<Pr
|
|
|
89
89
|
request: {
|
|
90
90
|
url: request.url,
|
|
91
91
|
method: request.method,
|
|
92
|
-
headers: [
|
|
93
|
-
...Array.from(request.headers),
|
|
94
|
-
['next-test-stack', getTestStack()],
|
|
95
|
-
],
|
|
92
|
+
headers: [...Array.from(request.headers), ['next-test-stack', getTestStack()]],
|
|
96
93
|
body: request.body ? Buffer.from(await request.arrayBuffer()).toString('base64') : null,
|
|
97
94
|
cache: request.cache,
|
|
98
95
|
credentials: request.credentials,
|
|
@@ -107,27 +104,27 @@ async function buildProxyRequest(testData: string, request: Request): Promise<Pr
|
|
|
107
104
|
referrer: request.referrer,
|
|
108
105
|
referrerPolicy: request.referrerPolicy,
|
|
109
106
|
},
|
|
110
|
-
}
|
|
107
|
+
}
|
|
111
108
|
}
|
|
112
109
|
|
|
113
110
|
function getTestStack(): string {
|
|
114
|
-
let stack = (new Error().stack ?? '').split('\n')
|
|
111
|
+
let stack = (new Error().stack ?? '').split('\n')
|
|
115
112
|
for (let i = 1; i < stack.length; i++) {
|
|
116
|
-
const line = stack[i]
|
|
113
|
+
const line = stack[i]
|
|
117
114
|
if (line && line.length > 0) {
|
|
118
|
-
stack = stack.slice(i)
|
|
119
|
-
break
|
|
115
|
+
stack = stack.slice(i)
|
|
116
|
+
break
|
|
120
117
|
}
|
|
121
118
|
}
|
|
122
|
-
stack = stack.filter(item => !item.includes('/next/dist/'))
|
|
123
|
-
stack = stack.slice(0, 5)
|
|
124
|
-
stack = stack.map(line => line.replace('webpack-internal:///(rsc)/', '').trim())
|
|
125
|
-
return stack.join(' ')
|
|
119
|
+
stack = stack.filter(item => !item.includes('/next/dist/'))
|
|
120
|
+
stack = stack.slice(0, 5)
|
|
121
|
+
stack = stack.map(line => line.replace('webpack-internal:///(rsc)/', '').trim())
|
|
122
|
+
return stack.join(' ')
|
|
126
123
|
}
|
|
127
124
|
|
|
128
125
|
interface ProxyResponse {
|
|
129
|
-
api: 'continue' | 'abort' | 'unhandled' | 'fetch'
|
|
130
|
-
response?: { status: number; headers: [string, string][]; body: string | null }
|
|
126
|
+
api: 'continue' | 'abort' | 'unhandled' | 'fetch'
|
|
127
|
+
response?: { status: number; headers: [string, string][]; body: string | null }
|
|
131
128
|
}
|
|
132
129
|
|
|
133
130
|
async function handleProxiedFetch(
|
|
@@ -135,129 +132,160 @@ async function handleProxiedFetch(
|
|
|
135
132
|
info: TestProxyInfo,
|
|
136
133
|
request: Request,
|
|
137
134
|
): Promise<Response> {
|
|
138
|
-
const proxyRequest = await buildProxyRequest(info.testData, request)
|
|
135
|
+
const proxyRequest = await buildProxyRequest(info.testData, request)
|
|
139
136
|
const resp = await originalFetch(`http://localhost:${info.proxyPort}`, {
|
|
140
137
|
method: 'POST',
|
|
141
138
|
body: JSON.stringify(proxyRequest),
|
|
142
139
|
next: { internal: true },
|
|
143
|
-
} as InternalInit)
|
|
144
|
-
if (!resp.ok) throw new Error(`Proxy request failed: ${resp.status}`)
|
|
145
|
-
const proxyResponse = (await resp.json()) as ProxyResponse
|
|
140
|
+
} as InternalInit)
|
|
141
|
+
if (!resp.ok) throw new Error(`Proxy request failed: ${resp.status}`)
|
|
142
|
+
const proxyResponse = (await resp.json()) as ProxyResponse
|
|
146
143
|
switch (proxyResponse.api) {
|
|
147
144
|
case 'continue':
|
|
148
|
-
return originalFetch(request)
|
|
145
|
+
return originalFetch(request)
|
|
149
146
|
case 'fetch': {
|
|
150
|
-
const r = proxyResponse.response
|
|
147
|
+
const r = proxyResponse.response!
|
|
151
148
|
return new Response(r.body ? Buffer.from(r.body, 'base64') : null, {
|
|
152
149
|
status: r.status,
|
|
153
150
|
headers: new Headers(r.headers),
|
|
154
|
-
})
|
|
151
|
+
})
|
|
155
152
|
}
|
|
156
153
|
default:
|
|
157
|
-
throw new Error(`Proxy request aborted [${request.method} ${request.url}]`)
|
|
154
|
+
throw new Error(`Proxy request aborted [${request.method} ${request.url}]`)
|
|
158
155
|
}
|
|
159
156
|
}
|
|
160
157
|
|
|
161
|
-
type TestGetCallback = (res: IncomingMessage) => void
|
|
162
|
-
type HttpGetInput = Parameters<typeof http.get>[0]
|
|
158
|
+
type TestGetCallback = (res: IncomingMessage) => void
|
|
159
|
+
type HttpGetInput = Parameters<typeof http.get>[0]
|
|
163
160
|
|
|
164
|
-
function buildResponseMessage(
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
161
|
+
function buildResponseMessage(
|
|
162
|
+
responsePromise: Promise<Response>,
|
|
163
|
+
callback?: TestGetCallback,
|
|
164
|
+
): IncomingMessage {
|
|
165
|
+
const stream = new PassThrough()
|
|
166
|
+
const message = stream as unknown as IncomingMessage
|
|
167
|
+
void responsePromise
|
|
168
|
+
.then(async response => {
|
|
169
|
+
const headers: Record<string, string> = {}
|
|
170
|
+
const rawHeaders: string[] = []
|
|
171
|
+
for (const [name, value] of response.headers) {
|
|
172
|
+
headers[name.toLowerCase()] = value
|
|
173
|
+
rawHeaders.push(name, value)
|
|
174
|
+
}
|
|
175
|
+
message.statusCode = response.status
|
|
176
|
+
message.statusMessage = response.statusText
|
|
177
|
+
message.headers = headers
|
|
178
|
+
message.rawHeaders = rawHeaders
|
|
179
|
+
message.complete = true
|
|
180
|
+
callback?.(message)
|
|
181
|
+
const body = await response.arrayBuffer()
|
|
182
|
+
stream.end(Buffer.from(body))
|
|
183
|
+
})
|
|
184
|
+
.catch(error => {
|
|
185
|
+
stream.emit('error', error)
|
|
186
|
+
stream.end()
|
|
187
|
+
})
|
|
188
|
+
return message
|
|
187
189
|
}
|
|
188
190
|
|
|
189
191
|
function getStringForGetInput(input: HttpGetInput): string | undefined {
|
|
190
|
-
if (typeof input === 'string' || input instanceof URL) return input.toString()
|
|
191
|
-
const candidate = input as {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
192
|
+
if (typeof input === 'string' || input instanceof URL) return input.toString()
|
|
193
|
+
const candidate = input as {
|
|
194
|
+
href?: string
|
|
195
|
+
protocol?: string
|
|
196
|
+
hostname?: string
|
|
197
|
+
host?: string
|
|
198
|
+
path?: string
|
|
199
|
+
pathname?: string
|
|
200
|
+
search?: string
|
|
201
|
+
port?: number | string
|
|
202
|
+
}
|
|
203
|
+
if (typeof candidate.href === 'string' && /^[a-z][a-z\d+.-]*:\/\//i.test(candidate.href))
|
|
204
|
+
return candidate.href
|
|
205
|
+
const protocol = typeof candidate.protocol === 'string' ? candidate.protocol : 'http:'
|
|
206
|
+
const host =
|
|
207
|
+
typeof candidate.host === 'string'
|
|
208
|
+
? candidate.host
|
|
209
|
+
: typeof candidate.hostname === 'string'
|
|
210
|
+
? candidate.hostname
|
|
211
|
+
: undefined
|
|
212
|
+
if (!host) return undefined
|
|
196
213
|
const port =
|
|
197
|
-
typeof candidate.port === 'number'
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
214
|
+
typeof candidate.port === 'number'
|
|
215
|
+
? `:${candidate.port}`
|
|
216
|
+
: typeof candidate.port === 'string'
|
|
217
|
+
? `:${candidate.port}`
|
|
218
|
+
: ''
|
|
219
|
+
const path =
|
|
220
|
+
typeof candidate.path === 'string'
|
|
221
|
+
? candidate.path
|
|
222
|
+
: typeof candidate.pathname === 'string'
|
|
223
|
+
? candidate.pathname
|
|
224
|
+
: '/'
|
|
225
|
+
const search = typeof candidate.search === 'string' ? candidate.search : ''
|
|
226
|
+
return `${protocol}//${host}${port}${path}${search}`
|
|
201
227
|
}
|
|
202
228
|
|
|
203
|
-
function patchableGet(
|
|
204
|
-
originalGet: typeof http.get,
|
|
205
|
-
originalFetch: typeof fetch,
|
|
206
|
-
): typeof http.get {
|
|
229
|
+
function patchableGet(originalGet: typeof http.get, originalFetch: typeof fetch): typeof http.get {
|
|
207
230
|
return ((input: HttpGetInput, options?: Parameters<typeof http.get>[1]) => {
|
|
208
|
-
const callback = typeof options === 'function' ? options : undefined
|
|
209
|
-
const url = getStringForGetInput(input)
|
|
210
|
-
const info = currentTestProxyInfo()
|
|
231
|
+
const callback = typeof options === 'function' ? options : undefined
|
|
232
|
+
const url = getStringForGetInput(input)
|
|
233
|
+
const info = currentTestProxyInfo()
|
|
211
234
|
if (!url || !info) {
|
|
212
235
|
if (typeof options === 'function') {
|
|
213
|
-
return originalGet(input, options)
|
|
236
|
+
return originalGet(input, options)
|
|
214
237
|
}
|
|
215
238
|
if (options === undefined) {
|
|
216
|
-
return originalGet(input)
|
|
239
|
+
return originalGet(input)
|
|
217
240
|
}
|
|
218
|
-
return originalGet(input, options)
|
|
241
|
+
return originalGet(input, options)
|
|
219
242
|
}
|
|
220
243
|
const request = new Request(url, {
|
|
221
|
-
method:
|
|
222
|
-
|
|
223
|
-
|
|
244
|
+
method:
|
|
245
|
+
typeof options === 'object' &&
|
|
246
|
+
options &&
|
|
247
|
+
'method' in options &&
|
|
248
|
+
typeof options.method === 'string'
|
|
249
|
+
? options.method
|
|
250
|
+
: 'GET',
|
|
224
251
|
headers:
|
|
225
252
|
typeof options === 'object' && options && 'headers' in options
|
|
226
253
|
? (options.headers as HeadersInit)
|
|
227
254
|
: undefined,
|
|
228
|
-
})
|
|
229
|
-
return buildResponseMessage(
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
255
|
+
})
|
|
256
|
+
return buildResponseMessage(
|
|
257
|
+
handleProxiedFetch(originalFetch, info, request),
|
|
258
|
+
callback,
|
|
259
|
+
) as unknown as ReturnType<typeof http.get>
|
|
260
|
+
}) as typeof http.get
|
|
233
261
|
}
|
|
234
262
|
|
|
235
|
-
let patched = false
|
|
263
|
+
let patched = false
|
|
236
264
|
|
|
237
265
|
/** Patch global.fetch and node http/https.get once for testmode outgoing requests. */
|
|
238
266
|
export function installTestProxyFetch(): void {
|
|
239
|
-
if (patched) return
|
|
240
|
-
patched = true
|
|
241
|
-
const originalFetch = globalThis.fetch.bind(globalThis)
|
|
267
|
+
if (patched) return
|
|
268
|
+
patched = true
|
|
269
|
+
const originalFetch = globalThis.fetch.bind(globalThis)
|
|
242
270
|
|
|
243
271
|
const testFetch = function testFetch(
|
|
244
272
|
input: Parameters<typeof fetch>[0],
|
|
245
273
|
init?: Parameters<typeof fetch>[1],
|
|
246
274
|
): Promise<Response> {
|
|
247
|
-
const nextInit = (init as { next?: { internal?: boolean } } | undefined)?.next
|
|
275
|
+
const nextInit = (init as { next?: { internal?: boolean } } | undefined)?.next
|
|
248
276
|
if (nextInit?.internal) {
|
|
249
|
-
return originalFetch(input, init)
|
|
277
|
+
return originalFetch(input, init)
|
|
250
278
|
}
|
|
251
|
-
const info = currentTestProxyInfo()
|
|
252
|
-
if (!info) return originalFetch(input, init)
|
|
253
|
-
return handleProxiedFetch(originalFetch, info, new Request(input, init))
|
|
254
|
-
}
|
|
279
|
+
const info = currentTestProxyInfo()
|
|
280
|
+
if (!info) return originalFetch(input, init)
|
|
281
|
+
return handleProxiedFetch(originalFetch, info, new Request(input, init))
|
|
282
|
+
}
|
|
255
283
|
// Preserve fetch.preconnect (typeof fetch requires it).
|
|
256
|
-
(testFetch as typeof fetch).preconnect = originalFetch.preconnect?.bind(originalFetch)
|
|
257
|
-
globalThis.fetch = testFetch as typeof fetch
|
|
284
|
+
;(testFetch as typeof fetch).preconnect = originalFetch.preconnect?.bind(originalFetch)
|
|
285
|
+
globalThis.fetch = testFetch as typeof fetch
|
|
258
286
|
|
|
259
|
-
const originalHttpGet = httpModule.get
|
|
260
|
-
const originalHttpsGet = httpsModule.get
|
|
261
|
-
httpModule.get = patchableGet(originalHttpGet, originalFetch)
|
|
262
|
-
httpsModule.get = patchableGet(originalHttpsGet, originalFetch)
|
|
287
|
+
const originalHttpGet = httpModule.get
|
|
288
|
+
const originalHttpsGet = httpsModule.get
|
|
289
|
+
httpModule.get = patchableGet(originalHttpGet, originalFetch)
|
|
290
|
+
httpsModule.get = patchableGet(originalHttpsGet, originalFetch)
|
|
263
291
|
}
|
|
@@ -14,32 +14,32 @@
|
|
|
14
14
|
// `providerImportSource` is set to our components provider only when the app ships an `mdx-components`
|
|
15
15
|
// file; without one, MDX emits bare host elements, which is exactly the mdx-no-mdx-components contract.
|
|
16
16
|
|
|
17
|
-
import { existsSync } from 'node:fs'
|
|
18
|
-
import { createRequire } from 'node:module'
|
|
19
|
-
import path from 'node:path'
|
|
20
|
-
import { pathToFileURL } from 'node:url'
|
|
21
|
-
import { getNextConfig } from '../next/config-loader'
|
|
17
|
+
import { existsSync } from 'node:fs'
|
|
18
|
+
import { createRequire } from 'node:module'
|
|
19
|
+
import path from 'node:path'
|
|
20
|
+
import { pathToFileURL } from 'node:url'
|
|
21
|
+
import { getNextConfig } from '../next/config-loader'
|
|
22
22
|
|
|
23
23
|
export interface MdxCompileResult {
|
|
24
|
-
code: string
|
|
24
|
+
code: string
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
interface MdxModule {
|
|
28
28
|
compile: (
|
|
29
29
|
source: string | { value: string; path?: string },
|
|
30
30
|
options?: Record<string, unknown>,
|
|
31
|
-
) => Promise<{ toString: () => string; value: string }
|
|
31
|
+
) => Promise<{ toString: () => string; value: string }>
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
interface MdxOptions {
|
|
35
|
-
remarkPlugins?: unknown[]
|
|
36
|
-
rehypePlugins?: unknown[]
|
|
37
|
-
recmaPlugins?: unknown[]
|
|
38
|
-
remarkRehypeOptions?: Record<string, unknown
|
|
39
|
-
providerImportSource?: string
|
|
35
|
+
remarkPlugins?: unknown[]
|
|
36
|
+
rehypePlugins?: unknown[]
|
|
37
|
+
recmaPlugins?: unknown[]
|
|
38
|
+
remarkRehypeOptions?: Record<string, unknown>
|
|
39
|
+
providerImportSource?: string
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
let cachedModule: MdxModule | null | undefined
|
|
42
|
+
let cachedModule: MdxModule | null | undefined
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
45
|
* Load `@mdx-js/mdx` lazily. Returns `null` (not throwing) when the optional
|
|
@@ -47,26 +47,26 @@ let cachedModule: MdxModule | null | undefined;
|
|
|
47
47
|
* when an app actually imports `.mdx`.
|
|
48
48
|
*/
|
|
49
49
|
async function loadMdx(): Promise<MdxModule | null> {
|
|
50
|
-
if (cachedModule !== undefined) return cachedModule
|
|
50
|
+
if (cachedModule !== undefined) return cachedModule
|
|
51
51
|
try {
|
|
52
|
-
const specifier = '@mdx-js/mdx'
|
|
53
|
-
cachedModule = (await import(/* @vite-ignore */ specifier)) as MdxModule
|
|
52
|
+
const specifier = '@mdx-js/mdx'
|
|
53
|
+
cachedModule = (await import(/* @vite-ignore */ specifier)) as MdxModule
|
|
54
54
|
} catch {
|
|
55
|
-
cachedModule = null
|
|
55
|
+
cachedModule = null
|
|
56
56
|
}
|
|
57
|
-
return cachedModule
|
|
57
|
+
return cachedModule
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
/** The user's mdxOptions from the wrapped next.config, normalized. */
|
|
61
61
|
export function mdxOptionsFromConfig(): MdxOptions {
|
|
62
62
|
const config = getNextConfig() as {
|
|
63
|
-
mdxOptions?: MdxOptions
|
|
64
|
-
experimental?: { mdxRs?: unknown }
|
|
65
|
-
}
|
|
63
|
+
mdxOptions?: MdxOptions
|
|
64
|
+
experimental?: { mdxRs?: unknown }
|
|
65
|
+
}
|
|
66
66
|
// @next/mdx stores the merged plugin options under `mdxOptions` on the config
|
|
67
67
|
// object the wrapper produces. `experimental.mdxRs` selects the Rust pipeline
|
|
68
68
|
// upstream; we always use the JS pipeline, so it is intentionally ignored.
|
|
69
|
-
return config.mdxOptions ?? {}
|
|
69
|
+
return config.mdxOptions ?? {}
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
/**
|
|
@@ -75,24 +75,30 @@ export function mdxOptionsFromConfig(): MdxOptions {
|
|
|
75
75
|
* used as `providerImportSource`, or `undefined` when absent (bare host elements).
|
|
76
76
|
*/
|
|
77
77
|
export function resolveMdxComponents(root: string): string | undefined {
|
|
78
|
-
const bases = [root, path.join(root, 'src')]
|
|
79
|
-
const names = [
|
|
78
|
+
const bases = [root, path.join(root, 'src')]
|
|
79
|
+
const names = [
|
|
80
|
+
'mdx-components.tsx',
|
|
81
|
+
'mdx-components.ts',
|
|
82
|
+
'mdx-components.jsx',
|
|
83
|
+
'mdx-components.js',
|
|
84
|
+
'mdx-components.mjs',
|
|
85
|
+
]
|
|
80
86
|
for (const base of bases) {
|
|
81
87
|
for (const name of names) {
|
|
82
|
-
const candidate = path.join(base, name)
|
|
83
|
-
if (existsSync(candidate)) return candidate
|
|
88
|
+
const candidate = path.join(base, name)
|
|
89
|
+
if (existsSync(candidate)) return candidate
|
|
84
90
|
}
|
|
85
91
|
}
|
|
86
|
-
return undefined
|
|
92
|
+
return undefined
|
|
87
93
|
}
|
|
88
94
|
|
|
89
95
|
function interopDefault(module: unknown): unknown {
|
|
90
|
-
return (module as { default?: unknown })?.default ?? module
|
|
96
|
+
return (module as { default?: unknown })?.default ?? module
|
|
91
97
|
}
|
|
92
98
|
|
|
93
99
|
// Sentinel returned when a configured plugin package can't be resolved from the
|
|
94
100
|
// app, so `resolvePlugins` can filter it out.
|
|
95
|
-
const UNRESOLVED_PLUGIN = Symbol('pnext.mdx.unresolved-plugin')
|
|
101
|
+
const UNRESOLVED_PLUGIN = Symbol('pnext.mdx.unresolved-plugin')
|
|
96
102
|
|
|
97
103
|
/**
|
|
98
104
|
* Resolve a single plugin entry to the shape `@mdx-js/mdx` expects. `@next/mdx` stores plugins as
|
|
@@ -107,21 +113,18 @@ const UNRESOLVED_PLUGIN = Symbol('pnext.mdx.unresolved-plugin');
|
|
|
107
113
|
* all. Load failures are common when the toolchain resolves into a flat auto-install cache rather than
|
|
108
114
|
* a real node_modules tree, so the real error is surfaced to the log instead of silently 500ing pages.
|
|
109
115
|
*/
|
|
110
|
-
async function resolvePlugin(
|
|
111
|
-
entry
|
|
112
|
-
resolveFrom: NodeRequire,
|
|
113
|
-
): Promise<unknown> {
|
|
114
|
-
if (typeof entry === 'function') return entry;
|
|
116
|
+
async function resolvePlugin(entry: unknown, resolveFrom: NodeRequire): Promise<unknown> {
|
|
117
|
+
if (typeof entry === 'function') return entry
|
|
115
118
|
if (typeof entry === 'string') {
|
|
116
|
-
return loadPlugin(entry, resolveFrom)
|
|
119
|
+
return loadPlugin(entry, resolveFrom)
|
|
117
120
|
}
|
|
118
121
|
if (Array.isArray(entry) && typeof entry[0] === 'string') {
|
|
119
|
-
const tuple = entry as unknown[]
|
|
120
|
-
const plugin = await loadPlugin(tuple[0] as string, resolveFrom)
|
|
121
|
-
if (plugin === UNRESOLVED_PLUGIN) return UNRESOLVED_PLUGIN
|
|
122
|
-
return [plugin, ...tuple.slice(1)]
|
|
122
|
+
const tuple = entry as unknown[]
|
|
123
|
+
const plugin = await loadPlugin(tuple[0] as string, resolveFrom)
|
|
124
|
+
if (plugin === UNRESOLVED_PLUGIN) return UNRESOLVED_PLUGIN
|
|
125
|
+
return [plugin, ...tuple.slice(1)]
|
|
123
126
|
}
|
|
124
|
-
return entry
|
|
127
|
+
return entry
|
|
125
128
|
}
|
|
126
129
|
|
|
127
130
|
/**
|
|
@@ -131,32 +134,32 @@ async function resolvePlugin(
|
|
|
131
134
|
* so the toolchain stays inside the app's node_modules.
|
|
132
135
|
*/
|
|
133
136
|
async function loadPlugin(name: string, resolveFrom: NodeRequire): Promise<unknown> {
|
|
134
|
-
let resolved: string
|
|
137
|
+
let resolved: string
|
|
135
138
|
try {
|
|
136
|
-
resolved = resolveFrom.resolve(name)
|
|
139
|
+
resolved = resolveFrom.resolve(name)
|
|
137
140
|
} catch {
|
|
138
141
|
console.warn(
|
|
139
142
|
`pnext: MDX plugin '${name}' is configured but not installed; skipping it. ` +
|
|
140
143
|
'Install it to apply this remark/rehype/recma plugin.',
|
|
141
|
-
)
|
|
142
|
-
return UNRESOLVED_PLUGIN
|
|
144
|
+
)
|
|
145
|
+
return UNRESOLVED_PLUGIN
|
|
143
146
|
}
|
|
144
147
|
try {
|
|
145
|
-
return interopDefault(await import(pathToFileURL(resolved).href))
|
|
148
|
+
return interopDefault(await import(pathToFileURL(resolved).href))
|
|
146
149
|
} catch (error) {
|
|
147
150
|
console.warn(
|
|
148
151
|
`pnext: MDX plugin '${name}' failed to load and was skipped: ` +
|
|
149
152
|
`${error instanceof Error ? error.message : String(error)}. ` +
|
|
150
153
|
'Ensure it is installed in the app’s node_modules (not only Bun’s auto-install cache).',
|
|
151
|
-
)
|
|
152
|
-
return UNRESOLVED_PLUGIN
|
|
154
|
+
)
|
|
155
|
+
return UNRESOLVED_PLUGIN
|
|
153
156
|
}
|
|
154
157
|
}
|
|
155
158
|
|
|
156
159
|
/** Resolve every entry of a remark/rehype/recma plugin array (skipping absent packages). */
|
|
157
160
|
async function resolvePlugins(plugins: unknown[], resolveFrom: NodeRequire): Promise<unknown[]> {
|
|
158
|
-
const resolved = await Promise.all(plugins.map(entry => resolvePlugin(entry, resolveFrom)))
|
|
159
|
-
return resolved.filter(entry => entry !== UNRESOLVED_PLUGIN)
|
|
161
|
+
const resolved = await Promise.all(plugins.map(entry => resolvePlugin(entry, resolveFrom)))
|
|
162
|
+
return resolved.filter(entry => entry !== UNRESOLVED_PLUGIN)
|
|
160
163
|
}
|
|
161
164
|
|
|
162
165
|
/**
|
|
@@ -168,25 +171,25 @@ export async function compileMdx(
|
|
|
168
171
|
filePath: string,
|
|
169
172
|
root: string,
|
|
170
173
|
): Promise<MdxCompileResult> {
|
|
171
|
-
const mdx = await loadMdx()
|
|
174
|
+
const mdx = await loadMdx()
|
|
172
175
|
if (!mdx) {
|
|
173
176
|
throw new Error(
|
|
174
177
|
"MDX support requires the '@mdx-js/mdx' package. Install it to render .mdx files.",
|
|
175
|
-
)
|
|
178
|
+
)
|
|
176
179
|
}
|
|
177
180
|
|
|
178
|
-
const userOptions = mdxOptionsFromConfig()
|
|
179
|
-
const provider = resolveMdxComponents(root)
|
|
181
|
+
const userOptions = mdxOptionsFromConfig()
|
|
182
|
+
const provider = resolveMdxComponents(root)
|
|
180
183
|
|
|
181
184
|
// Resolve string/tuple plugin names (@next/mdx's serialized form) to actual
|
|
182
185
|
// plugin functions from the app's node_modules before handing them to MDX.
|
|
183
|
-
const resolveFrom = createRequire(path.join(root, 'noop.js'))
|
|
186
|
+
const resolveFrom = createRequire(path.join(root, 'noop.js'))
|
|
184
187
|
|
|
185
188
|
const [remarkPlugins, rehypePlugins, recmaPlugins] = await Promise.all([
|
|
186
189
|
resolvePlugins(userOptions.remarkPlugins ?? [], resolveFrom),
|
|
187
190
|
resolvePlugins(userOptions.rehypePlugins ?? [], resolveFrom),
|
|
188
191
|
resolvePlugins(userOptions.recmaPlugins ?? [], resolveFrom),
|
|
189
|
-
])
|
|
192
|
+
])
|
|
190
193
|
|
|
191
194
|
const compiled = await mdx.compile(
|
|
192
195
|
{ value: source, path: filePath },
|
|
@@ -213,7 +216,7 @@ export async function compileMdx(
|
|
|
213
216
|
? { providerImportSource: provider }
|
|
214
217
|
: {}),
|
|
215
218
|
},
|
|
216
|
-
)
|
|
219
|
+
)
|
|
217
220
|
|
|
218
|
-
return { code: compiled.toString() }
|
|
221
|
+
return { code: compiled.toString() }
|
|
219
222
|
}
|