@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
|
@@ -7,66 +7,66 @@
|
|
|
7
7
|
// - every local source file must still match the stat it was read at, so a font swapped while the
|
|
8
8
|
// server was not running re-resolves and re-emits.
|
|
9
9
|
// Nothing here is used by `pnext build`, which owns the directory it just wiped.
|
|
10
|
-
import { existsSync, readFileSync, writeFileSync } from 'node:fs'
|
|
11
|
-
import { mkdir, stat } from 'node:fs/promises'
|
|
12
|
-
import { createHash } from 'node:crypto'
|
|
13
|
-
import path from 'node:path'
|
|
14
|
-
import type { ResolvedConfig } from '../../../config'
|
|
15
|
-
import { restartCacheEnabled } from '../../../dev/restart
|
|
16
|
-
import { writeFileAtomic } from '../../../utils/fs'
|
|
17
|
-
import type { MetadataLink } from '../../../types'
|
|
10
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs'
|
|
11
|
+
import { mkdir, stat } from 'node:fs/promises'
|
|
12
|
+
import { createHash } from 'node:crypto'
|
|
13
|
+
import path from 'node:path'
|
|
14
|
+
import type { ResolvedConfig } from '../../../config'
|
|
15
|
+
import { restartCacheEnabled } from '../../../dev/restart/enabled'
|
|
16
|
+
import { writeFileAtomic } from '../../../utils/fs'
|
|
17
|
+
import type { MetadataLink } from '../../../types'
|
|
18
18
|
|
|
19
19
|
export interface PersistableFont {
|
|
20
|
-
css: string
|
|
21
|
-
preloads: MetadataLink[]
|
|
22
|
-
usesFonts: boolean
|
|
23
|
-
files: string[]
|
|
20
|
+
css: string
|
|
21
|
+
preloads: MetadataLink[]
|
|
22
|
+
usesFonts: boolean
|
|
23
|
+
files: string[]
|
|
24
24
|
/** Local font files the resolution read (google resolutions have none). */
|
|
25
|
-
sources?: string[]
|
|
25
|
+
sources?: string[]
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
/** `[file, mtimeMs, size]` — a local source and the stat it was resolved at. */
|
|
29
|
-
type SourceStat = [string, number, number]
|
|
29
|
+
type SourceStat = [string, number, number]
|
|
30
30
|
|
|
31
31
|
interface Entry extends PersistableFont {
|
|
32
|
-
sourceStats: SourceStat[]
|
|
32
|
+
sourceStats: SourceStat[]
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
interface IndexFile {
|
|
36
|
-
version: number
|
|
36
|
+
version: number
|
|
37
37
|
/** Content hash of the font runtime, so an upgrade never serves its output. */
|
|
38
|
-
runtime: string
|
|
39
|
-
fonts: Record<string, Entry
|
|
38
|
+
runtime: string
|
|
39
|
+
fonts: Record<string, Entry>
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
/** Bumped whenever a record's shape changes; an older index is simply ignored. */
|
|
43
|
-
const INDEX_VERSION = 1
|
|
43
|
+
const INDEX_VERSION = 1
|
|
44
44
|
|
|
45
45
|
interface FontIndex {
|
|
46
|
-
file: string
|
|
47
|
-
fonts: Map<string, Entry
|
|
48
|
-
dirty: boolean
|
|
49
|
-
flush?: Timer
|
|
46
|
+
file: string
|
|
47
|
+
fonts: Map<string, Entry>
|
|
48
|
+
dirty: boolean
|
|
49
|
+
flush?: Timer
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
const indexes = new Map<string, FontIndex>()
|
|
52
|
+
const indexes = new Map<string, FontIndex>()
|
|
53
53
|
|
|
54
54
|
function fontIndex(config: ResolvedConfig): FontIndex {
|
|
55
|
-
const file = path.join(config.outPath, 'cache', 'fonts', 'index.json')
|
|
56
|
-
const existing = indexes.get(file)
|
|
57
|
-
if (existing) return existing
|
|
58
|
-
const created: FontIndex = { file, fonts: readIndex(file), dirty: false }
|
|
59
|
-
indexes.set(file, created)
|
|
55
|
+
const file = path.join(config.outPath, 'cache', 'fonts', 'index.json')
|
|
56
|
+
const existing = indexes.get(file)
|
|
57
|
+
if (existing) return existing
|
|
58
|
+
const created: FontIndex = { file, fonts: readIndex(file), dirty: false }
|
|
59
|
+
indexes.set(file, created)
|
|
60
60
|
process.on('exit', () => {
|
|
61
|
-
if (!created.dirty) return
|
|
62
|
-
created.dirty = false
|
|
61
|
+
if (!created.dirty) return
|
|
62
|
+
created.dirty = false
|
|
63
63
|
try {
|
|
64
|
-
writeFileSync(created.file, serializeIndex(created.fonts))
|
|
64
|
+
writeFileSync(created.file, serializeIndex(created.fonts))
|
|
65
65
|
} catch {
|
|
66
66
|
// Best effort: a missing index only costs the next boot a re-resolve.
|
|
67
67
|
}
|
|
68
|
-
})
|
|
69
|
-
return created
|
|
68
|
+
})
|
|
69
|
+
return created
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
/** The recorded resolution for `key`, or undefined when it no longer describes disk. */
|
|
@@ -74,72 +74,72 @@ export async function persistedFont(
|
|
|
74
74
|
config: ResolvedConfig,
|
|
75
75
|
key: string,
|
|
76
76
|
): Promise<PersistableFont | undefined> {
|
|
77
|
-
if (!restartCacheEnabled()) return undefined
|
|
78
|
-
const entry = fontIndex(config).fonts.get(key)
|
|
79
|
-
if (!entry) return undefined
|
|
80
|
-
if (!entry.files.every(file => existsSync(file))) return undefined
|
|
77
|
+
if (!restartCacheEnabled()) return undefined
|
|
78
|
+
const entry = fontIndex(config).fonts.get(key)
|
|
79
|
+
if (!entry) return undefined
|
|
80
|
+
if (!entry.files.every(file => existsSync(file))) return undefined
|
|
81
81
|
const stats = await Promise.all(
|
|
82
82
|
entry.sourceStats.map(async ([file, mtimeMs, size]) => {
|
|
83
|
-
const current = await stat(file).catch(() => undefined)
|
|
84
|
-
return current?.mtimeMs === mtimeMs && current.size === size
|
|
83
|
+
const current = await stat(file).catch(() => undefined)
|
|
84
|
+
return current?.mtimeMs === mtimeMs && current.size === size
|
|
85
85
|
}),
|
|
86
|
-
)
|
|
87
|
-
if (!stats.every(Boolean)) return undefined
|
|
88
|
-
return entry
|
|
86
|
+
)
|
|
87
|
+
if (!stats.every(Boolean)) return undefined
|
|
88
|
+
return entry
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
/** Record a finished resolution. Failures are non-fatal — they cost a re-resolve. */
|
|
92
92
|
export async function persistFont(config: ResolvedConfig, key: string, font: PersistableFont) {
|
|
93
|
-
const index = fontIndex(config)
|
|
93
|
+
const index = fontIndex(config)
|
|
94
94
|
const sourceStats = await Promise.all(
|
|
95
95
|
(font.sources ?? []).map(async (file): Promise<SourceStat | undefined> => {
|
|
96
|
-
const stats = await stat(file).catch(() => undefined)
|
|
97
|
-
return stats ? [file, stats.mtimeMs, stats.size] : undefined
|
|
96
|
+
const stats = await stat(file).catch(() => undefined)
|
|
97
|
+
return stats ? [file, stats.mtimeMs, stats.size] : undefined
|
|
98
98
|
}),
|
|
99
|
-
)
|
|
99
|
+
)
|
|
100
100
|
// A source that vanished mid-resolve must not be recorded as validated.
|
|
101
|
-
if (sourceStats.some(entry => entry === undefined)) return
|
|
102
|
-
index.fonts.set(key, { ...font, sourceStats: sourceStats as SourceStat[] })
|
|
103
|
-
persist(index)
|
|
101
|
+
if (sourceStats.some(entry => entry === undefined)) return
|
|
102
|
+
index.fonts.set(key, { ...font, sourceStats: sourceStats as SourceStat[] })
|
|
103
|
+
persist(index)
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
function persist(index: FontIndex) {
|
|
107
|
-
index.dirty = true
|
|
108
|
-
if (index.flush) return
|
|
107
|
+
index.dirty = true
|
|
108
|
+
if (index.flush) return
|
|
109
109
|
index.flush = setTimeout(async () => {
|
|
110
|
-
index.flush = undefined
|
|
111
|
-
if (!index.dirty) return
|
|
112
|
-
const contents = serializeIndex(index.fonts)
|
|
110
|
+
index.flush = undefined
|
|
111
|
+
if (!index.dirty) return
|
|
112
|
+
const contents = serializeIndex(index.fonts)
|
|
113
113
|
try {
|
|
114
|
-
await mkdir(path.dirname(index.file), { recursive: true })
|
|
115
|
-
await writeFileAtomic(index.file, contents)
|
|
116
|
-
index.dirty = false
|
|
114
|
+
await mkdir(path.dirname(index.file), { recursive: true })
|
|
115
|
+
await writeFileAtomic(index.file, contents)
|
|
116
|
+
index.dirty = false
|
|
117
117
|
} catch {
|
|
118
118
|
// A write that lost a race with a cache wipe must not look persisted.
|
|
119
119
|
}
|
|
120
|
-
}, 50)
|
|
120
|
+
}, 50)
|
|
121
121
|
// NOT unref'd: under the dev server this timer never fired, so the index was never written and
|
|
122
122
|
// every restart re-resolved every font over the network. The `exit` handler above still covers a
|
|
123
123
|
// process exit inside the window.
|
|
124
124
|
}
|
|
125
125
|
|
|
126
126
|
function readIndex(file: string) {
|
|
127
|
-
const fonts = new Map<string, Entry>()
|
|
128
|
-
let parsed: IndexFile | undefined
|
|
127
|
+
const fonts = new Map<string, Entry>()
|
|
128
|
+
let parsed: IndexFile | undefined
|
|
129
129
|
try {
|
|
130
|
-
parsed = JSON.parse(readFileSync(file, 'utf8')) as IndexFile
|
|
130
|
+
parsed = JSON.parse(readFileSync(file, 'utf8')) as IndexFile
|
|
131
131
|
} catch {
|
|
132
|
-
return fonts
|
|
132
|
+
return fonts
|
|
133
133
|
}
|
|
134
134
|
if (parsed?.version !== INDEX_VERSION || parsed.runtime !== runtimeFingerprint()) {
|
|
135
|
-
return fonts
|
|
135
|
+
return fonts
|
|
136
136
|
}
|
|
137
137
|
for (const [key, entry] of Object.entries(parsed.fonts ?? {})) {
|
|
138
138
|
if (entry && Array.isArray(entry.files) && Array.isArray(entry.sourceStats)) {
|
|
139
|
-
fonts.set(key, entry)
|
|
139
|
+
fonts.set(key, entry)
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
|
-
return fonts
|
|
142
|
+
return fonts
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
function serializeIndex(fonts: Map<string, Entry>) {
|
|
@@ -147,25 +147,25 @@ function serializeIndex(fonts: Map<string, Entry>) {
|
|
|
147
147
|
version: INDEX_VERSION,
|
|
148
148
|
runtime: runtimeFingerprint(),
|
|
149
149
|
fonts: Object.fromEntries(fonts),
|
|
150
|
-
} satisfies IndexFile)
|
|
150
|
+
} satisfies IndexFile)
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
// The CSS a resolution emits is shaped entirely by this directory's sources, so
|
|
154
154
|
// editing the font runtime must retire its records the same way editing a font
|
|
155
155
|
// does. Four small files, once per process.
|
|
156
|
-
let fingerprint: string | undefined
|
|
156
|
+
let fingerprint: string | undefined
|
|
157
157
|
|
|
158
158
|
function runtimeFingerprint() {
|
|
159
|
-
if (fingerprint !== undefined) return fingerprint
|
|
160
|
-
const hash = createHash('sha256')
|
|
159
|
+
if (fingerprint !== undefined) return fingerprint
|
|
160
|
+
const hash = createHash('sha256')
|
|
161
161
|
for (const entry of ['runtime.ts', 'google.ts', 'local.ts', 'shared.ts']) {
|
|
162
|
-
const file = new URL(entry, import.meta.url).pathname
|
|
162
|
+
const file = new URL(entry, import.meta.url).pathname
|
|
163
163
|
try {
|
|
164
|
-
hash.update(`${entry}:${Bun.hash(readFileSync(file)).toString(36)}\0`)
|
|
164
|
+
hash.update(`${entry}:${Bun.hash(readFileSync(file)).toString(36)}\0`)
|
|
165
165
|
} catch {
|
|
166
166
|
// ignore unreadable entries
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
|
-
fingerprint = hash.digest('hex').slice(0, 16)
|
|
170
|
-
return fingerprint
|
|
169
|
+
fingerprint = hash.digest('hex').slice(0, 16)
|
|
170
|
+
return fingerprint
|
|
171
171
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from 'next-font/google'
|
|
2
|
-
export type { FontDisplay, GoogleFontOptions, NextFont, NextFontWithVariable } from './runtime'
|
|
1
|
+
export * from 'next-font/google'
|
|
2
|
+
export type { FontDisplay, GoogleFontOptions, NextFont, NextFontWithVariable } from './runtime'
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { localFont } from './runtime'
|
|
1
|
+
import { localFont } from './runtime'
|
|
2
2
|
|
|
3
|
-
export type { LocalFontOptions, LocalFontSource, NextFont, NextFontWithVariable } from './runtime'
|
|
3
|
+
export type { LocalFontOptions, LocalFontSource, NextFont, NextFontWithVariable } from './runtime'
|
|
4
4
|
|
|
5
|
-
export default localFont
|
|
5
|
+
export default localFont
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
type GoogleFontOptions,
|
|
18
18
|
type LocalFontOptions,
|
|
19
19
|
type NextFontWithVariable,
|
|
20
|
-
} from './shared'
|
|
20
|
+
} from './shared'
|
|
21
21
|
|
|
22
22
|
export type {
|
|
23
23
|
FontDisplay,
|
|
@@ -26,13 +26,13 @@ export type {
|
|
|
26
26
|
LocalFontSource,
|
|
27
27
|
NextFont,
|
|
28
28
|
NextFontWithVariable,
|
|
29
|
-
} from './shared'
|
|
29
|
+
} from './shared'
|
|
30
30
|
|
|
31
31
|
function fontObject(naming: {
|
|
32
|
-
className: string
|
|
33
|
-
variable: string
|
|
34
|
-
hasVariable: boolean
|
|
35
|
-
style: NextFontWithVariable['style']
|
|
32
|
+
className: string
|
|
33
|
+
variable: string
|
|
34
|
+
hasVariable: boolean
|
|
35
|
+
style: NextFontWithVariable['style']
|
|
36
36
|
}): NextFontWithVariable {
|
|
37
37
|
// Plain data object: no registration side effects (the server already emitted
|
|
38
38
|
// the CSS/assets). Client code reads className/variable/style off this. The
|
|
@@ -42,30 +42,32 @@ function fontObject(naming: {
|
|
|
42
42
|
const font: NextFontWithVariable = {
|
|
43
43
|
className: naming.className,
|
|
44
44
|
style: naming.style,
|
|
45
|
-
} as NextFontWithVariable
|
|
46
|
-
if (naming.hasVariable) font.variable = naming.variable
|
|
47
|
-
return font
|
|
45
|
+
} as NextFontWithVariable
|
|
46
|
+
if (naming.hasVariable) font.variable = naming.variable
|
|
47
|
+
return font
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
export function googleFont(family: string) {
|
|
51
51
|
return (options: GoogleFontOptions = {}): NextFontWithVariable =>
|
|
52
|
-
fontObject(googleFontNaming(family, options))
|
|
52
|
+
fontObject(googleFontNaming(family, options))
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
export interface LocalFontLoader {
|
|
56
|
-
(options: LocalFontOptions): NextFontWithVariable
|
|
57
|
-
withFile: typeof localFontWithFile
|
|
56
|
+
(options: LocalFontOptions): NextFontWithVariable
|
|
57
|
+
withFile: typeof localFontWithFile
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
export function localFontWithFile(callerFile: string | undefined, family?: string) {
|
|
61
61
|
return (options: LocalFontOptions): NextFontWithVariable =>
|
|
62
62
|
fontObject({
|
|
63
63
|
...localFontNaming(callerFile, options),
|
|
64
|
-
...(family
|
|
65
|
-
|
|
64
|
+
...(family
|
|
65
|
+
? { fontFamily: family, style: fontStyle(family, options, options.fallback ?? []) }
|
|
66
|
+
: {}),
|
|
67
|
+
})
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
export const localFont: LocalFontLoader = Object.assign(
|
|
69
71
|
(options: LocalFontOptions) => localFontWithFile(undefined)(options),
|
|
70
72
|
{ withFile: localFontWithFile },
|
|
71
|
-
)
|
|
73
|
+
)
|