@wular/pnext 0.0.3 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -11
- package/bin/pnext +1 -1
- package/config/lint/base.js +7 -7
- package/config/ts/base.json +2 -4
- package/config/ts/react.json +2 -6
- package/package.json +23 -2
- package/reference/compat.md +1 -1
- package/reference/config.md +2 -2
- package/reference/css.md +13 -9
- package/reference/dev.md +1 -1
- package/reference/metadata.md +7 -7
- package/reference/navigation.md +35 -28
- package/reference/performance.md +70 -70
- package/reference/rendering.md +17 -17
- package/reference/routing.md +17 -17
- package/reference/typegen.md +12 -8
- package/src/api/cache.ts +36 -37
- package/src/api/client-cache.ts +2 -2
- package/src/api/client-navigation.ts +113 -109
- package/src/api/dynamic.tsx +58 -55
- package/src/api/link.tsx +49 -52
- package/src/api/navigation.ts +59 -58
- package/src/api/server.ts +152 -144
- package/src/api/suspense.ts +4 -4
- package/src/cli/adapters/vercel-warm.ts +126 -121
- package/src/cli/adapters/vercel.ts +437 -443
- package/src/cli/analyze.ts +333 -144
- package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
- package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
- package/src/cli/build.ts +976 -978
- package/src/cli/create.ts +71 -63
- package/src/cli/dev.ts +116 -116
- package/src/cli/index.ts +88 -85
- package/src/cli/migrate/package-json.ts +73 -71
- package/src/cli/migrate/report.ts +32 -33
- package/src/cli/migrate/{index.ts → run.ts} +48 -49
- package/src/cli/migrate/scan.ts +46 -46
- package/src/cli/migrate/spinner.ts +9 -9
- package/src/cli/migrate/tsconfig.ts +35 -35
- package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
- package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
- package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
- package/src/cli/start.ts +65 -66
- package/src/{typegen.ts → cli/typegen.ts} +59 -59
- package/src/client/build.ts +794 -768
- package/src/client/chunk-fold.ts +245 -240
- package/src/client/{paths.ts → chunk-name.ts} +6 -6
- package/src/client/entry.ts +162 -147
- package/src/client/prebuilt.ts +231 -223
- package/src/client/profile.ts +29 -29
- package/src/client/react-compiler.ts +20 -15
- package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
- package/src/client/reference-stub.ts +51 -51
- package/src/client/reference.ts +19 -19
- package/src/{api → client}/router/events.ts +17 -17
- package/src/{api → client}/router/history.ts +16 -16
- package/src/{api → client}/router/hub.ts +52 -53
- package/src/{api/router.ts → client/router/index.ts} +61 -60
- package/src/{api → client}/router/policies.ts +24 -24
- package/src/{api → client}/router/runtime.ts +1988 -1961
- package/src/{api → client}/router/types.ts +93 -98
- package/src/compat/actions/client-plugin.ts +42 -43
- package/src/compat/actions/client-stub.ts +14 -14
- package/src/compat/actions/{action-client.ts → client.ts} +194 -193
- package/src/compat/actions/config.ts +63 -64
- package/src/compat/actions/detect.ts +68 -68
- package/src/compat/actions/discovery.ts +105 -105
- package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
- package/src/compat/actions/early-submit.ts +1 -1
- package/src/compat/actions/endpoint.ts +198 -198
- package/src/compat/actions/extensions.ts +811 -0
- package/src/compat/actions/flight.ts +23 -23
- package/src/compat/actions/form-state.ts +34 -34
- package/src/compat/actions/hoist.ts +382 -236
- package/src/compat/actions/ids.ts +7 -12
- package/src/compat/actions/index.ts +8 -8
- package/src/compat/actions/instances.ts +46 -46
- package/src/compat/actions/origin.ts +47 -48
- package/src/compat/actions/protocol.ts +22 -22
- package/src/compat/actions/registry.ts +19 -19
- package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
- package/src/compat/actions/rewrite.ts +125 -125
- package/src/compat/actions/{action-router.ts → router.ts} +10 -10
- package/src/compat/actions/serve.ts +132 -136
- package/src/compat/actions/server-tag.ts +4 -4
- package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
- package/src/compat/actions/unrecognized-error.ts +4 -4
- package/src/compat/{index.ts → aliases.ts} +112 -109
- package/src/compat/bundler/bun-externals.ts +18 -18
- package/src/compat/bundler/cjs-exports.ts +271 -223
- package/src/compat/bundler/config.ts +116 -111
- package/src/compat/bundler/externals.ts +12 -12
- package/src/compat/bundler/import-meta-url.ts +19 -19
- package/src/compat/bundler/modularize-imports.ts +36 -33
- package/src/compat/bundler/new-url-asset.ts +22 -24
- package/src/compat/bundler/optimize-package-imports.ts +111 -107
- package/src/compat/bundler/polyfill.ts +28 -28
- package/src/compat/bundler/react-compiler.ts +35 -29
- package/src/compat/bundler/react-profiler.tsx +11 -11
- package/src/compat/bundler/relay-transform.ts +48 -47
- package/src/compat/bundler/require-context.ts +119 -113
- package/src/compat/bundler/resolve-extensions.ts +19 -19
- package/src/compat/bundler/source-cache.ts +25 -25
- package/src/compat/bundler/static-imports.ts +7 -7
- package/src/compat/bundler/symlink-imports.ts +46 -46
- package/src/compat/bundler/tsconfig-paths.ts +13 -15
- package/src/compat/bundler/wasm.ts +58 -60
- package/src/compat/bundler/webpack-loaders.ts +254 -241
- package/src/compat/bundler/worker.ts +101 -104
- package/src/compat/cache/build-flags.ts +29 -29
- package/src/compat/cache/build-prerender-errors.ts +40 -44
- package/src/compat/cache/custom-handler.ts +60 -53
- package/src/compat/cache/fetch-patch.ts +240 -240
- package/src/compat/cache/handler.ts +27 -31
- package/src/compat/cache/modern-handler.ts +148 -126
- package/src/compat/cache/resume-data-cache.ts +47 -45
- package/src/compat/cache/revalidate.ts +233 -232
- package/src/compat/cache/runtime-error.ts +35 -35
- package/src/compat/cache/use-cache-transform.ts +442 -417
- package/src/compat/cache/use-cache.ts +650 -614
- package/src/compat/cache-control.ts +140 -142
- package/src/compat/client/base-path.ts +21 -20
- package/src/compat/client/css-order.ts +18 -18
- package/src/compat/client/errors/bare-boundary.ts +11 -11
- package/src/compat/client/errors/control-flow.ts +23 -23
- package/src/compat/client/errors/error-boundary.ts +61 -61
- package/src/compat/client/errors/global-error.ts +101 -91
- package/src/compat/client/errors/install.ts +71 -72
- package/src/compat/client/errors/lazy.ts +23 -23
- package/src/compat/client/errors/primitive-throw.ts +47 -45
- package/src/compat/client/errors/soft-refresh.ts +4 -4
- package/src/compat/client/link-status.ts +33 -33
- package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
- package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
- package/src/compat/client/navigation-scroll.ts +63 -63
- package/src/compat/client/optimistic-routing.ts +93 -88
- package/src/compat/client/prefetch-cache.ts +23 -24
- package/src/compat/client/route-announcer.ts +35 -35
- package/src/compat/client/segment-cache-policy.ts +20 -20
- package/src/compat/client/segment-cache.ts +309 -315
- package/src/compat/client/segment-prefetch.ts +127 -132
- package/src/compat/client/trailing-slash.ts +5 -4
- package/src/compat/css/chunking.ts +113 -116
- package/src/compat/css/inline-css.ts +21 -21
- package/src/compat/css/lightningcss.ts +37 -38
- package/src/compat/css/modules.ts +161 -175
- package/src/compat/css/nonce.ts +7 -7
- package/src/compat/css/sass-plugin.ts +18 -21
- package/src/compat/css/sass.ts +150 -152
- package/src/compat/css/styled-jsx-runtime.ts +27 -27
- package/src/compat/css/styled-jsx.ts +21 -21
- package/src/compat/edge-runtime.ts +27 -27
- package/src/compat/{adapter → export}/build-complete.ts +72 -75
- package/src/compat/export/client.ts +29 -31
- package/src/compat/export/{index.ts → emit.ts} +111 -110
- package/src/compat/export/standalone.ts +62 -54
- package/src/compat/image-optimizer/cache.ts +51 -49
- package/src/compat/image-optimizer/detect.ts +52 -52
- package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
- package/src/compat/image-optimizer/source.ts +77 -80
- package/src/compat/lifecycle/after-scope.ts +26 -26
- package/src/compat/lifecycle/after.ts +48 -45
- package/src/compat/lifecycle/error-funnel.ts +98 -102
- package/src/compat/lifecycle/error-serialize.ts +30 -26
- package/src/compat/lifecycle/error-ui.ts +67 -32
- package/src/compat/lifecycle/instrumentation-client.ts +36 -38
- package/src/compat/lifecycle/instrumentation.ts +85 -85
- package/src/compat/lifecycle/node-console.ts +11 -11
- package/src/compat/lifecycle/testmode.ts +160 -132
- package/src/compat/mdx/compile.ts +60 -57
- package/src/compat/mdx/plugin.ts +11 -11
- package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
- package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
- package/src/compat/metadata.ts +75 -81
- package/src/compat/next/cache.ts +68 -69
- package/src/compat/next/canonical-url.ts +9 -9
- package/src/compat/next/client-cache.ts +19 -19
- package/src/compat/next/client-navigation.ts +112 -116
- package/src/compat/next/client-only.ts +1 -1
- package/src/compat/next/client-script.tsx +99 -93
- package/src/compat/next/client-server.ts +10 -10
- package/src/compat/next/config-loader.ts +176 -173
- package/src/compat/next/config.ts +7 -7
- package/src/compat/next/constants.cjs +6 -6
- package/src/compat/next/constants.ts +6 -6
- package/src/compat/next/custom-server.ts +26 -24
- package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
- package/src/compat/next/dynamic.tsx +21 -18
- package/src/compat/next/error.tsx +52 -52
- package/src/compat/next/font/cache.ts +74 -74
- package/src/compat/next/font/google.ts +2 -2
- package/src/compat/next/font/index.ts +1 -1
- package/src/compat/next/font/local.ts +3 -3
- package/src/compat/next/font/runtime-client.ts +17 -15
- package/src/compat/next/font/runtime.ts +443 -408
- package/src/compat/next/font/shared.ts +120 -108
- package/src/compat/next/form.tsx +63 -63
- package/src/compat/next/head.tsx +2 -2
- package/src/compat/next/headers.ts +103 -95
- package/src/compat/next/image/client.tsx +220 -0
- package/src/compat/next/image/config.ts +56 -58
- package/src/compat/next/image/optimizer.ts +40 -36
- package/src/compat/next/image/patterns.ts +37 -40
- package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
- package/src/compat/next/image/shared.ts +65 -57
- package/src/compat/next/image/static-metadata.ts +98 -107
- package/src/compat/next/image/validate.ts +79 -88
- package/src/compat/next/image.tsx +19 -23
- package/src/compat/next/index.ts +1 -1
- package/src/compat/next/legacy-image.tsx +59 -60
- package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
- package/src/compat/next/link.tsx +158 -158
- package/src/compat/next/navigation.cjs +12 -3
- package/src/compat/next/navigation.ts +48 -50
- package/src/compat/next/offline.ts +27 -27
- package/src/compat/next/og.ts +121 -124
- package/src/compat/next/preferred-region.ts +13 -14
- package/src/compat/next/redirects.ts +58 -56
- package/src/compat/next/resource-hints.ts +73 -76
- package/src/compat/next/rewrites.ts +130 -133
- package/src/compat/next/root-params.ts +45 -45
- package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
- package/src/compat/next/router.cjs +4 -2
- package/src/compat/next/router.ts +58 -61
- package/src/compat/next/script.tsx +108 -108
- package/src/compat/next/server-only.ts +1 -1
- package/src/compat/next/server.ts +19 -19
- package/src/compat/next/svgr.ts +18 -17
- package/src/compat/next/telemetry.ts +24 -24
- package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
- package/src/compat/next/user-agent.ts +53 -49
- package/src/compat/next/web-vitals.ts +22 -24
- package/src/compat/otel/api.ts +41 -41
- package/src/compat/otel/client-trace-metadata.ts +25 -27
- package/src/compat/otel/fetch-span.ts +29 -29
- package/src/compat/otel/tracer.ts +331 -331
- package/src/compat/pages/api.ts +456 -0
- package/src/compat/pages/client-plugin.ts +36 -36
- package/src/compat/pages/router-state.ts +34 -34
- package/src/compat/pages/{index.ts → router.ts} +130 -135
- package/src/compat/ppr/io.ts +12 -12
- package/src/compat/ppr/missing-root-params.ts +34 -38
- package/src/compat/ppr/root-params-scan.ts +66 -66
- package/src/compat/ppr/root-params-transform.ts +24 -26
- package/src/compat/ppr/root-params.ts +30 -30
- package/src/compat/ppr/segment-config-incompat.ts +6 -7
- package/src/compat/protocol.ts +71 -70
- package/src/compat/react/action-state.ts +47 -48
- package/src/compat/react/client-lite.ts +15 -15
- package/src/compat/react/client.ts +4 -4
- package/src/compat/react/compiler-runtime.ts +11 -11
- package/src/compat/react/dom-client.ts +44 -44
- package/src/compat/react/dom-react-server.ts +10 -16
- package/src/compat/react/dom-server.ts +10 -10
- package/src/compat/react/dom.ts +52 -52
- package/src/compat/react/hooks-extra.ts +34 -35
- package/src/compat/react/parity.ts +64 -61
- package/src/compat/react/preact.ts +81 -82
- package/src/compat/react/react-server.ts +28 -28
- package/src/compat/react/router-shim.ts +1 -1
- package/src/compat/react/server-component-use.ts +8 -8
- package/src/compat/react/server-inserted-html.ts +30 -31
- package/src/compat/react/server.ts +53 -55
- package/src/compat/react/use.ts +32 -32
- package/src/compat/react/view-transition.ts +20 -20
- package/src/compat/register/actions.ts +35 -824
- package/src/compat/register/boot.ts +41 -41
- package/src/compat/register/build-tier.ts +5 -5
- package/src/compat/register/build.ts +74 -70
- package/src/compat/register/bundler.ts +161 -156
- package/src/compat/register/cache.ts +20 -20
- package/src/compat/register/client-errors.ts +3 -3
- package/src/compat/register/config.ts +6 -6
- package/src/compat/register/css-extras.ts +30 -34
- package/src/compat/register/edge-runtime.ts +3 -3
- package/src/compat/register/errors.ts +10 -12
- package/src/compat/register/export.ts +16 -16
- package/src/compat/register/font.ts +11 -11
- package/src/compat/register/hooks.ts +2 -2
- package/src/compat/register/image.ts +40 -40
- package/src/compat/register/index.ts +59 -62
- package/src/compat/register/instrumentation-client.ts +10 -10
- package/src/compat/register/lifecycle.ts +25 -28
- package/src/compat/register/mdx.ts +10 -10
- package/src/compat/register/middleware.ts +226 -16
- package/src/compat/register/otel.ts +80 -88
- package/src/compat/register/pages-api.ts +10 -463
- package/src/compat/register/ppr.ts +16 -16
- package/src/compat/register/protocol.ts +17 -18
- package/src/compat/register/proxy.ts +49 -51
- package/src/compat/register/render.ts +79 -76
- package/src/compat/register/routing.ts +162 -159
- package/src/compat/register/segment.ts +24 -1887
- package/src/compat/register/static-image.ts +3 -3
- package/src/compat/register/{misc.ts → taint.ts} +9 -9
- package/src/compat/register/typed-routes.ts +14 -14
- package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
- package/src/compat/register/validation.ts +18 -18
- package/src/compat/segment/loading-boundary.ts +43 -45
- package/src/compat/segment/page-slot.ts +69 -69
- package/src/compat/segment/serve.ts +1884 -0
- package/src/compat/segment/tree.ts +113 -112
- package/src/compat/segment/vary-key.ts +38 -38
- package/src/compat/segment/vary-params.ts +138 -142
- package/src/compat/static-params.ts +14 -12
- package/src/compat/tsconfig-defaults.ts +87 -91
- package/src/compat/typecheck/{index.ts → check.ts} +234 -212
- package/src/compat/typecheck/worker.ts +15 -12
- package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
- package/src/compat/typed-routes/manifest.ts +174 -170
- package/src/compat/typed-routes/typegen.ts +127 -110
- package/src/compat/validation/errors.ts +16 -19
- package/src/compat/validation/prerender-diagnostics.ts +521 -504
- package/src/compat/validation/{index.ts → validate.ts} +647 -648
- package/src/compat-bootstrap.ts +16 -16
- package/src/config.ts +69 -69
- package/src/css/build.ts +230 -227
- package/src/css/postcss.ts +79 -80
- package/src/css/worker.ts +14 -15
- package/src/dev/client-actions.ts +10 -10
- package/src/dev/client-chunk-store.ts +27 -27
- package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
- package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
- package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
- package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
- package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
- package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
- package/src/dev/server.ts +804 -820
- package/src/env.ts +46 -43
- package/src/extensions.ts +491 -478
- package/src/index.ts +8 -8
- package/src/internal.ts +20 -23
- package/src/{islands → render}/boundary-error.ts +3 -3
- package/src/render/hooks.ts +71 -71
- package/src/render/island-context.ts +14 -14
- package/src/render/metadata.ts +310 -310
- package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
- package/src/{ppr.ts → render/ppr.ts} +244 -245
- package/src/render/renderer.ts +2076 -2082
- package/src/render/resource-hints.ts +16 -17
- package/src/render/slots.tsx +224 -235
- package/src/{islands → render}/static-children.ts +9 -12
- package/src/{islands → render}/static-slots.ts +37 -37
- package/src/{cache/context.ts → request/cache.ts} +20 -20
- package/src/request/context.ts +107 -107
- package/src/{dynamic/source.ts → resolve/dynamic.ts} +152 -143
- package/src/resolve/engine.ts +90 -77
- package/src/resolve/imports.ts +475 -463
- package/src/resolve/scan-facts.ts +442 -186
- package/src/resolve/source-text.ts +37 -37
- package/src/{dynamic → resolve}/tree-shake.ts +132 -128
- package/src/routing/forwarded.ts +19 -19
- package/src/routing/handler.ts +84 -91
- package/src/routing/href.ts +69 -70
- package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
- package/src/{proxy.ts → routing/proxy.ts} +306 -312
- package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
- package/src/routing/routes.ts +833 -848
- package/src/routing/slots.ts +164 -160
- package/src/runtime/loader.ts +952 -0
- package/src/{dev → runtime}/module-cache.ts +309 -287
- package/src/{dev → runtime}/module-generations.ts +9 -9
- package/src/{dev → runtime}/module-transform.ts +81 -72
- package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
- package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
- package/src/runtime/vendor.ts +425 -404
- package/src/styles.d.ts +9 -0
- package/src/types.ts +320 -335
- package/src/utils/ansi.ts +5 -5
- package/src/utils/{source.ts → code.ts} +15 -12
- package/src/utils/content-type.ts +3 -3
- package/src/utils/decode.ts +2 -2
- package/src/utils/dev-profile.ts +13 -13
- package/src/utils/error-log.ts +6 -6
- package/src/utils/esbuild.ts +18 -18
- package/src/utils/fs-cache.ts +13 -13
- package/src/utils/fs.ts +57 -49
- package/src/utils/html.ts +20 -24
- package/src/utils/native-require.ts +8 -8
- package/src/utils/serialize.ts +139 -146
- package/src/utils/verbose.ts +18 -18
- package/src/cli/analyze-print.ts +0 -181
- package/src/compat/middleware/manifest.ts +0 -210
- package/src/compat/next/image-client.tsx +0 -215
- package/src/compat/next/link-usage.ts +0 -29
- package/src/css/index.ts +0 -2
- package/src/render/index.ts +0 -1
- package/src/style-modules.d.ts +0 -9
|
@@ -1,41 +1,36 @@
|
|
|
1
|
-
import { existsSync, lstatSync, readdirSync, readFileSync, symlinkSync } from 'node:fs'
|
|
2
|
-
import { createRequire } from 'node:module'
|
|
3
|
-
import path from 'node:path'
|
|
4
|
-
import type { Plugin } from 'esbuild'
|
|
5
|
-
import type { ResolvedConfig } from '../../config'
|
|
6
|
-
import { resolveImport } from '../../resolve/imports'
|
|
7
|
-
import { maybeLightningcssTransform } from './lightningcss'
|
|
1
|
+
import { existsSync, lstatSync, readdirSync, readFileSync, symlinkSync } from 'node:fs'
|
|
2
|
+
import { createRequire } from 'node:module'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import type { Plugin } from 'esbuild'
|
|
5
|
+
import type { ResolvedConfig } from '../../config'
|
|
6
|
+
import { resolveImport } from '../../resolve/imports'
|
|
7
|
+
import { maybeLightningcssTransform } from './lightningcss'
|
|
8
|
+
import { escapeRegex } from '../../utils/code'
|
|
8
9
|
|
|
9
10
|
interface ComposeRef {
|
|
10
|
-
names: string[]
|
|
11
|
-
from?: string
|
|
11
|
+
names: string[]
|
|
12
|
+
from?: string
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
interface CssModuleInfo {
|
|
15
|
-
classes: Set<string
|
|
16
|
-
composes: Map<string, ComposeRef[]
|
|
17
|
-
dependencies: string[]
|
|
16
|
+
classes: Set<string>
|
|
17
|
+
composes: Map<string, ComposeRef[]>
|
|
18
|
+
dependencies: string[]
|
|
18
19
|
}
|
|
19
20
|
|
|
20
|
-
const pagesCompatIgnoredSourceEntries = new Set([
|
|
21
|
-
'.next',
|
|
22
|
-
'.pnext',
|
|
23
|
-
'app',
|
|
24
|
-
'node_modules',
|
|
25
|
-
'pages',
|
|
26
|
-
]);
|
|
21
|
+
const pagesCompatIgnoredSourceEntries = new Set(['.next', '.pnext', 'app', 'node_modules', 'pages'])
|
|
27
22
|
|
|
28
23
|
export function materializeNextCssSources(config: ResolvedConfig) {
|
|
29
|
-
const generatedRoot = path.dirname(config.appPath)
|
|
30
|
-
if (path.basename(path.dirname(generatedRoot)) !== 'pnext-pages-compat') return
|
|
24
|
+
const generatedRoot = path.dirname(config.appPath)
|
|
25
|
+
if (path.basename(path.dirname(generatedRoot)) !== 'pnext-pages-compat') return
|
|
31
26
|
|
|
32
27
|
for (const entry of readdirSync(config.root)) {
|
|
33
|
-
if (pagesCompatIgnoredSourceEntries.has(entry)) continue
|
|
34
|
-
const source = path.join(config.root, entry)
|
|
35
|
-
const target = path.join(generatedRoot, entry)
|
|
36
|
-
if (existsSync(target)) continue
|
|
28
|
+
if (pagesCompatIgnoredSourceEntries.has(entry)) continue
|
|
29
|
+
const source = path.join(config.root, entry)
|
|
30
|
+
const target = path.join(generatedRoot, entry)
|
|
31
|
+
if (existsSync(target)) continue
|
|
37
32
|
try {
|
|
38
|
-
symlinkSync(source, target, lstatSync(source).isDirectory() ? 'dir' : 'file')
|
|
33
|
+
symlinkSync(source, target, lstatSync(source).isDirectory() ? 'dir' : 'file')
|
|
39
34
|
} catch {
|
|
40
35
|
// A concurrent materialization may have linked the same source already.
|
|
41
36
|
}
|
|
@@ -47,86 +42,86 @@ export function nextCssModuleChunkPlugin(config: ResolvedConfig): Plugin {
|
|
|
47
42
|
name: 'pnext-compat-css-modules',
|
|
48
43
|
setup(build) {
|
|
49
44
|
build.onLoad({ filter: /\.css$/ }, ({ path: file }) => {
|
|
50
|
-
const source = nextCssSource(file, config.root)
|
|
45
|
+
const source = nextCssSource(file, config.root)
|
|
51
46
|
const contents = file.endsWith('.module.css')
|
|
52
47
|
? transformCssModule(readFileSync(source, 'utf8'), source, config.root)
|
|
53
|
-
: rewriteTransparentBodyChildren(readFileSync(source, 'utf8'))
|
|
48
|
+
: rewriteTransparentBodyChildren(readFileSync(source, 'utf8'))
|
|
54
49
|
return {
|
|
55
50
|
// No-op unless next.config enables experimental.useLightningcss.
|
|
56
51
|
contents: maybeLightningcssTransform(contents, source, config.root),
|
|
57
52
|
loader: 'css',
|
|
58
53
|
resolveDir: path.dirname(source),
|
|
59
|
-
}
|
|
60
|
-
})
|
|
54
|
+
}
|
|
55
|
+
})
|
|
61
56
|
},
|
|
62
|
-
}
|
|
57
|
+
}
|
|
63
58
|
}
|
|
64
59
|
|
|
65
60
|
export function nextCssResolveModule(config: ResolvedConfig) {
|
|
66
61
|
return (file: string): Record<string, string> | undefined =>
|
|
67
|
-
isCssModuleFile(file) ? cssModuleMapping(file, config.root) : undefined
|
|
62
|
+
isCssModuleFile(file) ? cssModuleMapping(file, config.root) : undefined
|
|
68
63
|
}
|
|
69
64
|
|
|
70
65
|
export function nextCssLoadModuleForClient(config: ResolvedConfig) {
|
|
71
66
|
return (file: string): string | undefined =>
|
|
72
67
|
isCssModuleFile(file)
|
|
73
68
|
? `export default ${JSON.stringify(cssModuleMapping(file, config.root))};`
|
|
74
|
-
: undefined
|
|
69
|
+
: undefined
|
|
75
70
|
}
|
|
76
71
|
|
|
77
72
|
export function nextCssResolveDependency(config: ResolvedConfig) {
|
|
78
|
-
const requires = new Map<string, NodeJS.Require>()
|
|
73
|
+
const requires = new Map<string, NodeJS.Require>()
|
|
79
74
|
return (_root: string, fromFile: string, specifier: string): string | undefined => {
|
|
80
|
-
if (specifier.startsWith('.') || path.isAbsolute(specifier)) return undefined
|
|
81
|
-
const source = nextCssSource(fromFile, config.root)
|
|
82
|
-
let require = requires.get(source)
|
|
75
|
+
if (specifier.startsWith('.') || path.isAbsolute(specifier)) return undefined
|
|
76
|
+
const source = nextCssSource(fromFile, config.root)
|
|
77
|
+
let require = requires.get(source)
|
|
83
78
|
if (!require) {
|
|
84
|
-
require = createRequire(source)
|
|
85
|
-
requires.set(source, require)
|
|
79
|
+
require = createRequire(source)
|
|
80
|
+
requires.set(source, require)
|
|
86
81
|
}
|
|
87
82
|
try {
|
|
88
|
-
const resolved = require.resolve(specifier)
|
|
89
|
-
return isCssDependency(resolved) ? resolved : undefined
|
|
83
|
+
const resolved = require.resolve(specifier)
|
|
84
|
+
return isCssDependency(resolved) ? resolved : undefined
|
|
90
85
|
} catch {
|
|
91
|
-
return undefined
|
|
86
|
+
return undefined
|
|
92
87
|
}
|
|
93
|
-
}
|
|
88
|
+
}
|
|
94
89
|
}
|
|
95
90
|
|
|
96
91
|
function isCssModuleFile(file: string) {
|
|
97
|
-
return file.endsWith('.module.css')
|
|
92
|
+
return file.endsWith('.module.css')
|
|
98
93
|
}
|
|
99
94
|
|
|
100
95
|
function isCssDependency(file: string) {
|
|
101
|
-
return /\.(?:css|scss|sass)$/.test(file)
|
|
96
|
+
return /\.(?:css|scss|sass)$/.test(file)
|
|
102
97
|
}
|
|
103
98
|
|
|
104
99
|
function cssModuleMapping(file: string, root: string) {
|
|
105
|
-
file = nextCssSource(file, root)
|
|
106
|
-
const cache = new Map<string, CssModuleInfo>()
|
|
107
|
-
const info = moduleInfo(file, root, cache)
|
|
100
|
+
file = nextCssSource(file, root)
|
|
101
|
+
const cache = new Map<string, CssModuleInfo>()
|
|
102
|
+
const info = moduleInfo(file, root, cache)
|
|
108
103
|
return Object.fromEntries(
|
|
109
104
|
[...info.classes].map(className => [
|
|
110
105
|
className,
|
|
111
106
|
classValue(file, className, root, cache, new Set()),
|
|
112
107
|
]),
|
|
113
|
-
)
|
|
108
|
+
)
|
|
114
109
|
}
|
|
115
110
|
|
|
116
111
|
export function nextCssSource(file: string, root: string) {
|
|
117
|
-
const resolved = path.resolve(file)
|
|
118
|
-
const parts = resolved.split(path.sep)
|
|
112
|
+
const resolved = path.resolve(file)
|
|
113
|
+
const parts = resolved.split(path.sep)
|
|
119
114
|
// Matched on the cache segments alone: the out dir above them is configurable
|
|
120
115
|
// (distDir) and gains a `dev/` level under a dev server.
|
|
121
116
|
const buildClientIndex = parts.findIndex(
|
|
122
117
|
(_, index) => parts.slice(index, index + 3).join('/') === 'cache/server/build-client',
|
|
123
|
-
)
|
|
118
|
+
)
|
|
124
119
|
if (buildClientIndex !== -1) {
|
|
125
|
-
const source = path.join(root, ...parts.slice(buildClientIndex + 3))
|
|
126
|
-
if (existsSync(source)) return source
|
|
120
|
+
const source = path.join(root, ...parts.slice(buildClientIndex + 3))
|
|
121
|
+
if (existsSync(source)) return source
|
|
127
122
|
}
|
|
128
|
-
const generatedIndex = parts.lastIndexOf('pnext-pages-compat')
|
|
129
|
-
const relative = generatedIndex === -1 ? undefined : parts.slice(generatedIndex + 2)
|
|
123
|
+
const generatedIndex = parts.lastIndexOf('pnext-pages-compat')
|
|
124
|
+
const relative = generatedIndex === -1 ? undefined : parts.slice(generatedIndex + 2)
|
|
130
125
|
if (relative?.length) {
|
|
131
126
|
const source = path.join(
|
|
132
127
|
root,
|
|
@@ -135,70 +130,65 @@ export function nextCssSource(file: string, root: string) {
|
|
|
135
130
|
: relative[0] === 'source-pages'
|
|
136
131
|
? ['pages', ...relative.slice(1)]
|
|
137
132
|
: relative),
|
|
138
|
-
)
|
|
139
|
-
if (existsSync(source)) return source
|
|
133
|
+
)
|
|
134
|
+
if (existsSync(source)) return source
|
|
140
135
|
}
|
|
141
136
|
|
|
142
|
-
return resolved
|
|
137
|
+
return resolved
|
|
143
138
|
}
|
|
144
139
|
|
|
145
140
|
function rewriteTransparentBodyChildren(source: string) {
|
|
146
141
|
return source.replace(
|
|
147
142
|
/body\s*>\s*(-?[_a-zA-Z][\w-]*)/g,
|
|
148
|
-
(_, element: string) =>
|
|
149
|
-
|
|
150
|
-
);
|
|
143
|
+
(_, element: string) => `:is(body>${element},body :where(pnext-layout,#pnext-page)>${element})`,
|
|
144
|
+
)
|
|
151
145
|
}
|
|
152
146
|
|
|
153
147
|
function transformCssModule(source: string, file: string, root: string) {
|
|
154
|
-
const info = moduleInfoFromSource(source, file, root)
|
|
155
|
-
const imports = info.dependencies.map(dep => `@import ${JSON.stringify(dep)};`).join('\n')
|
|
156
|
-
const css = scopeKeyframes(rewriteModuleSelectors(stripComposes(source), file), file)
|
|
157
|
-
return [imports, css].filter(Boolean).join('\n')
|
|
148
|
+
const info = moduleInfoFromSource(source, file, root)
|
|
149
|
+
const imports = info.dependencies.map(dep => `@import ${JSON.stringify(dep)};`).join('\n')
|
|
150
|
+
const css = scopeKeyframes(rewriteModuleSelectors(stripComposes(source), file), file)
|
|
151
|
+
return [imports, css].filter(Boolean).join('\n')
|
|
158
152
|
}
|
|
159
153
|
|
|
160
|
-
function moduleInfo(
|
|
161
|
-
file
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
)
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
if (cached) return cached;
|
|
168
|
-
const info = moduleInfoFromSource(readFileSync(key, 'utf8'), key, root);
|
|
169
|
-
cache.set(key, info);
|
|
170
|
-
return info;
|
|
154
|
+
function moduleInfo(file: string, root: string, cache: Map<string, CssModuleInfo>): CssModuleInfo {
|
|
155
|
+
const key = path.resolve(file)
|
|
156
|
+
const cached = cache.get(key)
|
|
157
|
+
if (cached) return cached
|
|
158
|
+
const info = moduleInfoFromSource(readFileSync(key, 'utf8'), key, root)
|
|
159
|
+
cache.set(key, info)
|
|
160
|
+
return info
|
|
171
161
|
}
|
|
172
162
|
|
|
173
163
|
function moduleInfoFromSource(source: string, file: string, root: string): CssModuleInfo {
|
|
174
|
-
const classes = cssClassNames(source)
|
|
175
|
-
const composes = new Map<string, ComposeRef[]>()
|
|
176
|
-
const dependencies: string[] = []
|
|
177
|
-
const seenDependencies = new Set<string>()
|
|
178
|
-
const rulePattern = /(^|})([^{}]+)\{([^{}]*)\}/g
|
|
179
|
-
let match: RegExpExecArray | null
|
|
164
|
+
const classes = cssClassNames(source)
|
|
165
|
+
const composes = new Map<string, ComposeRef[]>()
|
|
166
|
+
const dependencies: string[] = []
|
|
167
|
+
const seenDependencies = new Set<string>()
|
|
168
|
+
const rulePattern = /(^|})([^{}]+)\{([^{}]*)\}/g
|
|
169
|
+
let match: RegExpExecArray | null
|
|
180
170
|
|
|
181
171
|
while ((match = rulePattern.exec(source))) {
|
|
182
|
-
const [, , selector, body] = match
|
|
183
|
-
if (!selector || !body) continue
|
|
184
|
-
const localClasses = selectorClassNames(selector).filter(className => classes.has(className))
|
|
185
|
-
if (localClasses.length === 0) continue
|
|
172
|
+
const [, , selector, body] = match
|
|
173
|
+
if (!selector || !body) continue
|
|
174
|
+
const localClasses = selectorClassNames(selector).filter(className => classes.has(className))
|
|
175
|
+
if (localClasses.length === 0) continue
|
|
186
176
|
|
|
187
177
|
for (const ref of composeRefs(body)) {
|
|
188
178
|
for (const localClass of localClasses) {
|
|
189
|
-
const refs = composes.get(localClass) ?? []
|
|
190
|
-
refs.push(ref)
|
|
191
|
-
composes.set(localClass, refs)
|
|
179
|
+
const refs = composes.get(localClass) ?? []
|
|
180
|
+
refs.push(ref)
|
|
181
|
+
composes.set(localClass, refs)
|
|
192
182
|
}
|
|
193
|
-
if (!ref.from || ref.from === 'global') continue
|
|
194
|
-
const dependency = resolveCssModuleImport(root, file, ref.from)
|
|
195
|
-
if (!dependency || seenDependencies.has(dependency)) continue
|
|
196
|
-
dependencies.push(dependency)
|
|
197
|
-
seenDependencies.add(dependency)
|
|
183
|
+
if (!ref.from || ref.from === 'global') continue
|
|
184
|
+
const dependency = resolveCssModuleImport(root, file, ref.from)
|
|
185
|
+
if (!dependency || seenDependencies.has(dependency)) continue
|
|
186
|
+
dependencies.push(dependency)
|
|
187
|
+
seenDependencies.add(dependency)
|
|
198
188
|
}
|
|
199
189
|
}
|
|
200
190
|
|
|
201
|
-
return { classes, composes, dependencies }
|
|
191
|
+
return { classes, composes, dependencies }
|
|
202
192
|
}
|
|
203
193
|
|
|
204
194
|
function classValue(
|
|
@@ -208,72 +198,72 @@ function classValue(
|
|
|
208
198
|
cache: Map<string, CssModuleInfo>,
|
|
209
199
|
stack: Set<string>,
|
|
210
200
|
): string {
|
|
211
|
-
const key = `${path.resolve(file)}\0${className}
|
|
212
|
-
if (stack.has(key)) return cssModuleClassName(file, className)
|
|
213
|
-
stack.add(key)
|
|
201
|
+
const key = `${path.resolve(file)}\0${className}`
|
|
202
|
+
if (stack.has(key)) return cssModuleClassName(file, className)
|
|
203
|
+
stack.add(key)
|
|
214
204
|
|
|
215
|
-
const info = moduleInfo(file, root, cache)
|
|
216
|
-
const parts = [cssModuleClassName(file, className)]
|
|
205
|
+
const info = moduleInfo(file, root, cache)
|
|
206
|
+
const parts = [cssModuleClassName(file, className)]
|
|
217
207
|
for (const ref of info.composes.get(className) ?? []) {
|
|
218
208
|
if (ref.from === 'global') {
|
|
219
|
-
parts.push(...ref.names)
|
|
220
|
-
continue
|
|
209
|
+
parts.push(...ref.names)
|
|
210
|
+
continue
|
|
221
211
|
}
|
|
222
|
-
const refFile = ref.from ? resolveCssModuleImport(root, file, ref.from) : file
|
|
223
|
-
if (!refFile) continue
|
|
224
|
-
const refInfo = moduleInfo(refFile, root, cache)
|
|
212
|
+
const refFile = ref.from ? resolveCssModuleImport(root, file, ref.from) : file
|
|
213
|
+
if (!refFile) continue
|
|
214
|
+
const refInfo = moduleInfo(refFile, root, cache)
|
|
225
215
|
for (const name of ref.names) {
|
|
226
|
-
if (!refInfo.classes.has(name)) continue
|
|
227
|
-
parts.push(...classValue(refFile, name, root, cache, stack).split(/\s+/))
|
|
216
|
+
if (!refInfo.classes.has(name)) continue
|
|
217
|
+
parts.push(...classValue(refFile, name, root, cache, stack).split(/\s+/))
|
|
228
218
|
}
|
|
229
219
|
}
|
|
230
220
|
|
|
231
|
-
stack.delete(key)
|
|
232
|
-
return [...new Set(parts)].join(' ')
|
|
221
|
+
stack.delete(key)
|
|
222
|
+
return [...new Set(parts)].join(' ')
|
|
233
223
|
}
|
|
234
224
|
|
|
235
225
|
function composeRefs(body: string): ComposeRef[] {
|
|
236
|
-
const refs: ComposeRef[] = []
|
|
237
|
-
const pattern = /\bcomposes\s*:\s*([^;]+);/g
|
|
238
|
-
let match: RegExpExecArray | null
|
|
226
|
+
const refs: ComposeRef[] = []
|
|
227
|
+
const pattern = /\bcomposes\s*:\s*([^;]+);/g
|
|
228
|
+
let match: RegExpExecArray | null
|
|
239
229
|
|
|
240
230
|
while ((match = pattern.exec(body))) {
|
|
241
|
-
const value = match[1]?.trim()
|
|
242
|
-
if (!value) continue
|
|
243
|
-
const fromMatch = /^(.+?)\s+from\s+(['"]?)([^'"]+)\2$/.exec(value)
|
|
244
|
-
const names = (fromMatch?.[1] ?? value).split(/\s+/).filter(Boolean)
|
|
245
|
-
if (names.length === 0) continue
|
|
246
|
-
refs.push({ names, ...(fromMatch?.[3] ? { from: fromMatch[3] } : {}) })
|
|
231
|
+
const value = match[1]?.trim()
|
|
232
|
+
if (!value) continue
|
|
233
|
+
const fromMatch = /^(.+?)\s+from\s+(['"]?)([^'"]+)\2$/.exec(value)
|
|
234
|
+
const names = (fromMatch?.[1] ?? value).split(/\s+/).filter(Boolean)
|
|
235
|
+
if (names.length === 0) continue
|
|
236
|
+
refs.push({ names, ...(fromMatch?.[3] ? { from: fromMatch[3] } : {}) })
|
|
247
237
|
}
|
|
248
238
|
|
|
249
|
-
return refs
|
|
239
|
+
return refs
|
|
250
240
|
}
|
|
251
241
|
|
|
252
242
|
function resolveCssModuleImport(root: string, fromFile: string, specifier: string) {
|
|
253
|
-
const resolved = resolveImport(root, fromFile, specifier)
|
|
254
|
-
if (resolved && isCssModuleFile(resolved)) return path.resolve(resolved)
|
|
255
|
-
if (specifier.startsWith('.') || path.isAbsolute(specifier)) return undefined
|
|
243
|
+
const resolved = resolveImport(root, fromFile, specifier)
|
|
244
|
+
if (resolved && isCssModuleFile(resolved)) return path.resolve(resolved)
|
|
245
|
+
if (specifier.startsWith('.') || path.isAbsolute(specifier)) return undefined
|
|
256
246
|
|
|
257
|
-
const sibling = path.resolve(path.dirname(fromFile), specifier)
|
|
258
|
-
return existsSync(sibling) && isCssModuleFile(sibling) ? sibling : undefined
|
|
247
|
+
const sibling = path.resolve(path.dirname(fromFile), specifier)
|
|
248
|
+
return existsSync(sibling) && isCssModuleFile(sibling) ? sibling : undefined
|
|
259
249
|
}
|
|
260
250
|
|
|
261
251
|
function stripComposes(source: string) {
|
|
262
|
-
return source.replace(/\s*composes\s*:[^;{}]+;/g, '')
|
|
252
|
+
return source.replace(/\s*composes\s*:[^;{}]+;/g, '')
|
|
263
253
|
}
|
|
264
254
|
|
|
265
255
|
function cssClassNames(source: string) {
|
|
266
|
-
return new Set(selectorClassNames(source.replace(/\{[^{}]*\}/g, '{')))
|
|
256
|
+
return new Set(selectorClassNames(source.replace(/\{[^{}]*\}/g, '{')))
|
|
267
257
|
}
|
|
268
258
|
|
|
269
259
|
function selectorClassNames(selector: string) {
|
|
270
|
-
const classes: string[] = []
|
|
271
|
-
const pattern = /(^|[\s,>+~])\.(-?[_a-zA-Z][\w-]*)/g
|
|
272
|
-
let match: RegExpExecArray | null
|
|
260
|
+
const classes: string[] = []
|
|
261
|
+
const pattern = /(^|[\s,>+~])\.(-?[_a-zA-Z][\w-]*)/g
|
|
262
|
+
let match: RegExpExecArray | null
|
|
273
263
|
while ((match = pattern.exec(selector))) {
|
|
274
|
-
if (match[2]) classes.push(match[2])
|
|
264
|
+
if (match[2]) classes.push(match[2])
|
|
275
265
|
}
|
|
276
|
-
return classes
|
|
266
|
+
return classes
|
|
277
267
|
}
|
|
278
268
|
|
|
279
269
|
function rewriteModuleSelectors(css: string, file: string) {
|
|
@@ -285,90 +275,86 @@ function rewriteModuleSelectors(css: string, file: string) {
|
|
|
285
275
|
// Scanned by hand rather than with a regex: on a stylesheet whose tail holds no brace, the obvious
|
|
286
276
|
// pattern re-consumes the whole tail from every offset and backtracks it away again, which is
|
|
287
277
|
// quadratic and can cost minutes of build time on a large module.
|
|
288
|
-
let out = ''
|
|
289
|
-
let runStart = 0
|
|
278
|
+
let out = ''
|
|
279
|
+
let runStart = 0
|
|
290
280
|
for (let index = 0; index < css.length; index++) {
|
|
291
|
-
const char = css[index]
|
|
281
|
+
const char = css[index]
|
|
292
282
|
if (char === '{') {
|
|
293
|
-
out += `${rewriteSelectorRun(css.slice(runStart, index), file)}{
|
|
294
|
-
runStart = index + 1
|
|
283
|
+
out += `${rewriteSelectorRun(css.slice(runStart, index), file)}{`
|
|
284
|
+
runStart = index + 1
|
|
295
285
|
} else if (char === '}' || char === ';') {
|
|
296
|
-
out += css.slice(runStart, index + 1)
|
|
297
|
-
runStart = index + 1
|
|
286
|
+
out += css.slice(runStart, index + 1)
|
|
287
|
+
runStart = index + 1
|
|
298
288
|
}
|
|
299
289
|
}
|
|
300
|
-
return out + css.slice(runStart)
|
|
290
|
+
return out + css.slice(runStart)
|
|
301
291
|
}
|
|
302
292
|
|
|
303
293
|
function rewriteSelectorRun(selector: string, file: string) {
|
|
304
|
-
if (selector.trimStart().startsWith('@')) return selector
|
|
305
|
-
let out = selector
|
|
294
|
+
if (selector.trimStart().startsWith('@')) return selector
|
|
295
|
+
let out = selector
|
|
306
296
|
for (const className of selectorClassNames(selector)) {
|
|
307
|
-
out = rewriteClassSelector(out, cssModuleClassName(file, className), className)
|
|
297
|
+
out = rewriteClassSelector(out, cssModuleClassName(file, className), className)
|
|
308
298
|
}
|
|
309
|
-
return out.replace(/:global\(((?:[^()]|\([^()]*\))*)\)/g, '$1')
|
|
299
|
+
return out.replace(/:global\(((?:[^()]|\([^()]*\))*)\)/g, '$1')
|
|
310
300
|
}
|
|
311
301
|
|
|
312
302
|
function scopeKeyframes(css: string, file: string) {
|
|
313
|
-
let out = css
|
|
303
|
+
let out = css
|
|
314
304
|
for (const name of keyframeNames(css)) {
|
|
315
|
-
const scoped = cssModuleClassName(file, name)
|
|
305
|
+
const scoped = cssModuleClassName(file, name)
|
|
316
306
|
out = out.replace(
|
|
317
307
|
new RegExp(`(@(?:-webkit-)?keyframes\\s+)${escapeRegex(name)}(?![-_a-zA-Z0-9])`, 'g'),
|
|
318
308
|
`$1${scoped}`,
|
|
319
|
-
)
|
|
309
|
+
)
|
|
320
310
|
out = out.replace(
|
|
321
|
-
new RegExp(
|
|
322
|
-
`(animation-name\\s*:\\s*)${escapeRegex(name)}(?![-_a-zA-Z0-9])`,
|
|
323
|
-
'g',
|
|
324
|
-
),
|
|
311
|
+
new RegExp(`(animation-name\\s*:\\s*)${escapeRegex(name)}(?![-_a-zA-Z0-9])`, 'g'),
|
|
325
312
|
`$1${scoped}`,
|
|
326
|
-
)
|
|
313
|
+
)
|
|
327
314
|
out = out.replace(
|
|
328
315
|
new RegExp(
|
|
329
316
|
`(animation\\s*:[^;{}]*?(?<![-_a-zA-Z0-9]))${escapeRegex(name)}(?![-_a-zA-Z0-9])`,
|
|
330
317
|
'g',
|
|
331
318
|
),
|
|
332
319
|
`$1${scoped}`,
|
|
333
|
-
)
|
|
320
|
+
)
|
|
334
321
|
}
|
|
335
|
-
return out
|
|
322
|
+
return out
|
|
336
323
|
}
|
|
337
324
|
|
|
338
325
|
function keyframeNames(css: string) {
|
|
339
|
-
const names = new Set<string>()
|
|
340
|
-
const pattern = /@(?:-webkit-)?keyframes\s+(-?[_a-zA-Z][\w-]*)/g
|
|
341
|
-
let match: RegExpExecArray | null
|
|
326
|
+
const names = new Set<string>()
|
|
327
|
+
const pattern = /@(?:-webkit-)?keyframes\s+(-?[_a-zA-Z][\w-]*)/g
|
|
328
|
+
let match: RegExpExecArray | null
|
|
342
329
|
while ((match = pattern.exec(css))) {
|
|
343
|
-
if (match[1]) names.add(match[1])
|
|
330
|
+
if (match[1]) names.add(match[1])
|
|
344
331
|
}
|
|
345
|
-
return names
|
|
332
|
+
return names
|
|
346
333
|
}
|
|
347
334
|
|
|
348
335
|
function cssModuleClassName(file: string, className: string) {
|
|
349
|
-
const base = path
|
|
350
|
-
|
|
351
|
-
|
|
336
|
+
const base = path
|
|
337
|
+
.basename(file)
|
|
338
|
+
.replace(/\.module\.css$/, '')
|
|
339
|
+
.replace(/[^_a-zA-Z0-9]/g, '_')
|
|
340
|
+
const hash = pathHash(cssModuleScopePath(file))
|
|
341
|
+
return `${base}_${className}_${hash}`
|
|
352
342
|
}
|
|
353
343
|
|
|
354
344
|
function cssModuleScopePath(file: string) {
|
|
355
|
-
const normalized = file.split(path.sep).join('/')
|
|
356
|
-
const appIndex = normalized.lastIndexOf('/app/')
|
|
357
|
-
if (appIndex !== -1) return normalized.slice(appIndex + 1)
|
|
358
|
-
return normalized.split('/').slice(-3).join('/')
|
|
345
|
+
const normalized = file.split(path.sep).join('/')
|
|
346
|
+
const appIndex = normalized.lastIndexOf('/app/')
|
|
347
|
+
if (appIndex !== -1) return normalized.slice(appIndex + 1)
|
|
348
|
+
return normalized.split('/').slice(-3).join('/')
|
|
359
349
|
}
|
|
360
350
|
|
|
361
351
|
function rewriteClassSelector(css: string, scopedClassName: string, originalClassName: string) {
|
|
362
|
-
const pattern = new RegExp(`\\.${escapeRegex(originalClassName)}(?![-_a-zA-Z0-9])`, 'g')
|
|
363
|
-
return css.replace(pattern, `.${scopedClassName}`)
|
|
352
|
+
const pattern = new RegExp(`\\.${escapeRegex(originalClassName)}(?![-_a-zA-Z0-9])`, 'g')
|
|
353
|
+
return css.replace(pattern, `.${scopedClassName}`)
|
|
364
354
|
}
|
|
365
355
|
|
|
366
356
|
function pathHash(file: string) {
|
|
367
|
-
let hash = 5381
|
|
368
|
-
for (const char of file) hash = ((hash << 5) + hash) ^ char.charCodeAt(0)
|
|
369
|
-
return (hash >>> 0).toString(36).slice(0, 5)
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
function escapeRegex(value: string) {
|
|
373
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
357
|
+
let hash = 5381
|
|
358
|
+
for (const char of file) hash = ((hash << 5) + hash) ^ char.charCodeAt(0)
|
|
359
|
+
return (hash >>> 0).toString(36).slice(0, 5)
|
|
374
360
|
}
|
package/src/compat/css/nonce.ts
CHANGED
|
@@ -10,21 +10,21 @@
|
|
|
10
10
|
|
|
11
11
|
/** Extract the CSP nonce from a Content-Security-Policy header value, if any. */
|
|
12
12
|
export function nonceFromCsp(csp: string | null | undefined): string | undefined {
|
|
13
|
-
if (!csp) return undefined
|
|
13
|
+
if (!csp) return undefined
|
|
14
14
|
// A directive looks like `script-src 'self' 'nonce-abc123=='`. Sources are
|
|
15
15
|
// whitespace-separated; the nonce token is single-quoted `'nonce-<value>'`.
|
|
16
|
-
const directives = csp.split(';')
|
|
16
|
+
const directives = csp.split(';')
|
|
17
17
|
for (const directive of directives) {
|
|
18
18
|
for (const token of directive.trim().split(/\s+/)) {
|
|
19
|
-
const match = /^'nonce-([^']+)'$/.exec(token)
|
|
20
|
-
if (match?.[1]) return match[1]
|
|
19
|
+
const match = /^'nonce-([^']+)'$/.exec(token)
|
|
20
|
+
if (match?.[1]) return match[1]
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
|
-
return undefined
|
|
23
|
+
return undefined
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
/** Extract the CSP nonce from a request's headers. */
|
|
27
27
|
export function nonceFromRequest(request: Request | undefined): string | undefined {
|
|
28
|
-
if (!request) return undefined
|
|
29
|
-
return nonceFromCsp(request.headers.get('content-security-policy'))
|
|
28
|
+
if (!request) return undefined
|
|
29
|
+
return nonceFromCsp(request.headers.get('content-security-policy'))
|
|
30
30
|
}
|
|
@@ -9,22 +9,19 @@
|
|
|
9
9
|
// includePaths come from next.config `sassOptions.includePaths`. All fields degrade to core's empty
|
|
10
10
|
// behavior when `sass` is not installed.
|
|
11
11
|
|
|
12
|
-
import type { Plugin } from 'esbuild'
|
|
13
|
-
import type { ResolvedConfig } from '../../config'
|
|
14
|
-
import { getNextConfig } from '../next/config-loader'
|
|
15
|
-
import {
|
|
16
|
-
compileSassCss,
|
|
17
|
-
isSassFile,
|
|
18
|
-
isSassModuleFile,
|
|
19
|
-
sassModuleMapping,
|
|
20
|
-
} from './sass';
|
|
12
|
+
import type { Plugin } from 'esbuild'
|
|
13
|
+
import type { ResolvedConfig } from '../../config'
|
|
14
|
+
import { getNextConfig } from '../next/config-loader'
|
|
15
|
+
import { compileSassCss, isSassFile, isSassModuleFile, sassModuleMapping } from './sass'
|
|
21
16
|
|
|
22
17
|
/** Read `sassOptions.includePaths` from the loaded next.config. */
|
|
23
18
|
function sassIncludePaths(): string[] {
|
|
24
|
-
const config = getNextConfig()
|
|
25
|
-
const sassOptions = config.sassOptions as { includePaths?: unknown } | undefined
|
|
26
|
-
const includePaths = sassOptions?.includePaths
|
|
27
|
-
return Array.isArray(includePaths)
|
|
19
|
+
const config = getNextConfig()
|
|
20
|
+
const sassOptions = config.sassOptions as { includePaths?: unknown } | undefined
|
|
21
|
+
const includePaths = sassOptions?.includePaths
|
|
22
|
+
return Array.isArray(includePaths)
|
|
23
|
+
? includePaths.filter((p): p is string => typeof p === 'string')
|
|
24
|
+
: []
|
|
28
25
|
}
|
|
29
26
|
|
|
30
27
|
/**
|
|
@@ -39,27 +36,27 @@ export function sassChunkPlugin(config: ResolvedConfig): Plugin {
|
|
|
39
36
|
build.onLoad({ filter: /\.(?:scss|sass)$/ }, ({ path: file }) => ({
|
|
40
37
|
contents: compileSassCss(file, config.root, sassIncludePaths()),
|
|
41
38
|
loader: 'css',
|
|
42
|
-
}))
|
|
39
|
+
}))
|
|
43
40
|
},
|
|
44
|
-
}
|
|
41
|
+
}
|
|
45
42
|
}
|
|
46
43
|
|
|
47
44
|
/** Bun render-time loader / class-map resolver for `*.module.{scss,sass}`. */
|
|
48
45
|
export function sassResolveCssModule(config: ResolvedConfig) {
|
|
49
46
|
return (file: string): Record<string, string> | undefined =>
|
|
50
|
-
isSassModuleFile(file) ? sassModuleMapping(file, config.root, sassIncludePaths()) : undefined
|
|
47
|
+
isSassModuleFile(file) ? sassModuleMapping(file, config.root, sassIncludePaths()) : undefined
|
|
51
48
|
}
|
|
52
49
|
|
|
53
50
|
/** Client-bundle ESM text for a `.scss`/`.sass` import. */
|
|
54
51
|
export function sassLoadCssModuleForClient(config: ResolvedConfig) {
|
|
55
52
|
return (file: string): string | undefined => {
|
|
56
|
-
if (!isSassFile(file)) return undefined
|
|
53
|
+
if (!isSassFile(file)) return undefined
|
|
57
54
|
if (isSassModuleFile(file)) {
|
|
58
|
-
const map = sassModuleMapping(file, config.root, sassIncludePaths())
|
|
59
|
-
return `export default ${JSON.stringify(map)}
|
|
55
|
+
const map = sassModuleMapping(file, config.root, sassIncludePaths())
|
|
56
|
+
return `export default ${JSON.stringify(map)};`
|
|
60
57
|
}
|
|
61
58
|
// Global (non-module) sass carries no class map; the css bytes ship via the
|
|
62
59
|
// CSS chunk, so the client import is a side-effect-only empty module.
|
|
63
|
-
return 'export default undefined;'
|
|
64
|
-
}
|
|
60
|
+
return 'export default undefined;'
|
|
61
|
+
}
|
|
65
62
|
}
|