@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
|
@@ -10,24 +10,24 @@
|
|
|
10
10
|
// installs it via setCacheHandler, so core never imports compat.
|
|
11
11
|
|
|
12
12
|
export interface CacheHandlerEntry {
|
|
13
|
-
value: unknown
|
|
14
|
-
lastModified: number
|
|
15
|
-
tags?: readonly string[]
|
|
13
|
+
value: unknown
|
|
14
|
+
lastModified: number
|
|
15
|
+
tags?: readonly string[]
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export interface CacheHandlerGetContext {
|
|
19
|
-
tags?: readonly string[]
|
|
20
|
-
softTags?: readonly string[]
|
|
21
|
-
kind?: string
|
|
19
|
+
tags?: readonly string[]
|
|
20
|
+
softTags?: readonly string[]
|
|
21
|
+
kind?: string
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
export interface CacheHandlerSetContext {
|
|
25
|
-
tags?: readonly string[]
|
|
26
|
-
revalidate?: number | false
|
|
27
|
-
kind?: string
|
|
25
|
+
tags?: readonly string[]
|
|
26
|
+
revalidate?: number | false
|
|
27
|
+
kind?: string
|
|
28
28
|
/** Set for fetch data-cache writes (Next's incremental-cache fetch ctx). */
|
|
29
|
-
fetchCache?: boolean
|
|
30
|
-
fetchUrl?: string
|
|
29
|
+
fetchCache?: boolean
|
|
30
|
+
fetchUrl?: string
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/** The subset of Next's IncrementalCacheHandler contract pnext drives. */
|
|
@@ -35,29 +35,25 @@ export interface CacheHandler {
|
|
|
35
35
|
get(
|
|
36
36
|
key: string,
|
|
37
37
|
ctx?: CacheHandlerGetContext,
|
|
38
|
-
): Promise<CacheHandlerEntry | undefined | null> | CacheHandlerEntry | undefined | null
|
|
39
|
-
set(
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
ctx?: CacheHandlerSetContext,
|
|
43
|
-
): Promise<void> | void;
|
|
44
|
-
revalidateTag?(tag: string | string[]): Promise<void> | void;
|
|
45
|
-
resetRequestCache?(): void;
|
|
38
|
+
): Promise<CacheHandlerEntry | undefined | null> | CacheHandlerEntry | undefined | null
|
|
39
|
+
set(key: string, data: unknown, ctx?: CacheHandlerSetContext): Promise<void> | void
|
|
40
|
+
revalidateTag?(tag: string | string[]): Promise<void> | void
|
|
41
|
+
resetRequestCache?(): void
|
|
46
42
|
}
|
|
47
43
|
|
|
48
|
-
let handler: CacheHandler | undefined
|
|
44
|
+
let handler: CacheHandler | undefined
|
|
49
45
|
|
|
50
46
|
/** Install the configured handler (compat calls this from an init hook). */
|
|
51
47
|
export function setCacheHandler(instance: CacheHandler | undefined): void {
|
|
52
|
-
handler = instance
|
|
48
|
+
handler = instance
|
|
53
49
|
}
|
|
54
50
|
|
|
55
51
|
export function getCacheHandler(): CacheHandler | undefined {
|
|
56
|
-
return handler
|
|
52
|
+
return handler
|
|
57
53
|
}
|
|
58
54
|
|
|
59
55
|
export function hasCacheHandler(): boolean {
|
|
60
|
-
return handler !== undefined
|
|
56
|
+
return handler !== undefined
|
|
61
57
|
}
|
|
62
58
|
|
|
63
59
|
/** Read an entry from the configured handler, tolerating sync/async + throws. */
|
|
@@ -65,12 +61,12 @@ export async function cacheHandlerGet(
|
|
|
65
61
|
key: string,
|
|
66
62
|
ctx?: CacheHandlerGetContext,
|
|
67
63
|
): Promise<CacheHandlerEntry | undefined> {
|
|
68
|
-
if (!handler) return undefined
|
|
64
|
+
if (!handler) return undefined
|
|
69
65
|
try {
|
|
70
|
-
const entry = await handler.get(key, ctx)
|
|
71
|
-
return entry ?? undefined
|
|
66
|
+
const entry = await handler.get(key, ctx)
|
|
67
|
+
return entry ?? undefined
|
|
72
68
|
} catch {
|
|
73
|
-
return undefined
|
|
69
|
+
return undefined
|
|
74
70
|
}
|
|
75
71
|
}
|
|
76
72
|
|
|
@@ -80,9 +76,9 @@ export async function cacheHandlerSet(
|
|
|
80
76
|
data: unknown,
|
|
81
77
|
ctx?: CacheHandlerSetContext,
|
|
82
78
|
): Promise<void> {
|
|
83
|
-
if (!handler) return
|
|
79
|
+
if (!handler) return
|
|
84
80
|
try {
|
|
85
|
-
await handler.set(key, data, ctx)
|
|
81
|
+
await handler.set(key, data, ctx)
|
|
86
82
|
} catch {
|
|
87
83
|
// A handler failure must not break the response; the in-memory store is
|
|
88
84
|
// authoritative for correctness, the handler is a persistence layer.
|
|
@@ -91,9 +87,9 @@ export async function cacheHandlerSet(
|
|
|
91
87
|
|
|
92
88
|
/** Forward on-demand tag invalidation to the handler if it supports it. */
|
|
93
89
|
export async function cacheHandlerRevalidateTag(tag: string): Promise<void> {
|
|
94
|
-
if (!handler?.revalidateTag) return
|
|
90
|
+
if (!handler?.revalidateTag) return
|
|
95
91
|
try {
|
|
96
|
-
await handler.revalidateTag(tag)
|
|
92
|
+
await handler.revalidateTag(tag)
|
|
97
93
|
} catch {
|
|
98
94
|
// best-effort
|
|
99
95
|
}
|
|
@@ -1,113 +1,127 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from 'node:fs'
|
|
2
|
-
import { createRequire } from 'node:module'
|
|
3
|
-
import path from 'node:path'
|
|
4
|
-
import { format } from 'node:util'
|
|
5
|
-
import { fileURLToPath, pathToFileURL } from 'node:url'
|
|
6
|
-
import { currentRequest } from '../../request/context'
|
|
7
|
-
import { realNow } from '../../ppr'
|
|
8
|
-
import { getNextConfig } from '../next/config-loader'
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
2
|
+
import { createRequire } from 'node:module'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { format } from 'node:util'
|
|
5
|
+
import { fileURLToPath, pathToFileURL } from 'node:url'
|
|
6
|
+
import { currentRequest } from '../../request/context'
|
|
7
|
+
import { realNow } from '../../render/ppr'
|
|
8
|
+
import { getNextConfig } from '../next/config-loader'
|
|
9
9
|
|
|
10
10
|
interface ModernCacheEntry {
|
|
11
|
-
value: ReadableStream<Uint8Array
|
|
12
|
-
tags: string[]
|
|
13
|
-
stale: number
|
|
14
|
-
timestamp: number
|
|
15
|
-
expire: number
|
|
16
|
-
revalidate: number
|
|
11
|
+
value: ReadableStream<Uint8Array>
|
|
12
|
+
tags: string[]
|
|
13
|
+
stale: number
|
|
14
|
+
timestamp: number
|
|
15
|
+
expire: number
|
|
16
|
+
revalidate: number
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
interface ModernCacheHandler {
|
|
20
|
-
get?: (
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
get?: (
|
|
21
|
+
cacheKey: string,
|
|
22
|
+
softTags: string[],
|
|
23
|
+
) => Promise<ModernCacheEntry | undefined> | ModernCacheEntry | undefined
|
|
24
|
+
set?: (cacheKey: string, pendingEntry: Promise<ModernCacheEntry>) => Promise<void> | void
|
|
25
|
+
refreshTags?: () => Promise<void> | void
|
|
26
|
+
getExpiration?: (tags: string[]) => Promise<number> | number
|
|
27
|
+
updateTags?: (tags: string[], durations?: { expire?: number }) => Promise<void> | void
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
interface ModernCacheHandlerState {
|
|
28
|
-
handler?: ModernCacheHandler
|
|
29
|
-
installedFor?: string
|
|
31
|
+
handler?: ModernCacheHandler
|
|
32
|
+
installedFor?: string
|
|
30
33
|
}
|
|
31
34
|
|
|
32
|
-
const MODERN_CACHE_HANDLER_STATE = Symbol.for('pnext.compat.modernCacheHandler')
|
|
35
|
+
const MODERN_CACHE_HANDLER_STATE = Symbol.for('pnext.compat.modernCacheHandler')
|
|
33
36
|
|
|
34
37
|
function state(): ModernCacheHandlerState {
|
|
35
38
|
const global = globalThis as typeof globalThis & {
|
|
36
|
-
[MODERN_CACHE_HANDLER_STATE]?: ModernCacheHandlerState
|
|
37
|
-
}
|
|
38
|
-
return (global[MODERN_CACHE_HANDLER_STATE] ??= {})
|
|
39
|
+
[MODERN_CACHE_HANDLER_STATE]?: ModernCacheHandlerState
|
|
40
|
+
}
|
|
41
|
+
return (global[MODERN_CACHE_HANDLER_STATE] ??= {})
|
|
39
42
|
}
|
|
40
43
|
|
|
41
44
|
export function installModernCacheHandlers(root: string): void {
|
|
42
|
-
const configured = defaultCacheHandlerPath()
|
|
43
|
-
const current = state()
|
|
45
|
+
const configured = defaultCacheHandlerPath()
|
|
46
|
+
const current = state()
|
|
44
47
|
if (!configured) {
|
|
45
|
-
current.handler = undefined
|
|
46
|
-
current.installedFor = undefined
|
|
47
|
-
return
|
|
48
|
+
current.handler = undefined
|
|
49
|
+
current.installedFor = undefined
|
|
50
|
+
return
|
|
48
51
|
}
|
|
49
|
-
const filePath = resolveHandlerPath(configured, root)
|
|
50
|
-
if (current.installedFor === filePath) return
|
|
51
|
-
const loaded = loadHandler(filePath, root)
|
|
52
|
-
if (!loaded) return
|
|
53
|
-
current.handler = loaded
|
|
54
|
-
current.installedFor = filePath
|
|
52
|
+
const filePath = resolveHandlerPath(configured, root)
|
|
53
|
+
if (current.installedFor === filePath) return
|
|
54
|
+
const loaded = loadHandler(filePath, root)
|
|
55
|
+
if (!loaded) return
|
|
56
|
+
current.handler = loaded
|
|
57
|
+
current.installedFor = filePath
|
|
55
58
|
}
|
|
56
59
|
|
|
57
60
|
export function hasModernCacheHandler(): boolean {
|
|
58
|
-
return state().handler !== undefined
|
|
61
|
+
return state().handler !== undefined
|
|
59
62
|
}
|
|
60
63
|
|
|
61
64
|
export async function modernCacheRefreshTags(): Promise<void> {
|
|
62
|
-
const refreshTags = state().handler?.refreshTags
|
|
63
|
-
const handler = state().handler
|
|
64
|
-
if (!handler || !refreshTags) return
|
|
65
|
+
const refreshTags = state().handler?.refreshTags
|
|
66
|
+
const handler = state().handler
|
|
67
|
+
if (!handler || !refreshTags) return
|
|
65
68
|
try {
|
|
66
|
-
await withNodeConsoleFormat(() => refreshTags.call(handler))
|
|
69
|
+
await withNodeConsoleFormat(() => refreshTags.call(handler))
|
|
67
70
|
} catch {
|
|
68
71
|
// best-effort
|
|
69
72
|
}
|
|
70
73
|
}
|
|
71
74
|
|
|
72
|
-
export async function modernCacheGet(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
75
|
+
export async function modernCacheGet(
|
|
76
|
+
key: string,
|
|
77
|
+
softTags = implicitSoftTags(),
|
|
78
|
+
): Promise<ModernCacheEntry | undefined> {
|
|
79
|
+
const handler = state().handler
|
|
80
|
+
const get = handler?.get
|
|
81
|
+
if (!handler || !get) return undefined
|
|
76
82
|
try {
|
|
77
|
-
return await withNodeConsoleFormat(() => get.call(handler, key, softTags))
|
|
83
|
+
return await withNodeConsoleFormat(() => get.call(handler, key, softTags))
|
|
78
84
|
} catch {
|
|
79
|
-
return undefined
|
|
85
|
+
return undefined
|
|
80
86
|
}
|
|
81
87
|
}
|
|
82
88
|
|
|
83
|
-
export async function modernCacheSet(
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
89
|
+
export async function modernCacheSet(
|
|
90
|
+
key: string,
|
|
91
|
+
pendingEntry: Promise<ModernCacheEntry>,
|
|
92
|
+
): Promise<void> {
|
|
93
|
+
const handler = state().handler
|
|
94
|
+
const set = handler?.set
|
|
95
|
+
if (!handler || !set) return
|
|
87
96
|
try {
|
|
88
|
-
await withNodeConsoleFormat(() => set.call(handler, key, pendingEntry))
|
|
97
|
+
await withNodeConsoleFormat(() => set.call(handler, key, pendingEntry))
|
|
89
98
|
} catch {
|
|
90
99
|
// best-effort
|
|
91
100
|
}
|
|
92
101
|
}
|
|
93
102
|
|
|
94
|
-
export async function modernCacheGetExpiration(
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
103
|
+
export async function modernCacheGetExpiration(
|
|
104
|
+
tags = implicitSoftTags(),
|
|
105
|
+
): Promise<number | undefined> {
|
|
106
|
+
const handler = state().handler
|
|
107
|
+
const getExpiration = handler?.getExpiration
|
|
108
|
+
if (!handler || !getExpiration) return undefined
|
|
98
109
|
try {
|
|
99
|
-
return await withNodeConsoleFormat(() => getExpiration.call(handler, tags))
|
|
110
|
+
return await withNodeConsoleFormat(() => getExpiration.call(handler, tags))
|
|
100
111
|
} catch {
|
|
101
|
-
return undefined
|
|
112
|
+
return undefined
|
|
102
113
|
}
|
|
103
114
|
}
|
|
104
115
|
|
|
105
|
-
export async function modernCacheUpdateTags(
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
116
|
+
export async function modernCacheUpdateTags(
|
|
117
|
+
tags: string[],
|
|
118
|
+
durations?: { expire?: number },
|
|
119
|
+
): Promise<void> {
|
|
120
|
+
const handler = state().handler
|
|
121
|
+
const updateTags = handler?.updateTags
|
|
122
|
+
if (!handler || !updateTags) return
|
|
109
123
|
try {
|
|
110
|
-
await withNodeConsoleFormat(() => updateTags.call(handler, tags, durations))
|
|
124
|
+
await withNodeConsoleFormat(() => updateTags.call(handler, tags, durations))
|
|
111
125
|
} catch {
|
|
112
126
|
// best-effort
|
|
113
127
|
}
|
|
@@ -120,40 +134,40 @@ export async function modernCacheUpdateTags(tags: string[], durations?: { expire
|
|
|
120
134
|
* single-quoted util.inspect output verbatim.
|
|
121
135
|
*/
|
|
122
136
|
async function withNodeConsoleFormat<T>(fn: () => Promise<T> | T): Promise<T> {
|
|
123
|
-
const original = console.log.bind(console)
|
|
137
|
+
const original = console.log.bind(console)
|
|
124
138
|
console.log = (...args: unknown[]) => {
|
|
125
|
-
original(format(...args))
|
|
126
|
-
}
|
|
139
|
+
original(format(...args))
|
|
140
|
+
}
|
|
127
141
|
try {
|
|
128
|
-
return await fn()
|
|
142
|
+
return await fn()
|
|
129
143
|
} finally {
|
|
130
|
-
console.log = original
|
|
144
|
+
console.log = original
|
|
131
145
|
}
|
|
132
146
|
}
|
|
133
147
|
|
|
134
148
|
export function modernCacheKey(id: string, argsJson: string): string {
|
|
135
149
|
// eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
136
|
-
const buildId = process.env.NODE_ENV === 'development' ? 'development' : 'pnext'
|
|
150
|
+
const buildId = process.env.NODE_ENV === 'development' ? 'development' : 'pnext'
|
|
137
151
|
// Fixed-width hex: Next's cache keys are whole-byte hex strings and the e2e
|
|
138
152
|
// suites match them with `([0-9a-f]{2})+` — an odd-length (leading-zero
|
|
139
153
|
// trimmed) hash would never match.
|
|
140
|
-
const hash = Bun.hash.wyhash(`${id}:${argsJson}`).toString(16).padStart(16, '0')
|
|
141
|
-
return JSON.stringify([buildId, hash, JSON.parse(argsJson)])
|
|
154
|
+
const hash = Bun.hash.wyhash(`${id}:${argsJson}`).toString(16).padStart(16, '0')
|
|
155
|
+
return JSON.stringify([buildId, hash, JSON.parse(argsJson)])
|
|
142
156
|
}
|
|
143
157
|
|
|
144
158
|
export function modernCacheEntry(input: {
|
|
145
|
-
value: unknown
|
|
146
|
-
tags: string[]
|
|
147
|
-
staleSeconds?: number
|
|
148
|
-
expireSeconds?: number
|
|
149
|
-
revalidateSeconds?: number
|
|
150
|
-
storedAt: number
|
|
159
|
+
value: unknown
|
|
160
|
+
tags: string[]
|
|
161
|
+
staleSeconds?: number
|
|
162
|
+
expireSeconds?: number
|
|
163
|
+
revalidateSeconds?: number
|
|
164
|
+
storedAt: number
|
|
151
165
|
}): ModernCacheEntry {
|
|
152
166
|
return {
|
|
153
167
|
value: new ReadableStream<Uint8Array>({
|
|
154
168
|
start(controller) {
|
|
155
|
-
controller.enqueue(new TextEncoder().encode(JSON.stringify(input.value)))
|
|
156
|
-
controller.close()
|
|
169
|
+
controller.enqueue(new TextEncoder().encode(JSON.stringify(input.value)))
|
|
170
|
+
controller.close()
|
|
157
171
|
},
|
|
158
172
|
}),
|
|
159
173
|
tags: input.tags,
|
|
@@ -161,40 +175,41 @@ export function modernCacheEntry(input: {
|
|
|
161
175
|
timestamp: input.storedAt,
|
|
162
176
|
expire: input.expireSeconds ?? 31536000,
|
|
163
177
|
revalidate: input.revalidateSeconds ?? 900,
|
|
164
|
-
}
|
|
178
|
+
}
|
|
165
179
|
}
|
|
166
180
|
|
|
167
181
|
export function clearModernCacheHandlerForTest(): void {
|
|
168
|
-
const current = state()
|
|
169
|
-
current.handler = undefined
|
|
170
|
-
current.installedFor = undefined
|
|
182
|
+
const current = state()
|
|
183
|
+
current.handler = undefined
|
|
184
|
+
current.installedFor = undefined
|
|
171
185
|
}
|
|
172
186
|
|
|
173
187
|
function defaultCacheHandlerPath(): string | undefined {
|
|
174
|
-
const cacheHandlers = getNextConfig().cacheHandlers
|
|
175
|
-
if (!cacheHandlers || typeof cacheHandlers !== 'object' || Array.isArray(cacheHandlers))
|
|
176
|
-
|
|
177
|
-
|
|
188
|
+
const cacheHandlers = getNextConfig().cacheHandlers
|
|
189
|
+
if (!cacheHandlers || typeof cacheHandlers !== 'object' || Array.isArray(cacheHandlers))
|
|
190
|
+
return undefined
|
|
191
|
+
const configured = (cacheHandlers as Record<string, unknown>).default
|
|
192
|
+
return typeof configured === 'string' && configured.length > 0 ? configured : undefined
|
|
178
193
|
}
|
|
179
194
|
|
|
180
195
|
function resolveHandlerPath(configured: string, root: string): string {
|
|
181
|
-
const resolved = configured.startsWith('file:') ? fileURLToPath(configured) : configured
|
|
182
|
-
if (path.isAbsolute(resolved)) return resolved
|
|
183
|
-
return path.resolve(root, resolved)
|
|
196
|
+
const resolved = configured.startsWith('file:') ? fileURLToPath(configured) : configured
|
|
197
|
+
if (path.isAbsolute(resolved)) return resolved
|
|
198
|
+
return path.resolve(root, resolved)
|
|
184
199
|
}
|
|
185
200
|
|
|
186
201
|
function loadHandler(filePath: string, root: string): ModernCacheHandler | undefined {
|
|
187
|
-
if (!existsSync(filePath)) return undefined
|
|
202
|
+
if (!existsSync(filePath)) return undefined
|
|
188
203
|
try {
|
|
189
|
-
const require = createRequire(pathToFileURL(`${root}/index.js`).href)
|
|
204
|
+
const require = createRequire(pathToFileURL(`${root}/index.js`).href)
|
|
190
205
|
try {
|
|
191
|
-
return pickHandler(require(filePath))
|
|
206
|
+
return pickHandler(require(filePath))
|
|
192
207
|
} catch (error) {
|
|
193
|
-
if (!isNextDistMissing(error)) return undefined
|
|
194
|
-
return loadCommonJsHandlerWithNextStubs(filePath, require)
|
|
208
|
+
if (!isNextDistMissing(error)) return undefined
|
|
209
|
+
return loadCommonJsHandlerWithNextStubs(filePath, require)
|
|
195
210
|
}
|
|
196
211
|
} catch {
|
|
197
|
-
return undefined
|
|
212
|
+
return undefined
|
|
198
213
|
}
|
|
199
214
|
}
|
|
200
215
|
|
|
@@ -203,73 +218,80 @@ function loadCommonJsHandlerWithNextStubs(
|
|
|
203
218
|
rootRequire: NodeRequire,
|
|
204
219
|
): ModernCacheHandler | undefined {
|
|
205
220
|
try {
|
|
206
|
-
const module = { exports: {} as unknown }
|
|
221
|
+
const module = { exports: {} as unknown }
|
|
207
222
|
const localRequire = (specifier: string): unknown => {
|
|
208
223
|
if (specifier === 'next/dist/server/lib/cache-handlers/default.external') {
|
|
209
|
-
return { default: createDefaultExternalHandler() }
|
|
224
|
+
return { default: createDefaultExternalHandler() }
|
|
210
225
|
}
|
|
211
|
-
if (specifier.startsWith('next/dist/')) return {}
|
|
226
|
+
if (specifier.startsWith('next/dist/')) return {}
|
|
212
227
|
if (specifier.startsWith('./') || specifier.startsWith('../')) {
|
|
213
|
-
return rootRequire(path.resolve(path.dirname(filePath), specifier))
|
|
228
|
+
return rootRequire(path.resolve(path.dirname(filePath), specifier))
|
|
214
229
|
}
|
|
215
|
-
return rootRequire(specifier)
|
|
216
|
-
}
|
|
217
|
-
const source = readFileSync(filePath, 'utf8')
|
|
230
|
+
return rootRequire(specifier)
|
|
231
|
+
}
|
|
232
|
+
const source = readFileSync(filePath, 'utf8')
|
|
218
233
|
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
219
|
-
const evaluate = new Function(
|
|
234
|
+
const evaluate = new Function(
|
|
235
|
+
'require',
|
|
236
|
+
'module',
|
|
237
|
+
'exports',
|
|
238
|
+
'__filename',
|
|
239
|
+
'__dirname',
|
|
240
|
+
source,
|
|
241
|
+
) as (
|
|
220
242
|
require: (specifier: string) => unknown,
|
|
221
243
|
module: { exports: unknown },
|
|
222
244
|
exports: unknown,
|
|
223
245
|
filename: string,
|
|
224
246
|
dirname: string,
|
|
225
|
-
) => void
|
|
226
|
-
evaluate(localRequire, module, module.exports, filePath, path.dirname(filePath))
|
|
227
|
-
return pickHandler(module.exports)
|
|
247
|
+
) => void
|
|
248
|
+
evaluate(localRequire, module, module.exports, filePath, path.dirname(filePath))
|
|
249
|
+
return pickHandler(module.exports)
|
|
228
250
|
} catch {
|
|
229
|
-
return undefined
|
|
251
|
+
return undefined
|
|
230
252
|
}
|
|
231
253
|
}
|
|
232
254
|
|
|
233
255
|
function isNextDistMissing(error: unknown): boolean {
|
|
234
|
-
const message = (error as { message?: unknown }).message
|
|
235
|
-
return typeof message === 'string' && message.includes('next/dist/')
|
|
256
|
+
const message = (error as { message?: unknown }).message
|
|
257
|
+
return typeof message === 'string' && message.includes('next/dist/')
|
|
236
258
|
}
|
|
237
259
|
|
|
238
260
|
function pickHandler(mod: unknown): ModernCacheHandler | undefined {
|
|
239
261
|
const candidate =
|
|
240
262
|
mod && typeof mod === 'object' && 'default' in mod
|
|
241
263
|
? (mod as { default?: unknown }).default
|
|
242
|
-
: mod
|
|
243
|
-
return candidate && typeof candidate === 'object' ? candidate : undefined
|
|
264
|
+
: mod
|
|
265
|
+
return candidate && typeof candidate === 'object' ? candidate : undefined
|
|
244
266
|
}
|
|
245
267
|
|
|
246
268
|
function createDefaultExternalHandler(): ModernCacheHandler {
|
|
247
|
-
const entries = new Map<string, ModernCacheEntry>()
|
|
248
|
-
const tagExpirations = new Map<string, number>()
|
|
269
|
+
const entries = new Map<string, ModernCacheEntry>()
|
|
270
|
+
const tagExpirations = new Map<string, number>()
|
|
249
271
|
return {
|
|
250
272
|
get(cacheKey) {
|
|
251
|
-
return entries.get(cacheKey)
|
|
273
|
+
return entries.get(cacheKey)
|
|
252
274
|
},
|
|
253
275
|
async set(cacheKey, pendingEntry) {
|
|
254
|
-
entries.set(cacheKey, await pendingEntry)
|
|
276
|
+
entries.set(cacheKey, await pendingEntry)
|
|
255
277
|
},
|
|
256
278
|
refreshTags() {
|
|
257
|
-
return undefined
|
|
279
|
+
return undefined
|
|
258
280
|
},
|
|
259
281
|
getExpiration(tags) {
|
|
260
|
-
let value = 0
|
|
261
|
-
for (const tag of tags) value = Math.max(value, tagExpirations.get(tag) ?? 0)
|
|
262
|
-
return value
|
|
282
|
+
let value = 0
|
|
283
|
+
for (const tag of tags) value = Math.max(value, tagExpirations.get(tag) ?? 0)
|
|
284
|
+
return value
|
|
263
285
|
},
|
|
264
286
|
updateTags(tags) {
|
|
265
|
-
const now = realNow()
|
|
266
|
-
for (const tag of tags) tagExpirations.set(tag, now)
|
|
287
|
+
const now = realNow()
|
|
288
|
+
for (const tag of tags) tagExpirations.set(tag, now)
|
|
267
289
|
},
|
|
268
|
-
}
|
|
290
|
+
}
|
|
269
291
|
}
|
|
270
292
|
|
|
271
293
|
function implicitSoftTags(): string[] {
|
|
272
|
-
const pathname = new URL(currentRequest()?.url ?? 'http://pnext.local/').pathname || '/'
|
|
273
|
-
const leaf = pathname === '/' ? '/index' : pathname
|
|
274
|
-
return ['_N_T_/layout', '_N_T_/page', '_N_T_/', `_N_T_${leaf}`]
|
|
294
|
+
const pathname = new URL(currentRequest()?.url ?? 'http://pnext.local/').pathname || '/'
|
|
295
|
+
const leaf = pathname === '/' ? '/index' : pathname
|
|
296
|
+
return ['_N_T_/layout', '_N_T_/page', '_N_T_/', `_N_T_${leaf}`]
|
|
275
297
|
}
|