@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
package/src/compat/css/sass.ts
CHANGED
|
@@ -16,66 +16,67 @@
|
|
|
16
16
|
// `sass` is an optionalDependency; when absent the module degrades to core's behavior (empty CSS, empty
|
|
17
17
|
// map) so a non-sass app is never broken by loading compat.
|
|
18
18
|
|
|
19
|
-
import { createRequire } from 'node:module'
|
|
20
|
-
import { existsSync, readFileSync } from 'node:fs'
|
|
21
|
-
import path from 'node:path'
|
|
22
|
-
import { resolveImport } from '../../resolve/imports'
|
|
23
|
-
import { nextCssSource } from './modules'
|
|
19
|
+
import { createRequire } from 'node:module'
|
|
20
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
21
|
+
import path from 'node:path'
|
|
22
|
+
import { resolveImport } from '../../resolve/imports'
|
|
23
|
+
import { nextCssSource } from './modules'
|
|
24
|
+
import { escapeRegex } from '../../utils/code'
|
|
24
25
|
|
|
25
26
|
// Structural typing of the slice of the Dart Sass JS API we use. Avoids a hard
|
|
26
27
|
// type dependency on the optional `sass` package (mirrors how css.ts/runtime.ts
|
|
27
28
|
// type postcss/sharp via local structural shapes).
|
|
28
29
|
interface SassCompileOptions {
|
|
29
|
-
loadPaths?: string[]
|
|
30
|
-
style?: 'expanded' | 'compressed'
|
|
31
|
-
syntax?: 'scss' | 'indented' | 'css'
|
|
32
|
-
sourceMap?: boolean
|
|
30
|
+
loadPaths?: string[]
|
|
31
|
+
style?: 'expanded' | 'compressed'
|
|
32
|
+
syntax?: 'scss' | 'indented' | 'css'
|
|
33
|
+
sourceMap?: boolean
|
|
33
34
|
}
|
|
34
35
|
interface SassCompileResult {
|
|
35
|
-
css: string
|
|
36
|
+
css: string
|
|
36
37
|
}
|
|
37
38
|
interface SassApi {
|
|
38
|
-
compile: (path: string, options?: SassCompileOptions) => SassCompileResult
|
|
39
|
-
compileString: (source: string, options?: SassCompileOptions) => SassCompileResult
|
|
39
|
+
compile: (path: string, options?: SassCompileOptions) => SassCompileResult
|
|
40
|
+
compileString: (source: string, options?: SassCompileOptions) => SassCompileResult
|
|
40
41
|
}
|
|
41
42
|
|
|
42
|
-
const sassApis = new Map<string, SassApi | null>()
|
|
43
|
+
const sassApis = new Map<string, SassApi | null>()
|
|
43
44
|
|
|
44
45
|
/** Resolve the optional `sass` package once, from the project root. */
|
|
45
46
|
function loadSass(root: string): SassApi | undefined {
|
|
46
|
-
const cacheKey = path.resolve(root)
|
|
47
|
-
if (sassApis.has(cacheKey)) return sassApis.get(cacheKey) ?? undefined
|
|
47
|
+
const cacheKey = path.resolve(root)
|
|
48
|
+
if (sassApis.has(cacheKey)) return sassApis.get(cacheKey) ?? undefined
|
|
48
49
|
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
49
50
|
const roots = [root, path.resolve(import.meta.dirname, '../../..'), process.env.PNEXT_NEXTJS_REPO]
|
|
50
51
|
.filter(
|
|
51
52
|
(candidate): candidate is string => typeof candidate === 'string' && candidate.length > 0,
|
|
52
53
|
)
|
|
53
|
-
.map(candidate => path.join(path.resolve(candidate), 'package.json'))
|
|
54
|
+
.map(candidate => path.join(path.resolve(candidate), 'package.json'))
|
|
54
55
|
|
|
55
56
|
for (const packageJson of roots) {
|
|
56
57
|
try {
|
|
57
|
-
const appRequire = createRequire(packageJson)
|
|
58
|
-
const sass = appRequire('sass') as SassApi
|
|
59
|
-
sassApis.set(cacheKey, sass)
|
|
60
|
-
return sass
|
|
58
|
+
const appRequire = createRequire(packageJson)
|
|
59
|
+
const sass = appRequire('sass') as SassApi
|
|
60
|
+
sassApis.set(cacheKey, sass)
|
|
61
|
+
return sass
|
|
61
62
|
} catch {
|
|
62
63
|
// Try the next resolution root.
|
|
63
64
|
}
|
|
64
65
|
}
|
|
65
66
|
|
|
66
67
|
// Not installed / not resolvable — degrade to core's empty-module behavior.
|
|
67
|
-
sassApis.set(cacheKey, null)
|
|
68
|
-
return undefined
|
|
68
|
+
sassApis.set(cacheKey, null)
|
|
69
|
+
return undefined
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
/** True for `.scss` / `.sass` (module or global). */
|
|
72
73
|
export function isSassFile(file: string): boolean {
|
|
73
|
-
return /\.(?:scss|sass)$/.test(file)
|
|
74
|
+
return /\.(?:scss|sass)$/.test(file)
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
/** True for `.module.scss` / `.module.sass`. */
|
|
77
78
|
export function isSassModuleFile(file: string): boolean {
|
|
78
|
-
return /\.module\.(?:scss|sass)$/.test(file)
|
|
79
|
+
return /\.module\.(?:scss|sass)$/.test(file)
|
|
79
80
|
}
|
|
80
81
|
|
|
81
82
|
/**
|
|
@@ -88,17 +89,17 @@ export function isSassModuleFile(file: string): boolean {
|
|
|
88
89
|
* empty-module behavior) so the bundle still succeeds.
|
|
89
90
|
*/
|
|
90
91
|
export function compileSassCss(file: string, root: string, includePaths: string[] = []): string {
|
|
91
|
-
file = nextCssSource(file, root)
|
|
92
|
-
const sass = loadSass(root)
|
|
93
|
-
if (!sass) return ''
|
|
92
|
+
file = nextCssSource(file, root)
|
|
93
|
+
const sass = loadSass(root)
|
|
94
|
+
if (!sass) return ''
|
|
94
95
|
const compiled = sass.compile(file, {
|
|
95
96
|
loadPaths: [path.dirname(file), ...includePaths],
|
|
96
97
|
style: 'expanded',
|
|
97
98
|
syntax: file.endsWith('.sass') ? 'indented' : 'scss',
|
|
98
|
-
}).css
|
|
99
|
+
}).css
|
|
99
100
|
|
|
100
|
-
if (!isSassModuleFile(file)) return compiled
|
|
101
|
-
return transformCssModule(compiled, file, root, includePaths)
|
|
101
|
+
if (!isSassModuleFile(file)) return compiled
|
|
102
|
+
return transformCssModule(compiled, file, root, includePaths)
|
|
102
103
|
}
|
|
103
104
|
|
|
104
105
|
/**
|
|
@@ -112,16 +113,16 @@ export function sassModuleMapping(
|
|
|
112
113
|
root: string,
|
|
113
114
|
includePaths: string[] = [],
|
|
114
115
|
): Record<string, string> {
|
|
115
|
-
file = nextCssSource(file, root)
|
|
116
|
-
const sass = loadSass(root)
|
|
117
|
-
if (!sass) return {}
|
|
116
|
+
file = nextCssSource(file, root)
|
|
117
|
+
const sass = loadSass(root)
|
|
118
|
+
if (!sass) return {}
|
|
118
119
|
const compiled = sass.compile(file, {
|
|
119
120
|
loadPaths: [path.dirname(file), ...includePaths],
|
|
120
121
|
style: 'expanded',
|
|
121
122
|
syntax: file.endsWith('.sass') ? 'indented' : 'scss',
|
|
122
|
-
}).css
|
|
123
|
+
}).css
|
|
123
124
|
|
|
124
|
-
return cssModuleMappingFromSource(compiled, file, root, includePaths)
|
|
125
|
+
return cssModuleMappingFromSource(compiled, file, root, includePaths)
|
|
125
126
|
}
|
|
126
127
|
|
|
127
128
|
// ---------------------------------------------------------------------------
|
|
@@ -129,14 +130,14 @@ export function sassModuleMapping(
|
|
|
129
130
|
// ---------------------------------------------------------------------------
|
|
130
131
|
|
|
131
132
|
interface ComposeRef {
|
|
132
|
-
names: string[]
|
|
133
|
-
from?: string
|
|
133
|
+
names: string[]
|
|
134
|
+
from?: string
|
|
134
135
|
}
|
|
135
136
|
|
|
136
137
|
interface CssModuleInfo {
|
|
137
|
-
classes: Set<string
|
|
138
|
-
composes: Map<string, ComposeRef[]
|
|
139
|
-
dependencies: string[]
|
|
138
|
+
classes: Set<string>
|
|
139
|
+
composes: Map<string, ComposeRef[]>
|
|
140
|
+
dependencies: string[]
|
|
140
141
|
}
|
|
141
142
|
|
|
142
143
|
function cssModuleMappingFromSource(
|
|
@@ -145,15 +146,15 @@ function cssModuleMappingFromSource(
|
|
|
145
146
|
root: string,
|
|
146
147
|
includePaths: string[],
|
|
147
148
|
): Record<string, string> {
|
|
148
|
-
const cache = new Map<string, CssModuleInfo>()
|
|
149
|
-
const info = moduleInfoFromSource(source, file, root)
|
|
150
|
-
cache.set(path.resolve(file), info)
|
|
149
|
+
const cache = new Map<string, CssModuleInfo>()
|
|
150
|
+
const info = moduleInfoFromSource(source, file, root)
|
|
151
|
+
cache.set(path.resolve(file), info)
|
|
151
152
|
return Object.fromEntries(
|
|
152
153
|
[...info.classes].map(className => [
|
|
153
154
|
className,
|
|
154
155
|
classValue(file, className, root, includePaths, cache, new Set()),
|
|
155
156
|
]),
|
|
156
|
-
)
|
|
157
|
+
)
|
|
157
158
|
}
|
|
158
159
|
|
|
159
160
|
function transformCssModule(
|
|
@@ -162,10 +163,10 @@ function transformCssModule(
|
|
|
162
163
|
root: string,
|
|
163
164
|
_includePaths: string[],
|
|
164
165
|
): string {
|
|
165
|
-
const info = moduleInfoFromSource(source, file, root)
|
|
166
|
-
const imports = info.dependencies.map(dep => `@import ${JSON.stringify(dep)};`).join('\n')
|
|
167
|
-
const css = scopeKeyframes(rewriteModuleSelectors(stripComposes(source), file), file)
|
|
168
|
-
return [imports, css].filter(Boolean).join('\n')
|
|
166
|
+
const info = moduleInfoFromSource(source, file, root)
|
|
167
|
+
const imports = info.dependencies.map(dep => `@import ${JSON.stringify(dep)};`).join('\n')
|
|
168
|
+
const css = scopeKeyframes(rewriteModuleSelectors(stripComposes(source), file), file)
|
|
169
|
+
return [imports, css].filter(Boolean).join('\n')
|
|
169
170
|
}
|
|
170
171
|
|
|
171
172
|
function moduleInfo(
|
|
@@ -174,56 +175,56 @@ function moduleInfo(
|
|
|
174
175
|
includePaths: string[],
|
|
175
176
|
cache: Map<string, CssModuleInfo>,
|
|
176
177
|
): CssModuleInfo {
|
|
177
|
-
const key = path.resolve(file)
|
|
178
|
-
const cached = cache.get(key)
|
|
179
|
-
if (cached) return cached
|
|
178
|
+
const key = path.resolve(file)
|
|
179
|
+
const cached = cache.get(key)
|
|
180
|
+
if (cached) return cached
|
|
180
181
|
const source = isSassFile(key)
|
|
181
182
|
? compileSassCssSource(key, root, includePaths)
|
|
182
|
-
: readFileSync(key, 'utf8')
|
|
183
|
-
const info = moduleInfoFromSource(source, key, root)
|
|
184
|
-
cache.set(key, info)
|
|
185
|
-
return info
|
|
183
|
+
: readFileSync(key, 'utf8')
|
|
184
|
+
const info = moduleInfoFromSource(source, key, root)
|
|
185
|
+
cache.set(key, info)
|
|
186
|
+
return info
|
|
186
187
|
}
|
|
187
188
|
|
|
188
189
|
function compileSassCssSource(file: string, root: string, includePaths: string[]): string {
|
|
189
|
-
const sass = loadSass(root)
|
|
190
|
-
if (!sass) return ''
|
|
190
|
+
const sass = loadSass(root)
|
|
191
|
+
if (!sass) return ''
|
|
191
192
|
return sass.compile(file, {
|
|
192
193
|
loadPaths: [path.dirname(file), ...includePaths],
|
|
193
194
|
style: 'expanded',
|
|
194
195
|
syntax: file.endsWith('.sass') ? 'indented' : 'scss',
|
|
195
|
-
}).css
|
|
196
|
+
}).css
|
|
196
197
|
}
|
|
197
198
|
|
|
198
199
|
function moduleInfoFromSource(source: string, file: string, root: string): CssModuleInfo {
|
|
199
|
-
const classes = cssClassNames(source)
|
|
200
|
-
const composes = new Map<string, ComposeRef[]>()
|
|
201
|
-
const dependencies: string[] = []
|
|
202
|
-
const seenDependencies = new Set<string>()
|
|
203
|
-
const rulePattern = /(^|})([^{}]+)\{([^{}]*)\}/g
|
|
204
|
-
let match: RegExpExecArray | null
|
|
200
|
+
const classes = cssClassNames(source)
|
|
201
|
+
const composes = new Map<string, ComposeRef[]>()
|
|
202
|
+
const dependencies: string[] = []
|
|
203
|
+
const seenDependencies = new Set<string>()
|
|
204
|
+
const rulePattern = /(^|})([^{}]+)\{([^{}]*)\}/g
|
|
205
|
+
let match: RegExpExecArray | null
|
|
205
206
|
|
|
206
207
|
while ((match = rulePattern.exec(source))) {
|
|
207
|
-
const [, , selector, body] = match
|
|
208
|
-
if (!selector || !body) continue
|
|
209
|
-
const localClasses = selectorClassNames(selector).filter(className => classes.has(className))
|
|
210
|
-
if (localClasses.length === 0) continue
|
|
208
|
+
const [, , selector, body] = match
|
|
209
|
+
if (!selector || !body) continue
|
|
210
|
+
const localClasses = selectorClassNames(selector).filter(className => classes.has(className))
|
|
211
|
+
if (localClasses.length === 0) continue
|
|
211
212
|
|
|
212
213
|
for (const ref of composeRefs(body)) {
|
|
213
214
|
for (const localClass of localClasses) {
|
|
214
|
-
const refs = composes.get(localClass) ?? []
|
|
215
|
-
refs.push(ref)
|
|
216
|
-
composes.set(localClass, refs)
|
|
215
|
+
const refs = composes.get(localClass) ?? []
|
|
216
|
+
refs.push(ref)
|
|
217
|
+
composes.set(localClass, refs)
|
|
217
218
|
}
|
|
218
|
-
if (!ref.from || ref.from === 'global') continue
|
|
219
|
-
const dependency = resolveCssModuleImport(root, file, ref.from)
|
|
220
|
-
if (!dependency || seenDependencies.has(dependency)) continue
|
|
221
|
-
dependencies.push(dependency)
|
|
222
|
-
seenDependencies.add(dependency)
|
|
219
|
+
if (!ref.from || ref.from === 'global') continue
|
|
220
|
+
const dependency = resolveCssModuleImport(root, file, ref.from)
|
|
221
|
+
if (!dependency || seenDependencies.has(dependency)) continue
|
|
222
|
+
dependencies.push(dependency)
|
|
223
|
+
seenDependencies.add(dependency)
|
|
223
224
|
}
|
|
224
225
|
}
|
|
225
226
|
|
|
226
|
-
return { classes, composes, dependencies }
|
|
227
|
+
return { classes, composes, dependencies }
|
|
227
228
|
}
|
|
228
229
|
|
|
229
230
|
function classValue(
|
|
@@ -234,139 +235,140 @@ function classValue(
|
|
|
234
235
|
cache: Map<string, CssModuleInfo>,
|
|
235
236
|
stack: Set<string>,
|
|
236
237
|
): string {
|
|
237
|
-
const key = `${path.resolve(file)}\0${className}
|
|
238
|
-
if (stack.has(key)) return cssModuleClassName(file, className)
|
|
239
|
-
stack.add(key)
|
|
238
|
+
const key = `${path.resolve(file)}\0${className}`
|
|
239
|
+
if (stack.has(key)) return cssModuleClassName(file, className)
|
|
240
|
+
stack.add(key)
|
|
240
241
|
|
|
241
|
-
const info = moduleInfo(file, root, includePaths, cache)
|
|
242
|
-
const parts = [cssModuleClassName(file, className)]
|
|
242
|
+
const info = moduleInfo(file, root, includePaths, cache)
|
|
243
|
+
const parts = [cssModuleClassName(file, className)]
|
|
243
244
|
for (const ref of info.composes.get(className) ?? []) {
|
|
244
245
|
if (ref.from === 'global') {
|
|
245
|
-
parts.push(...ref.names)
|
|
246
|
-
continue
|
|
246
|
+
parts.push(...ref.names)
|
|
247
|
+
continue
|
|
247
248
|
}
|
|
248
|
-
const refFile = ref.from ? resolveCssModuleImport(root, file, ref.from) : file
|
|
249
|
-
if (!refFile) continue
|
|
250
|
-
const refInfo = moduleInfo(refFile, root, includePaths, cache)
|
|
249
|
+
const refFile = ref.from ? resolveCssModuleImport(root, file, ref.from) : file
|
|
250
|
+
if (!refFile) continue
|
|
251
|
+
const refInfo = moduleInfo(refFile, root, includePaths, cache)
|
|
251
252
|
for (const name of ref.names) {
|
|
252
|
-
if (!refInfo.classes.has(name)) continue
|
|
253
|
-
parts.push(...classValue(refFile, name, root, includePaths, cache, stack).split(/\s+/))
|
|
253
|
+
if (!refInfo.classes.has(name)) continue
|
|
254
|
+
parts.push(...classValue(refFile, name, root, includePaths, cache, stack).split(/\s+/))
|
|
254
255
|
}
|
|
255
256
|
}
|
|
256
257
|
|
|
257
|
-
stack.delete(key)
|
|
258
|
-
return [...new Set(parts)].join(' ')
|
|
258
|
+
stack.delete(key)
|
|
259
|
+
return [...new Set(parts)].join(' ')
|
|
259
260
|
}
|
|
260
261
|
|
|
261
262
|
function composeRefs(body: string): ComposeRef[] {
|
|
262
|
-
const refs: ComposeRef[] = []
|
|
263
|
-
const pattern = /\bcomposes\s*:\s*([^;]+);/g
|
|
264
|
-
let match: RegExpExecArray | null
|
|
263
|
+
const refs: ComposeRef[] = []
|
|
264
|
+
const pattern = /\bcomposes\s*:\s*([^;]+);/g
|
|
265
|
+
let match: RegExpExecArray | null
|
|
265
266
|
|
|
266
267
|
while ((match = pattern.exec(body))) {
|
|
267
|
-
const value = match[1]?.trim()
|
|
268
|
-
if (!value) continue
|
|
269
|
-
const fromMatch = /^(.+?)\s+from\s+(['"]?)([^'"]+)\2$/.exec(value)
|
|
270
|
-
const names = (fromMatch?.[1] ?? value).split(/\s+/).filter(Boolean)
|
|
271
|
-
if (names.length === 0) continue
|
|
272
|
-
refs.push({ names, ...(fromMatch?.[3] ? { from: fromMatch[3] } : {}) })
|
|
268
|
+
const value = match[1]?.trim()
|
|
269
|
+
if (!value) continue
|
|
270
|
+
const fromMatch = /^(.+?)\s+from\s+(['"]?)([^'"]+)\2$/.exec(value)
|
|
271
|
+
const names = (fromMatch?.[1] ?? value).split(/\s+/).filter(Boolean)
|
|
272
|
+
if (names.length === 0) continue
|
|
273
|
+
refs.push({ names, ...(fromMatch?.[3] ? { from: fromMatch[3] } : {}) })
|
|
273
274
|
}
|
|
274
275
|
|
|
275
|
-
return refs
|
|
276
|
+
return refs
|
|
276
277
|
}
|
|
277
278
|
|
|
278
|
-
function resolveCssModuleImport(
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
const
|
|
284
|
-
|
|
279
|
+
function resolveCssModuleImport(
|
|
280
|
+
root: string,
|
|
281
|
+
fromFile: string,
|
|
282
|
+
specifier: string,
|
|
283
|
+
): string | undefined {
|
|
284
|
+
const resolved = resolveImport(root, fromFile, specifier)
|
|
285
|
+
if (resolved && isCssModuleFile(resolved)) return path.resolve(resolved)
|
|
286
|
+
if (specifier.startsWith('.') || path.isAbsolute(specifier)) return undefined
|
|
287
|
+
|
|
288
|
+
const sibling = path.resolve(path.dirname(fromFile), specifier)
|
|
289
|
+
return existsSync(sibling) && isCssModuleFile(sibling) ? sibling : undefined
|
|
285
290
|
}
|
|
286
291
|
|
|
287
292
|
function isCssModuleFile(file: string): boolean {
|
|
288
|
-
return /\.module\.(?:css|scss|sass)$/.test(file)
|
|
293
|
+
return /\.module\.(?:css|scss|sass)$/.test(file)
|
|
289
294
|
}
|
|
290
295
|
|
|
291
296
|
function stripComposes(source: string): string {
|
|
292
|
-
return source.replace(/\s*composes\s*:[^;{}]+;/g, '')
|
|
297
|
+
return source.replace(/\s*composes\s*:[^;{}]+;/g, '')
|
|
293
298
|
}
|
|
294
299
|
|
|
295
300
|
function rewriteModuleSelectors(css: string, file: string): string {
|
|
296
301
|
return css.replace(/(^|})([^{}]+)\{/g, (match, boundary: string, selector: string) => {
|
|
297
|
-
if (selector.trimStart().startsWith('@')) return match
|
|
298
|
-
let out = selector
|
|
302
|
+
if (selector.trimStart().startsWith('@')) return match
|
|
303
|
+
let out = selector
|
|
299
304
|
for (const className of selectorClassNames(selector)) {
|
|
300
|
-
out = rewriteClassSelector(out, cssModuleClassName(file, className), className)
|
|
305
|
+
out = rewriteClassSelector(out, cssModuleClassName(file, className), className)
|
|
301
306
|
}
|
|
302
|
-
return `${boundary}${out}{
|
|
303
|
-
})
|
|
307
|
+
return `${boundary}${out}{`
|
|
308
|
+
})
|
|
304
309
|
}
|
|
305
310
|
|
|
306
311
|
function cssClassNames(source: string): Set<string> {
|
|
307
|
-
return new Set(selectorClassNames(source.replace(/\{[^{}]*\}/g, '{')))
|
|
312
|
+
return new Set(selectorClassNames(source.replace(/\{[^{}]*\}/g, '{')))
|
|
308
313
|
}
|
|
309
314
|
|
|
310
315
|
function selectorClassNames(selector: string): string[] {
|
|
311
|
-
const classNames: string[] = []
|
|
312
|
-
const classPattern = /(^|[\s,>+~])\.(-?[_a-zA-Z][\w-]*)/g
|
|
313
|
-
let match: RegExpExecArray | null
|
|
316
|
+
const classNames: string[] = []
|
|
317
|
+
const classPattern = /(^|[\s,>+~])\.(-?[_a-zA-Z][\w-]*)/g
|
|
318
|
+
let match: RegExpExecArray | null
|
|
314
319
|
while ((match = classPattern.exec(selector))) {
|
|
315
|
-
if (match[2]) classNames.push(match[2])
|
|
320
|
+
if (match[2]) classNames.push(match[2])
|
|
316
321
|
}
|
|
317
|
-
return classNames
|
|
322
|
+
return classNames
|
|
318
323
|
}
|
|
319
324
|
|
|
320
325
|
function cssModuleClassName(file: string, className: string): string {
|
|
321
326
|
const base = path
|
|
322
327
|
.basename(file)
|
|
323
328
|
.replace(/\.module\.(?:css|scss|sass)$/, '')
|
|
324
|
-
.replace(/[^_a-zA-Z0-9]/g, '_')
|
|
325
|
-
const hash = pathHash(cssModuleScopePath(file))
|
|
326
|
-
return `${base}_${className}_${hash}
|
|
329
|
+
.replace(/[^_a-zA-Z0-9]/g, '_')
|
|
330
|
+
const hash = pathHash(cssModuleScopePath(file))
|
|
331
|
+
return `${base}_${className}_${hash}`
|
|
327
332
|
}
|
|
328
333
|
|
|
329
334
|
function scopeKeyframes(css: string, file: string): string {
|
|
330
|
-
let out = css
|
|
335
|
+
let out = css
|
|
331
336
|
for (const name of keyframeNames(css)) {
|
|
332
|
-
const scoped = cssModuleClassName(file, name)
|
|
337
|
+
const scoped = cssModuleClassName(file, name)
|
|
333
338
|
out = out.replace(
|
|
334
339
|
new RegExp(`(@(?:-webkit-)?keyframes\\s+)${escapeRegex(name)}(?![-_a-zA-Z0-9])`, 'g'),
|
|
335
340
|
`$1${scoped}`,
|
|
336
|
-
)
|
|
341
|
+
)
|
|
337
342
|
out = out.replace(
|
|
338
|
-
new RegExp(
|
|
339
|
-
`(animation-name\\s*:\\s*)${escapeRegex(name)}(?![-_a-zA-Z0-9])`,
|
|
340
|
-
'g',
|
|
341
|
-
),
|
|
343
|
+
new RegExp(`(animation-name\\s*:\\s*)${escapeRegex(name)}(?![-_a-zA-Z0-9])`, 'g'),
|
|
342
344
|
`$1${scoped}`,
|
|
343
|
-
)
|
|
345
|
+
)
|
|
344
346
|
out = out.replace(
|
|
345
347
|
new RegExp(
|
|
346
348
|
`(animation\\s*:[^;{}]*?(?<![-_a-zA-Z0-9]))${escapeRegex(name)}(?![-_a-zA-Z0-9])`,
|
|
347
349
|
'g',
|
|
348
350
|
),
|
|
349
351
|
`$1${scoped}`,
|
|
350
|
-
)
|
|
352
|
+
)
|
|
351
353
|
}
|
|
352
|
-
return out
|
|
354
|
+
return out
|
|
353
355
|
}
|
|
354
356
|
|
|
355
357
|
function keyframeNames(css: string): Set<string> {
|
|
356
|
-
const names = new Set<string>()
|
|
357
|
-
const pattern = /@(?:-webkit-)?keyframes\s+(-?[_a-zA-Z][\w-]*)/g
|
|
358
|
-
let match: RegExpExecArray | null
|
|
358
|
+
const names = new Set<string>()
|
|
359
|
+
const pattern = /@(?:-webkit-)?keyframes\s+(-?[_a-zA-Z][\w-]*)/g
|
|
360
|
+
let match: RegExpExecArray | null
|
|
359
361
|
while ((match = pattern.exec(css))) {
|
|
360
|
-
if (match[1]) names.add(match[1])
|
|
362
|
+
if (match[1]) names.add(match[1])
|
|
361
363
|
}
|
|
362
|
-
return names
|
|
364
|
+
return names
|
|
363
365
|
}
|
|
364
366
|
|
|
365
367
|
function cssModuleScopePath(file: string): string {
|
|
366
|
-
const normalized = file.split(path.sep).join('/')
|
|
367
|
-
const appIndex = normalized.lastIndexOf('/app/')
|
|
368
|
-
if (appIndex !== -1) return normalized.slice(appIndex + 1)
|
|
369
|
-
return normalized.split('/').slice(-3).join('/')
|
|
368
|
+
const normalized = file.split(path.sep).join('/')
|
|
369
|
+
const appIndex = normalized.lastIndexOf('/app/')
|
|
370
|
+
if (appIndex !== -1) return normalized.slice(appIndex + 1)
|
|
371
|
+
return normalized.split('/').slice(-3).join('/')
|
|
370
372
|
}
|
|
371
373
|
|
|
372
374
|
function rewriteClassSelector(
|
|
@@ -377,16 +379,12 @@ function rewriteClassSelector(
|
|
|
377
379
|
const esbuildNamePattern = new RegExp(
|
|
378
380
|
`\\.${escapeRegex(originalClassName)}(?![-_a-zA-Z0-9])`,
|
|
379
381
|
'g',
|
|
380
|
-
)
|
|
381
|
-
return css.replace(esbuildNamePattern, `.${scopedClassName}`)
|
|
382
|
+
)
|
|
383
|
+
return css.replace(esbuildNamePattern, `.${scopedClassName}`)
|
|
382
384
|
}
|
|
383
385
|
|
|
384
386
|
function pathHash(file: string): string {
|
|
385
|
-
let hash = 5381
|
|
386
|
-
for (const char of file) hash = ((hash << 5) + hash) ^ char.charCodeAt(0)
|
|
387
|
-
return (hash >>> 0).toString(36).slice(0, 5)
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
function escapeRegex(value: string): string {
|
|
391
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
387
|
+
let hash = 5381
|
|
388
|
+
for (const char of file) hash = ((hash << 5) + hash) ^ char.charCodeAt(0)
|
|
389
|
+
return (hash >>> 0).toString(36).slice(0, 5)
|
|
392
390
|
}
|
|
@@ -7,27 +7,27 @@
|
|
|
7
7
|
// the registry and renders nothing; the app flushes `registry.styles()` through
|
|
8
8
|
// useServerInsertedHTML so the rules land in the streamed document head. On the client the registry
|
|
9
9
|
// mirrors new rules into document.head imperatively, matching styled-jsx's client runtime.
|
|
10
|
-
import { createContext, h, type ComponentChildren } from 'preact'
|
|
11
|
-
import { useContext } from 'preact/hooks'
|
|
10
|
+
import { createContext, h, type ComponentChildren } from 'preact'
|
|
11
|
+
import { useContext } from 'preact/hooks'
|
|
12
12
|
|
|
13
13
|
interface StyleProps {
|
|
14
|
-
id: string
|
|
15
|
-
children?: ComponentChildren
|
|
14
|
+
id: string
|
|
15
|
+
children?: ComponentChildren
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export class PNextStyleRegistry {
|
|
19
|
-
private rules = new Map<string, string>()
|
|
19
|
+
private rules = new Map<string, string>()
|
|
20
20
|
|
|
21
21
|
add(id: string, css: string): void {
|
|
22
|
-
if (this.rules.has(id)) return
|
|
23
|
-
this.rules.set(id, css)
|
|
22
|
+
if (this.rules.has(id)) return
|
|
23
|
+
this.rules.set(id, css)
|
|
24
24
|
if (typeof document !== 'undefined') {
|
|
25
|
-
const domId = `__jsx-${id}
|
|
25
|
+
const domId = `__jsx-${id}`
|
|
26
26
|
if (!document.getElementById(domId)) {
|
|
27
|
-
const element = document.createElement('style')
|
|
28
|
-
element.id = domId
|
|
29
|
-
element.textContent = css
|
|
30
|
-
document.head.appendChild(element)
|
|
27
|
+
const element = document.createElement('style')
|
|
28
|
+
element.id = domId
|
|
29
|
+
element.textContent = css
|
|
30
|
+
document.head.appendChild(element)
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -36,45 +36,45 @@ export class PNextStyleRegistry {
|
|
|
36
36
|
styles() {
|
|
37
37
|
return [...this.rules.entries()].map(([id, css]) =>
|
|
38
38
|
h('style', { id: `__jsx-${id}`, key: `__jsx-${id}` }, css),
|
|
39
|
-
)
|
|
39
|
+
)
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
flush(): void {
|
|
43
|
-
this.rules.clear()
|
|
43
|
+
this.rules.clear()
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
const StyleRegistryContext = createContext<PNextStyleRegistry | undefined>(undefined)
|
|
47
|
+
const StyleRegistryContext = createContext<PNextStyleRegistry | undefined>(undefined)
|
|
48
48
|
|
|
49
49
|
export function createStyleRegistry(): PNextStyleRegistry {
|
|
50
|
-
return new PNextStyleRegistry()
|
|
50
|
+
return new PNextStyleRegistry()
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
export function StyleRegistry({
|
|
54
54
|
registry,
|
|
55
55
|
children,
|
|
56
56
|
}: {
|
|
57
|
-
registry?: PNextStyleRegistry
|
|
58
|
-
children?: ComponentChildren
|
|
57
|
+
registry?: PNextStyleRegistry
|
|
58
|
+
children?: ComponentChildren
|
|
59
59
|
}) {
|
|
60
|
-
return h(StyleRegistryContext.Provider, { value: registry ?? createStyleRegistry() }, children)
|
|
60
|
+
return h(StyleRegistryContext.Provider, { value: registry ?? createStyleRegistry() }, children)
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
export function useStyleRegistry(): PNextStyleRegistry | undefined {
|
|
64
|
-
return useContext(StyleRegistryContext)
|
|
64
|
+
return useContext(StyleRegistryContext)
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
export function style({ id, children }: StyleProps) {
|
|
68
|
-
const registry = useContext(StyleRegistryContext)
|
|
68
|
+
const registry = useContext(StyleRegistryContext)
|
|
69
69
|
if (registry) {
|
|
70
|
-
registry.add(id, childrenToCss(children))
|
|
71
|
-
return null
|
|
70
|
+
registry.add(id, childrenToCss(children))
|
|
71
|
+
return null
|
|
72
72
|
}
|
|
73
|
-
return h('style', { id: `__jsx-${id}` }, children)
|
|
73
|
+
return h('style', { id: `__jsx-${id}` }, children)
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
function childrenToCss(children: ComponentChildren): string {
|
|
77
|
-
if (typeof children === 'string' || typeof children === 'number') return String(children)
|
|
78
|
-
if (Array.isArray(children)) return children.map(childrenToCss).join('')
|
|
79
|
-
return ''
|
|
77
|
+
if (typeof children === 'string' || typeof children === 'number') return String(children)
|
|
78
|
+
if (Array.isArray(children)) return children.map(childrenToCss).join('')
|
|
79
|
+
return ''
|
|
80
80
|
}
|