@wular/pnext 0.0.4 → 0.0.7
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 +22 -16
- package/bin/pnext +6 -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 +87 -22
- package/reference/config.md +40 -93
- package/reference/css.md +42 -33
- package/reference/dev.md +26 -33
- package/reference/env.md +18 -20
- package/reference/getting-started.md +132 -0
- package/reference/metadata.md +31 -46
- package/reference/navigation.md +65 -105
- package/reference/performance.md +21 -142
- package/reference/rendering.md +78 -75
- package/reference/routing.md +97 -107
- package/reference/typegen.md +27 -29
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +121 -114
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +52 -53
- 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 +72 -64
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +94 -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 +802 -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 +32 -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 +2022 -1995
- package/src/{api → client}/router/types.ts +98 -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 +86 -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 +2087 -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 +87 -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 +954 -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 +428 -406
- package/src/styles.d.ts +9 -0
- package/src/types.ts +324 -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/reference/overview.md +0 -35
- 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,22 +6,22 @@
|
|
|
6
6
|
// Counting them needs no registry walk: an artifact goes stale exactly when its (profile, source)
|
|
7
7
|
// pair is renamed to a different artifact, and it only costs memory if it was ever imported. Both
|
|
8
8
|
// facts are known at the two call sites below, so the count is an O(1) side effect of compiling.
|
|
9
|
-
import { fileURLToPath } from 'node:url'
|
|
9
|
+
import { fileURLToPath } from 'node:url'
|
|
10
10
|
|
|
11
11
|
/** Current artifact per `${profile}:${file}`. */
|
|
12
|
-
const liveNames = new Map<string, string>()
|
|
12
|
+
const liveNames = new Map<string, string>()
|
|
13
13
|
/** Artifacts that actually entered the ES module registry. */
|
|
14
|
-
const imported = new Set<string>()
|
|
15
|
-
let stale = 0
|
|
14
|
+
const imported = new Set<string>()
|
|
15
|
+
let stale = 0
|
|
16
16
|
|
|
17
17
|
/** Record that `outFile` is now the artifact for `key` (`${profile}:${file}`). */
|
|
18
18
|
export function noteModuleGeneration(key: string, outFile: string) {
|
|
19
|
-
const previous = liveNames.get(key)
|
|
19
|
+
const previous = liveNames.get(key)
|
|
20
20
|
if (previous !== outFile) {
|
|
21
|
-
liveNames.set(key, outFile)
|
|
21
|
+
liveNames.set(key, outFile)
|
|
22
22
|
// Only a generation the registry actually holds costs memory; one that was
|
|
23
23
|
// compiled and superseded before any import cost disk alone.
|
|
24
|
-
if (previous !== undefined && imported.delete(previous)) stale += 1
|
|
24
|
+
if (previous !== undefined && imported.delete(previous)) stale += 1
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
|
|
@@ -29,10 +29,10 @@ export function noteModuleGeneration(key: string, outFile: string) {
|
|
|
29
29
|
export function noteModuleImported(href: string) {
|
|
30
30
|
// Named as a path on the compile side, imported as an href: normalise through
|
|
31
31
|
// the same URL codec both sides use, or every entry would look never-imported.
|
|
32
|
-
imported.add(href.startsWith('file:') ? fileURLToPath(href) : href)
|
|
32
|
+
imported.add(href.startsWith('file:') ? fileURLToPath(href) : href)
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
/** Live and superseded registry generations of compiled server modules. */
|
|
36
36
|
export function moduleGenerationStats() {
|
|
37
|
-
return { live: imported.size, stale }
|
|
37
|
+
return { live: imported.size, stale }
|
|
38
38
|
}
|
|
@@ -4,14 +4,16 @@
|
|
|
4
4
|
//
|
|
5
5
|
// esbuild's bundler is still load-bearing for a handful of shapes (below); `transformBailReason` sniffs
|
|
6
6
|
// those out per file and the caller falls back to the esbuild build for them. Same pipeline in dev and prod.
|
|
7
|
-
import type { TransformOptions } from 'oxc-transform'
|
|
7
|
+
import type { TransformOptions } from 'oxc-transform'
|
|
8
8
|
|
|
9
9
|
// Lazy: the native binding costs ~3.6 MB RSS and a prod server never transforms.
|
|
10
10
|
const transformSync: typeof import('oxc-transform').transformSync = (...args) =>
|
|
11
11
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
12
|
-
loadNative(() => require('oxc-transform') as typeof import('oxc-transform')).transformSync(
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
loadNative(() => require('oxc-transform') as typeof import('oxc-transform')).transformSync(
|
|
13
|
+
...args,
|
|
14
|
+
)
|
|
15
|
+
import { loadNative } from '../utils/native-require'
|
|
16
|
+
import { isCommonJsModuleSource } from '../resolve/imports'
|
|
15
17
|
|
|
16
18
|
/** Why a source cannot take the transform path — one per esbuild-only shape. */
|
|
17
19
|
export type TransformBailReason =
|
|
@@ -20,23 +22,27 @@ export type TransformBailReason =
|
|
|
20
22
|
| 'enum' // oxc's enum lowering omits `E || {}`, breaking declaration merging
|
|
21
23
|
| 'helpers' // the transform needed @oxc-project/runtime helper imports
|
|
22
24
|
| 'parse-error'
|
|
23
|
-
| 'specifier'
|
|
25
|
+
| 'specifier' // a specifier the bundler resolves by inlining (assets with a
|
|
24
26
|
// loader rule, `#subpath` facades, require-aliases)
|
|
25
27
|
|
|
26
28
|
// `import(` whose argument is not a string literal — esbuild turns those into a
|
|
27
29
|
// `__glob({...})` map of the matching directory, which needs the bundler.
|
|
28
|
-
const NON_LITERAL_DYNAMIC_IMPORT = /\bimport\s*\(\s*(?!['"])[^)]
|
|
29
|
-
const REQUIRE_CALL = /\brequire\s*\(
|
|
30
|
-
const COMMONJS_EXPORTS = /\bmodule\.exports\b|\bexports\s*\.\s*[A-Za-z_$]
|
|
31
|
-
const ENUM_DECLARATION = /(?:^|[^.\w$])enum\s+[A-Za-z_$]
|
|
30
|
+
const NON_LITERAL_DYNAMIC_IMPORT = /\bimport\s*\(\s*(?!['"])[^)]/
|
|
31
|
+
const REQUIRE_CALL = /\brequire\s*\(/
|
|
32
|
+
const COMMONJS_EXPORTS = /\bmodule\.exports\b|\bexports\s*\.\s*[A-Za-z_$]/
|
|
33
|
+
const ENUM_DECLARATION = /(?:^|[^.\w$])enum\s+[A-Za-z_$]/
|
|
32
34
|
|
|
33
35
|
export function transformBailReason(source: string, file: string): TransformBailReason | undefined {
|
|
34
|
-
if (
|
|
35
|
-
|
|
36
|
+
if (
|
|
37
|
+
REQUIRE_CALL.test(source) ||
|
|
38
|
+
COMMONJS_EXPORTS.test(source) ||
|
|
39
|
+
isCommonJsModuleSource(source, file)
|
|
40
|
+
) {
|
|
41
|
+
return 'commonjs'
|
|
36
42
|
}
|
|
37
|
-
if (NON_LITERAL_DYNAMIC_IMPORT.test(source)) return 'glob-import'
|
|
38
|
-
if (ENUM_DECLARATION.test(source)) return 'enum'
|
|
39
|
-
return undefined
|
|
43
|
+
if (NON_LITERAL_DYNAMIC_IMPORT.test(source)) return 'glob-import'
|
|
44
|
+
if (ENUM_DECLARATION.test(source)) return 'enum'
|
|
45
|
+
return undefined
|
|
40
46
|
}
|
|
41
47
|
|
|
42
48
|
/**
|
|
@@ -55,67 +61,67 @@ export function transformServerModule(
|
|
|
55
61
|
// lowering plugins are expensive on the transform line.
|
|
56
62
|
sourcemap: false,
|
|
57
63
|
...(define ? { define } : {}),
|
|
58
|
-
}
|
|
59
|
-
const result = transformSync(file, source, options)
|
|
60
|
-
if (result.errors.length > 0) return { bail: 'parse-error' }
|
|
64
|
+
}
|
|
65
|
+
const result = transformSync(file, source, options)
|
|
66
|
+
if (result.errors.length > 0) return { bail: 'parse-error' }
|
|
61
67
|
// Runtime helpers would import `@oxc-project/runtime`, which the app does not
|
|
62
68
|
// have; esbuild inlines its equivalents, so hand those sources back to it.
|
|
63
|
-
if (Object.keys(result.helpersUsed).length > 0) return { bail: 'helpers' }
|
|
64
|
-
return { code: dropUnreferencedImports(result.code) }
|
|
69
|
+
if (Object.keys(result.helpersUsed).length > 0) return { bail: 'helpers' }
|
|
70
|
+
return { code: dropUnreferencedImports(result.code) }
|
|
65
71
|
}
|
|
66
72
|
|
|
67
73
|
// `.ts` forbids JSX (`<T>x` is a type assertion); `.js`/`.jsx` app modules may
|
|
68
74
|
// contain JSX, matching the esbuild build's `loader: { '.js': 'jsx' }`.
|
|
69
75
|
function langForFile(file: string): 'ts' | 'tsx' | 'jsx' {
|
|
70
|
-
if (/\.[mc]?ts$/.test(file)) return 'ts'
|
|
71
|
-
if (file.endsWith('.tsx')) return 'tsx'
|
|
72
|
-
return 'jsx'
|
|
76
|
+
if (/\.[mc]?ts$/.test(file)) return 'ts'
|
|
77
|
+
if (file.endsWith('.tsx')) return 'tsx'
|
|
78
|
+
return 'jsx'
|
|
73
79
|
}
|
|
74
80
|
|
|
75
81
|
// --------------------------------------------------------------------------
|
|
76
82
|
// emitted-module specifier scan
|
|
77
83
|
// --------------------------------------------------------------------------
|
|
78
84
|
|
|
79
|
-
export type SpecifierKind = 'import-statement' | 'dynamic-import'
|
|
85
|
+
export type SpecifierKind = 'import-statement' | 'dynamic-import'
|
|
80
86
|
|
|
81
87
|
export interface FoundSpecifier {
|
|
82
|
-
start: number
|
|
83
|
-
end: number
|
|
84
|
-
value: string
|
|
85
|
-
kind: SpecifierKind
|
|
88
|
+
start: number
|
|
89
|
+
end: number
|
|
90
|
+
value: string
|
|
91
|
+
kind: SpecifierKind
|
|
86
92
|
}
|
|
87
93
|
|
|
88
94
|
const SPECIFIER_RE =
|
|
89
|
-
/(?:^|[\n;{}])\s*(?:import|export)\b[^;'"]*?\bfrom\s*("[^"]*"|'[^']*')|(?:^|[\n;{}])\s*import\s*("[^"]*"|'[^']*')|\bimport\s*\(\s*("[^"]*"|'[^']*')\s*\)/g
|
|
95
|
+
/(?:^|[\n;{}])\s*(?:import|export)\b[^;'"]*?\bfrom\s*("[^"]*"|'[^']*')|(?:^|[\n;{}])\s*import\s*("[^"]*"|'[^']*')|\bimport\s*\(\s*("[^"]*"|'[^']*')\s*\)/g
|
|
90
96
|
|
|
91
97
|
/** Every module specifier in emitted ESM, with the span of its string literal. */
|
|
92
98
|
export function outputSpecifiers(code: string): FoundSpecifier[] {
|
|
93
|
-
const found: FoundSpecifier[] = []
|
|
94
|
-
SPECIFIER_RE.lastIndex = 0
|
|
95
|
-
let match: RegExpExecArray | null
|
|
99
|
+
const found: FoundSpecifier[] = []
|
|
100
|
+
SPECIFIER_RE.lastIndex = 0
|
|
101
|
+
let match: RegExpExecArray | null
|
|
96
102
|
while ((match = SPECIFIER_RE.exec(code))) {
|
|
97
103
|
for (let group = 1; group <= 3; group += 1) {
|
|
98
|
-
const literal = match[group]
|
|
99
|
-
if (literal === undefined) continue
|
|
100
|
-
const start = match.index + match[0].lastIndexOf(literal)
|
|
104
|
+
const literal = match[group]
|
|
105
|
+
if (literal === undefined) continue
|
|
106
|
+
const start = match.index + match[0].lastIndexOf(literal)
|
|
101
107
|
found.push({
|
|
102
108
|
start,
|
|
103
109
|
end: start + literal.length,
|
|
104
110
|
value: literal.slice(1, -1),
|
|
105
111
|
kind: group === 3 ? 'dynamic-import' : 'import-statement',
|
|
106
|
-
})
|
|
112
|
+
})
|
|
107
113
|
}
|
|
108
114
|
}
|
|
109
|
-
return found
|
|
115
|
+
return found
|
|
110
116
|
}
|
|
111
117
|
|
|
112
118
|
/** Apply `{start, end, value}` replacements to `code` (spans must not overlap). */
|
|
113
119
|
export function spliceSource(code: string, edits: { start: number; end: number; value: string }[]) {
|
|
114
|
-
let next = code
|
|
120
|
+
let next = code
|
|
115
121
|
for (const edit of [...edits].sort((a, b) => b.start - a.start)) {
|
|
116
|
-
next = `${next.slice(0, edit.start)}${edit.value}${next.slice(edit.end)}
|
|
122
|
+
next = `${next.slice(0, edit.start)}${edit.value}${next.slice(edit.end)}`
|
|
117
123
|
}
|
|
118
|
-
return next
|
|
124
|
+
return next
|
|
119
125
|
}
|
|
120
126
|
|
|
121
127
|
// --------------------------------------------------------------------------
|
|
@@ -123,7 +129,7 @@ export function spliceSource(code: string, edits: { start: number; end: number;
|
|
|
123
129
|
// --------------------------------------------------------------------------
|
|
124
130
|
|
|
125
131
|
const IMPORT_STATEMENT_RE =
|
|
126
|
-
/(?:^|\n)[ \t]*import\s+([A-Za-z_$][\w$]*\s*,\s*)?(?:\*\s*as\s+([A-Za-z_$][\w$]*)|\{([^}]*)\}|([A-Za-z_$][\w$]*))\s+from\s*(?:"[^"]*"|'[^']*')\s*;?/g
|
|
132
|
+
/(?:^|\n)[ \t]*import\s+([A-Za-z_$][\w$]*\s*,\s*)?(?:\*\s*as\s+([A-Za-z_$][\w$]*)|\{([^}]*)\}|([A-Za-z_$][\w$]*))\s+from\s*(?:"[^"]*"|'[^']*')\s*;?/g
|
|
127
133
|
|
|
128
134
|
/**
|
|
129
135
|
* oxc keeps an import whose only uses were type positions it could not see through; the emitted module then
|
|
@@ -133,49 +139,52 @@ const IMPORT_STATEMENT_RE =
|
|
|
133
139
|
* Side-effect-only `import 'x'` never matches this pattern and is always kept.
|
|
134
140
|
*/
|
|
135
141
|
export function dropUnreferencedImports(code: string) {
|
|
136
|
-
const statements: { start: number; end: number; names: string[] }[] = []
|
|
137
|
-
IMPORT_STATEMENT_RE.lastIndex = 0
|
|
138
|
-
let match: RegExpExecArray | null
|
|
142
|
+
const statements: { start: number; end: number; names: string[] }[] = []
|
|
143
|
+
IMPORT_STATEMENT_RE.lastIndex = 0
|
|
144
|
+
let match: RegExpExecArray | null
|
|
139
145
|
while ((match = IMPORT_STATEMENT_RE.exec(code))) {
|
|
140
|
-
const [text, defaultWithNamed, namespace, named, defaultOnly] = match
|
|
141
|
-
const names: string[] = []
|
|
142
|
-
if (defaultWithNamed) names.push(defaultWithNamed.replace(/\s*,\s*$/, '').trim())
|
|
143
|
-
if (namespace) names.push(namespace)
|
|
144
|
-
if (defaultOnly) names.push(defaultOnly)
|
|
146
|
+
const [text, defaultWithNamed, namespace, named, defaultOnly] = match
|
|
147
|
+
const names: string[] = []
|
|
148
|
+
if (defaultWithNamed) names.push(defaultWithNamed.replace(/\s*,\s*$/, '').trim())
|
|
149
|
+
if (namespace) names.push(namespace)
|
|
150
|
+
if (defaultOnly) names.push(defaultOnly)
|
|
145
151
|
if (named !== undefined) {
|
|
146
152
|
for (const part of named.split(',')) {
|
|
147
|
-
const local = part
|
|
153
|
+
const local = part
|
|
154
|
+
.split(/\bas\b/)
|
|
155
|
+
.pop()
|
|
156
|
+
?.trim()
|
|
148
157
|
// An unparsed clause (comments, odd spacing) yields no local name: keep.
|
|
149
|
-
if (!local) continue
|
|
150
|
-
if (!/^[A-Za-z_$][\w$]*$/.test(local)) return code
|
|
151
|
-
names.push(local)
|
|
158
|
+
if (!local) continue
|
|
159
|
+
if (!/^[A-Za-z_$][\w$]*$/.test(local)) return code
|
|
160
|
+
names.push(local)
|
|
152
161
|
}
|
|
153
162
|
}
|
|
154
|
-
if (names.length === 0) continue
|
|
155
|
-
const leading = text.startsWith('\n') ? 1 : 0
|
|
156
|
-
statements.push({ start: match.index + leading, end: match.index + text.length, names })
|
|
163
|
+
if (names.length === 0) continue
|
|
164
|
+
const leading = text.startsWith('\n') ? 1 : 0
|
|
165
|
+
statements.push({ start: match.index + leading, end: match.index + text.length, names })
|
|
157
166
|
}
|
|
158
|
-
if (statements.length === 0) return code
|
|
167
|
+
if (statements.length === 0) return code
|
|
159
168
|
|
|
160
169
|
// Reference test runs against the module with every import statement cut out,
|
|
161
170
|
// so one import's bindings never count as a use of another's.
|
|
162
|
-
const gaps: string[] = []
|
|
163
|
-
let cursor = 0
|
|
171
|
+
const gaps: string[] = []
|
|
172
|
+
let cursor = 0
|
|
164
173
|
for (const statement of statements) {
|
|
165
|
-
gaps.push(code.slice(cursor, statement.start))
|
|
166
|
-
cursor = statement.end
|
|
174
|
+
gaps.push(code.slice(cursor, statement.start))
|
|
175
|
+
cursor = statement.end
|
|
167
176
|
}
|
|
168
|
-
gaps.push(code.slice(cursor))
|
|
169
|
-
const used = referencedNames(gaps.join('\n'))
|
|
170
|
-
const unused = statements.filter(statement => statement.names.every(name => !used.has(name)))
|
|
171
|
-
if (unused.length === 0) return code
|
|
177
|
+
gaps.push(code.slice(cursor))
|
|
178
|
+
const used = referencedNames(gaps.join('\n'))
|
|
179
|
+
const unused = statements.filter(statement => statement.names.every(name => !used.has(name)))
|
|
180
|
+
if (unused.length === 0) return code
|
|
172
181
|
return spliceSource(
|
|
173
182
|
code,
|
|
174
183
|
unused.map(({ start, end }) => ({ start, end, value: '' })),
|
|
175
|
-
)
|
|
184
|
+
)
|
|
176
185
|
}
|
|
177
186
|
|
|
178
|
-
const IDENTIFIER_RE = /[A-Za-z_$][\w$]*/g
|
|
187
|
+
const IDENTIFIER_RE = /[A-Za-z_$][\w$]*/g
|
|
179
188
|
|
|
180
189
|
/**
|
|
181
190
|
* Every identifier token that is not a member-access property name. A single
|
|
@@ -183,12 +192,12 @@ const IDENTIFIER_RE = /[A-Za-z_$][\w$]*/g;
|
|
|
183
192
|
* spread/rest operator (`...name`), which IS a reference.
|
|
184
193
|
*/
|
|
185
194
|
function referencedNames(body: string) {
|
|
186
|
-
const names = new Set<string>()
|
|
187
|
-
IDENTIFIER_RE.lastIndex = 0
|
|
188
|
-
let match: RegExpExecArray | null
|
|
195
|
+
const names = new Set<string>()
|
|
196
|
+
IDENTIFIER_RE.lastIndex = 0
|
|
197
|
+
let match: RegExpExecArray | null
|
|
189
198
|
while ((match = IDENTIFIER_RE.exec(body))) {
|
|
190
|
-
if (body[match.index - 1] === '.' && body[match.index - 2] !== '.') continue
|
|
191
|
-
names.add(match[0])
|
|
199
|
+
if (body[match.index - 1] === '.' && body[match.index - 2] !== '.') continue
|
|
200
|
+
names.add(match[0])
|
|
192
201
|
}
|
|
193
|
-
return names
|
|
202
|
+
return names
|
|
194
203
|
}
|